diff --git a/DEPS b/DEPS
index ec383d1..3493e64 100644
--- a/DEPS
+++ b/DEPS
@@ -308,11 +308,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '51784961a549aa3eff970c32af08734422989955',
+  'src_internal_revision': 'f5dce23de2e76a39aeabd5418dfcda30b6c8106a',
   # 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': 'a3a016537a8c512df42b50522e78710b320c0faf',
+  'skia_revision': 'd221c1591d5939b8a3072769cab9507a7a6ba36c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -320,11 +320,11 @@
   # 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': 'd71b8ee0f0e26b14a8fa642460df2635c2d7db2f',
+  'angle_revision': '6861da63bb01592964789d531dd8a71a06057547',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '632c096c22930608f334235c9e1f83d444406bb4',
+  'swiftshader_revision': '764410d4d65546fd1e536b02059b1f714a390720',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -387,7 +387,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': 'fd8265d81da88a9c01d40378393da538d67a749e',
+  'chromium_variations_revision': '82bb2737369855a67042a9da0fc35105b2007c95',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -403,7 +403,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': 'f61a43042a8433b9487b37813b0bc19494a01dd7',
+  'devtools_frontend_revision': '01cc0edfe78cb9f14cdfd7d5cb5cb14af1e6b2af',
   # 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.
@@ -827,7 +827,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '4ccf9ec2cc92967d39ca0e3d0b0158bfd7937c81',
+    '9fac960efbf41bbdaa05ce10d5caaf74f2ee6347',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -836,7 +836,7 @@
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '26acfe36928095395dfcb6ff3d0578550bd868ac',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '2e38085850ae38e4b0d9325759a38a1f414f815f',
       'condition': 'checkout_ios',
   },
 
@@ -1192,13 +1192,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'af97284b58afb6bdb7dd2b353bc651c718ce5bb4',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6aaae85821254406042a11254d49b14c9d1b44f3',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '84f68106afc210db30fb1efa8f76425cb067e82b',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'e823faa7a77921dfb5fd356b41ce9685b1ab919f',
     'condition': 'checkout_src_internal',
   },
 
@@ -1652,7 +1652,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '09a4f3ec842a8932341b195c5b01e141c8a16eb7',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'dcd61dfe0e1e6c27d6d48fd4a29a9117e7d4b666',
+    Var('chromium_git') + '/openscreen' + '@' + '29abac6cf360ba375bba7f88826b75dade7a4a7d',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '95fe35ffb383710a6e0567e958ead9a3b66e930c',
@@ -1811,7 +1811,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@6066c0d57a8bd7d68060336c7b01eeb9a1271589',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@aa20d192b8c4e4a617d93d809cc416e0429acacd',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -1851,7 +1851,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0da8f2f1189d05814b5bbfd770f362928f2fb829',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '85bea5a11bf3e771b335671b9875b8a9b033f223',
+    Var('webrtc_git') + '/src.git' + '@' + 'b95dcde6f8b22436e3af68297f23e42fe65756d4',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -4065,7 +4065,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        'a2e21ab67af8c7fd133c90ec13d3b248640c199e',
+        'e306a767178bbe3e17c4404a2713992423162b39',
       'condition': 'checkout_src_internal',
   },
 
@@ -4125,7 +4125,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '4e9a9e1ff027107175ef685b140354acc5bfc1a9',
+        '2e8862517f6676771a2aaa26c8155238ac1981af',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/browser/state_serializer.cc b/android_webview/browser/state_serializer.cc
index fc61440..52873fff 100644
--- a/android_webview/browser/state_serializer.cc
+++ b/android_webview/browser/state_serializer.cc
@@ -161,15 +161,17 @@
   pickle->WriteString(entry.GetBaseURLForDataURL().spec());
 
   if (state_version >= internal::AW_STATE_VERSION_DATA_URL) {
-    std::string_view view;
+    const char* data = nullptr;
+    size_t size = 0;
     const scoped_refptr<const base::RefCountedString>& s =
         entry.GetDataURLAsString();
     if (s) {
-      view = base::as_string_view(*s);
+      data = s->front_as<char>();
+      size = s->size();
     }
     // Even when |entry.GetDataForDataURL()| is null we still need to write a
     // zero-length entry to ensure the fields all line up when read back in.
-    pickle->WriteData(view.data(), view.size());
+    pickle->WriteData(data, size);
   }
 
   pickle->WriteBool(static_cast<int>(entry.GetIsOverridingUserAgent()));
@@ -314,7 +316,7 @@
       return false;
     if (size > 0) {
       scoped_refptr<base::RefCountedString> ref = new base::RefCountedString();
-      ref->as_string().assign(data, size);
+      ref->data().assign(data, size);
       entry->SetDataURLAsString(ref);
     }
   }
diff --git a/android_webview/browser/state_serializer_unittest.cc b/android_webview/browser/state_serializer_unittest.cc
index cdb3d70..7a999d0 100644
--- a/android_webview/browser/state_serializer_unittest.cc
+++ b/android_webview/browser/state_serializer_unittest.cc
@@ -52,7 +52,7 @@
   entry->SetBaseURLForDataURL(base_url_for_data_url);
   {
     scoped_refptr<base::RefCountedString> s = new base::RefCountedString();
-    s->as_string() = data_url_as_string;
+    s->data().assign(data_url_as_string);
     entry->SetDataURLAsString(s);
   }
   entry->SetIsOverridingUserAgent(is_overriding_user_agent);
@@ -138,8 +138,8 @@
   EXPECT_EQ(entry->GetHasPostData(), copy->GetHasPostData());
   EXPECT_EQ(entry->GetOriginalRequestURL(), copy->GetOriginalRequestURL());
   EXPECT_EQ(entry->GetBaseURLForDataURL(), copy->GetBaseURLForDataURL());
-  EXPECT_EQ(entry->GetDataURLAsString()->as_string(),
-            copy->GetDataURLAsString()->as_string());
+  EXPECT_EQ(entry->GetDataURLAsString()->data(),
+            copy->GetDataURLAsString()->data());
   EXPECT_EQ(entry->GetIsOverridingUserAgent(),
             copy->GetIsOverridingUserAgent());
   EXPECT_EQ(entry->GetTimestamp(), copy->GetTimestamp());
@@ -278,7 +278,7 @@
   huge_data_url.replace(0, strlen(url::kDataScheme), url::kDataScheme);
   {
     scoped_refptr<base::RefCountedString> s = new base::RefCountedString();
-    s->as_string().assign(huge_data_url);
+    s->data().assign(huge_data_url);
     entry->SetDataURLAsString(s);
   }
 
@@ -293,7 +293,7 @@
   bool result = internal::RestoreNavigationEntryFromPickle(
       &iterator, copy.get(), context.get());
   EXPECT_TRUE(result);
-  EXPECT_EQ(huge_data_url, copy->GetDataURLAsString()->as_string());
+  EXPECT_EQ(huge_data_url, copy->GetDataURLAsString()->data());
 }
 
 }  // namespace android_webview
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index f0c52f89..8626d68 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1071,6 +1071,7 @@
     "picker/views/picker_widget.h",
     "picker/views/picker_zero_state_view.cc",
     "picker/views/picker_zero_state_view.h",
+    "picker/views/picker_zero_state_view_delegate.h",
     "policy/policy_recommendation_restorer.cc",
     "policy/policy_recommendation_restorer.h",
     "power/hid_battery_util.cc",
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc
index f20406e..68abf73 100644
--- a/ash/app_list/views/app_list_folder_view.cc
+++ b/ash/app_list/views/app_list_folder_view.cc
@@ -626,8 +626,9 @@
   ~ScrollViewWithMaxHeight() override = default;
 
   // views::View:
-  gfx::Size CalculatePreferredSize() const override {
-    gfx::Size size = views::ScrollView::CalculatePreferredSize();
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override {
+    gfx::Size size = views::ScrollView::CalculatePreferredSize(available_size);
     const int tile_height =
         folder_view_->items_grid_view()->GetTotalTileSize(/*page=*/0).height();
     // Show a maximum of 4 full rows, plus a little bit of the next row to make
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc
index 56154d3..0f1fa4d 100644
--- a/ash/assistant/ui/main_stage/suggestion_container_view.cc
+++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -122,7 +122,8 @@
     AssistantSuggestionsController::Get()->GetModel()->RemoveObserver(this);
 }
 
-gfx::Size SuggestionContainerView::CalculatePreferredSize() const {
+gfx::Size SuggestionContainerView::CalculatePreferredSize(
+    const views::SizeBounds& available_size) const {
   return gfx::Size(INT_MAX, GetHeightForWidth(INT_MAX));
 }
 
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.h b/ash/assistant/ui/main_stage/suggestion_container_view.h
index fa7c3456..65de3f1 100644
--- a/ash/assistant/ui/main_stage/suggestion_container_view.h
+++ b/ash/assistant/ui/main_stage/suggestion_container_view.h
@@ -45,7 +45,8 @@
   ~SuggestionContainerView() override;
 
   // AnimatedContainerView:
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override;
   int GetHeightForWidth(int width) const override;
   void OnContentsPreferredSizeChanged(views::View* content_view) override;
   void OnAssistantControllerDestroying() override;
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc
index c010a89..cc1e7e1 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.cc
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -94,7 +94,8 @@
 
 UiElementContainerView::~UiElementContainerView() = default;
 
-gfx::Size UiElementContainerView::CalculatePreferredSize() const {
+gfx::Size UiElementContainerView::CalculatePreferredSize(
+    const views::SizeBounds& available_size) const {
   return gfx::Size(INT_MAX, GetHeightForWidth(INT_MAX));
 }
 
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.h b/ash/assistant/ui/main_stage/ui_element_container_view.h
index 915a5a5..ec5c818 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.h
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.h
@@ -41,7 +41,8 @@
   void OnOverflowIndicatorVisibilityChanged(bool is_visible);
 
   // AnimatedContainerView:
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override;
   int GetHeightForWidth(int width) const override;
   gfx::Size GetMinimumSize() const override;
   void Layout(PassKey) override;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 6fff71a..90c7152b 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1937,11 +1937,6 @@
              "MultiZoneRgbKeyboard",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enables support for multilingual assistive typing on ChromeOS.
-BASE_FEATURE(kMultilingualTyping,
-             "MultilingualTyping",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enables Nearby Connections to specificy KeepAlive interval and timeout while
 // also making the Nearby Connections WebRTC defaults longer.
 BASE_FEATURE(kNearbyKeepAliveFix,
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 81a9ae7..ca55bbd 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -586,7 +586,6 @@
 extern const base::FeatureParam<base::TimeDelta>
     kMultiDeviceSetupNotificationTimeLimit;
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMultiZoneRgbKeyboard);
-COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMultilingualTyping);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNearbyKeepAliveFix);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNearbyPresence);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNotificationLimit);
diff --git a/ash/picker/views/picker_view.cc b/ash/picker/views/picker_view.cc
index 62d792a6..70ea330 100644
--- a/ash/picker/views/picker_view.cc
+++ b/ash/picker/views/picker_view.cc
@@ -208,6 +208,15 @@
   performance_metrics_.StopRecording();
 }
 
+void PickerView::SelectZeroStateCategory(PickerCategory category) {
+  SelectCategory(category);
+}
+
+void PickerView::SelectSuggestedZeroStateResult(
+    const PickerSearchResult& result) {
+  SelectSearchResult(result);
+}
+
 gfx::Rect PickerView::GetTargetBounds(const gfx::Rect& anchor_bounds,
                                       PickerLayoutType layout_type) {
   return GetPickerViewBounds(anchor_bounds, layout_type, size(),
@@ -345,16 +354,13 @@
                                views::MaximumFlexSizeRule::kUnbounded)
           .WithWeight(1));
 
-  // `base::Unretained` is safe here because this class owns
-  // `zero_state_view_`, `category_view_` and `search_results_view`_.
   zero_state_view_ =
       contents_view_->AddPage(std::make_unique<PickerZeroStateView>(
-          delegate_->GetAvailableCategories(),
-          delegate_->ShouldShowSuggestedResults(), kPickerSize.width(),
-          base::BindRepeating(&PickerView::SelectCategory,
-                              base::Unretained(this)),
-          base::BindRepeating(&PickerView::SelectSearchResult,
-                              base::Unretained(this))));
+          this, delegate_->GetAvailableCategories(),
+          delegate_->ShouldShowSuggestedResults(), kPickerSize.width()));
+
+  // `base::Unretained` is safe here because this class owns
+  // `zero_state_view_`, `category_view_` and `search_results_view`_.
   category_view_ = contents_view_->AddPage(std::make_unique<PickerCategoryView>(
       kPickerSize.width(),
       base::BindOnce(&PickerView::SelectSearchResult, base::Unretained(this)),
diff --git a/ash/picker/views/picker_view.h b/ash/picker/views/picker_view.h
index 90080967..07183fc5 100644
--- a/ash/picker/views/picker_view.h
+++ b/ash/picker/views/picker_view.h
@@ -12,6 +12,7 @@
 #include "ash/picker/metrics/picker_performance_metrics.h"
 #include "ash/picker/model/picker_search_results_section.h"
 #include "ash/picker/views/picker_key_event_handler.h"
+#include "ash/picker/views/picker_zero_state_view_delegate.h"
 #include "ash/public/cpp/ash_web_view.h"
 #include "ash/public/cpp/picker/picker_category.h"
 #include "base/memory/weak_ptr.h"
@@ -39,7 +40,8 @@
 class SystemShadow;
 
 // View for the Picker widget.
-class ASH_EXPORT PickerView : public views::WidgetDelegateView {
+class ASH_EXPORT PickerView : public views::WidgetDelegateView,
+                              public PickerZeroStateViewDelegate {
   METADATA_HEADER(PickerView, views::WidgetDelegateView)
 
  public:
@@ -63,6 +65,11 @@
   void AddedToWidget() override;
   void RemovedFromWidget() override;
 
+  // PickerZeroStateViewDelegate:
+  void SelectZeroStateCategory(PickerCategory category) override;
+  void SelectSuggestedZeroStateResult(
+      const PickerSearchResult& result) override;
+
   // Returns the target bounds for this Picker view. The target bounds try to
   // vertically align `search_field_view_` with `anchor_bounds`. `anchor_bounds`
   // and returned bounds should be in screen coordinates.
diff --git a/ash/picker/views/picker_zero_state_view.cc b/ash/picker/views/picker_zero_state_view.cc
index b858b13..aa69848 100644
--- a/ash/picker/views/picker_zero_state_view.cc
+++ b/ash/picker/views/picker_zero_state_view.cc
@@ -19,6 +19,7 @@
 #include "ash/picker/views/picker_section_list_view.h"
 #include "ash/picker/views/picker_section_view.h"
 #include "ash/picker/views/picker_strings.h"
+#include "ash/picker/views/picker_zero_state_view_delegate.h"
 #include "ash/public/cpp/picker/picker_category.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -78,12 +79,11 @@
 
 std::unique_ptr<PickerListItemView> CreateListItemViewForSearchResult(
     const PickerSearchResult& result,
-    PickerZeroStateView::SelectSearchResultCallback callback) {
+    PickerListItemView::SelectItemCallback callback) {
   // Only supports Clipboard results right now.
   if (auto* data =
           std::get_if<PickerSearchResult::ClipboardData>(&result.data())) {
-    return CreateListItemViewForClipboardResult(
-        *data, base::BindRepeating(std::move(callback), result));
+    return CreateListItemViewForClipboardResult(*data, std::move(callback));
   }
   return nullptr;
 }
@@ -91,12 +91,11 @@
 }  // namespace
 
 PickerZeroStateView::PickerZeroStateView(
+    PickerZeroStateViewDelegate* delegate,
     base::span<const PickerCategory> available_categories,
     bool show_suggested_results,
-    int picker_view_width,
-    SelectCategoryCallback select_category_callback,
-    SelectSearchResultCallback select_result_callback)
-    : select_result_callback_(std::move(select_result_callback)) {
+    int picker_view_width)
+    : delegate_(delegate) {
   SetLayoutManager(std::make_unique<views::FlexLayout>())
       ->SetOrientation(views::LayoutOrientation::kVertical);
 
@@ -113,7 +112,8 @@
 
   for (PickerCategory category : available_categories) {
     auto item_view = std::make_unique<PickerListItemView>(
-        base::BindRepeating(select_category_callback, category));
+        base::BindRepeating(&PickerZeroStateView::OnCategorySelected,
+                            weak_ptr_factory_.GetWeakPtr(), category));
     item_view->SetPrimaryText(GetLabelForPickerCategory(category));
     item_view->SetLeadingIcon(GetIconForPickerCategory(category));
     GetOrCreateSectionView(category)->AddListItem(std::move(item_view));
@@ -249,6 +249,15 @@
   return section_view;
 }
 
+void PickerZeroStateView::OnCategorySelected(PickerCategory category) {
+  delegate_->SelectZeroStateCategory(category);
+}
+
+void PickerZeroStateView::OnSuggestedResultSelected(
+    const PickerSearchResult& result) {
+  delegate_->SelectSuggestedZeroStateResult(result);
+}
+
 void PickerZeroStateView::SetPseudoFocusedView(views::View* view) {
   if (pseudo_focused_view_ == view) {
     return;
@@ -298,8 +307,10 @@
   }
   for (const auto& result : results) {
     if (std::unique_ptr<PickerListItemView> item_view =
-            CreateListItemViewForSearchResult(result,
-                                              select_result_callback_)) {
+            CreateListItemViewForSearchResult(
+                result, base::BindRepeating(
+                            &PickerZeroStateView::OnSuggestedResultSelected,
+                            weak_ptr_factory_.GetWeakPtr(), result))) {
       suggested_section_view_->AddListItem(std::move(item_view));
     }
   }
diff --git a/ash/picker/views/picker_zero_state_view.h b/ash/picker/views/picker_zero_state_view.h
index a3fcc16..faa66b0 100644
--- a/ash/picker/views/picker_zero_state_view.h
+++ b/ash/picker/views/picker_zero_state_view.h
@@ -29,25 +29,17 @@
 class PickerSearchResult;
 class PickerSectionListView;
 class PickerSectionView;
+class PickerZeroStateViewDelegate;
 
 class ASH_EXPORT PickerZeroStateView : public PickerPageView {
   METADATA_HEADER(PickerZeroStateView, PickerPageView)
 
  public:
-  // Indicates the user has selected a category.
-  using SelectCategoryCallback =
-      base::RepeatingCallback<void(PickerCategory category)>;
-
-  // Indicates the user has selected a result.
-  using SelectSearchResultCallback =
-      base::RepeatingCallback<void(const PickerSearchResult& result)>;
-
   explicit PickerZeroStateView(
+      PickerZeroStateViewDelegate* delegate,
       base::span<const PickerCategory> available_categories,
       bool show_suggested_results,
-      int picker_view_width,
-      SelectCategoryCallback select_category_callback,
-      SelectSearchResultCallback select_result_callback);
+      int picker_view_width);
   PickerZeroStateView(const PickerZeroStateView&) = delete;
   PickerZeroStateView& operator=(const PickerZeroStateView&) = delete;
   ~PickerZeroStateView() override;
@@ -70,6 +62,9 @@
   }
 
  private:
+  void OnCategorySelected(PickerCategory category);
+  void OnSuggestedResultSelected(const PickerSearchResult& result);
+
   // Gets or creates the section to contain `category`.
   PickerSectionView* GetOrCreateSectionView(PickerCategory category);
 
@@ -79,7 +74,7 @@
 
   void OnFetchSuggestedResults(std::vector<PickerSearchResult> result);
 
-  SelectSearchResultCallback select_result_callback_;
+  raw_ptr<PickerZeroStateViewDelegate> delegate_;
 
   // The section list view, contains the section views.
   raw_ptr<PickerSectionListView> section_list_view_ = nullptr;
diff --git a/ash/picker/views/picker_zero_state_view_delegate.h b/ash/picker/views/picker_zero_state_view_delegate.h
new file mode 100644
index 0000000..fe741189
--- /dev/null
+++ b/ash/picker/views/picker_zero_state_view_delegate.h
@@ -0,0 +1,26 @@
+// Copyright 2024 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_PICKER_VIEWS_PICKER_ZERO_STATE_VIEW_DELEGATE_H_
+#define ASH_PICKER_VIEWS_PICKER_ZERO_STATE_VIEW_DELEGATE_H_
+
+#include "ash/ash_export.h"
+#include "ash/public/cpp/picker/picker_category.h"
+
+namespace ash {
+
+class PickerSearchResult;
+
+// Delegate for `PickerZeroStateView`.
+class ASH_EXPORT PickerZeroStateViewDelegate {
+ public:
+  virtual void SelectZeroStateCategory(PickerCategory category) = 0;
+
+  virtual void SelectSuggestedZeroStateResult(
+      const PickerSearchResult& result) = 0;
+};
+
+}  // namespace ash
+
+#endif  // ASH_PICKER_VIEWS_PICKER_ZERO_STATE_VIEW_DELEGATE_H_
diff --git a/ash/picker/views/picker_zero_state_view_unittest.cc b/ash/picker/views/picker_zero_state_view_unittest.cc
index 367408f..5b86013b 100644
--- a/ash/picker/views/picker_zero_state_view_unittest.cc
+++ b/ash/picker/views/picker_zero_state_view_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/picker/views/picker_category_type.h"
 #include "ash/picker/views/picker_item_view.h"
 #include "ash/picker/views/picker_section_view.h"
+#include "ash/picker/views/picker_zero_state_view_delegate.h"
 #include "ash/public/cpp/picker/picker_category.h"
 #include "ash/public/cpp/picker/picker_search_result.h"
 #include "ash/style/ash_color_provider.h"
@@ -30,13 +31,16 @@
 namespace ash {
 namespace {
 
+using ::testing::AllOf;
 using ::testing::Contains;
 using ::testing::ElementsAre;
+using ::testing::Field;
 using ::testing::IsEmpty;
 using ::testing::IsNull;
 using ::testing::Key;
 using ::testing::Not;
 using ::testing::Property;
+using ::testing::VariantWith;
 
 constexpr int kPickerWidth = 320;
 
@@ -51,14 +55,23 @@
     PickerCategory::kUnitsMaths,
 }};
 
+class MockZeroStateViewDelegate : public PickerZeroStateViewDelegate {
+ public:
+  MOCK_METHOD(void, SelectZeroStateCategory, (PickerCategory), (override));
+  MOCK_METHOD(void,
+              SelectSuggestedZeroStateResult,
+              (const PickerSearchResult&),
+              (override));
+};
+
 class PickerZeroStateViewTest : public views::ViewsTestBase {
  private:
   AshColorProvider ash_color_provider_;
 };
 
 TEST_F(PickerZeroStateViewTest, CreatesCategorySections) {
-  PickerZeroStateView view(kAllCategories, true, kPickerWidth,
-                           base::DoNothing(), base::DoNothing());
+  MockZeroStateViewDelegate mock_delegate;
+  PickerZeroStateView view(&mock_delegate, kAllCategories, true, kPickerWidth);
 
   EXPECT_THAT(view.section_views_for_testing(),
               ElementsAre(Key(PickerCategoryType::kEditors),
@@ -70,10 +83,10 @@
 TEST_F(PickerZeroStateViewTest, LeftClickSelectsCategory) {
   std::unique_ptr<views::Widget> widget = CreateTestWidget();
   widget->SetFullscreen(true);
-  base::test::TestFuture<PickerCategory> future;
+  MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      std::vector<PickerCategory>{PickerCategory::kExpressions}, false,
-      kPickerWidth, future.GetRepeatingCallback(), base::DoNothing()));
+      &mock_delegate, std::vector<PickerCategory>{PickerCategory::kExpressions},
+      false, kPickerWidth));
   widget->Show();
   ASSERT_THAT(view->section_views_for_testing(),
               Contains(Key(PickerCategoryType::kGeneral)));
@@ -82,13 +95,15 @@
                   ->second->item_views_for_testing(),
               Not(IsEmpty()));
 
+  EXPECT_CALL(mock_delegate,
+              SelectZeroStateCategory(PickerCategory::kExpressions))
+      .Times(1);
+
   PickerItemView* category_view = view->section_views_for_testing()
                                       .find(PickerCategoryType::kGeneral)
                                       ->second->item_views_for_testing()[0];
   ViewDrawnWaiter().Wait(category_view);
   LeftClickOn(*category_view);
-
-  EXPECT_EQ(future.Get(), PickerCategory::kExpressions);
 }
 
 TEST_F(PickerZeroStateViewTest, ShowsClipboardItems) {
@@ -110,23 +125,31 @@
   std::unique_ptr<views::Widget> widget = CreateTestWidget();
   widget->SetFullscreen(true);
   base::test::TestFuture<const PickerSearchResult&> future;
+  MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      kAllCategories, true, kPickerWidth, base::DoNothing(),
-      future.GetRepeatingCallback()));
+      &mock_delegate, kAllCategories, true, kPickerWidth));
   widget->Show();
 
-  EXPECT_THAT(view->SuggestedSectionForTesting(), Not(IsNull()));
+  EXPECT_CALL(
+      mock_delegate,
+      SelectSuggestedZeroStateResult(Property(
+          "data", &ash::PickerSearchResult::data,
+          VariantWith<ash::PickerSearchResult::ClipboardData>(AllOf(
+              Field("item_id", &ash::PickerSearchResult::ClipboardData::item_id,
+                    item_id),
+              Field("display_format",
+                    &ash::PickerSearchResult::ClipboardData::display_format,
+                    PickerSearchResult::ClipboardData::DisplayFormat::kText),
+              Field("display_text",
+                    &ash::PickerSearchResult::ClipboardData::display_text,
+                    u"test"))))))
+      .Times(1);
+
+  ASSERT_THAT(view->SuggestedSectionForTesting(), Not(IsNull()));
   PickerItemView* item_view =
       view->SuggestedSectionForTesting()->item_views_for_testing()[0];
-
   ViewDrawnWaiter().Wait(item_view);
   LeftClickOn(*item_view);
-
-  EXPECT_EQ(
-      future.Get(),
-      PickerSearchResult::Clipboard(
-          item_id, PickerSearchResult::ClipboardData::DisplayFormat::kText,
-          u"test", /*display_image=*/{}));
 }
 
 TEST_F(PickerZeroStateViewTest, HidesSuggestedSectionWhenNoItemsToDisplay) {
@@ -139,9 +162,9 @@
 
   std::unique_ptr<views::Widget> widget = CreateTestWidget();
   widget->SetFullscreen(true);
+  MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      kAllCategories, true, kPickerWidth, base::DoNothing(),
-      base::DoNothing()));
+      &mock_delegate, kAllCategories, true, kPickerWidth));
   widget->Show();
 
   EXPECT_THAT(view->SuggestedSectionForTesting(), IsNull());
@@ -150,9 +173,9 @@
 TEST_F(PickerZeroStateViewTest, DoesntShowClipboardItems) {
   std::unique_ptr<views::Widget> widget = CreateTestWidget();
   widget->SetFullscreen(true);
+  MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      kAllCategories, false, kPickerWidth, base::DoNothing(),
-      base::DoNothing()));
+      &mock_delegate, kAllCategories, false, kPickerWidth));
   widget->Show();
 
   EXPECT_THAT(view->SuggestedSectionForTesting(), IsNull());
diff --git a/ash/quick_pair/repository/fast_pair/proto_conversions.cc b/ash/quick_pair/repository/fast_pair/proto_conversions.cc
index 95f68d05..12ccbb0 100644
--- a/ash/quick_pair/repository/fast_pair/proto_conversions.cc
+++ b/ash/quick_pair/repository/fast_pair/proto_conversions.cc
@@ -56,7 +56,8 @@
                                StoredDiscoveryItem_State_STATE_ENABLED);
 
   auto image_memory = device_metadata->image().As1xPNGBytes();
-  std::string png_encoded_image(base::as_string_view(*image_memory));
+  std::string png_encoded_image(image_memory->front_as<char>(),
+                                image_memory->size());
   discovery_item.set_icon_png(png_encoded_image);
 
   discovery_item.add_stored_relevances()->mutable_relevance()->set_evaluation(
diff --git a/ash/style/style_viewer/pagination_instances_grid_view_factory.cc b/ash/style/style_viewer/pagination_instances_grid_view_factory.cc
index 937435e..e9c3267 100644
--- a/ash/style/style_viewer/pagination_instances_grid_view_factory.cc
+++ b/ash/style/style_viewer/pagination_instances_grid_view_factory.cc
@@ -119,7 +119,8 @@
   ~PaginationTestScrollView() override = default;
 
   // views::ScrollView:
-  gfx::Size CalculatePreferredSize() const override {
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override {
     return gfx::Size(kPageWidth, kPageHeight);
   }
 
diff --git a/ash/system/input_device_settings/input_device_settings_notification_controller_unittest.cc b/ash/system/input_device_settings/input_device_settings_notification_controller_unittest.cc
index acbfae5..d676c7e 100644
--- a/ash/system/input_device_settings/input_device_settings_notification_controller_unittest.cc
+++ b/ash/system/input_device_settings/input_device_settings_notification_controller_unittest.cc
@@ -17,6 +17,7 @@
 #include "ash/system/toast/anchored_nudge_manager_impl.h"
 #include "ash/test/ash_test_base.h"
 #include "base/containers/contains.h"
+#include "base/run_loop.h"
 #include "base/values.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -96,6 +97,7 @@
 
 void CancelNudge(const std::string& id) {
   Shell::Get()->anchored_nudge_manager()->Cancel(id);
+  base::RunLoop().RunUntilIdle();
 }
 
 }  // namespace
@@ -568,22 +570,17 @@
 
 TEST_F(InputDeviceSettingsNotificationControllerTest,
        ShowTopRowRewritingNudge) {
-  const AnchoredNudge* nudge =
-      Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
-          kTopRowKeyNoMatchNudgeId);
-  ASSERT_FALSE(nudge);
+  AnchoredNudgeManagerImpl* nudge_manager =
+      Shell::Get()->anchored_nudge_manager();
+  ASSERT_TRUE(nudge_manager);
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kTopRowKeyNoMatchNudgeId));
 
   controller()->ShowTopRowRewritingNudge();
-  const AnchoredNudge* nudge_shown =
-      Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
-          kTopRowKeyNoMatchNudgeId);
-  ASSERT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kTopRowKeyNoMatchNudgeId));
 }
 
-// TODO(crbug.com/334987779): Re-enable this test
 TEST_F(InputDeviceSettingsNotificationControllerTest,
-       DISABLED_ShowSixPackKeyRewritingNudge) {
+       ShowSixPackKeyRewritingNudge) {
   const AnchoredNudge* nudge =
       Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
           kSixPackKeyNoMatchNudgeId);
@@ -601,106 +598,89 @@
       prefs::kKeyboardDefaultChromeOSSettings, std::move(remappings));
   AnchoredNudgeManagerImpl* nudge_manager =
       Shell::Get()->anchored_nudge_manager();
-  EXPECT_TRUE(nudge_manager);
+  ASSERT_TRUE(nudge_manager);
 
   // Display nudge for VKEY_INSERT.
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_INSERT, ui::mojom::SixPackShortcutModifier::kSearch);
-  const AnchoredNudge* nudge_shown =
-      nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId);
-  ASSERT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   EXPECT_EQ(
       nudge_manager->GetNudgeBodyTextForTest(kSixPackKeyNoMatchNudgeId),
       l10n_util::GetStringUTF16(
           IDS_ASH_SETTINGS_KEYBOARD_USE_FN_KEY_FOR_SEARCH_PLUS_SHIFT_BACKSPACE_NUDGE_DESCRIPTION));
   CancelNudge(kSixPackKeyNoMatchNudgeId);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Display nudge for VKEY_DELETE.
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_DELETE, ui::mojom::SixPackShortcutModifier::kSearch);
   // Modifier not match, nudge should not show.
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_DELETE, ui::mojom::SixPackShortcutModifier::kAlt);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   EXPECT_EQ(
       nudge_manager->GetNudgeBodyTextForTest(kSixPackKeyNoMatchNudgeId),
       l10n_util::GetStringUTF16(
           IDS_ASH_SETTINGS_KEYBOARD_USE_FN_KEY_FOR_ALT_PLUS_BACKSPACE_NUDGE_DESCRIPTION));
   CancelNudge(kSixPackKeyNoMatchNudgeId);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Display nudge for VKEY_HOME.
-  EXPECT_FALSE(nudge_shown->GetVisible());
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_HOME, ui::mojom::SixPackShortcutModifier::kSearch);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   EXPECT_EQ(
       nudge_manager->GetNudgeBodyTextForTest(kSixPackKeyNoMatchNudgeId),
       l10n_util::GetStringUTF16(
           IDS_ASH_SETTINGS_KEYBOARD_USE_FN_KEY_FOR_SEARCH_PLUS_LEFT_NUDGE_DESCRIPTION));
   CancelNudge(kSixPackKeyNoMatchNudgeId);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Display nudge for VKEY_END.
-  EXPECT_FALSE(nudge_shown->GetVisible());
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_END, ui::mojom::SixPackShortcutModifier::kSearch);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   EXPECT_EQ(
       nudge_manager->GetNudgeBodyTextForTest(kSixPackKeyNoMatchNudgeId),
       l10n_util::GetStringUTF16(
           IDS_ASH_SETTINGS_KEYBOARD_USE_FN_KEY_FOR_SEARCH_PLUS_RIGHT_NUDGE_DESCRIPTION));
   CancelNudge(kSixPackKeyNoMatchNudgeId);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Display nudge for VKEY_PRIOR.
-  EXPECT_FALSE(nudge_shown->GetVisible());
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_PRIOR, ui::mojom::SixPackShortcutModifier::kAlt);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
   EXPECT_EQ(
       nudge_manager->GetNudgeBodyTextForTest(kSixPackKeyNoMatchNudgeId),
       l10n_util::GetStringUTF16(
           IDS_ASH_SETTINGS_KEYBOARD_USE_FN_KEY_FOR_ALT_PLUS_UP_NUDGE_DESCRIPTION));
   CancelNudge(kSixPackKeyNoMatchNudgeId);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Six pack key VKEY_NEXT is not in the prefDict, should not show anything.
-  EXPECT_FALSE(nudge_shown->GetVisible());
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_NEXT, ui::mojom::SixPackShortcutModifier::kSearch);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 
   // Call the method with a non six pack key, should not show anything.
   // Six pack key VKEY_NEXT is not in the prefDict, should not show anything.
-  EXPECT_FALSE(nudge_shown->GetVisible());
   controller()->ShowSixPackKeyRewritingNudge(
       ui::VKEY_BRIGHTNESS_UP, ui::mojom::SixPackShortcutModifier::kSearch);
-  EXPECT_TRUE(nudge_shown);
-  EXPECT_FALSE(nudge_shown->GetVisible());
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kSixPackKeyNoMatchNudgeId));
 }
 
 TEST_F(InputDeviceSettingsNotificationControllerTest,
        ShowCapsLockRewritingNudge) {
-  const AnchoredNudge* nudge =
-      Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
-          kCapsLockNoMatchNudgeId);
-  ASSERT_FALSE(nudge);
+  AnchoredNudgeManagerImpl* nudge_manager =
+      Shell::Get()->anchored_nudge_manager();
+  ASSERT_TRUE(nudge_manager);
+  EXPECT_FALSE(nudge_manager->GetNudgeIfShown(kCapsLockNoMatchNudgeId));
 
   controller()->ShowCapsLockRewritingNudge();
-  const AnchoredNudge* nudge_shown =
-      Shell::Get()->anchored_nudge_manager()->GetNudgeIfShown(
-          kCapsLockNoMatchNudgeId);
-  ASSERT_TRUE(nudge_shown);
-  EXPECT_TRUE(nudge_shown->GetVisible());
+  EXPECT_TRUE(nudge_manager->GetNudgeIfShown(kCapsLockNoMatchNudgeId));
 }
 
 }  // namespace ash
diff --git a/ash/system/media/quick_settings_media_view.cc b/ash/system/media/quick_settings_media_view.cc
index c7cee77..ffbc55c 100644
--- a/ash/system/media/quick_settings_media_view.cc
+++ b/ash/system/media/quick_settings_media_view.cc
@@ -60,7 +60,8 @@
   ~MediaScrollView() override = default;
 
   // views::ScrollView:
-  gfx::Size CalculatePreferredSize() const override {
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override {
     return gfx::Size(kMediaViewWidth, media_view_->GetMediaViewHeight());
   }
 
diff --git a/ash/system/session/logout_button_tray.cc b/ash/system/session/logout_button_tray.cc
index c748ebc..692b61f 100644
--- a/ash/system/session/logout_button_tray.cc
+++ b/ash/system/session/logout_button_tray.cc
@@ -92,8 +92,7 @@
 void LogoutButtonTray::OnThemeChanged() {
   TrayBackgroundView::OnThemeChanged();
   const auto* color_provider = GetColorProvider();
-  button_->SetBgColorOverride(
-      color_provider->GetColor(cros_tokens::kColorAlert));
+  button_->SetBgColorIdOverride(cros_tokens::kColorAlert);
   button_->SetEnabledTextColors(
       color_provider->GetColor(cros_tokens::kColorPrimaryInverted));
 }
diff --git a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
index d08a214..a7f09aa 100644
--- a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
+++ b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
@@ -38,7 +38,7 @@
 
   if (image_metadata.empty()) {
     return gfx::JPEGCodec::Encode(bitmap, kDefaultEncodingQuality,
-                                  &(*output)->as_vector());
+                                  &(*output)->data());
   }
 
   SkPixmap pixmap;
@@ -51,7 +51,7 @@
 
   return gfx::JPEGCodec::Encode(pixmap, kDefaultEncodingQuality,
                                 SkJpegEncoder::Downsample::k420,
-                                &(*output)->as_vector(), xmpMetadata.get());
+                                &(*output)->data(), xmpMetadata.get());
 }
 
 // Resizes `image` to a resolution which is nearest to `preferred_width` and
diff --git a/ash/webui/demo_mode_app_ui/demo_mode_app_untrusted_ui_unittests.cc b/ash/webui/demo_mode_app_ui/demo_mode_app_untrusted_ui_unittests.cc
index 027c891..1e79359f 100644
--- a/ash/webui/demo_mode_app_ui/demo_mode_app_untrusted_ui_unittests.cc
+++ b/ash/webui/demo_mode_app_ui/demo_mode_app_untrusted_ui_unittests.cc
@@ -42,7 +42,8 @@
 void VerifyDataResponse(std::string expected_response,
                         base::OnceClosure quit_closure,
                         scoped_refptr<base::RefCountedMemory> data_response) {
-  EXPECT_EQ(base::as_string_view(*data_response), expected_response);
+  std::string result(data_response->front_as<char>(), data_response->size());
+  EXPECT_EQ(result, expected_response);
   std::move(quit_closure).Run();
 }
 
@@ -109,4 +110,4 @@
 }
 
 }  // namespace
-}  // namespace ash
+}  // namespace ash
\ No newline at end of file
diff --git a/ash/wm/gestures/wm_gesture_handler.cc b/ash/wm/gestures/wm_gesture_handler.cc
index 264faf4..9c0d8b9 100644
--- a/ash/wm/gestures/wm_gesture_handler.cc
+++ b/ash/wm/gestures/wm_gesture_handler.cc
@@ -14,9 +14,12 @@
 #include "ash/wm/window_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/time/time.h"
+#include "ui/aura/client/window_types.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/event.h"
 #include "ui/events/types/event_type.h"
+#include "ui/wm/core/capture_controller.h"
+#include "ui/wm/public/activation_client.h"
 
 namespace ash {
 
@@ -271,6 +274,16 @@
                  : false;
     }
 
+    // If the event should be captured by other normal window, do not handle
+    // this event as overview handling gesture. If it is captured by non-normal
+    // window (e.g. menu/popup), we can force enter overview mode.
+    aura::Window* capture_window =
+        ::wm::CaptureController::Get()->GetCaptureWindow();
+    if (capture_window &&
+        capture_window->GetType() == aura::client::WINDOW_TYPE_NORMAL) {
+      return false;
+    }
+
     if (std::fabs(scroll_x) < std::fabs(scroll_y)) {
       return Handle3FingerVerticalScroll(scroll_y);
     }
diff --git a/ash/wm/gestures/wm_gesture_handler_unittest.cc b/ash/wm/gestures/wm_gesture_handler_unittest.cc
index 9caec07..0839d7e7 100644
--- a/ash/wm/gestures/wm_gesture_handler_unittest.cc
+++ b/ash/wm/gestures/wm_gesture_handler_unittest.cc
@@ -30,6 +30,7 @@
 #include "base/files/file_path.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/prefs/pref_service.h"
+#include "ui/aura/client/window_types.h"
 #include "ui/aura/window.h"
 #include "ui/events/devices/device_hotplug_event_observer.h"
 #include "ui/events/devices/input_device.h"
@@ -37,6 +38,7 @@
 #include "ui/events/event_constants.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
+#include "ui/wm/core/capture_controller.h"
 
 namespace ash {
 
@@ -263,6 +265,80 @@
   EXPECT_TRUE(InOverviewSession());
 }
 
+TEST_F(WmGestureHandlerTest, EnterOverviewWithNormalCaptureWindow) {
+  base::TimeTicks timestamp = base::TimeTicks::Now();
+  constexpr int num_fingers = 3;
+  base::TimeDelta step_delay(base::Milliseconds(5));
+
+  // If 3 finger scroll event while there is a capture window is set to the
+  // normal type window, we should not handle the event as entering overview
+  // mode.
+  std::unique_ptr<aura::Window> normal_window =
+      CreateTestWindow(gfx::Rect(100, 100));
+  ::wm::CaptureController::Get()->SetCapture(normal_window.get());
+
+  ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, gfx::Point(),
+                               timestamp, 0, 0, 0, 0, 0, num_fingers);
+  GetEventGenerator()->Dispatch(&fling_cancel);
+
+  // Send ET_SCROLL events to initializae ScrollData.
+  for (int i = 0; i < 10; ++i) {
+    timestamp += step_delay;
+    ui::ScrollEvent move(ui::ET_SCROLL, gfx::Point(), timestamp, 0, 0,
+                         GetOffsetY(10), 0, GetOffsetY(10), num_fingers);
+    GetEventGenerator()->Dispatch(&move);
+  }
+
+  timestamp += step_delay;
+
+  ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START, gfx::Point(),
+                              timestamp, 0, 0, GetOffsetY(-10), 0,
+                              GetOffsetY(-10), num_fingers);
+  GetEventGenerator()->Dispatch(&fling_start);
+  EXPECT_FALSE(InOverviewSession());
+  ::wm::CaptureController::Get()->ReleaseCapture(normal_window.get());
+}
+
+TEST_F(WmGestureHandlerTest, EnterOverviewWithPopupCaptureWindow) {
+  base::TimeTicks timestamp = base::TimeTicks::Now();
+  constexpr int num_fingers = 3;
+  base::TimeDelta step_delay(base::Milliseconds(5));
+
+  // If 3 finger scroll event while there is a capture window is set to the
+  // window by not normal, we should ignore the capture state and handle the
+  // event as entering overview mode.
+  std::unique_ptr<aura::Window> normal_window =
+      CreateTestWindow(gfx::Rect(100, 100));
+  std::unique_ptr<aura::Window> popup_window =
+      std::make_unique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_POPUP);
+  popup_window->Init(ui::LAYER_NOT_DRAWN);
+  popup_window->SetBounds(gfx::Rect(100, 100));
+  normal_window->AddChild(popup_window.get());
+  popup_window->Show();
+  ::wm::CaptureController::Get()->SetCapture(popup_window.get());
+
+  ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, gfx::Point(),
+                               timestamp, 0, 0, 0, 0, 0, num_fingers);
+  GetEventGenerator()->Dispatch(&fling_cancel);
+
+  // Send ET_SCROLL events to initializae ScrollData.
+  for (int i = 0; i < 10; ++i) {
+    timestamp += step_delay;
+    ui::ScrollEvent move(ui::ET_SCROLL, gfx::Point(), timestamp, 0, 0,
+                         GetOffsetY(10), 0, GetOffsetY(10), num_fingers);
+    GetEventGenerator()->Dispatch(&move);
+  }
+
+  timestamp += step_delay;
+
+  ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START, gfx::Point(),
+                              timestamp, 0, 0, GetOffsetY(-10), 0,
+                              GetOffsetY(-10), num_fingers);
+  GetEventGenerator()->Dispatch(&fling_start);
+  EXPECT_TRUE(InOverviewSession());
+  ::wm::CaptureController::Get()->ReleaseCapture(popup_window.get());
+}
+
 // Test switch desk is disabled when screen is pinned.
 TEST_F(WmGestureHandlerTest, LockedModeNoSwitchDesk) {
   auto* desk_controller = DesksController::Get();
diff --git a/base/memory/ref_counted_memory.cc b/base/memory/ref_counted_memory.cc
index 3ca8854..b43e5091 100644
--- a/base/memory/ref_counted_memory.cc
+++ b/base/memory/ref_counted_memory.cc
@@ -13,76 +13,100 @@
 
 bool RefCountedMemory::Equals(
     const scoped_refptr<RefCountedMemory>& other) const {
-  return other && AsSpan() == other->AsSpan();
+  return other.get() && size() == other->size() &&
+         (size() == 0 || (memcmp(front(), other->front(), size()) == 0));
 }
 
 RefCountedMemory::RefCountedMemory() = default;
+
 RefCountedMemory::~RefCountedMemory() = default;
 
-RefCountedStaticMemory::RefCountedStaticMemory() = default;
-RefCountedStaticMemory::~RefCountedStaticMemory() = default;
-
-RefCountedStaticMemory::RefCountedStaticMemory(base::span<const uint8_t> bytes)
-    : bytes_(bytes) {}
-
-base::span<const uint8_t> RefCountedStaticMemory::AsSpan() const {
-  return bytes_;
+const unsigned char* RefCountedStaticMemory::front() const {
+  return data_;
 }
 
+size_t RefCountedStaticMemory::size() const {
+  return length_;
+}
+
+RefCountedStaticMemory::~RefCountedStaticMemory() = default;
+
 RefCountedBytes::RefCountedBytes() = default;
-RefCountedBytes::~RefCountedBytes() = default;
 
-RefCountedBytes::RefCountedBytes(std::vector<uint8_t> initializer)
-    : bytes_(std::move(initializer)) {}
+RefCountedBytes::RefCountedBytes(const std::vector<unsigned char>& initializer)
+    : data_(initializer) {}
 
-RefCountedBytes::RefCountedBytes(base::span<const uint8_t> initializer)
-    : bytes_(initializer.begin(), initializer.end()) {}
+RefCountedBytes::RefCountedBytes(base::span<const unsigned char> initializer)
+    : data_(initializer.begin(), initializer.end()) {}
 
-RefCountedBytes::RefCountedBytes(const uint8_t* p, size_t size)
-    : bytes_(p, p + size) {}
+RefCountedBytes::RefCountedBytes(const unsigned char* p, size_t size)
+    : data_(p, p + size) {}
 
-RefCountedBytes::RefCountedBytes(size_t size) : bytes_(size, 0u) {}
+RefCountedBytes::RefCountedBytes(size_t size) : data_(size, 0) {}
 
 scoped_refptr<RefCountedBytes> RefCountedBytes::TakeVector(
-    std::vector<uint8_t>* to_destroy) {
+    std::vector<unsigned char>* to_destroy) {
   auto bytes = MakeRefCounted<RefCountedBytes>();
-  bytes->bytes_.swap(*to_destroy);
+  bytes->data_.swap(*to_destroy);
   return bytes;
 }
 
-base::span<const uint8_t> RefCountedBytes::AsSpan() const {
-  return bytes_;
+const unsigned char* RefCountedBytes::front() const {
+  // STL will assert if we do front() on an empty vector, but calling code
+  // expects a NULL.
+  return size() ? &data_.front() : nullptr;
 }
 
+size_t RefCountedBytes::size() const {
+  return data_.size();
+}
+
+RefCountedBytes::~RefCountedBytes() = default;
+
 RefCountedString::RefCountedString() = default;
+
 RefCountedString::~RefCountedString() = default;
 
-RefCountedString::RefCountedString(std::string str) : string_(std::move(str)) {}
+RefCountedString::RefCountedString(std::string str) : data_(std::move(str)) {}
 
-base::span<const uint8_t> RefCountedString::AsSpan() const {
-  return base::as_byte_span(string_);
+const unsigned char* RefCountedString::front() const {
+  return data_.empty() ? nullptr
+                       : reinterpret_cast<const unsigned char*>(data_.data());
+}
+
+size_t RefCountedString::size() const {
+  return data_.size();
 }
 
 RefCountedString16::RefCountedString16() = default;
+
 RefCountedString16::~RefCountedString16() = default;
 
 RefCountedString16::RefCountedString16(std::u16string str)
-    : string_(std::move(str)) {}
+    : data_(std::move(str)) {}
 
-base::span<const uint8_t> RefCountedString16::AsSpan() const {
-  return base::as_byte_span(string_);
+const unsigned char* RefCountedString16::front() const {
+  return reinterpret_cast<const unsigned char*>(data_.data());
+}
+
+size_t RefCountedString16::size() const {
+  return data_.size() * sizeof(char16_t);
 }
 
 RefCountedSharedMemoryMapping::RefCountedSharedMemoryMapping(
     ReadOnlySharedMemoryMapping mapping)
-    : mapping_(std::move(mapping)) {
-  DCHECK_GT(mapping_.size(), 0u);
+    : mapping_(std::move(mapping)), size_(mapping_.size()) {
+  DCHECK_GT(size_, 0U);
 }
 
 RefCountedSharedMemoryMapping::~RefCountedSharedMemoryMapping() = default;
 
-base::span<const uint8_t> RefCountedSharedMemoryMapping::AsSpan() const {
-  return mapping_.GetMemoryAsSpan<const uint8_t>();
+const unsigned char* RefCountedSharedMemoryMapping::front() const {
+  return static_cast<const unsigned char*>(mapping_.memory());
+}
+
+size_t RefCountedSharedMemoryMapping::size() const {
+  return size_;
 }
 
 // static
diff --git a/base/memory/ref_counted_memory.h b/base/memory/ref_counted_memory.h
index aebcebd..8705d9d 100644
--- a/base/memory/ref_counted_memory.h
+++ b/base/memory/ref_counted_memory.h
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "base/base_export.h"
-#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/shared_memory_mapping.h"
@@ -24,76 +23,56 @@
 // A generic interface to memory. This object is reference counted because most
 // of its subclasses own the data they carry, and this interface needs to
 // support heterogeneous containers of these different types of memory.
-//
-// The RefCountedMemory class provides a const view of the data it holds, as it
-// does not require all subclassing implementations to hold mutable data. If a
-// mutable view is required, the code must maintain awareness of the subclass
-// type, and can access it through there, such as:
-// - RefCountedBytes provides `as_vector()` to give mutable access to its data.
-// - RefCountedString provides `as_string()` to give mutable access to its data.
 class BASE_EXPORT RefCountedMemory
     : public RefCountedThreadSafe<RefCountedMemory> {
  public:
-  // Returns true if `other` is byte for byte equal.
+  // Retrieves a pointer to the beginning of the data we point to. If the data
+  // is empty, this will return NULL.
+  virtual const unsigned char* front() const = 0;
+
+  // Size of the memory pointed to.
+  virtual size_t size() const = 0;
+
+  // Returns true if |other| is byte for byte equal.
   bool Equals(const scoped_refptr<RefCountedMemory>& other) const;
 
-  // Allow explicit conversion to `base::span<const uint8_t>`. Use a span to
-  // access the data in a safe way, rather than calling `data()` explicitly.
-  //
-  // Example:
-  // ```
-  // auto data = base::MakeRefCounted<base::RefCountedBytes>(
-  //     std::vector<uint8_t>{1, 2, 3});
-  // base::span<const uint8_t> v = base::span(data);
-  // v[2] = uint8_t{4};
-  // ```
-  const uint8_t* data() const LIFETIME_BOUND { return AsSpan().data(); }
-  size_t size() const { return AsSpan().size(); }
-
-  using iterator = base::span<const uint8_t>::iterator;
-  iterator begin() const LIFETIME_BOUND { return AsSpan().begin(); }
-  iterator end() const LIFETIME_BOUND { return AsSpan().end(); }
-
-  // TODO(danakj): Remove all callers and remove this.
-  const uint8_t* front() const LIFETIME_BOUND { return AsSpan().data(); }
-
-  // The data/size members (or begin/end) give conversion to span already, but
-  // we provide this operator as an optimization to combine two virtual method
-  // calls into one.
-  explicit operator base::span<const uint8_t>() const LIFETIME_BOUND {
-    return AsSpan();
+  // Handy method to simplify calling front() with a reinterpret_cast.
+  template<typename T> const T* front_as() const {
+    return reinterpret_cast<const T*>(front());
   }
 
+  const unsigned char* data() const { return front(); }
+
+  const unsigned char* begin() const { return data(); }
+  const unsigned char* end() const { return data() + size(); }
+
  protected:
   friend class RefCountedThreadSafe<RefCountedMemory>;
   RefCountedMemory();
   virtual ~RefCountedMemory();
-
-  virtual base::span<const uint8_t> AsSpan() const LIFETIME_BOUND = 0;
 };
 
-// An implementation of RefCountedMemory, for pointing to memory with a static
-// lifetime. Since the memory exists for the life of the program, the class can
-// not and does not need to take ownership of it.
+// An implementation of RefCountedMemory, where the ref counting does not
+// matter.
 class BASE_EXPORT RefCountedStaticMemory : public RefCountedMemory {
  public:
-  RefCountedStaticMemory();
-  explicit RefCountedStaticMemory(base::span<const uint8_t> bytes);
-
-  // TODO(crbug.com/40284755): Remove this overload, use the span ctor instead.
+  RefCountedStaticMemory() : data_(nullptr), length_(0) {}
   RefCountedStaticMemory(const void* data, size_t length)
-      : UNSAFE_BUFFERS(bytes_(static_cast<const uint8_t*>(data), length)) {}
+      : data_(static_cast<const unsigned char*>(length ? data : nullptr)),
+        length_(length) {}
 
   RefCountedStaticMemory(const RefCountedStaticMemory&) = delete;
   RefCountedStaticMemory& operator=(const RefCountedStaticMemory&) = delete;
 
+  // RefCountedMemory:
+  const unsigned char* front() const override;
+  size_t size() const override;
+
  private:
   ~RefCountedStaticMemory() override;
 
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
-  base::span<const uint8_t> bytes_;
+  const unsigned char* data_;
+  size_t length_;
 };
 
 // An implementation of RefCountedMemory, where the data is stored in a STL
@@ -103,13 +82,11 @@
   RefCountedBytes();
 
   // Constructs a RefCountedBytes object by copying from |initializer|.
-  explicit RefCountedBytes(std::vector<uint8_t> initializer);
-  explicit RefCountedBytes(base::span<const uint8_t> initializer);
+  explicit RefCountedBytes(const std::vector<unsigned char>& initializer);
+  explicit RefCountedBytes(base::span<const unsigned char> initializer);
 
   // Constructs a RefCountedBytes object by copying |size| bytes from |p|.
-  //
-  // TODO(crbug.com/40284755): Remove this overload, use the span ctor instead.
-  RefCountedBytes(const uint8_t* p, size_t size);
+  RefCountedBytes(const unsigned char* p, size_t size);
 
   // Constructs a RefCountedBytes object by zero-initializing a new vector of
   // |size| bytes.
@@ -121,22 +98,28 @@
   // Constructs a RefCountedBytes object by performing a swap. (To non
   // destructively build a RefCountedBytes, use the constructor that takes a
   // vector.)
-  //
-  // TODO(danakj): This can be removed, as callers can now move() the vector to
-  // the ctor instead.
   static scoped_refptr<RefCountedBytes> TakeVector(
-      std::vector<uint8_t>* to_destroy);
+      std::vector<unsigned char>* to_destroy);
 
-  const std::vector<uint8_t>& as_vector() const { return bytes_; }
-  std::vector<uint8_t>& as_vector() { return bytes_; }
+  // RefCountedMemory:
+  const unsigned char* front() const override;
+  size_t size() const override;
+
+  const std::vector<unsigned char>& data() const { return data_; }
+  std::vector<unsigned char>& data() { return data_; }
+
+  // Non-const versions of front() and front_as() that are simply shorthand for
+  // data().data().
+  unsigned char* front() { return data_.data(); }
+  template <typename T>
+  T* front_as() {
+    return reinterpret_cast<T*>(front());
+  }
 
  private:
   ~RefCountedBytes() override;
 
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
-  std::vector<uint8_t> bytes_;
+  std::vector<unsigned char> data_;
 };
 
 // An implementation of RefCountedMemory, where the bytes are stored in a STL
@@ -149,16 +132,17 @@
   RefCountedString(const RefCountedString&) = delete;
   RefCountedString& operator=(const RefCountedString&) = delete;
 
-  const std::string& as_string() const { return string_; }
-  std::string& as_string() { return string_; }
+  // RefCountedMemory:
+  const unsigned char* front() const override;
+  size_t size() const override;
+
+  const std::string& data() const { return data_; }
+  std::string& data() { return data_; }
 
  private:
   ~RefCountedString() override;
 
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
-  std::string string_;
+  std::string data_;
 };
 
 // An implementation of RefCountedMemory, where the bytes are stored in a
@@ -171,16 +155,15 @@
   RefCountedString16(const RefCountedString16&) = delete;
   RefCountedString16& operator=(const RefCountedString16&) = delete;
 
-  const std::u16string& as_string() const { return string_; }
-  std::u16string& as_string() { return string_; }
+  // RefCountedMemory:
+  const unsigned char* front() const override;
+  size_t size() const override;
 
- private:
+ protected:
   ~RefCountedString16() override;
 
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
-  std::u16string string_;
+ private:
+  std::u16string data_;
 };
 
 // An implementation of RefCountedMemory, where the bytes are stored in
@@ -195,18 +178,20 @@
   RefCountedSharedMemoryMapping& operator=(
       const RefCountedSharedMemoryMapping&) = delete;
 
-  // Convenience method to map all of `region` and take ownership of the
-  // mapping. Returns a null `scoped_refptr` if the map operation fails.
+  // Convenience method to map all of |region| and take ownership of the
+  // mapping. Returns an empty scoped_refptr if the map operation fails.
   static scoped_refptr<RefCountedSharedMemoryMapping> CreateFromWholeRegion(
       const ReadOnlySharedMemoryRegion& region);
 
+  // RefCountedMemory:
+  const unsigned char* front() const override;
+  size_t size() const override;
+
  private:
   ~RefCountedSharedMemoryMapping() override;
 
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
   const ReadOnlySharedMemoryMapping mapping_;
+  const size_t size_;
 };
 
 }  // namespace base
diff --git a/base/memory/ref_counted_memory_unittest.cc b/base/memory/ref_counted_memory_unittest.cc
index f2ffe2c..f347249 100644
--- a/base/memory/ref_counted_memory_unittest.cc
+++ b/base/memory/ref_counted_memory_unittest.cc
@@ -13,24 +13,27 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using testing::Each;
 using testing::ElementsAre;
 
 namespace base {
 
+namespace {
+
+void ConvertToByteSpanAndCheckSize(span<const uint8_t> data,
+                                   size_t expected_size) {
+  EXPECT_EQ(expected_size, data.size());
+}
+
+}  // namespace
+
 TEST(RefCountedMemoryUnitTest, RefCountedStaticMemory) {
-  {
-    auto mem = MakeRefCounted<RefCountedStaticMemory>(
-        base::byte_span_from_cstring("static mem"));
+  auto mem = MakeRefCounted<RefCountedStaticMemory>("static mem00", 10);
 
-    EXPECT_THAT(base::span(*mem),
-                ElementsAre('s', 't', 'a', 't', 'i', 'c', ' ', 'm', 'e', 'm'));
-  }
-  {
-    auto mem = MakeRefCounted<RefCountedStaticMemory>("static mem00", 10);
+  EXPECT_EQ(10U, mem->size());
+  EXPECT_EQ("static mem", std::string(mem->front_as<char>(), mem->size()));
 
-    EXPECT_THAT(base::span(*mem),
-                ElementsAre('s', 't', 'a', 't', 'i', 'c', ' ', 'm', 'e', 'm'));
-  }
+  ConvertToByteSpanAndCheckSize(*mem, 10);
 }
 
 TEST(RefCountedMemoryUnitTest, RefCountedBytes) {
@@ -41,40 +44,54 @@
 
   EXPECT_EQ(0U, data.size());
 
-  EXPECT_THAT(base::span(*mem), ElementsAre(45, 99));
+  ASSERT_EQ(2U, mem->size());
+  EXPECT_EQ(45U, mem->front()[0]);
+  EXPECT_EQ(99U, mem->front()[1]);
 
   scoped_refptr<RefCountedMemory> mem2;
   {
-    const uint8_t kData[] = {12, 11, 99};
-    mem2 = MakeRefCounted<RefCountedBytes>(base::span(kData));
+    const unsigned char kData[] = {12, 11, 99};
+    mem2 = MakeRefCounted<RefCountedBytes>(kData, std::size(kData));
   }
+  ASSERT_EQ(3U, mem2->size());
+  EXPECT_EQ(12U, mem2->front()[0]);
+  EXPECT_EQ(11U, mem2->front()[1]);
+  EXPECT_EQ(99U, mem2->front()[2]);
 
-  EXPECT_THAT(base::span(*mem2), ElementsAre(12, 11, 99));
+  ConvertToByteSpanAndCheckSize(*mem2, 3);
 }
 
 TEST(RefCountedMemoryUnitTest, RefCountedBytesMutable) {
   auto mem = MakeRefCounted<RefCountedBytes>(10);
 
-  EXPECT_THAT(base::span(*mem), ElementsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
+  ASSERT_EQ(10U, mem->size());
+  EXPECT_THAT(mem->data(), Each(0U));
 
-  // Test non-const version of as_vector().
-  mem->as_vector()[1u] = 1;
+  // Test non-const versions of data(), front() and front_as<>().
+  mem->data()[0] = 1;
+  mem->front()[1] = 2;
+  mem->front_as<char>()[2] = 3;
 
-  EXPECT_THAT(base::span(*mem), ElementsAre(0, 1, 0, 0, 0, 0, 0, 0, 0, 0));
+  EXPECT_THAT(mem->data(), ElementsAre(1, 2, 3, 0, 0, 0, 0, 0, 0, 0));
 }
 
 TEST(RefCountedMemoryUnitTest, RefCountedString) {
   scoped_refptr<RefCountedMemory> mem =
       base::MakeRefCounted<base::RefCountedString>(std::string("destroy me"));
 
-  EXPECT_EQ(base::span(*mem), base::span_from_cstring("destroy me"));
+  ASSERT_EQ(10U, mem->size());
+  EXPECT_EQ('d', mem->front()[0]);
+  EXPECT_EQ('e', mem->front()[1]);
+  EXPECT_EQ('e', mem->front()[9]);
+
+  ConvertToByteSpanAndCheckSize(*mem, 10);
 }
 
 TEST(RefCountedMemoryUnitTest, Equals) {
   scoped_refptr<RefCountedMemory> mem1 =
       base::MakeRefCounted<base::RefCountedString>(std::string("same"));
 
-  std::vector<uint8_t> d2 = {'s', 'a', 'm', 'e'};
+  std::vector<unsigned char> d2 = {'s', 'a', 'm', 'e'};
   scoped_refptr<RefCountedMemory> mem2 = RefCountedBytes::TakeVector(&d2);
 
   EXPECT_TRUE(mem1->Equals(mem2));
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc
index ca34d905..7f3ac459 100644
--- a/base/test/trace_event_analyzer.cc
+++ b/base/test/trace_event_analyzer.cc
@@ -28,7 +28,7 @@
                           base::trace_event::TraceResultBuffer* buffer,
                           const scoped_refptr<base::RefCountedString>& json,
                           bool has_more_events) {
-  buffer->AddFragment(json->as_string());
+  buffer->AddFragment(json->data());
   if (!has_more_events)
     std::move(quit_closure).Run();
 }
diff --git a/base/test/trace_event_analyzer_unittest.cc b/base/test/trace_event_analyzer_unittest.cc
index 929cabf..e6b08ba2 100644
--- a/base/test/trace_event_analyzer_unittest.cc
+++ b/base/test/trace_event_analyzer_unittest.cc
@@ -46,7 +46,7 @@
     base::WaitableEvent* flush_complete_event,
     const scoped_refptr<base::RefCountedString>& json_events_str,
     bool has_more_events) {
-  buffer_.AddFragment(json_events_str->as_string());
+  buffer_.AddFragment(json_events_str->data());
   if (!has_more_events)
     flush_complete_event->Signal();
 }
diff --git a/base/test/trace_to_file.cc b/base/test/trace_to_file.cc
index f271596..da2fb76 100644
--- a/base/test/trace_to_file.cc
+++ b/base/test/trace_to_file.cc
@@ -79,7 +79,7 @@
     trace_event::TraceResultBuffer* buffer,
     const scoped_refptr<RefCountedString>& json_events_str,
     bool has_more_events) {
-  buffer->AddFragment(json_events_str->as_string());
+  buffer->AddFragment(json_events_str->data());
   if (!has_more_events)
     std::move(quit_closure).Run();
 }
diff --git a/base/trace_event/trace_event_memory_overhead.cc b/base/trace_event/trace_event_memory_overhead.cc
index 0c2dfc8..1ba4c5e 100644
--- a/base/trace_event/trace_event_memory_overhead.cc
+++ b/base/trace_event/trace_event_memory_overhead.cc
@@ -91,7 +91,7 @@
 void TraceEventMemoryOverhead::AddRefCountedString(
     const RefCountedString& str) {
   Add(kOther, sizeof(RefCountedString));
-  AddString(str.as_string());
+  AddString(str.data());
 }
 
 void TraceEventMemoryOverhead::AddValue(const Value& value) {
diff --git a/base/trace_event/trace_event_unittest.cc b/base/trace_event/trace_event_unittest.cc
index c9711b9..5df0bed 100644
--- a/base/trace_event/trace_event_unittest.cc
+++ b/base/trace_event/trace_event_unittest.cc
@@ -198,12 +198,12 @@
     bool has_more_events) {
   num_flush_callbacks_++;
   if (num_flush_callbacks_ > 1) {
-    EXPECT_FALSE(events_str->as_string().empty());
+    EXPECT_FALSE(events_str->data().empty());
   }
   AutoLock lock(lock_);
   json_output_.json_output.clear();
   trace_buffer_.Start();
-  trace_buffer_.AddFragment(events_str->as_string());
+  trace_buffer_.AddFragment(events_str->data());
   trace_buffer_.Finish();
 
   std::optional<Value> root = base::JSONReader::Read(
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 8465a63..b80b33f 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -372,7 +372,7 @@
                          TraceLog::OutputCallback flush_callback)
       : flush_task_runner_(flush_task_runner),
         flush_callback_(std::move(flush_callback)) {
-    buffer_->as_string().reserve(kBufferReserveCapacity);
+    buffer_->data().reserve(kBufferReserveCapacity);
   }
 
   ~JsonStringOutputWriter() override { Flush(/*has_more=*/false); }
@@ -383,22 +383,22 @@
       DCHECK_EQ(string, kJsonPrefix);
       did_strip_prefix_ = true;
       return perfetto::trace_processor::util::OkStatus();
-    } else if (buffer_->as_string().empty() &&
+    } else if (buffer_->data().empty() &&
                !strncmp(string.c_str(), kJsonJoiner, strlen(kJsonJoiner))) {
       // We only remove the leading joiner comma for the first chunk in a buffer
       // since the consumer is expected to insert commas between the buffers we
       // provide.
-      buffer_->as_string() += string.substr(strlen(kJsonJoiner));
+      buffer_->data() += string.substr(strlen(kJsonJoiner));
     } else if (!strncmp(string.c_str(), kJsonSuffix, strlen(kJsonSuffix))) {
       return perfetto::trace_processor::util::OkStatus();
     } else {
-      buffer_->as_string() += string;
+      buffer_->data() += string;
     }
-    if (buffer_->as_string().size() > kBufferLimitInBytes) {
+    if (buffer_->data().size() > kBufferLimitInBytes) {
       Flush(/*has_more=*/true);
       // Reset the buffer_ after moving it above.
       buffer_ = new RefCountedString();
-      buffer_->as_string().reserve(kBufferReserveCapacity);
+      buffer_->data().reserve(kBufferReserveCapacity);
     }
     return perfetto::trace_processor::util::OkStatus();
   }
@@ -1384,7 +1384,7 @@
   if (proto_output_callback_) {
     scoped_refptr<RefCountedString> chunk = new RefCountedString();
     if (size)
-      chunk->as_string().assign(data, size);
+      chunk->data().assign(data, size);
     proto_output_callback_.Run(std::move(chunk), has_more);
     if (!has_more) {
       proto_output_callback_.Reset();
@@ -1424,18 +1424,18 @@
   // to let the caller know the completion of flush.
   scoped_refptr<RefCountedString> json_events_str_ptr = new RefCountedString();
   const size_t kReserveCapacity = kTraceEventBufferSizeInBytes * 5 / 4;
-  json_events_str_ptr->as_string().reserve(kReserveCapacity);
+  json_events_str_ptr->data().reserve(kReserveCapacity);
   while (const TraceBufferChunk* chunk = logged_events->NextChunk()) {
     for (size_t j = 0; j < chunk->size(); ++j) {
       size_t size = json_events_str_ptr->size();
       if (size > kTraceEventBufferSizeInBytes) {
         flush_output_callback.Run(json_events_str_ptr, true);
         json_events_str_ptr = new RefCountedString();
-        json_events_str_ptr->as_string().reserve(kReserveCapacity);
+        json_events_str_ptr->data().reserve(kReserveCapacity);
       } else if (size) {
-        json_events_str_ptr->as_string().append(",\n");
+        json_events_str_ptr->data().append(",\n");
       }
-      chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->as_string()),
+      chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->data()),
                                          argument_filter_predicate);
     }
   }
diff --git a/cc/paint/skottie_text_property_value.h b/cc/paint/skottie_text_property_value.h
index bfb9b34..e18d47d 100644
--- a/cc/paint/skottie_text_property_value.h
+++ b/cc/paint/skottie_text_property_value.h
@@ -36,7 +36,7 @@
   bool operator!=(const SkottieTextPropertyValue& other) const;
 
   void SetText(std::string text);
-  const std::string& text() const { return text_->as_string(); }
+  const std::string& text() const { return text_->data(); }
 
   void set_box(gfx::RectF box) { box_ = std::move(box); }
   const gfx::RectF& box() const { return box_; }
diff --git a/cc/test/transfer_cache_test_helper.cc b/cc/test/transfer_cache_test_helper.cc
index 436d007..1247c994 100644
--- a/cc/test/transfer_cache_test_helper.cc
+++ b/cc/test/transfer_cache_test_helper.cc
@@ -115,7 +115,7 @@
   // Serialize data.
   uint32_t size = client_entry.SerializedSize();
   auto data = base::HeapArray<uint8_t>::Uninit(size);
-  auto span = base::make_span(data.data(), size);
+  auto span = base::make_span(data);
   bool success = client_entry.Serialize(span);
   DCHECK(success);
   CreateEntryDirect(key, span);
diff --git a/chrome/VERSION b/chrome/VERSION
index 9774bf1..291c767 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=126
 MINOR=0
-BUILD=6425
+BUILD=6426
 PATCH=0
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index 7c282de94..ab4faa41 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -108,6 +108,7 @@
     "incognito_menu_art.icon",
     "incognito_profile.icon",
     "incognito_refresh_menu.icon",
+    "info.icon",
     "ink_highlighter.icon",
     "input.icon",
     "install_desktop_chrome_refresh.icon",
diff --git a/chrome/app/vector_icons/info.icon b/chrome/app/vector_icons/info.icon
new file mode 100644
index 0000000..46f351d
--- /dev/null
+++ b/chrome/app/vector_icons/info.icon
@@ -0,0 +1,52 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 960,
+FILL_RULE_NONZERO,
+MOVE_TO, 440, 680,
+R_H_LINE_TO, 80,
+R_V_LINE_TO, -240,
+R_H_LINE_TO, -80,
+R_V_LINE_TO, 240,
+CLOSE,
+R_MOVE_TO, 40, -320,
+R_QUADRATIC_TO, 17, 0, 28.5f, -11.5f,
+QUADRATIC_TO_SHORTHAND, 520, 320,
+R_QUADRATIC_TO, 0, -17, -11.5f, -28.5f,
+QUADRATIC_TO_SHORTHAND, 480, 280,
+R_QUADRATIC_TO, -17, 0, -28.5f, 11.5f,
+QUADRATIC_TO_SHORTHAND, 440, 320,
+R_QUADRATIC_TO, 0, 17, 11.5f, 28.5f,
+QUADRATIC_TO_SHORTHAND, 480, 360,
+CLOSE,
+R_MOVE_TO, 0, 520,
+R_QUADRATIC_TO, -83, 0, -156, -31.5f,
+QUADRATIC_TO_SHORTHAND, 197, 763,
+R_QUADRATIC_TO, -54, -54, -85.5f, -127,
+QUADRATIC_TO_SHORTHAND, 80, 480,
+R_QUADRATIC_TO, 0, -83, 31.5f, -156,
+QUADRATIC_TO_SHORTHAND, 197, 197,
+R_QUADRATIC_TO, 54, -54, 127, -85.5f,
+QUADRATIC_TO_SHORTHAND, 480, 80,
+R_QUADRATIC_TO, 83, 0, 156, 31.5f,
+QUADRATIC_TO_SHORTHAND, 763, 197,
+R_QUADRATIC_TO, 54, 54, 85.5f, 127,
+QUADRATIC_TO_SHORTHAND, 880, 480,
+R_QUADRATIC_TO, 0, 83, -31.5f, 156,
+QUADRATIC_TO_SHORTHAND, 763, 763,
+R_QUADRATIC_TO, -54, 54, -127, 85.5f,
+QUADRATIC_TO_SHORTHAND, 480, 880,
+CLOSE,
+R_MOVE_TO, 0, -80,
+R_QUADRATIC_TO, 134, 0, 227, -93,
+R_QUADRATIC_TO, 93, -93, 93, -227,
+R_QUADRATIC_TO, 0, -134, -93, -227,
+R_QUADRATIC_TO, -93, -93, -227, -93,
+R_QUADRATIC_TO, -134, 0, -227, 93,
+R_QUADRATIC_TO, -93, 93, -93, 227,
+R_QUADRATIC_TO, 0, 134, 93, 227,
+R_QUADRATIC_TO, 93, 93, 227, 93,
+CLOSE,
+R_MOVE_TO, 0, -320,
+CLOSE
diff --git a/chrome/app/vector_icons/input.icon b/chrome/app/vector_icons/input.icon
index 2120e4e..102a6c8 100644
--- a/chrome/app/vector_icons/input.icon
+++ b/chrome/app/vector_icons/input.icon
@@ -2,31 +2,38 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 16.55f, 3,
-H_LINE_TO, 3.46f,
-CUBIC_TO, 2.66f, 3, 2, 3.7f, 2, 4.56f,
-R_V_LINE_TO, 3.11f,
-R_H_LINE_TO, 2,
-V_LINE_TO, 5,
-R_H_LINE_TO, 12,
-R_V_LINE_TO, 10,
-H_LINE_TO, 4,
-R_V_LINE_TO, -2.66f,
-H_LINE_TO, 2,
-R_V_LINE_TO, 3.12f,
-CUBIC_TO, 2, 16.32f, 2.66f, 17, 3.46f, 17,
-R_H_LINE_TO, 13.09f,
-R_CUBIC_TO, 0.8f, 0, 1.46f, -0.68f, 1.46f, -1.54f,
-R_V_LINE_TO, -10.9f,
-CUBIC_TO, 18, 3.69f, 17.35f, 3, 16.55f, 3,
+CANVAS_DIMENSIONS, 960,
+FILL_RULE_NONZERO,
+MOVE_TO, 160, 800,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 80, 720,
+R_V_LINE_TO, -120,
+R_H_LINE_TO, 80,
+R_V_LINE_TO, 120,
+R_H_LINE_TO, 640,
+R_V_LINE_TO, -480,
+H_LINE_TO, 160,
+R_V_LINE_TO, 120,
+H_LINE_TO, 80,
+R_V_LINE_TO, -120,
+R_QUADRATIC_TO, 0, -33, 23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 160, 160,
+R_H_LINE_TO, 640,
+R_QUADRATIC_TO, 33, 0, 56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 880, 240,
+R_V_LINE_TO, 480,
+R_QUADRATIC_TO, 0, 33, -23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 800, 800,
+H_LINE_TO, 160,
 CLOSE,
-MOVE_TO, 9.14f, 13,
-R_LINE_TO, 3.04f, -3,
-R_LINE_TO, -3.04f, -3,
-R_V_LINE_TO, 2.25f,
-H_LINE_TO, 2,
-R_V_LINE_TO, 1.5f,
-R_H_LINE_TO, 7.14f,
-V_LINE_TO, 13,
+R_MOVE_TO, 300, -140,
+R_LINE_TO, -56, -58,
+R_LINE_TO, 83, -82,
+H_LINE_TO, 80,
+R_V_LINE_TO, -80,
+R_H_LINE_TO, 407,
+R_LINE_TO, -83, -82,
+R_LINE_TO, 56, -58,
+R_LINE_TO, 180, 180,
+R_LINE_TO, -180, 180,
 CLOSE
diff --git a/chrome/app/vector_icons/speaker.icon b/chrome/app/vector_icons/speaker.icon
index f784900..d61e367 100644
--- a/chrome/app/vector_icons/speaker.icon
+++ b/chrome/app/vector_icons/speaker.icon
@@ -2,33 +2,59 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 14.29f, 3,
-H_LINE_TO, 5.71f,
-CUBIC_TO, 4.77f, 3, 4, 3.68f, 4, 4.5f,
-R_V_LINE_TO, 12,
-R_CUBIC_TO, 0, 0.83f, 0.77f, 1.49f, 1.71f, 1.49f,
-R_LINE_TO, 8.57f, 0.01f,
-R_CUBIC_TO, 0.94f, 0, 1.71f, -0.67f, 1.71f, -1.5f,
-R_V_LINE_TO, -12,
-R_CUBIC_TO, 0, -0.82f, -0.77f, -1.5f, -1.71f, -1.5f,
+CANVAS_DIMENSIONS, 960,
+FILL_RULE_NONZERO,
+MOVE_TO, 680, 880,
+H_LINE_TO, 280,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 200, 800,
+R_V_LINE_TO, -640,
+R_QUADRATIC_TO, 0, -33, 23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 280, 80,
+R_H_LINE_TO, 400,
+R_QUADRATIC_TO, 33, 0, 56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 760, 160,
+R_V_LINE_TO, 640,
+R_QUADRATIC_TO, 0, 33, -23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 680, 880,
 CLOSE,
-MOVE_TO, 6, 16,
-V_LINE_TO, 5,
-R_H_LINE_TO, 8,
-R_V_LINE_TO, 11,
-H_LINE_TO, 6,
+R_MOVE_TO, 0, -80,
+R_V_LINE_TO, -640,
+H_LINE_TO, 280,
+R_V_LINE_TO, 640,
+R_H_LINE_TO, 400,
 CLOSE,
-R_MOVE_TO, 4, -7,
-R_ARC_TO, 3, 3, 0, 1, 0, 0, 6,
-R_ARC_TO, 3, 3, 0, 1, 0, 0, -6,
+MOVE_TO, 480, 360,
+R_QUADRATIC_TO, 33, 0, 56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 560, 280,
+R_QUADRATIC_TO, 0, -33, -23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 480, 200,
+R_QUADRATIC_TO, -33, 0, -56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 400, 280,
+R_QUADRATIC_TO, 0, 33, 23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 480, 360,
 CLOSE,
-R_MOVE_TO, 0, 2,
-R_ARC_TO, 1, 1, 0, 1, 1, 0, 2,
-R_ARC_TO, 1, 1, 0, 0, 1, 0, -2,
+R_MOVE_TO, 0, 400,
+R_QUADRATIC_TO, 66, 0, 113, -47,
+R_QUADRATIC_TO, 47, -47, 47, -113,
+R_QUADRATIC_TO, 0, -66, -47, -113,
+R_QUADRATIC_TO, -47, -47, -113, -47,
+R_QUADRATIC_TO, -66, 0, -113, 47,
+R_QUADRATIC_TO, -47, 47, -47, 113,
+R_QUADRATIC_TO, 0, 66, 47, 113,
+R_QUADRATIC_TO, 47, 47, 113, 47,
 CLOSE,
-R_MOVE_TO, 0, -3,
-R_CUBIC_TO, 0.55f, 0, 1, -0.45f, 1, -1,
-R_CUBIC_TO, 0, -0.55f, -0.45f, -1, -1, -1,
-R_ARC_TO, 1, 1, 0, 1, 0, 0, 2,
+R_MOVE_TO, 0, -80,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 400, 600,
+R_QUADRATIC_TO, 0, -33, 23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 480, 520,
+R_QUADRATIC_TO, 33, 0, 56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 560, 600,
+R_QUADRATIC_TO, 0, 33, -23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 480, 680,
+CLOSE,
+MOVE_TO, 280, 160,
+R_V_LINE_TO, 640,
+R_V_LINE_TO, -640,
 CLOSE
diff --git a/chrome/app/vector_icons/speaker_group.icon b/chrome/app/vector_icons/speaker_group.icon
index c39b100..ff23be9 100644
--- a/chrome/app/vector_icons/speaker_group.icon
+++ b/chrome/app/vector_icons/speaker_group.icon
@@ -2,43 +2,69 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 14, 4,
-R_V_LINE_TO, 9,
-R_LINE_TO, -6, -0.01f,
-V_LINE_TO, 4,
-R_H_LINE_TO, 6,
+CANVAS_DIMENSIONS, 960,
+FILL_RULE_NONZERO,
+MOVE_TO, 400, 680,
+R_H_LINE_TO, 360,
+R_V_LINE_TO, -560,
+H_LINE_TO, 400,
+R_V_LINE_TO, 560,
 CLOSE,
-R_MOVE_TO, 0.57f, -2,
-H_LINE_TO, 7.43f,
-ARC_TO, 1.44f, 1.44f, 0, 0, 0, 6, 3.44f,
-R_V_LINE_TO, 10.1f,
-R_CUBIC_TO, 0, 0.8f, 0.64f, 1.45f, 1.43f, 1.45f,
-LINE_TO, 14.57f, 15,
-ARC_TO, 1.44f, 1.44f, 0, 0, 0, 16, 13.56f,
-V_LINE_TO, 3.44f,
-ARC_TO, 1.44f, 1.44f, 0, 0, 0, 14.57f, 2,
+R_MOVE_TO, 0, 80,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 320, 680,
+R_V_LINE_TO, -560,
+R_QUADRATIC_TO, 0, -33, 23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 400, 40,
+R_H_LINE_TO, 360,
+R_QUADRATIC_TO, 33, 0, 56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 840, 120,
+R_V_LINE_TO, 560,
+R_QUADRATIC_TO, 0, 33, -23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 760, 760,
+H_LINE_TO, 400,
 CLOSE,
-MOVE_TO, 11, 7,
-R_ARC_TO, 1, 1, 0, 1, 1, 0, -2,
-R_ARC_TO, 1, 1, 0, 0, 1, 0, 2,
+R_MOVE_TO, 180, -460,
+R_QUADRATIC_TO, 25, 0, 42.5f, -17.5f,
+QUADRATIC_TO_SHORTHAND, 640, 240,
+R_QUADRATIC_TO, 0, -25, -17.5f, -42.5f,
+QUADRATIC_TO_SHORTHAND, 580, 180,
+R_QUADRATIC_TO, -25, 0, -42.5f, 17.5f,
+QUADRATIC_TO_SHORTHAND, 520, 240,
+R_QUADRATIC_TO, 0, 25, 17.5f, 42.5f,
+QUADRATIC_TO_SHORTHAND, 580, 300,
 CLOSE,
-R_MOVE_TO, 0, 5,
-R_CUBIC_TO, -1.1f, 0, -2, -0.9f, -2, -2,
-R_CUBIC_TO, 0, -1.1f, 0.9f, -2, 2, -2,
-R_CUBIC_TO, 1.1f, 0, 2, 0.9f, 2, 2,
-R_CUBIC_TO, 0, 1.1f, -0.9f, 2, -2, 2,
+R_MOVE_TO, 0, 340,
+R_QUADRATIC_TO, 58, 0, 99, -41,
+R_QUADRATIC_TO, 41, -41, 41, -99,
+R_QUADRATIC_TO, 0, -58, -41, -99,
+R_QUADRATIC_TO, -41, -41, -99, -41,
+R_QUADRATIC_TO, -58, 0, -99, 41,
+R_QUADRATIC_TO, -41, 41, -41, 99,
+R_QUADRATIC_TO, 0, 58, 41, 99,
+R_QUADRATIC_TO, 41, 41, 99, 41,
 CLOSE,
-R_MOVE_TO, 0, -1,
-R_ARC_TO, 1, 1, 0, 1, 0, 0, -2,
-R_ARC_TO, 1, 1, 0, 0, 0, 0, 2,
+R_MOVE_TO, 0, -80,
+R_QUADRATIC_TO, -25, 0, -42.5f, -17.5f,
+QUADRATIC_TO_SHORTHAND, 520, 500,
+R_QUADRATIC_TO, 0, -25, 17.5f, -42.5f,
+QUADRATIC_TO_SHORTHAND, 580, 440,
+R_QUADRATIC_TO, 25, 0, 42.5f, 17.5f,
+QUADRATIC_TO_SHORTHAND, 640, 500,
+R_QUADRATIC_TO, 0, 25, -17.5f, 42.5f,
+QUADRATIC_TO_SHORTHAND, 580, 560,
 CLOSE,
-MOVE_TO, 5, 4,
-H_LINE_TO, 3,
-R_V_LINE_TO, 12.44f,
-CUBIC_TO, 3, 17.3f, 3.68f, 18, 4.52f, 18,
-H_LINE_TO, 12,
-R_V_LINE_TO, -2,
-H_LINE_TO, 5,
-V_LINE_TO, 4,
+R_MOVE_TO, 60, 360,
+H_LINE_TO, 240,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 160, 840,
+R_V_LINE_TO, -640,
+R_H_LINE_TO, 80,
+R_V_LINE_TO, 640,
+R_H_LINE_TO, 400,
+R_V_LINE_TO, 80,
+CLOSE,
+MOVE_TO, 400, 120,
+R_V_LINE_TO, 560,
+R_V_LINE_TO, -560,
 CLOSE
diff --git a/chrome/app/vector_icons/tv.icon b/chrome/app/vector_icons/tv.icon
index 0bab71b..84f9fb5 100644
--- a/chrome/app/vector_icons/tv.icon
+++ b/chrome/app/vector_icons/tv.icon
@@ -2,24 +2,33 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 7.06f, 15,
-H_LINE_TO, 4,
-R_ARC_TO, 2, 2, 0, 0, 1, -2, -2,
-V_LINE_TO, 5,
-R_ARC_TO, 2, 2, 0, 0, 1, 2, -2,
-R_H_LINE_TO, 12,
-R_ARC_TO, 2, 2, 0, 0, 1, 2, 2,
-R_V_LINE_TO, 8,
-R_ARC_TO, 2, 2, 0, 0, 1, -2, 2,
-R_H_LINE_TO, -2.97f,
-R_LINE_TO, 0.97f, 2,
-H_LINE_TO, 6,
-R_LINE_TO, 1.06f, -2,
+CANVAS_DIMENSIONS, 960,
+FILL_RULE_NONZERO,
+MOVE_TO, 320, 840,
+R_V_LINE_TO, -80,
+H_LINE_TO, 160,
+R_QUADRATIC_TO, -33, 0, -56.5f, -23.5f,
+QUADRATIC_TO_SHORTHAND, 80, 680,
+R_V_LINE_TO, -480,
+R_QUADRATIC_TO, 0, -33, 23.5f, -56.5f,
+QUADRATIC_TO_SHORTHAND, 160, 120,
+R_H_LINE_TO, 640,
+R_QUADRATIC_TO, 33, 0, 56.5f, 23.5f,
+QUADRATIC_TO_SHORTHAND, 880, 200,
+R_V_LINE_TO, 480,
+R_QUADRATIC_TO, 0, 33, -23.5f, 56.5f,
+QUADRATIC_TO_SHORTHAND, 800, 760,
+H_LINE_TO, 640,
+R_V_LINE_TO, 80,
+H_LINE_TO, 320,
 CLOSE,
-MOVE_TO, 16, 13,
-V_LINE_TO, 5,
-H_LINE_TO, 4,
-R_V_LINE_TO, 8,
-R_H_LINE_TO, 12,
+MOVE_TO, 160, 680,
+R_H_LINE_TO, 640,
+R_V_LINE_TO, -480,
+H_LINE_TO, 160,
+R_V_LINE_TO, 480,
+CLOSE,
+R_MOVE_TO, 0, 0,
+R_V_LINE_TO, -480,
+R_V_LINE_TO, 480,
 CLOSE
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index fe0c8e2..0376236c 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5515,10 +5515,6 @@
      flag_descriptions::kJapaneseOSSettingsName,
      flag_descriptions::kJapaneseOSSettingsDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kJapaneseOSSettings)},
-    {"enable-cros-multilingual-typing",
-     flag_descriptions::kMultilingualTypingName,
-     flag_descriptions::kMultilingualTypingDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kMultilingualTyping)},
     {"enable-cros-on-device-grammar-check",
      flag_descriptions::kCrosOnDeviceGrammarCheckName,
      flag_descriptions::kCrosOnDeviceGrammarCheckDescription, kOsCrOS,
diff --git a/chrome/browser/android/favicon_helper_unittest.cc b/chrome/browser/android/favicon_helper_unittest.cc
index c1a9c5131..58cf8cde 100644
--- a/chrome/browser/android/favicon_helper_unittest.cc
+++ b/chrome/browser/android/favicon_helper_unittest.cc
@@ -31,7 +31,7 @@
   // Create bitmap and fill with |color|.
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
   gfx::PNGCodec::EncodeBGRASkBitmap(gfx::test::CreateBitmap(size, color), false,
-                                    &data->as_vector());
+                                    &data->data());
 
   result.bitmap_data = data;
   result.pixel_size = gfx::Size(size, size);
diff --git a/chrome/browser/app_controller_mac.h b/chrome/browser/app_controller_mac.h
index 4d7a57e..e9a4f011 100644
--- a/chrome/browser/app_controller_mac.h
+++ b/chrome/browser/app_controller_mac.h
@@ -122,10 +122,6 @@
 - (HistoryMenuBridge*)historyMenuBridge;
 - (TabMenuBridge*)tabMenuBridge;
 
-// Initializes the AppShimMenuController. This enables changing the menu bar for
-// apps.
-- (void)initAppShimMenuController;
-
 // Called when the user has changed browser windows, meaning the backing profile
 // may have changed. This can cause a rebuild of the user-data menus. This is a
 // no-op if the new profile is the same as the current one. This can be either
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index d6625511..737ff732 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -69,7 +69,6 @@
 #include "chrome/browser/ui/browser_mac.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/chrome_pages.h"
-#import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h"
 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h"
 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h"
 #import "chrome/browser/ui/cocoa/confirm_quit.h"
@@ -585,9 +584,6 @@
 
   std::unique_ptr<HistoryMenuBridge> _historyMenuBridge;
 
-  // Controller that manages main menu items for packaged apps.
-  AppShimMenuController* __strong _appShimMenuController;
-
   // The profile menu, which appears right before the Help menu. It is only
   // available when multiple profiles is enabled.
   ProfileMenuController* __strong _profileMenuController;
@@ -907,7 +903,6 @@
 
   _profileAttributesStorageObserver.reset();
   [self unregisterEventHandlers];
-  _appShimMenuController = nil;
   _profileBookmarkMenuBridgeMap.clear();
 }
 
@@ -1063,10 +1058,6 @@
 
   [self setUpdateCheckInterval];
 
-  // Start managing the menu for app windows. This needs to be done here because
-  // main menu item titles are not yet initialized in awakeFromNib.
-  [self initAppShimMenuController];
-
   // If enabled, keep Chrome alive when apps are open instead of quitting all
   // apps.
   _quitWithAppsController = new QuitWithAppsController();
@@ -1872,11 +1863,6 @@
   return _tabMenuBridge.get();
 }
 
-- (void)initAppShimMenuController {
-  if (!_appShimMenuController)
-    _appShimMenuController = [[AppShimMenuController alloc] init];
-}
-
 - (void)setLastProfile:(Profile*)profile {
   if (profile == _lastProfile)
     return;
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service.cc b/chrome/browser/apps/app_preload_service/app_preload_service.cc
index e38934fe..144656a 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service.cc
@@ -233,25 +233,22 @@
   // If the app is already installed with the relevant install reason, we do not
   // need to reinstall it. This avoids extra work in the case where we are
   // retrying the flow after an install error for a different app.
-
-  // TODO(crbug.com/329144520) Implement already installed check for android.
-  if (app.GetPlatform() == PackageType::kArc) {
-    return true;
-  }
-
   InstallReason expected_reason =
       app.IsDefaultApp() ? InstallReason::kDefault : InstallReason::kOem;
   AppServiceProxy* proxy = AppServiceProxyFactory::GetForProfile(profile_);
   bool installed = false;
 
-  proxy->AppRegistryCache().ForOneApp(
-      app.GetWebAppId(), [&installed, expected_reason](const AppUpdate& app) {
+  proxy->AppRegistryCache().ForEachApp(
+      [&installed, expected_reason, app](const apps::AppUpdate& update) {
         // It's possible that if APS requests the same app to be installed for
         // multiple reasons, this check could incorrectly return false, as App
         // Service only reports the highest priority install reason. This is
         // acceptable since the check is just an optimization.
-        installed = apps_util::IsInstalled(app.Readiness()) &&
-                    app.InstallReason() == expected_reason;
+        if (update.InstallerPackageId() == app.GetPackageId() &&
+            apps_util::IsInstalled(update.Readiness()) &&
+            update.InstallReason() == expected_reason) {
+          installed = true;
+        }
       });
 
   return !installed;
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition.cc b/chrome/browser/apps/app_preload_service/preload_app_definition.cc
index 4c9787c..73f4c4b2 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition.cc
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition.cc
@@ -4,9 +4,9 @@
 
 #include "chrome/browser/apps/app_preload_service/preload_app_definition.h"
 
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/apps/app_preload_service/proto/app_preload.pb.h"
-#include "chrome/browser/web_applications/web_app_helpers.h"
 #include "components/services/app_service/public/cpp/package_id.h"
 #include "url/gurl.h"
 
@@ -23,6 +23,10 @@
     const PreloadAppDefinition&) = default;
 PreloadAppDefinition::~PreloadAppDefinition() = default;
 
+std::optional<PackageId> PreloadAppDefinition::GetPackageId() const {
+  return package_id_;
+}
+
 std::string PreloadAppDefinition::GetName() const {
   return app_proto_.name();
 }
@@ -80,11 +84,6 @@
   return GURL(package_id_->identifier());
 }
 
-std::string PreloadAppDefinition::GetWebAppId() const {
-  DCHECK_EQ(GetPlatform(), PackageType::kWeb);
-  return web_app::GenerateAppIdFromManifestId(GetWebAppManifestId());
-}
-
 AppInstallData PreloadAppDefinition::ToAppInstallData() const {
   AppInstallData result(package_id_.value());
   result.name = GetName();
@@ -103,6 +102,9 @@
 
 std::ostream& operator<<(std::ostream& os, const PreloadAppDefinition& app) {
   os << std::boolalpha;
+  os << "- Package ID: "
+     << (app.GetPackageId() ? app.GetPackageId()->ToString() : std::string())
+     << std::endl;
   os << "- Name: " << app.GetName() << std::endl;
   os << "- Platform: " << EnumToString(app.GetPlatform()) << std::endl;
   os << "- OEM: " << app.IsOemApp() << std::endl;
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition.h b/chrome/browser/apps/app_preload_service/preload_app_definition.h
index 83bbfd76..2f3e3df 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition.h
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition.h
@@ -26,6 +26,7 @@
   PreloadAppDefinition& operator=(const PreloadAppDefinition&);
   ~PreloadAppDefinition();
 
+  std::optional<PackageId> GetPackageId() const;
   std::string GetName() const;
   PackageType GetPlatform() const;
   bool IsDefaultApp() const;
@@ -54,8 +55,6 @@
   // called if `GetPlatform()` returns `AppType::kWeb`.
   GURL GetWebAppManifestId() const;
 
-  std::string GetWebAppId() const;
-
   AppInstallData ToAppInstallData() const;
 
  private:
diff --git a/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc b/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
index 774120a..f306cb6 100644
--- a/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/preload_app_definition_unittest.cc
@@ -209,15 +209,6 @@
             "https://example.com/path/of/manifest_id");
 }
 
-TEST_F(PreloadAppDefinitionTest, GetWebAppId) {
-  proto::AppPreloadListResponse_App app;
-  app.set_package_id("web:https://example.com/path/of/manifest_id");
-
-  PreloadAppDefinition app_def(app);
-
-  ASSERT_EQ(app_def.GetWebAppId(), "pckfllnaogmpbmijcjpenfdglaikbiea");
-}
-
 TEST_F(PreloadAppDefinitionTest, ToAppInstallData) {
   proto::AppPreloadListResponse_App app;
   app.set_name("Example App");
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_source.cc b/chrome/browser/apps/app_service/app_icon/app_icon_source.cc
index 9d59913..ae555d39 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_source.cc
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_source.cc
@@ -35,7 +35,8 @@
           IDR_APP_DEFAULT_ICON, apps_util::GetPrimaryDisplayUIScaleFactor());
 
   base::RefCountedBytes* image_bytes = new base::RefCountedBytes();
-  image_bytes->as_vector().assign(contents.begin(), contents.end());
+  image_bytes->data().assign(contents.data(),
+                             contents.data() + contents.size());
   std::move(callback).Run(image_bytes);
 }
 
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
index 9d97319..1115446 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/ash/guest_os/guest_os_shelf_utils.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/web_app_id_constants.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chromeos/components/mgs/managed_guest_session_utils.h"
 #include "components/app_constants/constants.h"
@@ -1214,6 +1215,13 @@
             .Record(ukm::UkmRecorder::Get());
       }
 
+      // UMA for Mall app.
+      if (it.second.app_id == web_app::kMallAppId) {
+        base::UmaHistogramCustomTimes("Apps.AppDiscovery.MallUsageTime",
+                                      it.second.running_time, base::Seconds(1),
+                                      base::Hours(2), 100);
+      }
+
       // Also reset time in the pref store now that we have reported this data.
       ClearAppsUsageTimeForInstance(it.first.ToString());
     }
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
index a5ba771..084235a 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
@@ -71,8 +71,6 @@
 
 std::string GetAppTypeHistogramNameV2(apps::AppTypeNameV2 app_type_name);
 
-const std::set<apps::AppTypeName>& GetAppTypeNameSet();
-
 ApplicationInstallTime ConvertInstallTimeToProtoApplicationInstallTime(
     InstallTime install_time);
 
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc
index 6d2c4f5f..2beceea 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc
@@ -68,6 +68,9 @@
         {apps::kExtensionHistogramName, apps::AppTypeName::kExtension},
         {apps::kStandaloneBrowserExtensionHistogramName,
          apps::AppTypeName::kStandaloneBrowserExtension},
+        {apps::kStandaloneBrowserWebAppHistogramName,
+         apps::AppTypeName::kStandaloneBrowserWebApp},
+        {apps::kBruschettaHistogramName, apps::AppTypeName::kBruschetta},
     });
 
 constexpr char kInstallReasonUnknownHistogram[] = "Unknown";
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h
index 97e8410..7053cf17 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h
@@ -19,8 +19,9 @@
 namespace apps {
 
 // This is used for logging, so do not remove or reorder existing entries.
-// This should be kept in sync with GetAppTypeNameSet in
-// c/b/apps/app_service/app_platform_metrics_service.cc.
+// This should be kept in sync with:
+// * c/b/apps/app_service/metrics/app_platform_metrics_utils.cc:kAppTypeNameMap
+// * tools/metrics/histograms/metadata/apps/histograms.xml:AppType
 enum class AppTypeName {
   kUnknown = 0,
   kArc = 1,
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 6f68b13..3526785 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -2770,8 +2770,8 @@
     "policy/remote_commands/user_commands_factory_ash.h",
     "policy/reporting/app_install_event_log_manager_wrapper.cc",
     "policy/reporting/app_install_event_log_manager_wrapper.h",
-    "policy/reporting/arc_app_install_event_encrypted_reporter.cc",
-    "policy/reporting/arc_app_install_event_encrypted_reporter.h",
+    "policy/reporting/arc_app_install_encrypted_event_reporter.cc",
+    "policy/reporting/arc_app_install_encrypted_event_reporter.h",
     "policy/reporting/arc_app_install_event_log.cc",
     "policy/reporting/arc_app_install_event_log.h",
     "policy/reporting/arc_app_install_event_log_collector.cc",
@@ -6023,7 +6023,7 @@
     "policy/remote_commands/fake_cros_network_config_base.h",
     "policy/remote_commands/user_command_arc_job_unittest.cc",
     "policy/reporting/app_install_event_log_manager_wrapper_unittest.cc",
-    "policy/reporting/arc_app_install_event_encrypted_reporter_unittest.cc",
+    "policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc",
     "policy/reporting/arc_app_install_event_log_collector_unittest.cc",
     "policy/reporting/arc_app_install_event_log_manager_unittest.cc",
     "policy/reporting/arc_app_install_event_log_unittest.cc",
diff --git a/chrome/browser/ash/PRESUBMIT.py b/chrome/browser/ash/PRESUBMIT.py
new file mode 100644
index 0000000..54ab747
--- /dev/null
+++ b/chrome/browser/ash/PRESUBMIT.py
@@ -0,0 +1,88 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+PRESUBMIT_VERSION = '2.0.0'
+USE_PYTHON3 = True
+
+def _CheckDepsFileProhibitingChromeExists(input_api, output_api):
+  """Enforce that each top-level directory in //chrome/browser/ash has DEPS file
+  which prohibits //chrome.
+
+  This ensures that any new //chrome dependencies added in this directory are
+  reviewed by a //chrome OWNER. There is an active effort to refactor
+  //chrome/browser/ash to break these dependencies; see b/332804822.
+  """
+  _CHROME_BROWSER_ASH = input_api.os_path.join('chrome', 'browser', 'ash')
+
+  missing_deps_files = set()
+  deps_files_not_prohibiting_chrome = set()
+
+  for f in input_api.AffectedFiles(False):
+    # Path relative to chrome/browser/ash.
+    # Example: For 'chrome/browser/ash/foo/bar/baz.h' => 'foo/bar/baz.h'.
+    relative_path = input_api.os_path.relpath(f.LocalPath(),
+                                              _CHROME_BROWSER_ASH)
+
+    # Split path for this relative path.
+    # Example: For 'foo/bar/baz.h' => ['foo' 'bar/baz.h'].
+    splitPath = relative_path.split(input_api.os_path.sep, 1)
+
+    # If the split path contains 1 or fewer elements, it is not in a
+    # subdirectory (e.g., len == 1 would be a file directly in
+    # //chrome/browser/ash).
+    if len(splitPath) <= 1:
+      continue
+
+    relative_deps_files_path = input_api.os_path.join(splitPath[0], 'DEPS')
+    deps_file_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
+                                            relative_deps_files_path)
+
+    if not input_api.os_path.exists(deps_file_path):
+      missing_deps_files.add(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, relative_deps_files_path))
+      continue
+
+    # If the affected file is not a DEPS file, move onto the next file to check.
+    if f.LocalPath() != deps_file_path:
+      continue
+
+    # If the affected file *is* a DEPS file, confirm that it has a "-chrome"
+    # rule, prohibiting new //chrome dependencies.
+    prohibit_chrome_pattern = input_api.re.compile(r'\"\-chrome\"')
+    if not prohibit_chrome_pattern.search(input_api.ReadFile(deps_file_path)):
+      deps_files_not_prohibiting_chrome.add(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, relative_deps_files_path))
+
+  results = []
+  if missing_deps_files:
+    dir_text = ''
+    for dir in missing_deps_files:
+      dir_text += dir + ', '
+    dir_text = dir_text[:-2]
+    results.append(output_api.PresubmitError(
+        "Subdirectories in //chrome/browser/ash require a DEPS file. Please "
+        "create DEPS files: [%s]. See b/332805865 and "
+        "//tools/chromeos/gen_deps.sh for details." % (dir_text)
+        ))
+
+  if deps_files_not_prohibiting_chrome:
+    deps_text = ''
+    for deps_file in deps_files_not_prohibiting_chrome:
+      deps_text += deps_file + ', '
+    deps_text = deps_text[:-2]
+    results.append(output_api.PresubmitError(
+        "DEPS files in subdirectories of in //chrome/browser/ash must prohibit "
+        "new //chrome dependencies. Please ensure a \"-chrome\" rule is added "
+        "in [%s]. See b/332805865 and //tools/chromeos/gen_deps.sh for "
+        " details." % (deps_text)
+        ))
+
+  return results
+
+def CheckChangeOnUpload(input_api, output_api):
+  return _CheckDepsFileProhibitingChromeExists(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+  return _CheckDepsFileProhibitingChromeExists(input_api, output_api)
diff --git a/chrome/browser/ash/PRESUBMIT_test.py b/chrome/browser/ash/PRESUBMIT_test.py
new file mode 100755
index 0000000..df6ab0cd
--- /dev/null
+++ b/chrome/browser/ash/PRESUBMIT_test.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os.path
+import sys
+import unittest
+
+import PRESUBMIT
+
+# Switch to src/ directory to import test mocks.
+file_path = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(file_path, '..', '..', '..'))
+from PRESUBMIT_test_mocks import (MockInputApi, MockOutputApi, MockAffectedFile,
+    MockFile)
+
+_CHROME_BROWSER_ASH = os.path.join('chrome', 'browser', 'ash')
+
+class DepsFileProhibitingChromeExistsFileTest(unittest.TestCase):
+  def assertDepsFilesWithErrors(self, input_api, expected_missing_deps_files,
+      expected_deps_files_missing_chrome):
+    # Restore path that was changed to import test mocks above.
+    input_api.presubmit_local_path = _CHROME_BROWSER_ASH
+
+    # Create mock files for all affected files so that os_path.exists() works.
+    input_api.CreateMockFileInPath(
+        [x.LocalPath() for x in input_api.AffectedFiles(include_deletes=True)])
+
+    results = PRESUBMIT._CheckDepsFileProhibitingChromeExists(
+        input_api, MockOutputApi())
+    self.assertTrue(len(results) <= 2)
+
+    missing_deps_file_pattern = input_api.re.compile(
+        r'.*require a DEPS file.*\[(.*)\].*')
+    missing_chrome_rule_pattern = input_api.re.compile(
+        r'.*must prohibit new \/\/chrome dependencies.*\[(.*)\].*')
+
+    missing_deps_files = []
+    deps_files_missing_chrome = []
+
+    for r in results:
+      regex_results = missing_deps_file_pattern.search(r.message)
+      if regex_results:
+        missing_deps_files = regex_results.group(1).split(', ')
+
+      regex_results = missing_chrome_rule_pattern.search(r.message)
+      if missing_chrome_rule_pattern.search(r.message):
+        deps_files_missing_chrome = regex_results.group(1).split(', ')
+
+    self.assertEqual(set(missing_deps_files), set(expected_missing_deps_files))
+    self.assertEqual(set(deps_files_missing_chrome),
+                     set(expected_deps_files_missing_chrome))
+
+  # No files created; no errors expected.
+  def testNoFiles(self):
+    input_api = MockInputApi()
+    self.assertDepsFilesWithErrors(input_api, [], [])
+
+  # Create files in new subdirectories without DEPS files.
+  def testFileInDirectoryWithNoDeps(self):
+    input_api = MockInputApi()
+    input_api.files = [
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'bar.h'), ''),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'baz.h'), ''),
+    ]
+    self.assertDepsFilesWithErrors(
+        input_api,
+        [
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'DEPS'),
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'DEPS'),
+        ], [])
+
+  # Create files in a new subdirectories with DEPS files not prohibiting
+  # //chrome.
+  def testFileInDirectoryNotProhibitingChrome(self):
+    DEPS_FILE_NOT_PROHIBITING_CHROME = ['include_rules = []']
+
+    input_api = MockInputApi()
+    input_api.files = [
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'bar.h'), ''),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'DEPS'),
+          DEPS_FILE_NOT_PROHIBITING_CHROME),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'baz.h'), ''),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'DEPS'),
+          DEPS_FILE_NOT_PROHIBITING_CHROME),
+    ]
+    self.assertDepsFilesWithErrors(
+        input_api, [],
+        [
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'DEPS'),
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'DEPS'),
+        ])
+
+  # Create files in a new subdirectories with DEPS files prohibiting //chrome.
+  def testFilesWithDepsFilesProhibitingChrome(self):
+    DEPS_FILE_PROHIBITING_CHROME = ['include_rules = [ "-chrome", ]']
+
+    input_api = MockInputApi()
+    input_api.files = [
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'bar.h'), ''),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'foo', 'DEPS'),
+          DEPS_FILE_PROHIBITING_CHROME),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'baz.h'), ''),
+      MockAffectedFile(
+          input_api.os_path.join(_CHROME_BROWSER_ASH, 'bar', 'DEPS'),
+          DEPS_FILE_PROHIBITING_CHROME),
+    ]
+    self.assertDepsFilesWithErrors(input_api, [], [])
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/chrome/browser/ash/child_accounts/web_approvals_integration_test.cc b/chrome/browser/ash/child_accounts/web_approvals_integration_test.cc
index d795dcf..7320a02 100644
--- a/chrome/browser/ash/child_accounts/web_approvals_integration_test.cc
+++ b/chrome/browser/ash/child_accounts/web_approvals_integration_test.cc
@@ -33,7 +33,9 @@
   std::string GetMatureSite() { return delegate_.test_data().mature_site; }
 };
 
-IN_PROC_BROWSER_TEST_F(WebApprovalsIntegrationTest, TestMatureSiteBlocked) {
+// Flaky: b/334993995
+IN_PROC_BROWSER_TEST_F(WebApprovalsIntegrationTest,
+                       DISABLED_TestMatureSiteBlocked) {
   SetupContextWidget();
   login_mixin().Login();
 
diff --git a/chrome/browser/ash/customization/customization_wallpaper_util.cc b/chrome/browser/ash/customization/customization_wallpaper_util.cc
index e03879c..2ffaff6 100644
--- a/chrome/browser/ash/customization/customization_wallpaper_util.cc
+++ b/chrome/browser/ash/customization/customization_wallpaper_util.cc
@@ -38,8 +38,9 @@
       image, skia::ImageOperations::RESIZE_LANCZOS3, size);
   scoped_refptr<base::RefCountedBytes> image_data = new base::RefCountedBytes();
   gfx::JPEGCodec::Encode(*resized_image.bitmap(), 90 /*quality=*/,
-                         &image_data->as_vector());
-  return base::WriteFile(file_path, *image_data);
+                         &image_data->data());
+  return base::WriteFile(
+      file_path, base::make_span(image_data->front(), image_data->size()));
 }
 
 // Returns true if both file paths exist.
diff --git a/chrome/browser/ash/events/event_rewriter_delegate_impl.cc b/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
index d13efd75..d52d7dc 100644
--- a/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
+++ b/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
@@ -75,6 +75,10 @@
     const std::string& pref_name) const {
   // `modifier_key` and `device_id` are unused when the flag is disabled.
   if (!ash::features::IsInputDeviceSettingsSplitEnabled()) {
+    if (pref_name.empty()) {
+      return std::nullopt;
+    }
+
     // If we're at the login screen, try to get the pref from the global prefs
     // dictionary.
     int value;
diff --git a/chrome/browser/ash/events/event_rewriter_unittest.cc b/chrome/browser/ash/events/event_rewriter_unittest.cc
index c6158481..2441119 100644
--- a/chrome/browser/ash/events/event_rewriter_unittest.cc
+++ b/chrome/browser/ash/events/event_rewriter_unittest.cc
@@ -63,6 +63,7 @@
 #include "ui/events/ash/pref_names.h"
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/events/devices/device_data_manager_test_api.h"
+#include "ui/events/devices/input_device.h"
 #include "ui/events/devices/keyboard_device.h"
 #include "ui/events/devices/touchpad_device.h"
 #include "ui/events/event.h"
@@ -327,6 +328,10 @@
                             ui::DomKey::CAPS_LOCK,
                             ui::VKEY_CAPITAL,
                             ui::EF_MOD3_DOWN>;
+using KeyFunction = TestKey<ui::DomCode::FN,
+                            ui::DomKey::FN,
+                            ui::VKEY_FUNCTION,
+                            ui::EF_FUNCTION_DOWN>;
 
 // Function keys.
 using KeyEscape =
@@ -683,6 +688,8 @@
          ui::VKEY_LWIN},
         {ui::EF_MOD3_DOWN, ui::DomCode::CAPS_LOCK, ui::DomKey::CAPS_LOCK,
          ui::VKEY_CAPITAL},
+        {ui::EF_FUNCTION_DOWN, ui::DomCode::FN, ui::DomKey::FN,
+         ui::VKEY_FUNCTION},
     };
 
     // Send modifier key press events to update rewriter's modifier flag state.
@@ -1693,6 +1700,86 @@
   input_method_manager_mock_->set_mod3_used(false);
 }
 
+TEST_P(EventRewriterTest, TestRewriteToFunction) {
+  // Remap RightAlt to Control
+  Preferences::RegisterProfilePrefs(prefs()->registry());
+  IntegerPrefMember control;
+  InitModifierKeyPref(&control, ::prefs::kLanguageRemapControlKeyTo,
+                      ui::mojom::ModifierKey::kControl,
+                      ui::mojom::ModifierKey::kFunction);
+
+  IntegerPrefMember search;
+  InitModifierKeyPref(&search, ::prefs::kLanguageRemapSearchKeyTo,
+                      ui::mojom::ModifierKey::kMeta,
+                      ui::mojom::ModifierKey::kFunction);
+
+  for (const auto& keyboard : kChromeKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
+
+    // A + rewritten modifiers produce events with function flag down.
+    EXPECT_EQ(KeyA::Typed(ui::EF_FUNCTION_DOWN),
+              RunRewriter(KeyA::Typed(), ui::EF_CONTROL_DOWN));
+    EXPECT_EQ(KeyA::Typed(ui::EF_FUNCTION_DOWN),
+              RunRewriter(KeyA::Typed(), ui::EF_COMMAND_DOWN));
+
+    // After command + control are released, events are not affected.
+    EXPECT_EQ(KeyA::Typed(), RunRewriter(KeyA::Typed()));
+  }
+}
+
+TEST_P(EventRewriterTest, TestRewriteFromFunction) {
+  // Function is only available when InputDeviceSettingsSplit is enabled.
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kInputDeviceSettingsSplit);
+
+  // Remap Function to Control
+  InitModifierKeyPref(nullptr, "", ui::mojom::ModifierKey::kFunction,
+                      ui::mojom::ModifierKey::kControl);
+
+  for (const auto& keyboard : kChromeKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
+
+    EXPECT_EQ(KeyLControl::Typed(), RunRewriter(KeyFunction::Typed()));
+
+    // A + rewritten modifiers produce events with function flag down.
+    EXPECT_EQ(KeyA::Typed(ui::EF_CONTROL_DOWN),
+              RunRewriter(KeyA::Typed(), ui::EF_FUNCTION_DOWN));
+    // After command + control are released, events are not affected.
+    EXPECT_EQ(KeyA::Typed(), RunRewriter(KeyA::Typed()));
+  }
+
+  // Remap Function to CapsLock
+  InitModifierKeyPref(nullptr, "", ui::mojom::ModifierKey::kFunction,
+                      ui::mojom::ModifierKey::kCapsLock);
+
+  for (const auto& keyboard : kChromeKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
+
+    // Toggle CapsLock on
+    EXPECT_EQ(KeyCapsLock::Typed(ui::EF_CAPS_LOCK_ON),
+              RunRewriter(KeyFunction::Typed(ui::EF_CAPS_LOCK_ON)));
+
+    // Toggle CapsLock off
+    EXPECT_EQ(KeyCapsLock::Typed(), RunRewriter(KeyFunction::Typed()));
+  }
+
+  // Remap Function to Void
+  InitModifierKeyPref(nullptr, "", ui::mojom::ModifierKey::kFunction,
+                      ui::mojom::ModifierKey::kVoid);
+
+  for (const auto& keyboard : kChromeKeyboardVariants) {
+    SCOPED_TRACE(keyboard.name);
+    SetUpKeyboard(keyboard);
+
+    EXPECT_EQ(KeyUnknown::Typed(), RunRewriter(KeyFunction::Typed()));
+  }
+
+  scoped_feature_list_.Reset();
+}
+
 // TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
 TEST_P(EventRewriterTest, TestRewriteExtendedKeysAltVariantsOld) {
   Preferences::RegisterProfilePrefs(prefs()->registry());
diff --git a/chrome/browser/ash/exo/chrome_security_delegate_unittest.cc b/chrome/browser/ash/exo/chrome_security_delegate_unittest.cc
index 2a6e2320..ad97c426 100644
--- a/chrome/browser/ash/exo/chrome_security_delegate_unittest.cc
+++ b/chrome/browser/ash/exo/chrome_security_delegate_unittest.cc
@@ -50,15 +50,12 @@
 }
 
 void Capture(std::string* result, scoped_refptr<base::RefCountedMemory> data) {
-  *result = std::string(base::as_string_view(*data));
+  *result = std::string(data->front_as<char>(), data->size());
 }
 
 void CaptureUTF16(std::string* result,
                   scoped_refptr<base::RefCountedMemory> data) {
-  base::span<const uint8_t> bytes = *data;
-  std::u16string str(bytes.size() / 2u, u'\0');
-  base::as_writable_byte_span(str).copy_from(bytes);
-  *result = base::UTF16ToUTF8(str);
+  base::UTF16ToUTF8(data->front_as<char16_t>(), data->size() / 2, result);
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/file_system_provider/cloud_file_system.cc b/chrome/browser/ash/file_system_provider/cloud_file_system.cc
index 7dd09fa5..cdba973 100644
--- a/chrome/browser/ash/file_system_provider/cloud_file_system.cc
+++ b/chrome/browser/ash/file_system_provider/cloud_file_system.cc
@@ -37,10 +37,6 @@
   return GURL("chrome://content-cache/");
 }
 
-const base::FilePath RootFilePath() {
-  return base::FilePath("/");
-}
-
 std::ostream& operator<<(std::ostream& out,
                          const std::vector<base::FilePath>& entry_paths) {
   for (size_t i = 0; i < entry_paths.size(); ++i) {
@@ -119,26 +115,9 @@
       file_system_->GetFileSystemInfo(),
       base::BindOnce(&CloudFileSystem::OnContentCacheInitialized,
                      weak_ptr_factory_.GetWeakPtr()));
-
-  // Add watcher to keep content cache up to date. Notifications are received
-  // though Notify() so no notification_callback is needed.
-  AddWatcher(GetContentCacheURL(), RootFilePath(),
-             /*recursive=*/true, /*persistent=*/false,
-             base::BindOnce([](base::File::Error result) {
-               VLOG(1) << "Added file watcher on root: " << result;
-             }),
-             base::DoNothing());
 }
 
-CloudFileSystem::~CloudFileSystem() {
-  if (content_cache_) {
-    RemoveWatcher(GetContentCacheURL(), RootFilePath(),
-                  /*recursive=*/true,
-                  base::BindOnce([](base::File::Error result) {
-                    VLOG(1) << "Removed file watcher on root: " << result;
-                  }));
-  }
-}
+CloudFileSystem::~CloudFileSystem() = default;
 
 void CloudFileSystem::OnContentCacheInitialized(
     base::FileErrorOr<std::unique_ptr<ContentCache>> error_or_cache) {
@@ -146,6 +125,7 @@
       << "Error initializing the content cache: " << error_or_cache.error();
   if (error_or_cache.has_value()) {
     content_cache_ = std::move(error_or_cache.value());
+    // TODO(b/328679875): Add watcher for every file in the cache.
   }
 }
 
@@ -257,18 +237,37 @@
   auto readchunk_success_callback = base::BindRepeating(
       std::move(callback), bytes_read, has_more, base::File::FILE_OK);
 
+  const OpenedCloudFile& opened_cloud_file = it->second;
   if (!content_cache_->StartWriteBytes(
-          it->second, buffer, offset, bytes_read,
+          opened_cloud_file, buffer, offset, bytes_read,
           base::BindOnce(&CloudFileSystem::OnBytesWrittenToCache,
                          weak_ptr_factory_.GetWeakPtr(),
+                         opened_cloud_file.file_path,
                          readchunk_success_callback))) {
     readchunk_success_callback.Run();
   }
 }
 
 void CloudFileSystem::OnBytesWrittenToCache(
+    const base::FilePath& file_path,
     base::RepeatingCallback<void()> readchunk_success_callback,
     base::File::Error result) {
+  if (result == base::File::FILE_OK) {
+    Watchers::const_iterator watcher =
+        GetWatchers()->find(WatcherKey(file_path, /*recursive=*/false));
+    if (watcher == GetWatchers()->end() ||
+        !watcher->second.subscribers.contains(GetContentCacheURL())) {
+      // This file is newly added to the cache so watch it to track any changes.
+      // Notifications are received though Notify() so no notification_callback
+      // is needed.
+      AddWatcher(GetContentCacheURL(), file_path,
+                 /*recursive=*/false, /*persistent=*/false,
+                 base::BindOnce([](base::File::Error result) {
+                   VLOG(1) << "Added file watcher on file: " << result;
+                 }),
+                 base::DoNothing());
+    }
+  }
   readchunk_success_callback.Run();
 }
 
diff --git a/chrome/browser/ash/file_system_provider/cloud_file_system.h b/chrome/browser/ash/file_system_provider/cloud_file_system.h
index d080053..91d0090 100644
--- a/chrome/browser/ash/file_system_provider/cloud_file_system.h
+++ b/chrome/browser/ash/file_system_provider/cloud_file_system.h
@@ -168,6 +168,7 @@
   // successfully read the file, if the content cache fails to write the file to
   // disk this should not stop further FSP requests.
   void OnBytesWrittenToCache(
+      const base::FilePath& file_path,
       base::RepeatingCallback<void()> readchunk_success_callback,
       base::File::Error result);
 
diff --git a/chrome/browser/ash/file_system_provider/cloud_file_system_unittest.cc b/chrome/browser/ash/file_system_provider/cloud_file_system_unittest.cc
index 30d3a11f..b4fb572 100644
--- a/chrome/browser/ash/file_system_provider/cloud_file_system_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/cloud_file_system_unittest.cc
@@ -32,7 +32,7 @@
 using testing::_;
 using testing::Field;
 using testing::IsEmpty;
-using testing::IsTrue;
+using testing::IsFalse;
 using testing::Return;
 
 using OpenFileFuture =
@@ -65,6 +65,7 @@
 
 class MockContentCache : public ContentCache {
  public:
+  MOCK_METHOD(void, SetMaxCacheSize, (size_t max_cache_size), (override));
   MOCK_METHOD(bool,
               StartReadBytes,
               (const OpenedCloudFile& file,
@@ -160,10 +161,11 @@
 
   void ReadFileSuccessfully(CloudFileSystem& cloud_file_system,
                             int file_handle,
-                            scoped_refptr<net::IOBuffer> buffer) {
+                            scoped_refptr<net::IOBuffer> buffer,
+                            int64_t offset = 0,
+                            int length = 1) {
     ReadFileFuture read_file_future;
-    cloud_file_system.ReadFile(file_handle, buffer.get(), /*offset=*/0,
-                               /*length=*/1,
+    cloud_file_system.ReadFile(file_handle, buffer.get(), offset, length,
                                read_file_future.GetRepeatingCallback());
     EXPECT_EQ(read_file_future.Get<int>(), 1);
     EXPECT_EQ(read_file_future.Get<base::File::Error>(), base::File::FILE_OK);
@@ -192,37 +194,7 @@
   std::unique_ptr<TestingProfile> profile_;
 };
 
-// Test that there always exists a self-added recursive watcher on root when
-// there is a CacheManager.
-TEST_F(FileSystemProviderCloudFileSystemTest,
-       WatcherOnRootIsAddedWhenCacheManagerExists) {
-  EXPECT_CALL(mock_cache_manager_,
-              InitializeForProvider(
-                  GetFileSystemInfo(/*with_mock_cache_manager=*/true), _))
-      .Times(1);
-  std::unique_ptr<CloudFileSystem> cloud_file_system =
-      CreateCloudFileSystem(/*with_mock_cache_manager=*/true);
-
-  // Expect recursive root watcher added.
-  EXPECT_THAT(cloud_file_system->GetWatchers(),
-              Pointee(ElementsAre(Pair(
-                  _, AllOf(Field(&Watcher::entry_path, base::FilePath("/")),
-                           Field(&Watcher::recursive, IsTrue()))))));
-}
-
-// Test that there is not a recursive watcher on root when there isn't a
-// CacheManager.
-TEST_F(FileSystemProviderCloudFileSystemTest,
-       WatcherOnRootIsNotAddedWhenCacheManagerDoesNotExist) {
-  EXPECT_CALL(mock_cache_manager_, InitializeForProvider(_, _)).Times(0);
-  std::unique_ptr<CloudFileSystem> cloud_file_system =
-      CreateCloudFileSystem(/*with_mock_cache_manager=*/false);
-
-  // Expect no watchers are added.
-  EXPECT_THAT(cloud_file_system->GetWatchers(), Pointee(IsEmpty()));
-}
-
-TEST_F(FileSystemProviderCloudFileSystemTest, FirstReadFileWritesToCache) {
+TEST_F(FileSystemProviderCloudFileSystemTest, ContiguousReadsWriteToCache) {
   auto [mock_content_cache, cloud_file_system] =
       CreateMockContentCacheAndCloudFileSystem();
 
@@ -251,7 +223,40 @@
         return true;
       });
 
-  ReadFileSuccessfully(*cloud_file_system, file_handle, buffer);
+  // Read the first chunk.
+  ReadFileSuccessfully(*cloud_file_system, file_handle, buffer, /*offset=*/0,
+                       /*length=*/1);
+
+  // Expect watcher added for file.
+  EXPECT_THAT(
+      cloud_file_system->GetWatchers(),
+      Pointee(ElementsAre(Pair(
+          _, AllOf(Field(&Watcher::entry_path, base::FilePath(kFakeFilePath)),
+                   Field(&Watcher::recursive, IsFalse()))))));
+
+  // Read the next chunk.
+  EXPECT_CALL(*mock_content_cache,
+              StartReadBytes(_, buffer.get(), /*offset=*/1,
+                             /*length=*/1, IsNotNullCallback()))
+      .WillOnce(Return(false));
+  EXPECT_CALL(*mock_content_cache,
+              StartWriteBytes(_, buffer.get(), /*offset=*/1,
+                              /*length=*/1, IsNotNullCallback()))
+      .WillOnce([](const OpenedCloudFile& file, net::IOBuffer* buffer,
+                   int64_t offset, int length, FileErrorCallback callback) {
+        std::move(callback).Run(base::File::FILE_OK);
+        return true;
+      });
+  ReadFileSuccessfully(*cloud_file_system, file_handle, buffer, /*offset=*/1,
+                       /*length=*/1);
+
+  // Expect no new watcher added for the file.
+  EXPECT_THAT(
+      cloud_file_system->GetWatchers(),
+      Pointee(ElementsAre(Pair(
+          _, AllOf(Field(&Watcher::entry_path, base::FilePath(kFakeFilePath)),
+                   Field(&Watcher::recursive, IsFalse()))))));
+
   CloseFileSuccessfully(*cloud_file_system, file_handle);
 }
 
@@ -316,6 +321,9 @@
       .WillOnce(Return(false));
 
   ReadFileSuccessfully(*cloud_file_system, file_handle, buffer);
+  // Expect no watcher is added.
+  EXPECT_THAT(cloud_file_system->GetWatchers(), Pointee(IsEmpty()));
+
   CloseFileSuccessfully(*cloud_file_system, file_handle);
 }
 
@@ -336,6 +344,9 @@
   EXPECT_CALL(*mock_content_cache, StartWriteBytes(_, _, _, _, _)).Times(0);
 
   ReadFileSuccessfully(*cloud_file_system, file_handle, buffer);
+  // Expect no watcher is added.
+  EXPECT_THAT(cloud_file_system->GetWatchers(), Pointee(IsEmpty()));
+
   CloseFileSuccessfully(*cloud_file_system, file_handle);
 }
 
@@ -374,6 +385,8 @@
   EXPECT_EQ(read_file_future.Get<int>(), 0);
   EXPECT_EQ(read_file_future.Get<base::File::Error>(),
             base::File::FILE_ERROR_INVALID_OPERATION);
+  // Expect no watcher is added.
+  EXPECT_THAT(cloud_file_system->GetWatchers(), Pointee(IsEmpty()));
 
   CloseFileSuccessfully(*cloud_file_system, file_handle);
 }
diff --git a/chrome/browser/ash/file_system_provider/content_cache/content_cache.h b/chrome/browser/ash/file_system_provider/content_cache/content_cache.h
index 64a9baa..56d0275 100644
--- a/chrome/browser/ash/file_system_provider/content_cache/content_cache.h
+++ b/chrome/browser/ash/file_system_provider/content_cache/content_cache.h
@@ -25,6 +25,12 @@
  public:
   virtual ~ContentCache() = default;
 
+  // Sets the maximum size of the cache. No new items will be inserted once the
+  // capacity is reached.
+  // TODO(b/328679426): Evict items if the new max size is less than the number
+  // of items already in the cache.
+  virtual void SetMaxCacheSize(size_t max_cache_size) = 0;
+
   // Start reading bytes defined by `file` from the content cache. Returns true
   // when the bytes exist in the content cache and can be read (the actual bytes
   // will be stored in the `buffer` and `callback` invoked on finish) and false
diff --git a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
index 8b458c5..f3f17476 100644
--- a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
+++ b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
@@ -55,12 +55,14 @@
 }  // namespace
 
 ContentCacheImpl::ContentCacheImpl(const base::FilePath& root_dir,
-                                   BoundContextDatabase context_db)
+                                   BoundContextDatabase context_db,
+                                   size_t max_cache_size)
     : root_dir_(root_dir),
       io_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
           {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
            base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
-      context_db_(std::move(context_db)) {}
+      context_db_(std::move(context_db)),
+      max_cache_size_(max_cache_size) {}
 
 ContentCacheImpl::~ContentCacheImpl() {
   context_db_.Reset();
@@ -68,8 +70,16 @@
 
 std::unique_ptr<ContentCache> ContentCacheImpl::Create(
     const base::FilePath& root_dir,
-    BoundContextDatabase context_db) {
-  return std::make_unique<ContentCacheImpl>(root_dir, std::move(context_db));
+    BoundContextDatabase context_db,
+    size_t max_cache_size) {
+  return std::make_unique<ContentCacheImpl>(root_dir, std::move(context_db),
+                                            max_cache_size);
+}
+
+void ContentCacheImpl::SetMaxCacheSize(size_t max_cache_size) {
+  // TODO(b/328679426): Evict items if the new max size is less than the number
+  // of items already in the cache.
+  max_cache_size_ = max_cache_size;
 }
 
 bool ContentCacheImpl::StartReadBytes(
@@ -163,8 +173,16 @@
 
   ContentLRUCache::iterator it = lru_cache_.Get(file.file_path);
   if (it == lru_cache_.end()) {
-    // No `CacheFileContext` as this is the first write to the cache, let's
-    // create it with the supplied version_tag.
+    // The file doesn't exist in the cache yet.
+
+    if (lru_cache_.size() >= max_cache_size_) {
+      // TODO(b/328679426): Evict files instead of preventing all new
+      // insertions.
+      VLOG(1) << "Cache is already at capacity";
+      return false;
+    }
+
+    // Let's create `CacheFileContext` with the supplied version_tag.
     it = lru_cache_.Put(
         PathContextPair(file.file_path, CacheFileContext(file.version_tag)));
   }
diff --git a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.h b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.h
index 7b4a83e6..db7af68e 100644
--- a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.h
+++ b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.h
@@ -16,13 +16,17 @@
 #include "chrome/browser/ash/file_system_provider/provided_file_system_interface.h"
 
 namespace ash::file_system_provider {
+namespace {
+constexpr size_t kMaxCacheSize = 500;
+}  // namespace
 
 // The content cache for every mounted FSP. This will serve as the single point
 // of orchestration between the LRU cache and the disk persistence layer.
 class ContentCacheImpl : public ContentCache {
  public:
   ContentCacheImpl(const base::FilePath& root_dir,
-                   BoundContextDatabase context_db);
+                   BoundContextDatabase context_db,
+                   size_t max_cache_size);
 
   ContentCacheImpl(const ContentCacheImpl&) = delete;
   ContentCacheImpl& operator=(const ContentCacheImpl&) = delete;
@@ -30,8 +34,12 @@
   ~ContentCacheImpl() override;
 
   // Creates a `ContentCache` with the concrete implementation.
-  static std::unique_ptr<ContentCache> Create(const base::FilePath& root_dir,
-                                              BoundContextDatabase context_db);
+  static std::unique_ptr<ContentCache> Create(
+      const base::FilePath& root_dir,
+      BoundContextDatabase context_db,
+      size_t max_cache_size = kMaxCacheSize);
+
+  void SetMaxCacheSize(size_t max_cache_size) override;
 
   bool StartReadBytes(
       const OpenedCloudFile& file,
@@ -77,6 +85,7 @@
 
   scoped_refptr<base::SequencedTaskRunner> io_task_runner_;
   BoundContextDatabase context_db_;
+  size_t max_cache_size_;
 
   base::WeakPtrFactory<ContentCacheImpl> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl_unittest.cc b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl_unittest.cc
index 79561697..8471829 100644
--- a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl_unittest.cc
@@ -46,7 +46,7 @@
     EXPECT_TRUE(future.Get());
 
     content_cache_ =
-        std::make_unique<ContentCacheImpl>(temp_dir_.GetPath(), std::move(db));
+        ContentCacheImpl::Create(temp_dir_.GetPath(), std::move(db));
   }
 
   void TearDown() override { content_cache_.reset(); }
@@ -156,6 +156,37 @@
 }
 
 TEST_F(FileSystemProviderContentCacheImplTest,
+       StartWriteBytesForNewFileShouldFailIfCacheFull) {
+  content_cache_->SetMaxCacheSize(2);
+
+  // Inserts file into cache. 1 space left.
+  WriteFileToCache(base::FilePath("random-path1"), /*version_tag=*/"versionA");
+  // Inserts another file into cache. 0 spaces left.
+  WriteFileToCache(base::FilePath("random-path2"), /*version_tag=*/"versionA");
+
+  // Expect third insertion to fail.
+  OpenedCloudFile file3(base::FilePath("random-path3"),
+                        OpenFileMode::OPEN_FILE_MODE_READ,
+                        /*version_tag=*/"versionA");
+  EXPECT_FALSE(content_cache_->StartWriteBytes(file3, /*buffer=*/nullptr,
+                                               /*offset=*/0, kDefaultChunkSize,
+                                               base::DoNothing()));
+
+  // Should still be able to write to existing files in the cache.
+  OpenedCloudFile file1(base::FilePath("random-path1"),
+                        OpenFileMode::OPEN_FILE_MODE_READ,
+                        /*version_tag=*/"versionA");
+  TestFuture<base::File::Error> future;
+  scoped_refptr<net::IOBufferWithSize> buffer =
+      InitializeBufferWithRandBytes(kDefaultChunkSize);
+  EXPECT_TRUE(content_cache_->StartWriteBytes(file1, buffer.get(),
+                                              /*offset=*/512, kDefaultChunkSize,
+                                              future.GetCallback()));
+  // Contiguous file write should succeed.
+  EXPECT_EQ(future.Get(), base::File::FILE_OK);
+}
+
+TEST_F(FileSystemProviderContentCacheImplTest,
        StartReadBytesShouldFailOnFirstRead) {
   OpenedCloudFile file(base::FilePath("not-in-cache"),
                        OpenFileMode::OPEN_FILE_MODE_READ, /*version_tag=*/"");
diff --git a/chrome/browser/ash/file_system_provider/fake_provided_file_system.cc b/chrome/browser/ash/file_system_provider/fake_provided_file_system.cc
index 78aa74a..34bb5a3b 100644
--- a/chrome/browser/ash/file_system_provider/fake_provided_file_system.cc
+++ b/chrome/browser/ash/file_system_provider/fake_provided_file_system.cc
@@ -535,15 +535,20 @@
   const WatcherKey key(entry_watcher, recursive);
   const Watchers::iterator it = watchers_.find(key);
   if (it != watchers_.end()) {
-    std::move(callback).Run(base::File::FILE_OK);
     return PostAbortableTask(
         base::BindOnce(std::move(callback), base::File::FILE_OK));
   }
 
+  Subscriber subscriber;
+  subscriber.origin = origin;
+  subscriber.persistent = persistent;
+  subscriber.notification_callback = std::move(notification_callback);
+
   // Add watcher.
   Watcher* const watcher = &watchers_[key];
   watcher->entry_path = entry_watcher;
   watcher->recursive = recursive;
+  watcher->subscribers[origin] = subscriber;
 
   // Notify observers.
   for (auto& observer : observers_) {
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_without_ime_service_browsertest.cc b/chrome/browser/ash/input_method/native_input_method_engine_without_ime_service_browsertest.cc
index 43eb575..3c5341a1 100644
--- a/chrome/browser/ash/input_method/native_input_method_engine_without_ime_service_browsertest.cc
+++ b/chrome/browser/ash/input_method/native_input_method_engine_without_ime_service_browsertest.cc
@@ -102,8 +102,7 @@
  public:
   NativeInputMethodEngineWithoutImeServiceTest() : input_method_(this) {
     feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kMultilingualTyping,
-                              features::kOnDeviceGrammarCheck},
+        /*enabled_features=*/{features::kOnDeviceGrammarCheck},
         /*disabled_features=*/{});
   }
 
diff --git a/chrome/browser/ash/login/supervised_user_login_integration_test.cc b/chrome/browser/ash/login/supervised_user_login_integration_test.cc
index 1628d81..5750542 100644
--- a/chrome/browser/ash/login/supervised_user_login_integration_test.cc
+++ b/chrome/browser/ash/login/supervised_user_login_integration_test.cc
@@ -73,7 +73,9 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest, TestUnicornLogin) {
+// Flaky: b/334993995
+IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest,
+                       DISABLED_TestUnicornLogin) {
   SetupContextWidget();
 
   login_mixin().Login();
@@ -83,7 +85,9 @@
   VerifyPolicies();
 }
 
-IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest, TestGellerLogin) {
+// Flaky: b/334993995
+IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest,
+                       DISABLED_TestGellerLogin) {
   SetupContextWidget();
 
   delegate_.set_user_type(
@@ -95,7 +99,9 @@
   VerifyPolicies();
 }
 
-IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest, TestGriffinLogin) {
+// Flaky: b/334993995
+IN_PROC_BROWSER_TEST_F(SupervisedUserLoginIntegrationTest,
+                       DISABLED_TestGriffinLogin) {
   SetupContextWidget();
 
   delegate_.set_user_type(
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader.cc b/chrome/browser/ash/login/users/avatar/user_image_loader.cc
index 1dbe9acd..997c3d9 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_loader.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_loader.cc
@@ -297,7 +297,7 @@
               auto encoded = base::MakeRefCounted<base::RefCountedBytes>();
               if (!gfx::PNGCodec::EncodeBGRASkBitmap(
                       bitmap, /*discard_transparency=*/false,
-                      &encoded->as_vector())) {
+                      &encoded->data())) {
                 return std::make_unique<user_manager::UserImage>();
               }
 
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader_unittest.cc b/chrome/browser/ash/login/users/avatar/user_image_loader_unittest.cc
index a6822fe..f3ad64f 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_loader_unittest.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_loader_unittest.cc
@@ -60,9 +60,8 @@
       task_environment_.GetMainThreadTaskRunner(), image_path,
       base::BindLambdaForTesting(
           [&](std::unique_ptr<user_manager::UserImage> user_image) {
-            EXPECT_EQ(
-                original_contents,
-                std::string(base::as_string_view(*user_image->image_bytes())));
+            auto data = user_image->image_bytes()->data();
+            EXPECT_EQ(original_contents, std::string(data.begin(), data.end()));
             EXPECT_EQ(user_manager::UserImage::FORMAT_WEBP,
                       user_image->image_format());
             EXPECT_EQ(16, user_image->image().width());
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
index defb65f..3d0b38e 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -107,7 +107,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "google_apis/gaia/gaia_auth_util.h"
-#include "ui/base/l10n/l10n_util.h"
 #include "ui/wm/core/wm_core_switches.h"
 
 namespace ash {
@@ -148,12 +147,6 @@
   }
 }
 
-// Runs on SequencedWorkerPool thread. Passes resolved locale to UI thread.
-void ResolveLocale(const std::string& raw_locale,
-                   std::string* resolved_locale) {
-  std::ignore = l10n_util::CheckAndResolveLocale(raw_locale, resolved_locale);
-}
-
 bool GetUserLockAttributes(const user_manager::User* user,
                            MultiUserSignInPolicy* policy) {
   Profile* const profile = ProfileHelper::Get()->GetProfileByUser(user);
@@ -988,17 +981,6 @@
          user_manager::kSupervisedUserDomain;
 }
 
-void ChromeUserManagerImpl::ScheduleResolveLocale(
-    const std::string& locale,
-    base::OnceClosure on_resolved_callback,
-    std::string* out_resolved_locale) const {
-  base::ThreadPool::PostTaskAndReply(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(ResolveLocale, locale,
-                     base::Unretained(out_resolved_locale)),
-      std::move(on_resolved_callback));
-}
-
 bool ChromeUserManagerImpl::IsValidDefaultUserImageId(int image_index) const {
   return default_user_image::IsValidIndex(image_index);
 }
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.h b/chrome/browser/ash/login/users/chrome_user_manager_impl.h
index 0a27b60..519c231 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_impl.h
+++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.h
@@ -79,9 +79,6 @@
   void AsyncRemoveCryptohome(const AccountId& account_id) const override;
   bool IsDeprecatedSupervisedAccountId(
       const AccountId& account_id) const override;
-  void ScheduleResolveLocale(const std::string& locale,
-                             base::OnceClosure on_resolved_callback,
-                             std::string* out_resolved_locale) const override;
   bool IsValidDefaultUserImageId(int image_index) const override;
   user_manager::MultiUserSignInPolicyController*
   GetMultiUserSignInPolicyController() override;
diff --git a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc
index 78962c0..da0fa6f 100644
--- a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc
+++ b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc
@@ -283,14 +283,6 @@
          user_manager::kSupervisedUserDomain;
 }
 
-void FakeChromeUserManager::ScheduleResolveLocale(
-    const std::string& locale,
-    base::OnceClosure on_resolved_callback,
-    std::string* out_resolved_locale) const {
-  NOTIMPLEMENTED();
-  return;
-}
-
 bool FakeChromeUserManager::IsValidDefaultUserImageId(int image_index) const {
   return default_user_image::IsValidIndex(image_index);
 }
diff --git a/chrome/browser/ash/login/users/fake_chrome_user_manager.h b/chrome/browser/ash/login/users/fake_chrome_user_manager.h
index ab80d97..59c179b 100644
--- a/chrome/browser/ash/login/users/fake_chrome_user_manager.h
+++ b/chrome/browser/ash/login/users/fake_chrome_user_manager.h
@@ -123,9 +123,6 @@
   void AsyncRemoveCryptohome(const AccountId& account_id) const override;
   bool IsDeprecatedSupervisedAccountId(
       const AccountId& account_id) const override;
-  void ScheduleResolveLocale(const std::string& locale,
-                             base::OnceClosure on_resolved_callback,
-                             std::string* out_resolved_locale) const override;
   bool IsValidDefaultUserImageId(int image_index) const override;
   user_manager::MultiUserSignInPolicyController*
   GetMultiUserSignInPolicyController() override;
diff --git a/chrome/browser/ash/multi_screen_capture/DEPS b/chrome/browser/ash/multi_screen_capture/DEPS
new file mode 100644
index 0000000..28ac3258
--- /dev/null
+++ b/chrome/browser/ash/multi_screen_capture/DEPS
@@ -0,0 +1,20 @@
+include_rules = [
+  # ChromeOS should not depend on //chrome. See //docs/chromeos/code.md for
+  # details.
+  "-chrome",
+
+  # This directory is in //chrome, which violates the rule above. Allow this
+  # directory to #include its own files.
+  "+chrome/browser/ash/multi_screen_capture",
+
+  # Existing dependencies within //chrome. There is an active effort to
+  # refactor //chrome/browser/ash to break these dependencies; see b/332804822.
+  # Whenever possible, avoid adding new //chrome dependencies to this list.
+  #
+  # Files residing in certain directories (e.g., //chrome/browser) are listed
+  # individually. Other dependencies within //chrome are listed on a per-
+  # directory basis. See //tools/chromeos/gen_deps.sh for details.
+  "+chrome/browser/ash/policy/multi_screen_capture",
+  "+chrome/browser/media/webrtc",
+  "+chrome/browser/profiles",
+]
diff --git a/chrome/browser/ash/net/secure_dns_manager.cc b/chrome/browser/ash/net/secure_dns_manager.cc
index f6e9fff..21b92e9 100644
--- a/chrome/browser/ash/net/secure_dns_manager.cc
+++ b/chrome/browser/ash/net/secure_dns_manager.cc
@@ -32,13 +32,6 @@
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
 namespace ash {
-namespace {
-
-// A wildcard character to allow secure DNS automatic mode on any IP addresses.
-// TODO(b/333757554): Update to Shill D-Bus constant after M-125 branch cut.
-constexpr std::string_view kSecureDNSMatchAnyIPAddress = "*";
-
-}  // namespace
 
 SecureDnsManager::SecureDnsManager(PrefService* pref_service)
     : pref_service_(pref_service) {
@@ -112,8 +105,10 @@
   // wildcard character denoting that it matches any IP addresses. In automatic
   // upgrade mode, the corresponding name servers will be populated using the
   // applicable providers.
-  const auto addr =
-      mode == SecureDnsConfig::kModeSecure ? "" : kSecureDNSMatchAnyIPAddress;
+  const std::string_view addr =
+      mode == SecureDnsConfig::kModeSecure
+          ? ""
+          : shill::kDNSProxyDOHProvidersMatchAnyIPAddress;
   for (const auto& doh_template : base::SplitString(
            templates, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
     doh_providers.Set(doh_template, addr);
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
index 455c7ca..b603cbe0 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
@@ -297,8 +297,9 @@
   }
 
   scoped_refptr<base::RefCountedMemory> png_data = GetScreenshotData();
-  if (report->include_screenshot && png_data) {
-    feedback_data->set_image(std::string(base::as_string_view(*png_data)));
+  if (report->include_screenshot && png_data && png_data.get()) {
+    feedback_data->set_image(
+        std::string(png_data->front_as<char>(), png_data->size()));
   }
 
   // Append consent value to report. For cross platform implementations see:
diff --git a/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.cc b/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.cc
index 8c611e8..92d64ca8 100644
--- a/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.cc
+++ b/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.cc
@@ -144,8 +144,7 @@
 // switch for a particular version, we can increment it after fixing the logic.
 // The devices running new code will not be affected by kill switch and we can
 // test our fixes.
-// TODO(b/265923216): Change to 1 to launch unified state determination.
-const int kCodeVersion = 0;
+const int kCodeVersion = 1;
 
 // When set to true, unified state determination is disabled.
 std::optional<bool> g_unified_state_determination_kill_switch;
diff --git a/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker_unittest.cc b/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker_unittest.cc
index 69ac9ba..2b09e219 100644
--- a/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker_unittest.cc
+++ b/chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker_unittest.cc
@@ -663,8 +663,7 @@
   base::test::TestFuture<void> future;
   test_url_loader_factory_.AddResponse(
       "https://www.gstatic.com/chromeos-usd-experiment/v1.json",
-      // TODO(b/265923216): Change to 0 when kCodeVersion is 1.
-      R"({"disable_up_to_version": -1})", net::HTTP_OK);
+      R"({"disable_up_to_version": 0})", net::HTTP_OK);
 
   AutoEnrollmentTypeChecker::Initialize(test_shared_loader_factory_,
                                         future.GetCallback());
@@ -707,7 +706,9 @@
   }
 
   bool IsOfficialGoogleOS() {
-    return device_os_ != DeviceOs::Nonchrome && google_branded_;
+    return google_branded_ && (device_os_ == DeviceOs::Chrome ||
+                               device_os_ == DeviceOs::FlexWithoutFRE ||
+                               device_os_ == DeviceOs::FlexWithFRE);
   }
 
   const DeviceOs device_os_ = std::get<0>(GetParam());
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
index fa138ba5..ee7d6e23 100644
--- a/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
@@ -124,7 +124,7 @@
           reinterpret_cast<const unsigned char*>(bmp.getPixels()), color_format,
           gfx::Size(bmp.width(), bmp.height()),
           static_cast<int>(bmp.rowBytes()), false,
-          std::vector<gfx::PNGCodec::Comment>(), &png_bytes->as_vector())) {
+          std::vector<gfx::PNGCodec::Comment>(), &png_bytes->data())) {
     LOG(ERROR) << "Failed to encode image";
   }
   return png_bytes;
diff --git a/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.cc b/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.cc
index a631e76..860fa2c6 100644
--- a/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.cc
+++ b/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.cc
@@ -90,7 +90,7 @@
               {.event_type = ::reporting::EventType::kUser,
                .destination = ::reporting::Destination::ARC_INSTALL})
               .SetSourceInfo(std::move(source_info)));
-  encrypted_reporter_ = std::make_unique<ArcAppInstallEventEncryptedReporter>(
+  encrypted_reporter_ = std::make_unique<ArcAppInstallEncryptedEventReporter>(
       std::move(report_queue), profile_);
 }
 
diff --git a/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.h b/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.h
index fc4e15c6..3a69aad 100644
--- a/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.h
+++ b/chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.h
@@ -9,7 +9,7 @@
 
 #include "base/callback_list.h"
 #include "base/memory/raw_ptr.h"
-#include "chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h"
+#include "chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h"
 #include "chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager.h"
 #include "chrome/browser/ash/policy/reporting/arc_app_install_event_logger.h"
 #include "chrome/browser/policy/messaging_layer/proto/synced/app_install_events.pb.h"
@@ -92,7 +92,7 @@
   // Handles collection, storage and upload of app push-install event logs.
   std::unique_ptr<ArcAppInstallEventLogManager> log_manager_;
 
-  std::unique_ptr<ArcAppInstallEventEncryptedReporter> encrypted_reporter_;
+  std::unique_ptr<ArcAppInstallEncryptedEventReporter> encrypted_reporter_;
 
   // Pref change observer.
   PrefChangeRegistrar pref_change_registrar_;
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.cc b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.cc
similarity index 89%
rename from chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.cc
rename to chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.cc
index 7d024a9c..d795de6 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.cc
@@ -2,7 +2,7 @@
 // Copyright 2024 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/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h"
+#include "chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h"
 
 #include "ash/constants/ash_switches.h"
 #include "base/command_line.h"
@@ -19,7 +19,7 @@
 
 namespace policy {
 
-ArcAppInstallEventEncryptedReporter::ArcAppInstallEventEncryptedReporter(
+ArcAppInstallEncryptedEventReporter::ArcAppInstallEncryptedEventReporter(
     std::unique_ptr<reporting::ReportQueue, base::OnTaskRunnerDeleter>
         report_queue,
     Profile* profile)
@@ -28,12 +28,12 @@
   CHECK(report_queue_);
 }
 
-ArcAppInstallEventEncryptedReporter::~ArcAppInstallEventEncryptedReporter() {
+ArcAppInstallEncryptedEventReporter::~ArcAppInstallEncryptedEventReporter() {
   logger_.reset();
 }
 
 // ArcAppInstallEventLogger::Delegate:
-void ArcAppInstallEventEncryptedReporter::Add(
+void ArcAppInstallEncryptedEventReporter::Add(
     const std::set<std::string>& packages,
     const em::AppInstallReportLogEvent& event) {
   // Only report pending installations, successful installations, or failures.
@@ -73,7 +73,7 @@
   }
 }
 
-void ArcAppInstallEventEncryptedReporter::GetAndroidId(
+void ArcAppInstallEncryptedEventReporter::GetAndroidId(
     ArcAppInstallEventLogger::Delegate::AndroidIdCallback callback) const {
   arc::GetAndroidId(std::move(callback));
 }
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h
similarity index 71%
rename from chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h
rename to chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h
index 120290f..87a20a53 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h
@@ -1,8 +1,8 @@
 // Copyright 2024 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_ASH_POLICY_REPORTING_ARC_APP_INSTALL_EVENT_ENCRYPTED_REPORTER_H_
-#define CHROME_BROWSER_ASH_POLICY_REPORTING_ARC_APP_INSTALL_EVENT_ENCRYPTED_REPORTER_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REPORTING_ARC_APP_INSTALL_ENCRYPTED_EVENT_REPORTER_H_
+#define CHROME_BROWSER_ASH_POLICY_REPORTING_ARC_APP_INSTALL_ENCRYPTED_EVENT_REPORTER_H_
 
 #include "chrome/browser/ash/policy/reporting/arc_app_install_event_logger.h"
 #include "components/reporting/client/report_queue.h"
@@ -16,21 +16,21 @@
 // - AppInstallReportLogEvent::INSTALLATION_STARTED
 // - AppInstallReportLogEvent::INSTALLATION_FAILED
 // - AppInstallReportLogEvent::SERVER_REQUEST
-class ArcAppInstallEventEncryptedReporter
+class ArcAppInstallEncryptedEventReporter
     : public ArcAppInstallEventLogger::Delegate {
  public:
-  explicit ArcAppInstallEventEncryptedReporter(
+  explicit ArcAppInstallEncryptedEventReporter(
       std::unique_ptr<reporting::ReportQueue, base::OnTaskRunnerDeleter>
           report_queue,
       Profile* profile);
 
-  ArcAppInstallEventEncryptedReporter(
-      const ArcAppInstallEventEncryptedReporter&) = delete;
+  ArcAppInstallEncryptedEventReporter(
+      const ArcAppInstallEncryptedEventReporter&) = delete;
 
-  ArcAppInstallEventEncryptedReporter operator=(
-      const ArcAppInstallEventEncryptedReporter&) = delete;
+  ArcAppInstallEncryptedEventReporter operator=(
+      const ArcAppInstallEncryptedEventReporter&) = delete;
 
-  ~ArcAppInstallEventEncryptedReporter() override;
+  ~ArcAppInstallEncryptedEventReporter() override;
 
   // ArcAppInstallEventLogger::Delegate
   void Add(
@@ -49,4 +49,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_ASH_POLICY_REPORTING_ARC_APP_INSTALL_EVENT_ENCRYPTED_REPORTER_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REPORTING_ARC_APP_INSTALL_ENCRYPTED_EVENT_REPORTER_H_
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
similarity index 96%
rename from chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter_unittest.cc
rename to chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
index 4b7111e..b73bf1e 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ash/policy/reporting/arc_app_install_event_encrypted_reporter.h"
+#include "chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter.h"
 
 #include <memory>
 
@@ -101,7 +101,7 @@
   EXPECT_CALL(*report_queue.get(), AddRecord).Times(3);
 
   auto reporter =
-      ArcAppInstallEventEncryptedReporter(std::move(report_queue), &profile_);
+      ArcAppInstallEncryptedEventReporter(std::move(report_queue), &profile_);
 
   reporter.Add(packages, std::move(event_success));
   reporter.Add(packages, std::move(event_started));
diff --git a/chrome/browser/ash/system_web_apps/apps/personalization_app/personalization_app_user_provider_impl_unittest.cc b/chrome/browser/ash/system_web_apps/apps/personalization_app/personalization_app_user_provider_impl_unittest.cc
index ea14c41..fd52eaa 100644
--- a/chrome/browser/ash/system_web_apps/apps/personalization_app/personalization_app_user_provider_impl_unittest.cc
+++ b/chrome/browser/ash/system_web_apps/apps/personalization_app/personalization_app_user_provider_impl_unittest.cc
@@ -428,7 +428,7 @@
   // The BigBuffer data received from the observer should be equal to the test
   // image encoded to png.
   ASSERT_GT(expected_data.size(), 0u);
-  EXPECT_EQ(expected_data, base::span(*encoded_png));
+  EXPECT_EQ(expected_data, encoded_png->data());
 }
 
 TEST_F(PersonalizationAppUserProviderImplTest,
diff --git a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_url_data_source.cc b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_url_data_source.cc
index 9e8bb79a..17c7e26f 100644
--- a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_url_data_source.cc
+++ b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_url_data_source.cc
@@ -80,13 +80,13 @@
             scoped_refptr<base::RefCountedString> ref_contents(
                 new base::RefCountedString);
             if (id == "manifest.json")
-              ref_contents->as_string() = kManifestText;
+              ref_contents->data() = kManifestText;
             else if (id == "pwa.html")
-              ref_contents->as_string() = kPwaHtml;
+              ref_contents->data() = kPwaHtml;
             else if (id == "sw.js")
-              ref_contents->as_string() = kSwJs;
+              ref_contents->data() = kSwJs;
             else if (id == "page2.html")
-              ref_contents->as_string() = kPage2Html;
+              ref_contents->data() = kPage2Html;
             else
               NOTREACHED();
 
diff --git a/chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl_browsertest.cc b/chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl_browsertest.cc
index 33c88c0..516d241 100644
--- a/chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl_browsertest.cc
+++ b/chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl_browsertest.cc
@@ -47,7 +47,7 @@
 scoped_refptr<base::RefCountedBytes> EncodeImage(const gfx::ImageSkia& image) {
   auto output = base::MakeRefCounted<base::RefCountedBytes>();
   SkBitmap bitmap = *(image.bitmap());
-  gfx::JPEGCodec::Encode(bitmap, /*quality=*/90, &(output)->as_vector());
+  gfx::JPEGCodec::Encode(bitmap, /*quality=*/90, &(output)->data());
   return output;
 }
 
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index f5a1dd7..0eb8c2b 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/ash/drive/file_system_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/buildflags.h"
+#include "chrome/browser/bundz_translation/translation_manager_impl.h"
 #include "chrome/browser/cart/commerce_hint_service.h"
 #include "chrome/browser/companion/core/features.h"
 #include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
@@ -103,9 +104,11 @@
 #include "services/image_annotation/public/mojom/image_annotation.mojom.h"
 #include "services/screen_ai/buildflags/buildflags.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/mojom/credentialmanagement/credential_manager.mojom.h"
 #include "third_party/blink/public/mojom/lcp_critical_path_predictor/lcp_critical_path_predictor.mojom.h"
 #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h"
+#include "third_party/blink/public/mojom/on_device_translation/translation_manager.mojom.h"
 #include "third_party/blink/public/mojom/payments/payment_credential.mojom.h"
 #include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
 #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
@@ -1084,6 +1087,11 @@
   map->Add<blink::mojom::WebPrintingService>(
       base::BindRepeating(&printing::CreateWebPrintingServiceForFrame));
 #endif
+
+  if (base::FeatureList::IsEnabled(blink::features::kEnableTranslationAPI)) {
+    map->Add<blink::mojom::TranslationManager>(
+        base::BindRepeating(&TranslationManagerImpl::Create));
+  }
 }
 
 void PopulateChromeWebUIFrameBinders(
diff --git a/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.cc b/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.cc
index 8e5eaa1c..68f2f5e 100644
--- a/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.cc
+++ b/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.cc
@@ -15,7 +15,9 @@
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/mahi/mahi_browser_util.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/screen_ai/screen_ai_service_router.h"
+#include "chrome/browser/screen_ai/screen_ai_service_router_factory.h"
 #include "chromeos/components/mahi/public/mojom/content_extraction.mojom.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/crosapi/mojom/mahi.mojom.h"
@@ -32,7 +34,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/profiles/profile_manager.h"
 #endif
 
 namespace mahi {
@@ -75,11 +76,13 @@
   EnsureServiceIsConnected();
 
   // Builds connection with screen ai service.
-  screen_ai_service_router_.GetServiceStateAsync(
-      screen_ai::ScreenAIServiceRouter::Service::kMainContentExtraction,
-      base::BindOnce(
-          &MahiContentExtractionDelegate::OnScreenAIServiceInitialized,
-          weak_pointer_factory_.GetWeakPtr()));
+  screen_ai::ScreenAIServiceRouterFactory::GetForBrowserContext(
+      ProfileManager::GetActiveUserProfile())
+      ->GetServiceStateAsync(
+          screen_ai::ScreenAIServiceRouter::Service::kMainContentExtraction,
+          base::BindOnce(
+              &MahiContentExtractionDelegate::OnScreenAIServiceInitialized,
+              weak_pointer_factory_.GetWeakPtr()));
 }
 
 MahiContentExtractionDelegate::~MahiContentExtractionDelegate() = default;
@@ -222,8 +225,9 @@
       screen_ai_receiver;
   auto screen_ai_remote = screen_ai_receiver.InitWithNewPipeAndPassRemote();
 
-  screen_ai_service_router_.BindMainContentExtractor(
-      std::move(screen_ai_receiver));
+  screen_ai::ScreenAIServiceRouterFactory::GetForBrowserContext(
+      ProfileManager::GetActiveUserProfile())
+      ->BindMainContentExtractor(std::move(screen_ai_receiver));
   remote_content_extraction_service_factory_->OnScreen2xReady(
       std::move(screen_ai_remote));
 }
diff --git a/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.h b/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.h
index e0352c2..afcfa00 100644
--- a/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.h
+++ b/chrome/browser/chromeos/mahi/mahi_content_extraction_delegate.h
@@ -10,7 +10,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/unguessable_token.h"
-#include "chrome/browser/screen_ai/screen_ai_service_router.h"
 #include "chromeos/components/mahi/public/mojom/content_extraction.mojom.h"
 #include "chromeos/crosapi/mojom/mahi.mojom-forward.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -74,10 +73,6 @@
   mojo::Remote<mojom::ContentExtractionService>
       remote_content_extraction_service_;
 
-  // Router for the screen ai models. We need it to get the content extraction
-  // model.
-  screen_ai::ScreenAIServiceRouter screen_ai_service_router_;
-
   // This is the callback function to notifies the `MahiWebContentManager` with
   // the distillability check result.
   base::RepeatingCallback<void(const base::UnguessableToken&, bool)>
diff --git a/chrome/browser/devtools/device/usb/android_usb_device.cc b/chrome/browser/devtools/device/usb/android_usb_device.cc
index b570d4d..cce1739 100644
--- a/chrome/browser/devtools/device/usb/android_usb_device.cc
+++ b/chrome/browser/devtools/device/usb/android_usb_device.cc
@@ -286,13 +286,9 @@
   // Queue body.
   if (!message->body.empty()) {
     auto body_buffer = base::MakeRefCounted<base::RefCountedBytes>(body_length);
-    {
-      auto& v = body_buffer->as_vector();
-      memcpy(v.data(), message->body.data(), message->body.length());
-      if (append_zero) {
-        v[body_length - 1] = 0;
-      }
-    }
+    memcpy(body_buffer->front(), message->body.data(), message->body.length());
+    if (append_zero)
+      body_buffer->data()[body_length - 1] = 0;
     outgoing_queue_.push(body_buffer);
     if (android_device_info_.zero_mask &&
         (body_length & android_device_info_.zero_mask) == 0) {
@@ -311,10 +307,10 @@
 
   BulkMessage message = outgoing_queue_.front();
   outgoing_queue_.pop();
-  DumpMessage(true, message->data(), message->size());
+  DumpMessage(true, message->front(), message->size());
 
   device_->GenericTransferOut(
-      android_device_info_.outbound_address, message->as_vector(), kUsbTimeout,
+      android_device_info_.outbound_address, message->data(), kUsbTimeout,
       base::BindOnce(&AndroidUsbDevice::OutgoingMessageSent,
                      weak_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/enterprise/data_protection/print_utils.cc b/chrome/browser/enterprise/data_protection/print_utils.cc
index 424275a..3f5246c 100644
--- a/chrome/browser/enterprise/data_protection/print_utils.cc
+++ b/chrome/browser/enterprise/data_protection/print_utils.cc
@@ -130,7 +130,7 @@
     std::move(on_verdict).Run(/*allowed=*/true);
     return;
   }
-  std::memcpy(region.mapping.memory(), print_data->data(), print_data->size());
+  std::memcpy(region.mapping.memory(), print_data->front(), print_data->size());
   scanning_data.page = std::move(region.region);
 
   auto on_scan_result = base::BindOnce(
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index 634dc05..9667817 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -916,7 +916,10 @@
 
 std::string ExtensionInfoGenerator::GetIconUrlFromImage(
     const gfx::Image& image) {
-  std::string base_64 = base::Base64Encode(*image.As1xPNGBytes());
+  scoped_refptr<base::RefCountedMemory> data;
+  data = image.As1xPNGBytes();
+  std::string base_64 = base::Base64Encode(
+      std::string_view(data->front_as<char>(), data->size()));
   const char kDataUrlPrefix[] = "data:image/png;base64,";
   return GURL(kDataUrlPrefix + base_64).spec();
 }
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index f221501..6929694 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -526,9 +526,6 @@
                           base::FeatureList::IsEnabled(
                               ash::features::kSystemJapanesePhysicalTyping)));
   features.Append(GenerateFeatureFlag(
-      "multilingualtyping",
-      base::FeatureList::IsEnabled(ash::features::kMultilingualTyping)));
-  features.Append(GenerateFeatureFlag(
       "autocorrectparamstuning",
       base::FeatureList::IsEnabled(ash::features::kAutocorrectParamsTuning)));
   features.Append(
diff --git a/chrome/browser/extensions/chrome_url_request_util.cc b/chrome/browser/extensions/chrome_url_request_util.cc
index 754c77f..14e8c038 100644
--- a/chrome/browser/extensions/chrome_url_request_util.cc
+++ b/chrome/browser/extensions/chrome_url_request_util.cc
@@ -49,7 +49,8 @@
                        base::CompareCase::INSENSITIVE_ASCII)) {
     // All of our HTML files should be UTF-8 and for other resource types
     // (like images), charset doesn't matter.
-    DCHECK(base::IsStringUTF8(base::as_string_view(*data)));
+    DCHECK(base::IsStringUTF8(base::StringPiece(
+        reinterpret_cast<const char*>(data->front()), data->size())));
     *out_charset = "utf-8";
   }
 }
@@ -68,8 +69,9 @@
           : nullptr;
 
   if (replacements) {
-    std::string temp_str = ui::ReplaceTemplateExpressions(
-        base::as_string_view(*bytes), *replacements);
+    base::StringPiece input(reinterpret_cast<const char*>(bytes->front()),
+                            bytes->size());
+    std::string temp_str = ui::ReplaceTemplateExpressions(input, *replacements);
     DCHECK(!temp_str.empty());
     return base::MakeRefCounted<base::RefCountedString>(std::move(temp_str));
   } else {
@@ -181,7 +183,7 @@
                                std::nullopt);
 
     size_t write_size = data->size();
-    MojoResult result = producer_handle->WriteData(data->data(), &write_size,
+    MojoResult result = producer_handle->WriteData(data->front(), &write_size,
                                                    MOJO_WRITE_DATA_FLAG_NONE);
     OnFileWritten(result);
   }
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index 41451fdc..8352344e 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -275,7 +275,7 @@
   for (const gfx::ImageSkiaRep& image_rep : image_reps) {
     auto bitmap_data = base::MakeRefCounted<base::RefCountedBytes>();
     if (gfx::PNGCodec::EncodeBGRASkBitmap(image_rep.GetBitmap(), false,
-                                          &bitmap_data->as_vector())) {
+                                          &bitmap_data->data())) {
       favicon_base::FaviconRawBitmapResult bitmap_result;
       bitmap_result.bitmap_data = bitmap_data;
       bitmap_result.pixel_size = gfx::Size(image_rep.pixel_width(),
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/BUILD.gn b/chrome/browser/facilitated_payments/ui/android/internal/BUILD.gn
index ed5c977..963a8803 100644
--- a/chrome/browser/facilitated_payments/ui/android/internal/BUILD.gn
+++ b/chrome/browser/facilitated_payments/ui/android/internal/BUILD.gn
@@ -24,11 +24,15 @@
   srcjar_deps = [ ":jni" ]
 
   deps = [
+    ":java_resources",
     "//chrome/android:chrome_app_java_resources",
     "//chrome/browser/facilitated_payments/ui/android:public_java",
+    "//chrome/browser/touch_to_fill/common/android:java",
+    "//chrome/browser/touch_to_fill/common/android:java_resources",
     "//components/browser_ui/bottomsheet/android:java",
     "//content/public/android:content_full_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
+    "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//third_party/jni_zero:jni_zero_java",
     "//ui/android:ui_java",
@@ -36,6 +40,13 @@
   ]
 }
 
+android_resources("java_resources") {
+  sources = [
+    "java/res/layout/facilitated_payments_payment_methods_sheet_header_item.xml",
+    "java/res/values/dimens.xml",
+  ]
+}
+
 robolectric_library("junit") {
   testonly = true
   resources_package = "org.chromium.chrome.browser.facilitated_payments"
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/res/layout/facilitated_payments_payment_methods_sheet_header_item.xml b/chrome/browser/facilitated_payments/ui/android/internal/java/res/layout/facilitated_payments_payment_methods_sheet_header_item.xml
new file mode 100644
index 0000000..1270c783
--- /dev/null
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/res/layout/facilitated_payments_payment_methods_sheet_header_item.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2024 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent"
+    android:layout_marginHorizontal="8dp"
+    android:layout_marginBottom="16dp"
+    android:orientation="vertical">
+
+  <ImageView
+      android:id="@+id/branding_icon"
+      android:layout_width="wrap_content"
+      android:layout_height="@dimen/facilitated_payments_product_icon_height"
+      android:layout_marginVertical="@dimen/facilitated_payments_product_icon_margin_vertical"
+      android:importantForAccessibility="no"
+      android:layout_gravity="center_horizontal"/>
+</LinearLayout>
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/res/values/dimens.xml b/chrome/browser/facilitated_payments/ui/android/internal/java/res/values/dimens.xml
new file mode 100644
index 0000000..42a294d1
--- /dev/null
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/res/values/dimens.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2024 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<resources>
+    <dimen name="facilitated_payments_product_icon_height">32dp</dimen>
+    <dimen name="facilitated_payments_product_icon_margin_vertical">12dp</dimen>
+</resources>
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsCoordinator.java b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsCoordinator.java
index 32123cb..dc866d45 100644
--- a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsCoordinator.java
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsCoordinator.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.facilitated_payments;
 
+import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.ItemType.HEADER;
 import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.SHEET_ITEMS;
 import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.VISIBLE;
 
@@ -15,6 +16,7 @@
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
 
 /**
  * Implements the FacilitatedPaymentsPaymentMethodsComponent. It uses a bottom sheet to let the user
@@ -57,6 +59,22 @@
                         ::bindFacilitatedPaymentsPaymentMethodsView);
     }
 
+    /**
+     * Register payment methods items to RecyclerViewAdapter.
+     *
+     * @param model The observed {@link PropertyModel}. Its data need to be reflected in the view.
+     * @param view The {@link FacilitatedPaymentsPaymentMethodsView} to update.
+     */
+    public static void setUpPaymentMethodsItems(
+            PropertyModel model, FacilitatedPaymentsPaymentMethodsView view) {
+        SimpleRecyclerViewAdapter adapter = new SimpleRecyclerViewAdapter(model.get(SHEET_ITEMS));
+        adapter.registerType(
+                HEADER,
+                FacilitatedPaymentsPaymentMethodsViewBinder::createHeaderItemView,
+                FacilitatedPaymentsPaymentMethodsViewBinder::bindHeaderView);
+        view.getSheetItemListView().setAdapter(adapter);
+    }
+
     PropertyModel createModel() {
         return new PropertyModel.Builder(FacilitatedPaymentsPaymentMethodsProperties.ALL_KEYS)
                 .with(VISIBLE, false)
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsMediator.java b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsMediator.java
index 3eda646..e8aece1 100644
--- a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsMediator.java
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsMediator.java
@@ -4,8 +4,13 @@
 
 package org.chromium.chrome.browser.facilitated_payments;
 
+import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.HeaderProperties.IMAGE_DRAWABLE_ID;
+import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.SHEET_ITEMS;
 import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.VISIBLE;
 
+import org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.HeaderProperties;
+import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
+import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /**
@@ -20,6 +25,18 @@
     }
 
     void showSheet() {
+        ModelList sheetItems = mModel.get(SHEET_ITEMS);
+        sheetItems.clear();
+
+        sheetItems.add(0, buildHeader());
         mModel.set(VISIBLE, true);
     }
+
+    private ListItem buildHeader() {
+        return new ListItem(
+                FacilitatedPaymentsPaymentMethodsProperties.ItemType.HEADER,
+                new PropertyModel.Builder(HeaderProperties.ALL_KEYS)
+                        .with(IMAGE_DRAWABLE_ID, R.drawable.google_pay)
+                        .build());
+    }
 }
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsView.java b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsView.java
index 72db420..475ee3a 100644
--- a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsView.java
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsView.java
@@ -5,74 +5,42 @@
 package org.chromium.chrome.browser.facilitated_payments;
 
 import android.content.Context;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.RelativeLayout;
 
-import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.RecyclerView;
+import androidx.annotation.Px;
 
-import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
+import org.chromium.chrome.browser.touch_to_fill.common.TouchToFillViewBase;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 
+import java.util.Set;
+
 /**
- * This class is responsible for rendering the bottom sheet which displays the FacilitatedPayments
+ * This class is responsible for rendering the bottom sheet which displays the facilitated payments
  * instruments. It is a View in this Model-View-Controller component and doesn't inherit but holds
  * Android Views.
  */
-class FacilitatedPaymentsPaymentMethodsView implements BottomSheetContent {
-    private final BottomSheetController mBottomSheetController;
-    private final View mView;
-
-    private RecyclerView mSheetItemListView;
-
+class FacilitatedPaymentsPaymentMethodsView extends TouchToFillViewBase {
+    /**
+     * Constructs a FacilitatedPaymentsPaymentMethodsView which creates, modifies, and shows the
+     * bottom sheet.
+     *
+     * @param context A {@link Context} used to load resources and inflate the sheet.
+     * @param bottomSheetController The {@link BottomSheetController} used to show/hide the sheet.
+     */
     FacilitatedPaymentsPaymentMethodsView(
             Context context, BottomSheetController bottomSheetController) {
-        mBottomSheetController = bottomSheetController;
-        mView = new View(context);
-        mSheetItemListView = new RecyclerView(context);
-    }
-
-    public boolean setVisible(boolean isVisible) {
-        if (isVisible) {
-            if (!mBottomSheetController.requestShowContent(this, true)) {
-                return false;
-            }
-        } else {
-            mBottomSheetController.hideContent(this, true);
-        }
-        return true;
-    }
-
-    @Override
-    public View getContentView() {
-        return mView;
-    }
-
-    public void setSheetItemListAdapter(RecyclerView.Adapter adapter) {
-        mSheetItemListView.setAdapter(adapter);
-    }
-
-    @Nullable
-    @Override
-    public View getToolbarView() {
-        return null;
+        super(
+                bottomSheetController,
+                (RelativeLayout)
+                        LayoutInflater.from(context).inflate(R.layout.touch_to_fill_sheet, null),
+                true);
     }
 
     @Override
     public int getVerticalScrollOffset() {
-        return 0;
-    }
-
-    @Override
-    public void destroy() {}
-
-    @Override
-    public int getPriority() {
-        return ContentPriority.HIGH;
-    }
-
-    @Override
-    public boolean swipeToDismissEnabled() {
-        return false;
+        return getSheetItemListView().computeVerticalScrollOffset();
     }
 
     @Override
@@ -96,6 +64,31 @@
     }
 
     @Override
+    protected View getHandlebar() {
+        return getContentView().findViewById(R.id.drag_handlebar);
+    }
+
+    @Override
+    protected int getConclusiveMarginHeightPx() {
+        return getContentView().getResources().getDimensionPixelSize(R.dimen.ttf_sheet_padding);
+    }
+
+    @Override
+    protected @Px int getSideMarginPx() {
+        return getContentView().getResources().getDimensionPixelSize(R.dimen.ttf_sheet_padding);
+    }
+
+    @Override
+    protected Set<Integer> listedItemTypes() {
+        return Set.of(FacilitatedPaymentsPaymentMethodsProperties.ItemType.PAYMENT_INSTRUMENT);
+    }
+
+    @Override
+    protected int footerItemType() {
+        return FacilitatedPaymentsPaymentMethodsProperties.ItemType.FOOTER;
+    }
+
+    @Override
     public boolean hasCustomLifecycle() {
         return true;
     }
diff --git a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsViewBinder.java b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsViewBinder.java
index 0057287..973c035 100644
--- a/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsViewBinder.java
+++ b/chrome/browser/facilitated_payments/ui/android/internal/java/src/org/chromium/chrome/browser/facilitated_payments/FacilitatedPaymentsPaymentMethodsViewBinder.java
@@ -4,12 +4,19 @@
 
 package org.chromium.chrome.browser.facilitated_payments;
 
+import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.HeaderProperties.IMAGE_DRAWABLE_ID;
 import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.SHEET_ITEMS;
 import static org.chromium.chrome.browser.facilitated_payments.FacilitatedPaymentsPaymentMethodsProperties.VISIBLE;
 
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.appcompat.content.res.AppCompatResources;
+
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
 
 /**
  * Provides functions that map {@link FacilitatedPaymentsPaymentMethodsProperties} changes in a
@@ -30,9 +37,41 @@
         if (propertyKey == VISIBLE) {
             view.setVisible(model.get(VISIBLE));
         } else if (propertyKey == SHEET_ITEMS) {
-            SimpleRecyclerViewAdapter adapter =
-                    new SimpleRecyclerViewAdapter(model.get(SHEET_ITEMS));
-            view.setSheetItemListAdapter(adapter);
+            FacilitatedPaymentsPaymentMethodsCoordinator.setUpPaymentMethodsItems(model, view);
+        } else {
+            assert false : "Unhandled update to property:" + propertyKey;
+        }
+    }
+
+    private FacilitatedPaymentsPaymentMethodsViewBinder() {}
+
+    /**
+     * Factory used to create a new header inside the ListView inside the
+     * FacilitatedPaymentsPaymentMethodsView.
+     *
+     * @param parent The parent {@link ViewGroup} of the new item.
+     */
+    static View createHeaderItemView(ViewGroup parent) {
+        return LayoutInflater.from(parent.getContext())
+                .inflate(
+                        R.layout.facilitated_payments_payment_methods_sheet_header_item,
+                        parent,
+                        false);
+    }
+
+    /**
+     * Called whenever a property in the given model changes. It updates the given view accordingly.
+     *
+     * @param model The observed {@link PropertyModel}. Its data need to be reflected in the view.
+     * @param view The {@link View} of the header to update.
+     * @param key The {@link PropertyKey} which changed.
+     */
+    static void bindHeaderView(PropertyModel model, View view, PropertyKey propertyKey) {
+        if (propertyKey == IMAGE_DRAWABLE_ID) {
+            ImageView sheetHeaderImage = view.findViewById(R.id.branding_icon);
+            sheetHeaderImage.setImageDrawable(
+                    AppCompatResources.getDrawable(
+                            view.getContext(), model.get(IMAGE_DRAWABLE_ID)));
         } else {
             assert false : "Unhandled update to property:" + propertyKey;
         }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 481449ba..d3c651c 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2641,11 +2641,6 @@
     "expiry_milestone": 120
   },
   {
-    "name": "enable-cros-multilingual-typing",
-    "owners": [ "tranbaoduy@chromium.org", "essential-inputs-team@google.com" ],
-    "expiry_milestone": 116
-  },
-  {
     "name": "enable-cros-on-device-grammar-check",
     "owners": [ "jiwan@chromium.org", "essential-inputs-team@google.com" ],
     "expiry_milestone": 116
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index f85b326..bf86fd3f 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -6932,10 +6932,6 @@
 const char kMultiZoneRgbKeyboardDescription[] =
     "Enable multi-zone RGB keyboard customization on supported devices.";
 
-const char kMultilingualTypingName[] = "Multilingual typing on CrOS";
-const char kMultilingualTypingDescription[] =
-    "Enables support for multilingual assistive typing on ChromeOS.";
-
 const char kNearbySharingSelfShareName[] = "Nearby Sharing Self Share";
 const char kNearbySharingSelfShareDescription[] =
     "Enables Self Share auto-accept and UI features to allow seamless sharing "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 8df54ba7..5a8eb4e 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -4028,9 +4028,6 @@
 extern const char kMultiZoneRgbKeyboardName[];
 extern const char kMultiZoneRgbKeyboardDescription[];
 
-extern const char kMultilingualTypingName[];
-extern const char kMultilingualTypingDescription[];
-
 extern const char kNearbySharingSelfShareName[];
 extern const char kNearbySharingSelfShareDescription[];
 
diff --git a/chrome/browser/lens/lens_overlay/lens_overlay_image_helper.cc b/chrome/browser/lens/lens_overlay/lens_overlay_image_helper.cc
index 65a2940..f126d8a 100644
--- a/chrome/browser/lens/lens_overlay/lens_overlay_image_helper.cc
+++ b/chrome/browser/lens/lens_overlay/lens_overlay_image_helper.cc
@@ -94,8 +94,7 @@
                  int compression_quality,
                  scoped_refptr<base::RefCountedBytes>* output) {
   *output = base::MakeRefCounted<base::RefCountedBytes>();
-  return gfx::JPEGCodec::Encode(image, compression_quality,
-                                &(*output)->as_vector());
+  return gfx::JPEGCodec::Encode(image, compression_quality, &(*output)->data());
 }
 
 lens::ImageData DownscaleAndEncodeBitmap(const SkBitmap& image) {
diff --git a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.cc
index 07b6cf97..5ebf17f3 100644
--- a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.cc
@@ -158,8 +158,8 @@
   }
   // Take the learned LCPP here so that we can report it after overwriting it
   // with the new data below.
-  std::optional<predictors::LcppData> lcpp_data_prelearn =
-      predictor ? predictor->GetLcppData(*commit_url_) : std::nullopt;
+  std::optional<predictors::LcppStat> lcpp_stat_prelearn =
+      predictor ? predictor->GetLcppStat(*commit_url_) : std::nullopt;
 
   // TODO(crbug.com/40517495): kSpeculativePreconnectFeature flag can also
   // affect this. Unflag the feature.
@@ -184,7 +184,7 @@
             GetDelegate(), largest_contentful_paint.Time().value());
     PAGE_LOAD_HISTOGRAM(internal::kHistogramLCPPLargestContentfulPaint,
                         corrected);
-    ReportUMAForTimingPredictor(std::move(lcpp_data_prelearn));
+    ReportUMAForTimingPredictor(std::move(lcpp_stat_prelearn));
   }
 }
 
@@ -285,14 +285,14 @@
 
 void LcpCriticalPathPredictorPageLoadMetricsObserver::
     ReportUMAForTimingPredictor(
-        std::optional<predictors::LcppData> lcpp_data_prelearn) {
-  if (!lcpp_data_inputs_.has_value() || !commit_url_ || !lcpp_data_prelearn ||
-      !IsValidLcppStat(lcpp_data_prelearn->lcpp_stat())) {
+        std::optional<predictors::LcppStat> lcpp_stat_prelearn) {
+  if (!lcpp_data_inputs_.has_value() || !commit_url_ || !lcpp_stat_prelearn ||
+      !IsValidLcppStat(*lcpp_stat_prelearn)) {
     return;
   }
   std::optional<blink::mojom::LCPCriticalPathPredictorNavigationTimeHint> hint =
-      ConvertLcppDataToLCPCriticalPathPredictorNavigationTimeHint(
-          *lcpp_data_prelearn);
+      ConvertLcppStatToLCPCriticalPathPredictorNavigationTimeHint(
+          *lcpp_stat_prelearn);
   if (!hint || !hint->lcp_element_locators.size()) {
     return;
   }
diff --git a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.h
index 6ef4c04c..6f81120 100644
--- a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer.h
@@ -111,7 +111,7 @@
   void OnFirstContentfulPaintInPage(
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
   void ReportUMAForTimingPredictor(
-      std::optional<predictors::LcppData> lcpp_data_prelearn);
+      std::optional<predictors::LcppStat> lcpp_stat_prelearn);
 
   // True if the page is prerendered.
   bool is_prerender_ = false;
diff --git a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer_unittest.cc
index 412063a..ca671c58 100644
--- a/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/lcp_critical_path_predictor_page_load_metrics_observer_unittest.cc
@@ -125,9 +125,9 @@
     auto* loading_predictor =
         predictors::LoadingPredictorFactory::GetForProfile(
             Profile::FromBrowserContext(browser_context()));
-    std::optional<predictors::LcppData> lcpp_data =
-        loading_predictor->resource_prefetch_predictor()->GetLcppData(url);
-    EXPECT_EQ(learn_lcpp, lcpp_data.has_value()) << location.ToString();
+    std::optional<predictors::LcppStat> lcpp_stat =
+        loading_predictor->resource_prefetch_predictor()->GetLcppStat(url);
+    EXPECT_EQ(learn_lcpp, lcpp_stat.has_value()) << location.ToString();
 
     base::Histogram::Count expected_count = record_uma ? 1 : 0;
     tester()->histogram_tester().ExpectTotalCount(
diff --git a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.cc b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.cc
index 468bcdd..ce1b78d 100644
--- a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.cc
+++ b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.cc
@@ -50,17 +50,17 @@
   return true;
 }
 
-// Returns LCP element locators in the past loads for a given `data`.  The
+// Returns LCP element locators in the past loads for a given `stat`.  The
 // returned LCP element locators are ordered by descending frequency (the
 // most frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<std::string> PredictLcpElementLocators(const LcppData& data) {
+std::vector<std::string> PredictLcpElementLocators(const LcppStat& stat) {
   // We do not use `ConvertToFrequencyStringPair` for the following code
   // because the core part of the code is converting `std::map` to
   // `std::vector<std::pair<double, std::string>>`, which we need the different
   // logic due to the `bytes` protobuf type.
   const auto& buckets =
-      data.lcpp_stat().lcp_element_locator_stat().lcp_element_locator_buckets();
+      stat.lcp_element_locator_stat().lcp_element_locator_buckets();
   std::vector<std::pair<double, std::string>>
       lcp_element_locators_with_frequency;
   lcp_element_locators_with_frequency.reserve(buckets.size());
@@ -81,13 +81,13 @@
   return lcp_element_locators;
 }
 
-// Returns LCP influencer scripts from past loads for a given `data`.
+// Returns LCP influencer scripts from past loads for a given `stat`.
 // The returned script urls are ordered by descending frequency (the most
 // frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<GURL> PredictLcpInfluencerScripts(const LcppData& data) {
+std::vector<GURL> PredictLcpInfluencerScripts(const LcppStat& stat) {
   std::vector<std::pair<double, std::string>> lcp_script_urls_with_frequency =
-      ConvertToFrequencyStringPair(data.lcpp_stat().lcp_script_url_stat());
+      ConvertToFrequencyStringPair(stat.lcp_script_url_stat());
 
   std::vector<GURL> lcp_script_urls;
   lcp_script_urls.reserve(lcp_script_urls_with_frequency.size());
@@ -556,16 +556,16 @@
 }  // namespace
 
 std::optional<blink::mojom::LCPCriticalPathPredictorNavigationTimeHint>
-ConvertLcppDataToLCPCriticalPathPredictorNavigationTimeHint(
-    const LcppData& lcpp_data) {
+ConvertLcppStatToLCPCriticalPathPredictorNavigationTimeHint(
+    const LcppStat& lcpp_stat) {
   std::vector<std::string> lcp_element_locators =
-      PredictLcpElementLocators(lcpp_data);
+      PredictLcpElementLocators(lcpp_stat);
   std::vector<GURL> lcp_influencer_scripts =
-      PredictLcpInfluencerScripts(lcpp_data);
-  std::vector<GURL> fetched_fonts = PredictFetchedFontUrls(lcpp_data);
+      PredictLcpInfluencerScripts(lcpp_stat);
+  std::vector<GURL> fetched_fonts = PredictFetchedFontUrls(lcpp_stat);
   std::vector<GURL> preconnect_origins =
-      PredictPreconnectableOrigins(lcpp_data);
-  std::vector<GURL> unused_preloads = PredictUnusedPreloads(lcpp_data);
+      PredictPreconnectableOrigins(lcpp_stat);
+  std::vector<GURL> unused_preloads = PredictUnusedPreloads(lcpp_stat);
 
   if (!lcp_element_locators.empty() || !lcp_influencer_scripts.empty() ||
       !fetched_fonts.empty() || !preconnect_origins.empty() ||
@@ -578,12 +578,12 @@
   return std::nullopt;
 }
 
-std::vector<GURL> PredictFetchedFontUrls(const LcppData& data) {
+std::vector<GURL> PredictFetchedFontUrls(const LcppStat& stat) {
   if (!base::FeatureList::IsEnabled(blink::features::kLCPPFontURLPredictor)) {
     return std::vector<GURL>();
   }
   std::vector<std::pair<double, std::string>> font_urls_with_frequency =
-      ConvertToFrequencyStringPair(data.lcpp_stat().fetched_font_url_stat());
+      ConvertToFrequencyStringPair(stat.fetched_font_url_stat());
 
   const double threshold =
       blink::features::kLCPPFontURLPredictorFrequencyThreshold.Get();
@@ -639,10 +639,10 @@
   return font_urls;
 }
 
-std::vector<GURL> PredictPreconnectableOrigins(const LcppData& data) {
+std::vector<GURL> PredictPreconnectableOrigins(const LcppStat& stat) {
   std::vector<std::pair<double, std::string>>
-      preconnect_origins_with_frequency = ConvertToFrequencyStringPair(
-          data.lcpp_stat().preconnect_origin_stat());
+      preconnect_origins_with_frequency =
+          ConvertToFrequencyStringPair(stat.preconnect_origin_stat());
 
   const double frequency_threshold =
       blink::features::kLCPPAutoPreconnectFrequencyThreshold.Get();
@@ -673,10 +673,10 @@
   return preconnect_origins;
 }
 
-std::vector<GURL> PredictFetchedSubresourceUrls(const LcppData& data) {
+std::vector<GURL> PredictFetchedSubresourceUrls(const LcppStat& stat) {
   std::vector<GURL> subresource_urls;
-  for (const auto& [frequency, subresource_url] : ConvertToFrequencyStringPair(
-           data.lcpp_stat().fetched_subresource_url_stat())) {
+  for (const auto& [frequency, subresource_url] :
+       ConvertToFrequencyStringPair(stat.fetched_subresource_url_stat())) {
     GURL parsed_url(subresource_url);
     if (!parsed_url.is_valid() || !parsed_url.SchemeIsHTTPOrHTTPS()) {
       continue;
@@ -686,7 +686,7 @@
   return subresource_urls;
 }
 
-std::vector<GURL> PredictUnusedPreloads(const LcppData& data) {
+std::vector<GURL> PredictUnusedPreloads(const LcppStat& stat) {
   const double frequency_threshold =
       blink::features::kLCPPDeferUnusedPreloadFrequencyThreshold.Get();
   std::vector<GURL> unused_preloads;
@@ -695,7 +695,7 @@
   }
 
   for (const auto& [frequency, url] :
-       ConvertToFrequencyStringPair(data.lcpp_stat().unused_preload_stat())) {
+       ConvertToFrequencyStringPair(stat.unused_preload_stat())) {
     // The frequencies are reverse sorted by `ConvertToFrequencyStringPair`.
     if (frequency < frequency_threshold) {
       break;
diff --git a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.h b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.h
index 04d399d..ab743b71 100644
--- a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.h
+++ b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util.h
@@ -13,35 +13,35 @@
 
 namespace predictors {
 
-// Converts LcppData to LCPCriticalPathPredictorNavigationTimeHint
+// Converts LcppStat to LCPCriticalPathPredictorNavigationTimeHint
 // so that it can be passed to the renderer via the navigation handle.
 std::optional<blink::mojom::LCPCriticalPathPredictorNavigationTimeHint>
-ConvertLcppDataToLCPCriticalPathPredictorNavigationTimeHint(
-    const LcppData& data);
+ConvertLcppStatToLCPCriticalPathPredictorNavigationTimeHint(
+    const LcppStat& data);
 
-// Returns possible fonts from past loads for a given `data`.
+// Returns possible fonts from past loads for a given `stat`.
 // The returned urls are ordered by descending frequency (the most
 // frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<GURL> PredictFetchedFontUrls(const LcppData& data);
+std::vector<GURL> PredictFetchedFontUrls(const LcppStat& stat);
 
-// Returns possible preconnects based on past loads for a given `data`.
+// Returns possible preconnects based on past loads for a given `stat`.
 // The returned origins are ordered by descending frequency (the most
 // frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<GURL> PredictPreconnectableOrigins(const LcppData& data);
+std::vector<GURL> PredictPreconnectableOrigins(const LcppStat& stat);
 
-// Returns possible subresource URLs from past loads for a given `data`.
+// Returns possible subresource URLs from past loads for a given `stat`.
 // The returned URLs are ordered by descending frequency (the most
 // frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<GURL> PredictFetchedSubresourceUrls(const LcppData& data);
+std::vector<GURL> PredictFetchedSubresourceUrls(const LcppStat& stat);
 
-// Returns possible unused preload URLs from past loads for a given `data`.
+// Returns possible unused preload URLs from past loads for a given `stat`.
 // The returned URLs are ordered by descending frequency (the most
 // frequent one comes first). If there is no data, it returns an empty
 // vector.
-std::vector<GURL> PredictUnusedPreloads(const LcppData& data);
+std::vector<GURL> PredictUnusedPreloads(const LcppStat& stat);
 
 // An input to update LcppData.
 struct LcppDataInputs {
diff --git a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util_unittest.cc b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util_unittest.cc
index e786abb5..4caa59af 100644
--- a/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util_unittest.cc
+++ b/chrome/browser/predictors/lcp_critical_path_predictor/lcp_critical_path_predictor_util_unittest.cc
@@ -358,8 +358,8 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{blink::features::kLCPPFontURLPredictor, {}}}, {});
-  LcppData lcpp_data;
-  EXPECT_EQ(std::vector<GURL>(), PredictFetchedFontUrls(lcpp_data));
+  LcppStat lcpp_stat;
+  EXPECT_EQ(std::vector<GURL>(), PredictFetchedFontUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedFontUrls, Simple) {
@@ -369,14 +369,12 @@
         {{blink::features::kLCPPFontURLPredictorFrequencyThreshold.name, "0.5"},
          {blink::features::kLCPPFontURLPredictorMaxPreloadCount.name, "10"}}}},
       {});
-  LcppData lcpp_data;
-  lcpp_data.mutable_lcpp_stat()
-      ->mutable_fetched_font_url_stat()
-      ->mutable_main_buckets()
-      ->insert({"https://example.com/a.woff", 0.9});
+  LcppStat lcpp_stat;
+  lcpp_stat.mutable_fetched_font_url_stat()->mutable_main_buckets()->insert(
+      {"https://example.com/a.woff", 0.9});
   std::vector<GURL> expected;
   expected.emplace_back("https://example.com/a.woff");
-  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_data));
+  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedFontUrls, BrokenFontNames) {
@@ -386,10 +384,9 @@
         {{blink::features::kLCPPFontURLPredictorFrequencyThreshold.name, "0.5"},
          {blink::features::kLCPPFontURLPredictorMaxPreloadCount.name, "10"}}}},
       {});
-  LcppData lcpp_data;
-  auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                           ->mutable_fetched_font_url_stat()
-                           ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* main_buckets =
+      lcpp_stat.mutable_fetched_font_url_stat()->mutable_main_buckets();
   // Duplicated.
   main_buckets->insert({"https://example.com/a.woff", 0.9});
   main_buckets->insert({"https://example.com/a.woff", 0.8});
@@ -399,7 +396,7 @@
   main_buckets->insert({"wss://example.com/", 0.9});
   std::vector<GURL> expected;
   expected.emplace_back("https://example.com/a.woff");
-  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_data));
+  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedFontUrls, Threshold) {
@@ -409,15 +406,14 @@
         {{blink::features::kLCPPFontURLPredictorFrequencyThreshold.name, "0.5"},
          {blink::features::kLCPPFontURLPredictorMaxPreloadCount.name, "10"}}}},
       {});
-  LcppData lcpp_data;
-  auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                           ->mutable_fetched_font_url_stat()
-                           ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* main_buckets =
+      lcpp_stat.mutable_fetched_font_url_stat()->mutable_main_buckets();
   main_buckets->insert({"https://example.com/a.woff", 0.9});
   main_buckets->insert({"https://example.com/b.woff", 0.1});
   std::vector<GURL> expected;
   expected.emplace_back("https://example.com/a.woff");
-  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_data));
+  EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedFontUrls, MaxUrls) {
@@ -429,15 +425,14 @@
             "0.5"},
            {blink::features::kLCPPFontURLPredictorMaxPreloadCount.name, "1"}}}},
         {});
-    LcppData lcpp_data;
-    auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                             ->mutable_fetched_font_url_stat()
-                             ->mutable_main_buckets();
+    LcppStat lcpp_stat;
+    auto* main_buckets =
+        lcpp_stat.mutable_fetched_font_url_stat()->mutable_main_buckets();
     main_buckets->insert({"https://example.com/a.woff", 0.9});
     main_buckets->insert({"https://example.com/b.woff", 0.8});
     std::vector<GURL> expected;
     expected.emplace_back("https://example.com/a.woff");
-    EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_data));
+    EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_stat));
   }
   {  // Use MaxUrls as a kill switch.
     base::test::ScopedFeatureList feature_list;
@@ -447,14 +442,13 @@
             "0.5"},
            {blink::features::kLCPPFontURLPredictorMaxPreloadCount.name, "0"}}}},
         {});
-    LcppData lcpp_data;
-    auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                             ->mutable_fetched_font_url_stat()
-                             ->mutable_main_buckets();
+    LcppStat lcpp_stat;
+    auto* main_buckets =
+        lcpp_stat.mutable_fetched_font_url_stat()->mutable_main_buckets();
     main_buckets->insert({"https://example.com/a.woff", 0.9});
     main_buckets->insert({"https://example.com/b.woff", 0.8});
     std::vector<GURL> expected;
-    EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_data));
+    EXPECT_EQ(expected, PredictFetchedFontUrls(lcpp_stat));
   }
 }
 
@@ -463,34 +457,31 @@
 }
 
 TEST(PredictFetchedSubresourceUrls, SingleEntry) {
-  LcppData lcpp_data;
-  lcpp_data.mutable_lcpp_stat()
-      ->mutable_fetched_subresource_url_stat()
+  LcppStat lcpp_stat;
+  lcpp_stat.mutable_fetched_subresource_url_stat()
       ->mutable_main_buckets()
       ->insert({"https://example.com/a.jpeg", 0.9});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/a.jpeg")}),
-            PredictFetchedSubresourceUrls(lcpp_data));
+            PredictFetchedSubresourceUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedSubresourceUrls, SortedByFrequencyInDescendingOrder) {
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_fetched_subresource_url_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_fetched_subresource_url_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com/c.jpeg", 0.1});
   buckets->insert({"https://example.com/a.jpeg", 0.3});
   buckets->insert({"https://example.com/b.jpeg", 0.2});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/a.jpeg"),
                                GURL("https://example.com/b.jpeg"),
                                GURL("https://example.com/c.jpeg")}),
-            PredictFetchedSubresourceUrls(lcpp_data));
+            PredictFetchedSubresourceUrls(lcpp_stat));
 }
 
 TEST(PredictFetchedSubresourceUrls, FilterUrls) {
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_fetched_subresource_url_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_fetched_subresource_url_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com/a.jpeg", 0.1});
   buckets->insert({"https://example.com/b.jpeg", 0.2});
   // Not an HTTP/HTTPS.
@@ -500,15 +491,15 @@
   EXPECT_EQ(4U, buckets->size());
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/b.jpeg"),
                                GURL("https://example.com/a.jpeg")}),
-            PredictFetchedSubresourceUrls(lcpp_data));
+            PredictFetchedSubresourceUrls(lcpp_stat));
 }
 
 TEST(PredictPreconnectableOrigins, Empty) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{blink::features::kLCPPAutoPreconnectLcpOrigin, {}}}, {});
-  LcppData lcpp_data;
-  EXPECT_EQ(std::vector<GURL>(), PredictPreconnectableOrigins(lcpp_data));
+  LcppStat lcpp_stat;
+  EXPECT_EQ(std::vector<GURL>(), PredictPreconnectableOrigins(lcpp_stat));
 }
 
 TEST(PredictPreconnectableOrigins, Simple) {
@@ -519,14 +510,12 @@
          {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
           "10"}}}},
       {});
-  LcppData lcpp_data;
-  lcpp_data.mutable_lcpp_stat()
-      ->mutable_preconnect_origin_stat()
-      ->mutable_main_buckets()
-      ->insert({"https://example.com", 0.9});
+  LcppStat lcpp_stat;
+  lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets()->insert(
+      {"https://example.com", 0.9});
   std::vector<GURL> expected;
   expected.emplace_back("https://example.com");
-  EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_data));
+  EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_stat));
 }
 
 TEST(PredictPreconnectableOrigins, SortedByFrequencyInDescendingOrder) {
@@ -537,17 +526,16 @@
          {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
           "10"}}}},
       {});
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_preconnect_origin_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com", 0.1});
   buckets->insert({"https://example2.com", 0.3});
   buckets->insert({"https://example3.com", 0.2});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example2.com"),
                                GURL("https://example3.com"),
                                GURL("https://example.com")}),
-            PredictPreconnectableOrigins(lcpp_data));
+            PredictPreconnectableOrigins(lcpp_stat));
 }
 
 TEST(PredictPreconnectableOrigins, Threshold) {
@@ -558,15 +546,14 @@
          {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
           "10"}}}},
       {});
-  LcppData lcpp_data;
-  auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                           ->mutable_preconnect_origin_stat()
-                           ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* main_buckets =
+      lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets();
   main_buckets->insert({"https://example1.com", 0.9});
   main_buckets->insert({"https://example2.com", 0.1});
   std::vector<GURL> expected;
   expected.emplace_back("https://example1.com");
-  EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_data));
+  EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_stat));
 }
 
 TEST(PredictPreconnectableOrigins, MaxUrls) {
@@ -578,15 +565,14 @@
            {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
             "1"}}}},
         {});
-    LcppData lcpp_data;
-    auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                             ->mutable_preconnect_origin_stat()
-                             ->mutable_main_buckets();
+    LcppStat lcpp_stat;
+    auto* main_buckets =
+        lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets();
     main_buckets->insert({"https://example.com", 0.9});
     main_buckets->insert({"https://example1.com", 0.8});
     std::vector<GURL> expected;
     expected.emplace_back("https://example.com");
-    EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_data));
+    EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_stat));
   }
   {  // Use MaxUrls as a kill switch.
     base::test::ScopedFeatureList feature_list;
@@ -596,14 +582,13 @@
            {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
             "0"}}}},
         {});
-    LcppData lcpp_data;
-    auto* main_buckets = lcpp_data.mutable_lcpp_stat()
-                             ->mutable_preconnect_origin_stat()
-                             ->mutable_main_buckets();
+    LcppStat lcpp_stat;
+    auto* main_buckets =
+        lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets();
     main_buckets->insert({"https://example1.com", 0.9});
     main_buckets->insert({"https://example2.com", 0.8});
     std::vector<GURL> expected;
-    EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_data));
+    EXPECT_EQ(expected, PredictPreconnectableOrigins(lcpp_stat));
   }
 }
 
@@ -615,10 +600,9 @@
          {blink::features::kkLCPPAutoPreconnectMaxPreconnectOriginsCount.name,
           "10"}}}},
       {});
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_preconnect_origin_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_preconnect_origin_stat()->mutable_main_buckets();
   buckets->insert({"https://example1.com", 0.9});
   buckets->insert({"https://example2.com", 0.8});
   // Not an HTTP/HTTPS.
@@ -628,7 +612,7 @@
   EXPECT_EQ(4U, buckets->size());
   EXPECT_EQ(std::vector<GURL>(
                 {GURL("https://example1.com"), GURL("https://example2.com")}),
-            PredictPreconnectableOrigins(lcpp_data));
+            PredictPreconnectableOrigins(lcpp_stat));
 }
 
 TEST(PredictUnusedPreloads, Empty) {
@@ -650,13 +634,11 @@
           "0.5"}}}},
       {});
 
-  LcppData lcpp_data;
-  lcpp_data.mutable_lcpp_stat()
-      ->mutable_unused_preload_stat()
-      ->mutable_main_buckets()
-      ->insert({"https://example.com/a.jpeg", 0.9});
+  LcppStat lcpp_stat;
+  lcpp_stat.mutable_unused_preload_stat()->mutable_main_buckets()->insert(
+      {"https://example.com/a.jpeg", 0.9});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/a.jpeg")}),
-            PredictUnusedPreloads(lcpp_data));
+            PredictUnusedPreloads(lcpp_stat));
 }
 
 TEST(PredictUnusedPreloads, SortedByFrequencyInDescendingOrder) {
@@ -667,17 +649,16 @@
           "0"}}}},
       {});
 
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_unused_preload_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_unused_preload_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com/c.jpeg", 0.1});
   buckets->insert({"https://example.com/a.jpeg", 0.3});
   buckets->insert({"https://example.com/b.jpeg", 0.2});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/a.jpeg"),
                                GURL("https://example.com/b.jpeg"),
                                GURL("https://example.com/c.jpeg")}),
-            PredictUnusedPreloads(lcpp_data));
+            PredictUnusedPreloads(lcpp_stat));
 }
 
 TEST(PredictUnusedPreloads, FilterUrls) {
@@ -688,10 +669,9 @@
           "0"}}}},
       {});
 
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_unused_preload_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_unused_preload_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com/a.jpeg", 0.1});
   buckets->insert({"https://example.com/b.jpeg", 0.2});
   // Not an HTTP/HTTPS.
@@ -701,7 +681,7 @@
   EXPECT_EQ(4U, buckets->size());
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/b.jpeg"),
                                GURL("https://example.com/a.jpeg")}),
-            PredictUnusedPreloads(lcpp_data));
+            PredictUnusedPreloads(lcpp_stat));
 }
 
 TEST(PredictUnusedPreloads, Threshold) {
@@ -712,14 +692,13 @@
           "0.5"}}}},
       {});
 
-  LcppData lcpp_data;
-  auto* buckets = lcpp_data.mutable_lcpp_stat()
-                      ->mutable_unused_preload_stat()
-                      ->mutable_main_buckets();
+  LcppStat lcpp_stat;
+  auto* buckets =
+      lcpp_stat.mutable_unused_preload_stat()->mutable_main_buckets();
   buckets->insert({"https://example.com/a.jpeg", 0.9});
   buckets->insert({"https://example.com/b.jpeg", 0.1});
   EXPECT_EQ(std::vector<GURL>({GURL("https://example.com/a.jpeg")}),
-            PredictUnusedPreloads(lcpp_data));
+            PredictUnusedPreloads(lcpp_stat));
 }
 
 TEST(LcppKeyTest, InvalidURLs) {
diff --git a/chrome/browser/predictors/loading_predictor.cc b/chrome/browser/predictors/loading_predictor.cc
index f9f0e61..a5c15735 100644
--- a/chrome/browser/predictors/loading_predictor.cc
+++ b/chrome/browser/predictors/loading_predictor.cc
@@ -218,15 +218,15 @@
   // without optimization guide.
   if (base::FeatureList::IsEnabled(
           blink::features::kLCPPAutoPreconnectLcpOrigin)) {
-    std::optional<LcppData> lcpp_data =
-        resource_prefetch_predictor()->GetLcppData(url);
-    if (lcpp_data) {
+    std::optional<LcppStat> lcpp_stat =
+        resource_prefetch_predictor()->GetLcppStat(url);
+    if (lcpp_stat) {
       auto network_anonymization_key =
           net::NetworkAnonymizationKey::CreateSameSite(
               net::SchemefulSite(url::Origin::Create(url)));
       size_t count = 0;
       for (const GURL& preconnect_origin :
-           PredictPreconnectableOrigins(*lcpp_data)) {
+           PredictPreconnectableOrigins(*lcpp_stat)) {
         prediction.requests.emplace_back(url::Origin::Create(preconnect_origin),
                                          1, network_anonymization_key);
         ++count;
@@ -244,14 +244,14 @@
       base::FeatureList::IsEnabled(features::kLoadingPredictorPrefetch) &&
       features::kLoadingPredictorPrefetchSubresourceType.Get() ==
           features::PrefetchSubresourceType::kAll) {
-    std::optional<LcppData> lcpp_data =
-        resource_prefetch_predictor()->GetLcppData(url);
-    if (lcpp_data) {
+    std::optional<LcppStat> lcpp_stat =
+        resource_prefetch_predictor()->GetLcppStat(url);
+    if (lcpp_stat) {
       auto network_anonymization_key =
           net::NetworkAnonymizationKey::CreateSameSite(
               net::SchemefulSite(url::Origin::Create(url)));
       size_t count = 0;
-      for (const GURL& font_url : PredictFetchedFontUrls(*lcpp_data)) {
+      for (const GURL& font_url : PredictFetchedFontUrls(*lcpp_stat)) {
         prediction.prefetch_requests.emplace_back(
             font_url, network_anonymization_key,
             network::mojom::RequestDestination::kFont);
@@ -556,10 +556,10 @@
     return;
   }
 
-  std::optional<LcppData> lcpp_data =
-      resource_prefetch_predictor()->GetLcppData(top_frame_main_resource_url);
+  std::optional<LcppStat> lcpp_stat =
+      resource_prefetch_predictor()->GetLcppStat(top_frame_main_resource_url);
 
-  if (!lcpp_data || !IsValidLcppStat(lcpp_data->lcpp_stat())) {
+  if (!lcpp_stat || !IsValidLcppStat(*lcpp_stat)) {
     return;
   }
 
@@ -571,7 +571,7 @@
   }
 
   prewarm_http_disk_cache_manager_->MaybePrewarmResources(
-      top_frame_main_resource_url, PredictFetchedSubresourceUrls(*lcpp_data));
+      top_frame_main_resource_url, PredictFetchedSubresourceUrls(*lcpp_stat));
 }
 
 }  // namespace predictors
diff --git a/chrome/browser/predictors/loading_predictor_browsertest.cc b/chrome/browser/predictors/loading_predictor_browsertest.cc
index fadf233..433929d 100644
--- a/chrome/browser/predictors/loading_predictor_browsertest.cc
+++ b/chrome/browser/predictors/loading_predictor_browsertest.cc
@@ -913,13 +913,13 @@
       const base::Location& from_here,
       const GURL& url,
       size_t expected_locator_count) {
-    auto lcpp_data =
-        loading_predictor()->resource_prefetch_predictor()->GetLcppData(url);
+    auto lcpp_stat =
+        loading_predictor()->resource_prefetch_predictor()->GetLcppStat(url);
     std::vector<std::string> locators;
-    if (lcpp_data) {
+    if (lcpp_stat) {
       std::optional<blink::mojom::LCPCriticalPathPredictorNavigationTimeHint>
-          hint = ConvertLcppDataToLCPCriticalPathPredictorNavigationTimeHint(
-              *lcpp_data);
+          hint = ConvertLcppStatToLCPCriticalPathPredictorNavigationTimeHint(
+              *lcpp_stat);
       if (hint) {
         locators = hint->lcp_element_locators;
       }
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper.cc b/chrome/browser/predictors/loading_predictor_tab_helper.cc
index b0425e0..669578f 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper.cc
+++ b/chrome/browser/predictors/loading_predictor_tab_helper.cc
@@ -181,22 +181,22 @@
   if (!navigation_url.is_valid() || !navigation_url.SchemeIsHTTPOrHTTPS()) {
     return;
   }
-  std::optional<LcppData> lcpp_data =
-      predictor.resource_prefetch_predictor()->GetLcppData(navigation_url);
-  if (!lcpp_data) {
+  std::optional<LcppStat> lcpp_stat =
+      predictor.resource_prefetch_predictor()->GetLcppStat(navigation_url);
+  if (!lcpp_stat) {
     base::UmaHistogramEnumeration(
         "LoadingPredictor.SetLCPPNavigationHint.Status",
         LcppHintStatus::kNoLcppData);
     return;
   }
-  if (!IsValidLcppStat(lcpp_data->lcpp_stat())) {
+  if (!IsValidLcppStat(*lcpp_stat)) {
     base::UmaHistogramEnumeration(
         "LoadingPredictor.SetLCPPNavigationHint.Status",
         LcppHintStatus::kInvalidLcppStat);
     return;
   }
   std::optional<blink::mojom::LCPCriticalPathPredictorNavigationTimeHint> hint =
-      ConvertLcppDataToLCPCriticalPathPredictorNavigationTimeHint(*lcpp_data);
+      ConvertLcppStatToLCPCriticalPathPredictorNavigationTimeHint(*lcpp_stat);
   if (hint) {
     navigation_handle.SetLCPPNavigationHint(*hint);
     base::UmaHistogramEnumeration(
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc
index e1f7602c..983725c 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
@@ -395,7 +395,7 @@
   return has_any_prediction;
 }
 
-std::optional<LcppData> ResourcePrefetchPredictor::GetLcppData(
+std::optional<LcppStat> ResourcePrefetchPredictor::GetLcppStat(
     const GURL& url) const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // The `initialization_state_` can be not `INITIALIZED` in the very first
@@ -414,7 +414,7 @@
   if (!lcpp_data_->TryGetData(key, &data)) {
     return std::nullopt;
   }
-  return data;
+  return data.lcpp_stat();
 }
 
 void ResourcePrefetchPredictor::CreateCaches(
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.h b/chrome/browser/predictors/resource_prefetch_predictor.h
index 9b78dc72..b730f8dc 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.h
+++ b/chrome/browser/predictors/resource_prefetch_predictor.h
@@ -207,8 +207,8 @@
   // Deletes all URLs from the predictor database and caches.
   void DeleteAllUrls();
 
-  // Returns LcppData for the `url`, or std::nullopt on failure.
-  std::optional<LcppData> GetLcppData(const GURL& url) const;
+  // Returns LcppStat for the `url`, or std::nullopt on failure.
+  std::optional<LcppStat> GetLcppStat(const GURL& url) const;
 
  private:
   friend class LoadingPredictor;
diff --git a/chrome/browser/printing/pwg_raster_converter.cc b/chrome/browser/printing/pwg_raster_converter.cc
index 7df2387..56b59fb 100644
--- a/chrome/browser/printing/pwg_raster_converter.cc
+++ b/chrome/browser/printing/pwg_raster_converter.cc
@@ -105,7 +105,7 @@
 
   // TODO(thestig): Write `data` into shared memory in the first place, to avoid
   // this memcpy().
-  memcpy(memory.mapping.memory(), data->data(), data->size());
+  memcpy(memory.mapping.memory(), data->front(), data->size());
   pdf_to_pwg_raster_converter_remote_->Convert(
       std::move(memory.region), settings_, bitmap_settings_,
       base::BindOnce(&PwgRasterConverterHelper::RunCallback, this));
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc
index 6458ff3..2476d03 100644
--- a/chrome/browser/profiles/profile_attributes_storage.cc
+++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -1014,9 +1014,9 @@
     base::OnceClosure callback) {
   cached_avatar_images_[key] = image;
 
+  std::unique_ptr<ImageData> data(new ImageData);
   scoped_refptr<base::RefCountedMemory> png_data = image.As1xPNGBytes();
-  auto data = std::make_unique<ImageData>(png_data->size());
-  base::span(*data).copy_from(*png_data);
+  data->assign(png_data->front(), png_data->front() + png_data->size());
 
   // Remove the file from the list of downloads in progress. Note that this list
   // only contains the high resolution avatars, and not the Gaia profile images.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index 3c328537..b07865a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -82,6 +82,7 @@
   "panel/panel.ts",
   "panel/panel_captions.ts",
   "panel/panel_interface.ts",
+  "panel/panel_menu.ts",
   "panel/panel_menu_item.ts",
   "panel/panel_mode.ts",
   "third_party/tamachiyomi/ja_phonetic_data.ts",
@@ -172,7 +173,6 @@
   "common/settings_manager.js",
   "common/tree_dumper.js",
   "panel/menu_manager.js",
-  "panel/panel_menu.js",
 ]
 
 # Closure library modules needed by chromevox.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.ts
similarity index 61%
rename from chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js
rename to chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.ts
index 615bb84..f4caa45 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.ts
@@ -11,12 +11,27 @@
 
 import {PanelMenuItem} from './panel_menu_item.js';
 
+type MenuCallback = () => Promise<void>;
+
 export class PanelMenu {
+  menuBarItemElement: HTMLDivElement;
+  menuContainerElement: HTMLDivElement;
+  menuElement: HTMLTableElement;
+  menuMsg: string;
+
+  /** The current active menu item index, or -1 if none. */
+  protected activeIndex_ = -1;
+  private enabled_ = true;
+  protected items_: PanelMenuItem[] = [];
   /**
-   * @param {string} menuMsg The msg id of the menu.
+   * The return value from setTimeout for a function to update the
+   * scroll bars after an item has been added to a menu. Used so that we
+   * don't re-layout too many times.
    */
-  constructor(menuMsg) {
-    /** @type {string} */
+  private updateScrollbarsTimeout_: number | null = null;
+
+  /** @param menuMsg The msg id of the menu. */
+  constructor(menuMsg: string) {
     this.menuMsg = menuMsg;
     // The item in the menu bar containing the menu's title.
     this.menuBarItemElement = document.createElement('div');
@@ -39,75 +54,45 @@
     this.menuElement.setAttribute('aria-label', menuTitle);
     this.menuContainerElement.appendChild(this.menuElement);
 
-    /**
-     * The items in the menu.
-     * @type {!Array<!PanelMenuItem>}
-     * @private
-     */
-    this.items_ = [];
-
-    /**
-     * The return value from setTimeout for a function to update the
-     * scroll bars after an item has been added to a menu. Used so that we
-     * don't re-layout too many times.
-     * @type {?number}
-     * @private
-     */
-    this.updateScrollbarsTimeout_ = null;
-
-    /**
-     * The current active menu item index, or -1 if none.
-     * @type {number}
-     * @private
-     */
-    this.activeIndex_ = -1;
-
     this.menuElement.addEventListener(
         'keypress', this.onKeyPress_.bind(this), true);
-
-    /** @private {boolean} */
-    this.enabled_ = true;
   }
 
   /**
-   * @param {string} menuItemTitle The title of the menu item.
-   * @param {string|undefined} menuItemShortcut The keystrokes to select this
+   * @param menuItemTitle The title of the menu item.
+   * @param menuItemShortcut The keystrokes to select this
    *     item.
-   * @param {string|undefined} menuItemBraille
-   * @param {string|undefined} gesture
-   * @param {function(): !Promise} callback The function to call if this item
+   * @param callback The function to call if this item
    *     is selected.
-   * @param {string=} opt_id An optional id for the menu item element.
-   * @return {!PanelMenuItem} The menu item just created.
+   * @param id An optional id for the menu item element.
+   * @return The menu item just created.
    */
   addMenuItem(
-      menuItemTitle, menuItemShortcut, menuItemBraille, gesture, callback,
-      opt_id) {
+      menuItemTitle: string, menuItemShortcut: string | undefined,
+      menuItemBraille: string | undefined, gesture: string | undefined,
+      callback: MenuCallback, id?: string): PanelMenuItem {
     const menuItem = new PanelMenuItem(
         menuItemTitle, menuItemShortcut, menuItemBraille, gesture, callback,
-        opt_id);
+        id);
+    const menuElement = menuItem.element as Node;
     this.items_.push(menuItem);
-    this.menuElement.appendChild(menuItem.element);
+    this.menuElement.appendChild(menuElement);
 
     // Sync the active index with focus.
-    menuItem.element.addEventListener(
-        'focus', (function(index, event) {
-                   this.activeIndex_ = index;
-                 }).bind(this, this.items_.length - 1),
-        false);
+    const lastItemIndex = this.items_.length - 1;
+    menuElement.addEventListener(
+        'focus', () => this.activeIndex_ = lastItemIndex, false);
 
     // Update the container height, adding a scroll bar if necessary - but
     // to avoid excessive layout, schedule this once per batch of adding
     // menu items rather than after each add.
     if (!this.updateScrollbarsTimeout_) {
-      this.updateScrollbarsTimeout_ = setTimeout(
-          (function() {
-            const menuBounds = this.menuElement.getBoundingClientRect();
-            const maxHeight = window.innerHeight - menuBounds.top;
-            this.menuContainerElement.style.maxHeight = maxHeight + 'px';
-            this.updateScrollbarsTimeout_ = null;
-          }).bind(this),
-          0);
+      this.updateScrollbarsTimeout_ = setTimeout(() => {
+        const menuBounds = this.menuElement.getBoundingClientRect();
+        const maxHeight = window.innerHeight - menuBounds.top;
+        this.menuContainerElement.style.maxHeight = maxHeight + 'px';
+        this.updateScrollbarsTimeout_ = null;
+      }, 0);
     }
 
     return menuItem;
@@ -116,21 +101,21 @@
   /**
    * Activate this menu, which means showing it and positioning it on the
    * screen underneath its title in the menu bar.
-   * @param {boolean} activateFirstItem Whether or not we should activate the
-   *     menu's
-   * first item.
+   * @param activateFirstItem Whether or not we should activate the menu's
+   *     first item.
    */
-  activate(activateFirstItem) {
+  activate(activateFirstItem: boolean): void {
     if (!this.enabled_) {
       this.menuBarItemElement.focus();
       return;
     }
 
     this.menuContainerElement.style.visibility = 'visible';
-    this.menuContainerElement.style.opacity = 1;
+    this.menuContainerElement.style.opacity = String(1);
     this.menuBarItemElement.classList.add('active');
+    // TODO(b/314203187): Not null asserted, check that this is correct.
     const barBounds =
-        this.menuBarItemElement.parentElement.getBoundingClientRect();
+        this.menuBarItemElement.parentElement!.getBoundingClientRect();
     const titleBounds = this.menuBarItemElement.getBoundingClientRect();
     const menuBounds = this.menuElement.getBoundingClientRect();
 
@@ -154,13 +139,14 @@
    * When activated, focus gets placed on the menuBarItem (title element)
    * instead of the first menu item.
    */
-  disable() {
+  disable(): void {
     this.enabled_ = false;
     this.menuBarItemElement.classList.add('disabled');
-    this.menuBarItemElement.setAttribute('aria-disabled', true);
-    this.menuBarItemElement.setAttribute('tabindex', 0);
+    this.menuBarItemElement.setAttribute('aria-disabled', String(true));
+    this.menuBarItemElement.setAttribute('tabindex', String(0));
+    // TODO(b/314203187): Not null asserted, check that this is correct.
     this.menuBarItemElement.setAttribute(
-        'aria-label', this.menuBarItemElement.textContent);
+        'aria-label', this.menuBarItemElement.textContent!);
     this.activeIndex_ = -1;
   }
 
@@ -168,34 +154,31 @@
    * Hide this menu. Make it invisible first to minimize spurious
    * accessibility events before the next menu activates.
    */
-  deactivate() {
-    this.menuContainerElement.style.opacity = 0.001;
+  deactivate(): void {
+    this.menuContainerElement.style.opacity = String(0.001);
     this.menuBarItemElement.classList.remove('active');
     this.activeIndex_ = -1;
 
-    setTimeout(
-        (function() {
-          this.menuContainerElement.style.visibility = 'hidden';
-        }).bind(this),
-        0);
+    setTimeout(() => this.menuContainerElement.style.visibility = 'hidden', 0);
   }
 
   /**
    * Make a specific menu item index active.
-   * @param {number} itemIndex The index of the menu item.
+   * @param itemIndex The index of the menu item.
    */
-  activateItem(itemIndex) {
+  activateItem(itemIndex: number): void {
     this.activeIndex_ = itemIndex;
     if (this.activeIndex_ >= 0 && this.activeIndex_ < this.items_.length) {
-      this.items_[this.activeIndex_].element.focus();
+      // TODO(b/314203187): Not null asserted, check that this is correct.
+      this.items_[this.activeIndex_].element!.focus();
     }
   }
 
   /**
    * Advanced the active menu item index by a given number.
-   * @param {number} delta The number to add to the active menu item index.
+   * @param delta The number to add to the active menu item index.
    */
-  advanceItemBy(delta) {
+  advanceItemBy(delta: number): void {
     if (!this.enabled_) {
       return;
     }
@@ -219,42 +202,34 @@
       return;
     }
 
-    this.items_[this.activeIndex_].element.focus();
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    this.items_[this.activeIndex_].element!.focus();
   }
 
-  /**
-   * Sets the active menu item index to be 0.
-   */
-  scrollToTop() {
+  /** Sets the active menu item index to be 0. */
+  scrollToTop(): void {
     this.activeIndex_ = 0;
-    this.items_[this.activeIndex_].element.focus();
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    this.items_[this.activeIndex_].element!.focus();
   }
 
-  /**
-   * Sets the active menu item index to be the last index.
-   */
-  scrollToBottom() {
+  /** Sets the active menu item index to be the last index. */
+  scrollToBottom(): void {
     this.activeIndex_ = this.items_.length - 1;
-    this.items_[this.activeIndex_].element.focus();
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    this.items_[this.activeIndex_].element!.focus();
   }
 
-  /**
-   * Get the callback for the active menu item.
-   * @return {?function() : !Promise} The callback.
-   */
-  getCallbackForCurrentItem() {
+  /** Get the callback for the active menu item. */
+  getCallbackForCurrentItem(): MenuCallback | null {
     if (this.activeIndex_ >= 0 && this.activeIndex_ < this.items_.length) {
       return this.items_[this.activeIndex_].callback;
     }
     return null;
   }
 
-  /**
-   * Get the callback for a menu item given its DOM element.
-   * @param {Element} element The DOM element.
-   * @return {?function() : !Promise} The callback.
-   */
-  getCallbackForElement(element) {
+  /** Get the callback for a menu item given its DOM element. */
+  getCallbackForElement(element: HTMLElement): MenuCallback | null {
     for (let i = 0; i < this.items_.length; i++) {
       if (element === this.items_[i].element) {
         return this.items_[i].callback;
@@ -263,10 +238,8 @@
     return null;
   }
 
-  /**
-   * Handles key presses for first letter accelerators.
-   */
-  onKeyPress_(evt) {
+  /** Handles key presses for first letter accelerators. */
+  private onKeyPress_(evt: KeyboardEvent): void {
     if (!this.items_.length) {
       return;
     }
@@ -281,28 +254,19 @@
     }
   }
 
-  /**
-   * @return {boolean} The enabled state of this menu.
-   */
-  get enabled() {
+  get enabled(): boolean {
     return this.enabled_;
   }
 
-  /**
-   * @return {!Array<!PanelMenuItem>}
-   */
-  get items() {
+  get items(): PanelMenuItem[] {
     return this.items_;
   }
 
   /**
    * Starting at |startIndex|, looks for an enabled menu item.
-   * @param {number} startIndex
-   * @param {number} delta
-   * @return {number} The index of the enabled item. -1 if not found.
-   * @private
+   * @return The index of the enabled item. -1 if not found.
    */
-  findEnabledItemIndex_(startIndex, delta) {
+  private findEnabledItemIndex_(startIndex: number, delta: number): number {
     const endIndex = (delta > 0) ? this.items_.length : -1;
     while (startIndex !== endIndex) {
       if (this.items_[startIndex].enabled) {
@@ -316,8 +280,7 @@
 
 
 export class PanelNodeMenu extends PanelMenu {
-  /** @override */
-  activate(activateFirstItem) {
+  override activate(activateFirstItem: boolean): void {
     super.activate(false);
     if (activateFirstItem) {
       // The active index might have been set prior to this call in
@@ -327,8 +290,7 @@
     }
   }
 
-  /** @param {!PanelNodeMenuItemData} data */
-  addItemFromData(data) {
+  addItemFromData(data: PanelNodeMenuItemData): void {
     this.addMenuItem(data.title, '', '', '', async () => {
       if (data.callbackId) {
         BridgeCallbackManager.performCallback(data.callbackId);
@@ -345,12 +307,15 @@
  * ChromeVox menus.
  */
 export class PanelSearchMenu extends PanelMenu {
+  searchBar: HTMLInputElement;
+
+  private searchResultCounter_ = 0;
+
   /**
-   * @param {!string} menuMsg The msg id of the menu.
+   * @param menuMsg The msg id of the menu.
    */
-  constructor(menuMsg) {
+  constructor(menuMsg: string) {
     super(menuMsg);
-    this.searchResultCounter_ = 0;
 
     // Add id attribute to the menu so we can associate it with search bar.
     this.menuElement.setAttribute('id', 'search-results');
@@ -378,120 +343,112 @@
     this.menuContainerElement.insertBefore(menuItem, this.menuElement);
   }
 
-  /** @override */
-  activate(activateFirstItem) {
+  override activate(_activateFirstItem: boolean): void {
     PanelMenu.prototype.activate.call(this, false);
     if (this.searchBar.value === '') {
       this.clear();
     }
-    if (this.items_.length > 0) {
+    if (this.items.length > 0) {
       this.activateItem(this.activeIndex_);
     }
     this.searchBar.focus();
   }
 
-  /** @override */
-  activateItem(index) {
+  override activateItem(index: number): void {
     this.resetItemAtActiveIndex();
-    if (this.items_.length === 0) {
+    if (this.items.length === 0) {
       return;
     }
     if (index >= 0) {
-      index = (index + this.items_.length) % this.items_.length;
+      index = (index + this.items.length) % this.items.length;
     } else {
       if (index >= this.activeIndex_) {
         index = 0;
       } else {
-        index = this.items_.length - 1;
+        index = this.items.length - 1;
       }
     }
     this.activeIndex_ = index;
-    const item = this.items_[this.activeIndex_];
-    this.searchBar.setAttribute('aria-activedescendant', item.element.id);
-    item.element.classList.add('active');
+    const item = this.items[this.activeIndex_];
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    this.searchBar.setAttribute('aria-activedescendant', item.element!.id);
+    item.element!.classList.add('active');
 
     // Scroll item into view, if necessary. Only check y-axis.
-    const itemBounds = item.element.getBoundingClientRect();
+    const itemBounds = item.element!.getBoundingClientRect();
     const menuBarBounds = this.menuBarItemElement.getBoundingClientRect();
     const topThreshold = menuBarBounds.bottom;
     const bottomThreshold = window.innerHeight;
     if (itemBounds.bottom > bottomThreshold) {
       // Item is too far down, so align to top.
-      item.element.scrollIntoView(true /* alignToTop */);
+      item.element!.scrollIntoView(true /* alignToTop */);
     } else if (itemBounds.top < topThreshold) {
       // Item is too far up, so align to bottom.
-      item.element.scrollIntoView(false /* alignToTop */);
+      item.element!.scrollIntoView(false /* alignToTop */);
     }
   }
 
-  /** @override */
-  addMenuItem(
-      menuItemTitle, menuItemShortcut, menuItemBraille, gesture, callback,
-      opt_id) {
+  override addMenuItem(
+      menuItemTitle: string, menuItemShortcut: string | undefined,
+      menuItemBraille: string | undefined, gesture: string | undefined,
+      callback: MenuCallback, _id?: string): PanelMenuItem {
     this.searchResultCounter_ += 1;
     const item = PanelMenu.prototype.addMenuItem.call(
         this, menuItemTitle, menuItemShortcut, menuItemBraille, gesture,
         callback, 'result-number-' + this.searchResultCounter_.toString());
     // Ensure that item styling is updated on mouse hovers.
-    item.element.addEventListener('mouseover', event => {
-      this.resetItemAtActiveIndex();
-    }, true);
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    item.element!.addEventListener(
+      'mouseover', () => this.resetItemAtActiveIndex(), true);
     return item;
   }
 
-  /** @override */
-  advanceItemBy(delta) {
+  override advanceItemBy(delta: number): void {
     this.activateItem(this.activeIndex_ + delta);
   }
 
-  /**
-   * Clears this menu's contents.
-   */
-  clear() {
+  /** Clears this menu's contents. */
+  clear(): void {
     this.items_ = [];
     this.activeIndex_ = -1;
     while (this.menuElement.children.length !== 0) {
-      this.menuElement.removeChild(this.menuElement.firstChild);
+      this.menuElement.removeChild(this.menuElement.firstChild as Node);
     }
     this.searchBar.setAttribute('aria-activedescendant', '');
   }
 
   /**
    * A convenience method to add a copy of an existing PanelMenuItem.
-   * @param {!PanelMenuItem} item The item we want to copy.
-   * @return {!PanelMenuItem} The menu item that was just created.
+   * @param item The item we want to copy.
+   * @return The menu item that was just created.
    */
-  copyAndAddMenuItem(item) {
+  copyAndAddMenuItem(item: PanelMenuItem): PanelMenuItem {
     return this.addMenuItem(
         item.menuItemTitle, item.menuItemShortcut, item.menuItemBraille,
         item.gesture, item.callback);
   }
 
-  /** @override */
-  deactivate() {
+  override deactivate(): void {
     this.resetItemAtActiveIndex();
     PanelMenu.prototype.deactivate.call(this);
   }
 
-  /**
-   * Resets the item at this.activeIndex_.
-   */
-  resetItemAtActiveIndex() {
+  /** Resets the item at this.activeIndex_. */
+  resetItemAtActiveIndex(): void {
     // Sanity check.
     if (this.activeIndex_ < 0 || this.activeIndex_ >= this.items.length) {
       return;
     }
 
-    this.items_[this.activeIndex_].element.classList.remove('active');
+    // TODO(b/314203187): Not null asserted, check that this is correct.
+    this.items_[this.activeIndex_].element!.classList.remove('active');
   }
 
-  /** @override */
-  scrollToTop() {
+  override scrollToTop(): void {
     this.activateItem(0);
   }
 
-  /** @override */
-  scrollToBottom() {
+  override scrollToBottom(): void {
     this.activateItem(this.items_.length - 1);
   }
 }
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
index 77d8dfd..e591f31 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_consent_step.ts
@@ -4,6 +4,7 @@
 
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/icons.html.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './strings.m.js';
 import './shared_style.css.js';
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_notice_step.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_notice_step.ts
index df2b7f8f..4b5d689 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_notice_step.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_notice_step.ts
@@ -4,6 +4,8 @@
 
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/icons.html.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './strings.m.js';
 import './shared_style.css.js';
 import './privacy_sandbox_dialog_learn_more.js';
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_notice_dialog_app.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_notice_dialog_app.ts
index 52a7de0..2601fd7 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_notice_dialog_app.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_notice_dialog_app.ts
@@ -4,6 +4,8 @@
 
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/icons.html.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './strings.m.js';
 import './shared_style.css.js';
 import './privacy_sandbox_dialog_learn_more.js';
diff --git a/chrome/browser/resources/settings/safety_hub/safety_hub_entry_point.html b/chrome/browser/resources/settings/safety_hub/safety_hub_entry_point.html
index 6edd36a..6ddb7a0 100644
--- a/chrome/browser/resources/settings/safety_hub/safety_hub_entry_point.html
+++ b/chrome/browser/resources/settings/safety_hub/safety_hub_entry_point.html
@@ -1,5 +1,5 @@
 <style include="cr-shared-style">
-   :host {
+   #module {
     padding: 8px 16px;
   }
 </style>
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts
index b1b590d..01f56e7 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.ts
+++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -127,6 +127,19 @@
     readAnythingApp.updateSelection();
   };
 
+  chrome.readingMode.updateVoicePackStatus = (lang: string, status: string) => {
+    const readAnythingApp = document.querySelector('read-anything-app');
+    assert(readAnythingApp, 'no app');
+    readAnythingApp.updateVoicePackStatus(lang, status);
+  };
+
+  chrome.readingMode.updateVoicePackStatusFromInstallResponse =
+      (lang: string, status: string) => {
+        const readAnythingApp = document.querySelector('read-anything-app');
+        assert(readAnythingApp, 'no app');
+        readAnythingApp.updateVoicePackStatusFromInstallResponse(lang, status);
+      };
+
   chrome.readingMode.updateTheme = () => {
     const readAnythingApp = document.querySelector('read-anything-app');
     assert(readAnythingApp, 'no app');
@@ -158,6 +171,13 @@
   };
 }
 
+export enum VoicePackStatus {
+  NOT_INSTALLED,
+  INSTALLING,
+  INSTALLED,
+  ERROR,
+}
+
 export enum PauseActionSource {
   DEFAULT,
   BUTTON_CLICK,
@@ -259,6 +279,8 @@
 
   private localeToDisplayName: {[locale: string]: string};
 
+  private voicePackInstallStatus: {[language: string]: VoicePackStatus} = {};
+
   // State for speech synthesis paused/play state needs to be tracked explicitly
   // because there are bugs with window.speechSynthesis.paused and
   // window.speechSynthesis.speaking on some platforms.
@@ -717,6 +739,41 @@
     }
   }
 
+  updateVoicePackStatusFromInstallResponse(lang: string, status: string) {
+    // Do not rely on this status from Install response. It has responded
+    // "installed" for voices that are not installed. Instead, rely on the
+    // status from GetVoicePackStatus.
+    // TODO (b/323159502) Trigger ChromeOS system notification that voice has
+    // been installed
+    if (lang && status === 'kInstalled') {
+      // TODO (b/335472298) Handle voice menu downloading voice spinners. Keep
+      // in mind that this status is not reliable, and to explicitly check that
+      // the Natural voices have been installed.
+    }
+  }
+
+  updateVoicePackStatus(lang: string, status: string) {
+    if (!lang) {
+      return;
+    }
+    // The following possible values of "status" is a union of enum values of
+    // enum InstallationState and enum ErrorCode in read_anything.mojom
+    let voicePackStatus: VoicePackStatus;
+    if (status === 'kNotInstalled') {
+      voicePackStatus = VoicePackStatus.NOT_INSTALLED;
+    } else if (status === 'kInstalling') {
+      voicePackStatus = VoicePackStatus.INSTALLING;
+    } else if (status === 'kInstalled') {
+      voicePackStatus = VoicePackStatus.INSTALLED;
+    } else {
+      // TODO (b/331795122) Handle install errors on the UI
+      voicePackStatus = VoicePackStatus.ERROR;
+    }
+    this.voicePackInstallStatus =
+        {...this.voicePackInstallStatus, [lang]: voicePackStatus};
+    // TODO (b/335472298) Handle voice menu downloading voice spinners
+  }
+
   private onSpeechRateChange_(event: CustomEvent<{rate: number}>) {
     this.updateSpeechRate_(event.detail.rate);
   }
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
index a01dad5..2c6014d 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
@@ -246,6 +246,13 @@
     // toolbar and are ready to consume.
     function updateTheme(): void;
 
+    // Called with the response of sendGetVoicePackInfoRequest()
+    function updateVoicePackStatus(lang: string, status: string): void;
+
+    // Called with the response of sendInstallVoicePackRequest()
+    function updateVoicePackStatusFromInstallResponse(
+        lang: string, status: string): void;
+
     // Ping that the theme choices of the user have been retrieved from
     // preferences and can be used to set up the page.
     function restoreSettingsFromPrefs(): void;
@@ -298,6 +305,16 @@
     function getDisplayNameForLocale(locale: string, displayLocale: string):
         string;
 
+    // Sends an async request to get the status of a Natural voice pack for a
+    // specific language. The response is sent back to the UI via
+    // updateVoicePackStatus()
+    function sendGetVoicePackInfoRequest(language: string): void;
+
+    // Sends an async request to install a  Natural voice pack for a
+    // specific language. The response is sent back to the UI via
+    // updateVoicePackStatusFromInstallResponse()
+    function sendInstallVoicePackRequest(language: string): void;
+
     // Log UmaHistogramLong
     function logMetric(time: number, metricName: string): void;
   }
diff --git a/chrome/browser/resources/webui_gallery/demos/buttons/buttons_demo.ts b/chrome/browser/resources/webui_gallery/demos/buttons/buttons_demo.ts
index 1336e726..4fdb9e8 100644
--- a/chrome/browser/resources/webui_gallery/demos/buttons/buttons_demo.ts
+++ b/chrome/browser/resources/webui_gallery/demos/buttons/buttons_demo.ts
@@ -6,7 +6,9 @@
 import '//resources/cr_elements/cr_expand_button/cr_expand_button.js';
 import '//resources/cr_elements/cr_icon_button/cr_icon_button.js';
 import '//resources/cr_elements/icons.html.js';
+import '//resources/cr_elements/icons_lit.html.js';
 import '//resources/polymer/v3_0/iron-collapse/iron-collapse.js';
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '../demo.css.js';
 
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.html b/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.html
index 638788a..df05c91 100644
--- a/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.html
+++ b/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.html
@@ -16,7 +16,7 @@
     justify-content: center;
   }
 
-  .icon iron-icon,
+  .icon cr-icon,
   .icon .cr-icon {
     margin-block-end: 12px;
   }
@@ -30,40 +30,40 @@
   }
 </style>
 
-<h1>cr iron-icons</h1>
+<h1>cr cr-icons</h1>
 <div class="demos">
-  <div>Commonly used iron-icons across WebUI built with SVG.</div>
+  <div>Commonly used cr-icons across WebUI built with SVG.</div>
   <div class="icons" style$="
       --iron-icon-fill-color: [[iconColor_]];
       --iron-icon-height: [[iconSize_]]px;
       --iron-icon-width: [[iconSize_]]px;
   ">
-    <template is="dom-repeat" items="[[ironIcons_]]" as="icon">
+    <template is="dom-repeat" items="[[icons_]]" as="icon">
       <div class="icon">
-        <iron-icon icon="[[icon]]"></iron-icon>
+        <cr-icon icon="[[icon]]"></cr-icon>
         <div class="label">[[icon]]</div>
       </div>
     </template>
   </div>
 </div>
 
-<h1>Custom iron-icons</h1>
+<h1>Custom cr-icons</h1>
 <div class="demos">
-  <div>An example of a custom iconset for an app using iron-iconset-svg.</div>
-  <iron-iconset-svg name="desserts">
+  <div>An example of a custom iconset for an app using cr-iconset.</div>
+  <cr-iconset name="desserts">
     <svg>
       <defs>
         <g id="cake"><path d="M4 22q-.425 0-.712-.288Q3 21.425 3 21v-5q0-.825.587-1.413Q4.175 14 5 14v-4q0-.825.588-1.413Q6.175 8 7 8h4V6.55q-.45-.3-.725-.725Q10 5.4 10 4.8q0-.375.15-.738.15-.362.45-.662L12 2l1.4 1.4q.3.3.45.662.15.363.15.738 0 .6-.275 1.025-.275.425-.725.725V8h4q.825 0 1.413.587Q19 9.175 19 10v4q.825 0 1.413.587Q21 15.175 21 16v5q0 .425-.288.712Q20.425 22 20 22Zm3-8h10v-4H7Zm-2 6h14v-4H5Zm2-6h10Zm-2 6h14Zm14-6H5h14Z"></g>
       </defs>
     </svg>
-  </iron-iconset-svg>
+  </cr-iconset>
   <div class="icons" style$="
       --iron-icon-fill-color: [[iconColor_]];
       --iron-icon-height: [[iconSize_]]px;
       --iron-icon-width: [[iconSize_]]px;
   ">
     <div class="icon">
-      <iron-icon icon="desserts:cake"></iron-icon>
+      <cr-icon icon="desserts:cake"></cr-icon>
       <div class="label">desserts:cake</div>
     </div>
   </div>
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.ts b/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.ts
index 67168f9e..0015cb58 100644
--- a/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.ts
+++ b/chrome/browser/resources/webui_gallery/demos/cr_icons/cr_icons_demo.ts
@@ -3,13 +3,14 @@
 // found in the LICENSE file.
 
 import '//resources/cr_elements/cr_icons.css.js';
+import '//resources/cr_elements/cr_icon/cr_icon.js';
+import '//resources/cr_elements/cr_icon/cr_iconset.js';
 import '//resources/cr_elements/cr_input/cr_input.js';
-import '//resources/cr_elements/icons.html.js';
-import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+import '//resources/cr_elements/icons_lit.html.js';
 import '../demo.css.js';
 
+import type {CrIconsetElement} from '//resources/cr_elements/cr_icon/cr_iconset.js';
 import {assert} from '//resources/js/assert.js';
-import type {IronIconsetSvgElement} from '//resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './cr_icons_demo.html.js';
@@ -28,7 +29,7 @@
       crIcons_: Array,
       iconColor_: String,
       iconSize_: String,
-      ironIcons_: Array,
+      icons_: Array,
     };
   }
 
@@ -43,22 +44,29 @@
   ];
   private iconColor_: string = '#000000';
   private iconSize_: string = '24';
-  private ironIcons_: string[] = [];
+  private icons_: string[] = [];
 
   override ready() {
     super.ready();
 
+    function getIconNames(iconset: CrIconsetElement) {
+      return Array.from(iconset.querySelectorAll('g[id]'))
+          .map((el: Element) => {
+            return `${iconset.name}:${el.id}`;
+          });
+    }
+
     // Iconsets are appended to the document's head element when they are
     // imported.
-    const crIconsSet = document.head.querySelector<IronIconsetSvgElement>(
-        'iron-iconset-svg[name=cr]');
+    const crIconsSet = document.head.querySelector<CrIconsetElement>(
+        'cr-iconset[name=cr]');
     assert(crIconsSet);
-    this.push('ironIcons_', ...crIconsSet.getIconNames());
+    this.push('icons_', ...getIconNames(crIconsSet));
 
-    const cr20IconsSet = document.head.querySelector<IronIconsetSvgElement>(
-        'iron-iconset-svg[name=cr20]');
+    const cr20IconsSet = document.head.querySelector<CrIconsetElement>(
+        'cr-iconset[name=cr20]');
     assert(cr20IconsSet);
-    this.push('ironIcons_', ...cr20IconsSet.getIconNames());
+    this.push('icons_', ...getIconNames(cr20IconsSet));
   }
 
   private onIconColorInput_(e: Event) {
diff --git a/chrome/browser/search/most_visited_iframe_source_unittest.cc b/chrome/browser/search/most_visited_iframe_source_unittest.cc
index 26faf542..94c3ba48 100644
--- a/chrome/browser/search/most_visited_iframe_source_unittest.cc
+++ b/chrome/browser/search/most_visited_iframe_source_unittest.cc
@@ -77,7 +77,7 @@
 
   std::string response_string() {
     if (response_.get()) {
-      return std::string(base::as_string_view(*response_));
+      return std::string(response_->front_as<char>(), response_->size());
     }
     return "";
   }
diff --git a/chrome/browser/shortcuts/BUILD.gn b/chrome/browser/shortcuts/BUILD.gn
index 578a615..0a55d2c 100644
--- a/chrome/browser/shortcuts/BUILD.gn
+++ b/chrome/browser/shortcuts/BUILD.gn
@@ -7,58 +7,10 @@
 assert(!is_android)
 
 source_set("shortcuts") {
-  sources = [
-    "create_shortcut_for_current_web_contents_task.h",
-    "document_icon_fetcher.cc",
-    "document_icon_fetcher.h",
-    "fetch_icons_from_document_task.cc",
-    "fetch_icons_from_document_task.h",
-    "platform_util_mac.h",
-    "platform_util_mac.mm",
-  ]
+  sources = [ "create_shortcut_for_current_web_contents_task.h" ]
 
   deps = [
     "//base",
-    "//components/webapps/common",
-    "//components/webapps/common:mojo_bindings",
     "//content/public/browser",
-    "//mojo/public/cpp/bindings",
-    "//skia",
-    "//third_party/blink/public/common",
-    "//ui/gfx",
-    "//url",
-  ]
-}
-
-source_set("browser_tests") {
-  testonly = true
-
-  sources = [ "document_icon_fetcher_browsertest.cc" ]
-
-  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
-
-  deps = [
-    ":shortcuts",
-    "//base",
-    "//chrome/browser/ui:ui",
-    "//chrome/test:test_support_ui",
-    "//content/public/browser",
-    "//skia",
-    "//testing/gtest:gtest",
-    "//ui/gfx:test_support",
-    "//url",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-
-  sources = [ "platform_util_mac_unittest.mm" ]
-
-  deps = [
-    ":shortcuts",
-    "//base",
-    "//base/test:test_support",
-    "//testing/gtest",
   ]
 }
diff --git a/chrome/browser/shortcuts/document_icon_fetcher.cc b/chrome/browser/shortcuts/document_icon_fetcher.cc
deleted file mode 100644
index 9ae1be2..0000000
--- a/chrome/browser/shortcuts/document_icon_fetcher.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2024 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/shortcuts/document_icon_fetcher.h"
-
-#include <iterator>
-#include <memory>
-
-#include "base/containers/flat_map.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "base/functional/callback_forward.h"
-#include "base/location.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/types/expected.h"
-#include "base/types/pass_key.h"
-#include "chrome/browser/shortcuts/fetch_icons_from_document_task.h"
-#include "content/public/browser/document_user_data.h"
-#include "content/public/browser/web_contents.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-
-namespace shortcuts {
-
-// static
-void DocumentIconFetcher::FetchIcons(content::WebContents& web_contents,
-                                     FetchIconsFromDocumentCallback callback) {
-  DocumentIconFetcher* fetch_manager =
-      DocumentIconFetcher::GetOrCreateForCurrentDocument(
-          web_contents.GetPrimaryMainFrame());
-  fetch_manager->RunTask(std::move(callback));
-}
-
-DocumentIconFetcher::~DocumentIconFetcher() {
-  in_destruction_ = true;
-  // All of the tasks callbacks call `DocumentIconFetcher::OnTaskComplete` below
-  // directly. Save them & call them synchronously after the tasks are
-  // destroyed to prevent map modification during iteration.
-  std::vector<FetchIconsFromDocumentCallback> pending_callbacks;
-  for (const auto& [id, task] : fetch_tasks_) {
-    pending_callbacks.push_back(task->TakeCallback());
-  }
-  fetch_tasks_.clear();
-  for (FetchIconsFromDocumentCallback& callback : pending_callbacks) {
-    CHECK(callback);
-    // This calls `DocumentIconFetcher::OnTaskComplete` below.
-    std::move(callback).Run(
-        base::unexpected(FetchIconsForDocumentError::kDocumentDestroyed));
-  }
-}
-
-DOCUMENT_USER_DATA_KEY_IMPL(DocumentIconFetcher);
-
-DocumentIconFetcher::DocumentIconFetcher(content::RenderFrameHost* rfh)
-    : content::DocumentUserData<DocumentIconFetcher>(rfh) {}
-
-void DocumentIconFetcher::RunTask(FetchIconsFromDocumentCallback callback) {
-  std::unique_ptr<FetchIconsFromDocumentTask> task =
-      std::make_unique<FetchIconsFromDocumentTask>(
-          base::PassKey<DocumentIconFetcher>(), render_frame_host());
-  int task_id = next_task_id_;
-  next_task_id_++;
-  const auto& [iter, _] = fetch_tasks_.emplace(task_id, std::move(task));
-  // Note: the callback may be called synchronously.
-  iter->second->Start(base::BindOnce(&DocumentIconFetcher::OnTaskComplete,
-                                     weak_factory_.GetWeakPtr(), task_id,
-                                     std::move(callback)));
-}
-
-void DocumentIconFetcher::OnTaskComplete(
-    int id,
-    FetchIconsFromDocumentCallback original_callback,
-    FetchIconsFromDocumentResult result) {
-  int num_erased = fetch_tasks_.erase(id);
-  CHECK(num_erased > 0 || in_destruction_);
-  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(std::move(original_callback), result));
-}
-
-}  // namespace shortcuts
diff --git a/chrome/browser/shortcuts/document_icon_fetcher.h b/chrome/browser/shortcuts/document_icon_fetcher.h
deleted file mode 100644
index f057bbe..0000000
--- a/chrome/browser/shortcuts/document_icon_fetcher.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2024 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_SHORTCUTS_DOCUMENT_ICON_FETCHER_H_
-#define CHROME_BROWSER_SHORTCUTS_DOCUMENT_ICON_FETCHER_H_
-
-#include <memory>
-
-#include "base/containers/flat_map.h"
-#include "base/functional/callback_forward.h"
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/shortcuts/fetch_icons_from_document_task.h"
-#include "content/public/browser/document_user_data.h"
-
-namespace content {
-class WebContents;
-}
-
-namespace shortcuts {
-
-// This object is responsible for fetching all available icons from a given
-// document.
-class DocumentIconFetcher
-    : public content::DocumentUserData<DocumentIconFetcher> {
- public:
-  // Fetches all icons for the top level primary frame of the given web
-  // contents. `callback` will always be called (even on document destruction),
-  // and always called asynchronously.
-  static void FetchIcons(content::WebContents& web_contents,
-                         FetchIconsFromDocumentCallback callback);
-
-  ~DocumentIconFetcher() override;
-
- private:
-  friend DocumentUserData;
-  DOCUMENT_USER_DATA_KEY_DECL();
-
-  explicit DocumentIconFetcher(content::RenderFrameHost* rfh);
-
-  void RunTask(FetchIconsFromDocumentCallback callback);
-
-  void OnTaskComplete(int id,
-                      FetchIconsFromDocumentCallback original_callback,
-                      FetchIconsFromDocumentResult result);
-
-  bool in_destruction_ = false;
-  int next_task_id_ = 0;
-  base::flat_map<int, std::unique_ptr<FetchIconsFromDocumentTask>> fetch_tasks_;
-
-  base::WeakPtrFactory<DocumentIconFetcher> weak_factory_{this};
-};
-
-}  // namespace shortcuts
-
-#endif  // CHROME_BROWSER_SHORTCUTS_DOCUMENT_ICON_FETCHER_H_
diff --git a/chrome/browser/shortcuts/document_icon_fetcher_browsertest.cc b/chrome/browser/shortcuts/document_icon_fetcher_browsertest.cc
deleted file mode 100644
index b93d0f8..0000000
--- a/chrome/browser/shortcuts/document_icon_fetcher_browsertest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2024 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/shortcuts/document_icon_fetcher.h"
-
-#include <memory>
-
-#include "base/base_paths.h"
-#include "base/files/file_util.h"
-#include "base/path_service.h"
-#include "base/test/gmock_expected_support.h"
-#include "base/test/test_future.h"
-#include "base/types/expected.h"
-#include "chrome/browser/shortcuts/fetch_icons_from_document_task.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "content/public/test/browser_test.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/codec/png_codec.h"
-#include "ui/gfx/color_utils.h"
-#include "ui/gfx/test/sk_gmock_support.h"
-
-namespace shortcuts {
-namespace {
-constexpr char kPageNoIcons[] = "/shortcuts/no_icons_page.html";
-constexpr char kPageWithIcons[] = "/shortcuts/page_icons.html";
-
-class DocumentIconFetcherTest : public InProcessBrowserTest {
- public:
-  void SetUpOnMainThread() override {
-    default_favicon_server_.AddDefaultHandlers(base::FilePath(
-        FILE_PATH_LITERAL("chrome/test/data/shortcuts/default_icon_has_two")));
-    ASSERT_TRUE(embedded_https_test_server().Start());
-    ASSERT_TRUE(default_favicon_server_.Start());
-  }
-
-  GURL GetPageWithDefaultFavicon() {
-    return default_favicon_server_.GetURL("/index.html");
-  }
-
-  base::expected<SkBitmap, std::string> LoadImageFromTestFile(
-      const base::FilePath& relative_path_from_chrome_data) {
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    // Load image data from test directory.
-    base::FilePath chrome_src_dir;
-    if (!base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT,
-                                &chrome_src_dir)) {
-      return base::unexpected("Could not find src directory.");
-    }
-
-    base::FilePath image_path =
-        chrome_src_dir.Append(FILE_PATH_LITERAL("chrome/test/data"))
-            .Append(relative_path_from_chrome_data);
-    if (!base::PathExists(image_path)) {
-      return base::unexpected(
-          base::StrCat({"Path does not exist: ", image_path.AsUTF8Unsafe()}));
-    }
-    std::string image_data;
-    if (!base::ReadFileToString(image_path, &image_data)) {
-      return base::unexpected("Could not read file.");
-    }
-
-    SkBitmap image;
-    if (!gfx::PNGCodec::Decode(
-            reinterpret_cast<const uint8_t*>(image_data.data()),
-            image_data.size(), &image)) {
-      return base::unexpected("Could not decode file.");
-    }
-    return image;
-  }
-
- private:
-  net::EmbeddedTestServer default_favicon_server_{
-      net::EmbeddedTestServer::TYPE_HTTPS};
-};
-
-IN_PROC_BROWSER_TEST_F(DocumentIconFetcherTest, PageNoIcons) {
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_https_test_server().GetURL(kPageNoIcons)));
-
-  base::test::TestFuture<FetchIconsFromDocumentResult> future;
-  DocumentIconFetcher::FetchIcons(
-      *browser()->tab_strip_model()->GetActiveWebContents(),
-      future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-  EXPECT_TRUE(future.Get().has_value());
-  EXPECT_THAT(future.Get().value(), testing::IsEmpty());
-}
-
-IN_PROC_BROWSER_TEST_F(DocumentIconFetcherTest, IconMetadata) {
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_https_test_server().GetURL(kPageWithIcons)));
-
-  base::test::TestFuture<FetchIconsFromDocumentResult> future;
-
-  DocumentIconFetcher::FetchIcons(
-      *browser()->tab_strip_model()->GetActiveWebContents(),
-      future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-  ASSERT_TRUE(future.Get().has_value());
-  std::vector<SkBitmap> images = future.Get().value();
-
-  SkBitmap expected_green;
-  ASSERT_OK_AND_ASSIGN(expected_green,
-                       LoadImageFromTestFile(base::FilePath(
-                           FILE_PATH_LITERAL("shortcuts/green.png"))));
-  SkBitmap expected_noise;
-  ASSERT_OK_AND_ASSIGN(expected_noise,
-                       LoadImageFromTestFile(base::FilePath(
-                           FILE_PATH_LITERAL("shortcuts/noise.png"))));
-  EXPECT_THAT(images, testing::UnorderedElementsAre(
-                          gfx::test::EqualsBitmap(expected_green),
-                          gfx::test::EqualsBitmap(expected_noise)));
-}
-
-IN_PROC_BROWSER_TEST_F(DocumentIconFetcherTest, DefaultFavicon) {
-  ASSERT_TRUE(
-      ui_test_utils::NavigateToURL(browser(), GetPageWithDefaultFavicon()));
-
-  base::test::TestFuture<FetchIconsFromDocumentResult> future;
-  DocumentIconFetcher::FetchIcons(
-      *browser()->tab_strip_model()->GetActiveWebContents(),
-      future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-  EXPECT_TRUE(future.Get().has_value());
-  std::vector<SkBitmap> images = future.Get().value();
-  SkBitmap expected_16;
-  ASSERT_OK_AND_ASSIGN(
-      expected_16, LoadImageFromTestFile(base::FilePath(FILE_PATH_LITERAL(
-                       "shortcuts/default_icon_has_two/16_favicon_part.png"))));
-  SkBitmap expected_32;
-  ASSERT_OK_AND_ASSIGN(
-      expected_32, LoadImageFromTestFile(base::FilePath(FILE_PATH_LITERAL(
-                       "shortcuts/default_icon_has_two/32_favicon_part.png"))));
-  EXPECT_THAT(images, testing::UnorderedElementsAre(
-                          gfx::test::EqualsBitmap(expected_16),
-                          gfx::test::EqualsBitmap(expected_32)));
-}
-
-IN_PROC_BROWSER_TEST_F(DocumentIconFetcherTest, WebContentsClosed) {
-  base::test::TestFuture<FetchIconsFromDocumentResult> future;
-  chrome::NewTab(browser());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_https_test_server().GetURL(kPageWithIcons)));
-  DocumentIconFetcher::FetchIcons(
-      *browser()->tab_strip_model()->GetActiveWebContents(),
-      future.GetCallback());
-  chrome::CloseTab(browser());
-  ASSERT_TRUE(future.Wait());
-  EXPECT_THAT(
-      future.Get(),
-      base::test::ErrorIs(FetchIconsForDocumentError::kDocumentDestroyed));
-}
-
-}  // namespace
-}  // namespace shortcuts
diff --git a/chrome/browser/shortcuts/fetch_icons_from_document_task.cc b/chrome/browser/shortcuts/fetch_icons_from_document_task.cc
deleted file mode 100644
index 653a96e..0000000
--- a/chrome/browser/shortcuts/fetch_icons_from_document_task.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2024 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/shortcuts/fetch_icons_from_document_task.h"
-
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "base/location.h"
-#include "base/memory/raw_ref.h"
-#include "base/types/expected.h"
-#include "components/webapps/common/web_page_metadata.mojom.h"
-#include "components/webapps/common/web_page_metadata_agent.mojom.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/web_contents.h"
-#include "mojo/public/cpp/bindings/associated_remote.h"
-#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
-#include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace shortcuts {
-
-FetchIconsFromDocumentTask::FetchIconsFromDocumentTask(
-    base::PassKey<DocumentIconFetcher>,
-    content::RenderFrameHost& rfh)
-    : frame_host_(rfh) {
-  CHECK(frame_host_->IsInPrimaryMainFrame());
-}
-
-FetchIconsFromDocumentTask::~FetchIconsFromDocumentTask() = default;
-
-void FetchIconsFromDocumentTask::Start(
-    FetchIconsFromDocumentCallback callback) {
-  callback_ = std::move(callback);
-  mojo::AssociatedRemote<webapps::mojom::WebPageMetadataAgent> metadata_agent;
-  frame_host_->GetRemoteAssociatedInterfaces()->GetInterface(&metadata_agent);
-
-  // Set the error handler so that we can run abort this task if the WebContents
-  // or the RenderFrameHost are destroyed and the connection to
-  // ChromeRenderFrame is lost.
-  metadata_agent.set_disconnect_handler(
-      base::BindOnce(&FetchIconsFromDocumentTask::OnMetadataFetchError,
-                     weak_factory_.GetWeakPtr()));
-
-  // Bind the InterfacePtr into the callback so that it's kept alive
-  // until there's either a connection error or a response.
-  auto* web_page_metadata_proxy = metadata_agent.get();
-  web_page_metadata_proxy->GetWebPageMetadata(
-      base::BindOnce(&FetchIconsFromDocumentTask::OnWebPageMetadataObtained,
-                     weak_factory_.GetWeakPtr(), std::move(metadata_agent)));
-}
-
-FetchIconsFromDocumentCallback FetchIconsFromDocumentTask::TakeCallback() {
-  return std::move(callback_);
-}
-
-void FetchIconsFromDocumentTask::OnWebPageMetadataObtained(
-    mojo::AssociatedRemote<webapps::mojom::WebPageMetadataAgent> metadata_agent,
-    webapps::mojom::WebPageMetadataPtr web_page_metadata) {
-  metadata_fetch_complete_ = true;
-  std::vector<GURL> icons;
-  for (const auto& icon_info : web_page_metadata->icons) {
-    icons.push_back(icon_info->url);
-  }
-  for (const auto& favicon_url : frame_host_->FaviconURLs()) {
-    icons.push_back(favicon_url->icon_url);
-  }
-
-  // Eliminate duplicates.
-  base::flat_set<GURL> icon_set(std::move(icons));
-  num_pending_image_requests_ = icon_set.size();
-
-  content::WebContents* web_contents =
-      content::WebContents::FromRenderFrameHost(&frame_host_.get());
-  for (const GURL& url : icon_set) {
-    web_contents->DownloadImageInFrame(
-        frame_host_->GetGlobalId(), url, /*is_favicon=*/true,
-        /*preferred_size=*/gfx::Size(),
-        /*max_bitmap_size=*/0, /*bypass_cache=*/false,
-        base::BindOnce(&FetchIconsFromDocumentTask::DidDownloadFavicon,
-                       weak_factory_.GetWeakPtr()));
-  }
-  MaybeCompleteImageDownloadAndSelfDestruct();
-}
-
-void FetchIconsFromDocumentTask::DidDownloadFavicon(
-    int id,
-    int http_status_code,
-    const GURL& image_url,
-    const std::vector<SkBitmap>& bitmaps,
-    const std::vector<gfx::Size>& sizes) {
-  icons_.reserve(icons_.size() + bitmaps.size());
-  for (const SkBitmap& bitmap : bitmaps) {
-    if (bitmap.drawsNothing()) {
-      continue;
-    }
-    icons_.push_back(bitmap);
-  }
-  --num_pending_image_requests_;
-  MaybeCompleteImageDownloadAndSelfDestruct();
-}
-
-void FetchIconsFromDocumentTask::MaybeCompleteImageDownloadAndSelfDestruct() {
-  if (!metadata_fetch_complete_ || num_pending_image_requests_ > 0) {
-    return;
-  }
-  OnCompleteSelfDestruct(base::ok(std::move(icons_)));
-}
-
-void FetchIconsFromDocumentTask::OnCompleteSelfDestruct(Result result,
-                                                        base::Location here) {
-  if (!callback_) {
-    return;
-  }
-  std::move(callback_).Run(std::move(result));
-}
-
-void FetchIconsFromDocumentTask::OnMetadataFetchError() {
-  OnCompleteSelfDestruct(
-      base::unexpected(FetchIconsForDocumentError::kMetadataFetchFailed));
-}
-
-}  // namespace shortcuts
diff --git a/chrome/browser/shortcuts/fetch_icons_from_document_task.h b/chrome/browser/shortcuts/fetch_icons_from_document_task.h
deleted file mode 100644
index 7ef5b9a..0000000
--- a/chrome/browser/shortcuts/fetch_icons_from_document_task.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2024 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_SHORTCUTS_FETCH_ICONS_FROM_DOCUMENT_TASK_H_
-#define CHROME_BROWSER_SHORTCUTS_FETCH_ICONS_FROM_DOCUMENT_TASK_H_
-
-#include <vector>
-
-#include "base/functional/callback_forward.h"
-#include "base/memory/raw_ref.h"
-#include "base/memory/weak_ptr.h"
-#include "base/types/expected.h"
-#include "base/types/pass_key.h"
-#include "base/values.h"
-#include "components/webapps/common/web_page_metadata.mojom-forward.h"
-#include "components/webapps/common/web_page_metadata_agent.mojom-forward.h"
-#include "mojo/public/cpp/bindings/associated_remote.h"
-
-class SkBitmap;
-class GURL;
-
-namespace base {
-class Location;
-}
-
-namespace content {
-class RenderFrameHost;
-}
-
-namespace gfx {
-class Size;
-}
-
-namespace shortcuts {
-class DocumentIconFetcher;
-
-enum class FetchIconsForDocumentError {
-  kDocumentDestroyed,
-  kMetadataFetchFailed
-};
-using FetchIconsFromDocumentResult =
-    base::expected<std::vector<SkBitmap>, FetchIconsForDocumentError>;
-using FetchIconsFromDocumentCallback =
-    base::OnceCallback<void(FetchIconsFromDocumentResult)>;
-
-// Fetch all icons for the current RenderFrameHost document.
-// Invariants:
-// - The `frame_host_` provided to this class must be alive for the lifetime of
-//   this class.
-// - The `callback` may be called synchronously.
-// - The `callback` will be NOT be called on destruction. To handle that, the
-// user
-//   of this class must use the `TakeCallback()` method to extract the callback.
-class FetchIconsFromDocumentTask {
- public:
-  using Result = FetchIconsFromDocumentResult;
-
-  // `rfh` must be the primary main frame.
-  FetchIconsFromDocumentTask(base::PassKey<DocumentIconFetcher>,
-                             content::RenderFrameHost& rfh);
-  ~FetchIconsFromDocumentTask();
-
-  // The `callback` may be called synchronously.
-  void Start(FetchIconsFromDocumentCallback callback);
-
-  FetchIconsFromDocumentCallback TakeCallback();
-
- private:
-  void OnWebPageMetadataObtained(
-      mojo::AssociatedRemote<webapps::mojom::WebPageMetadataAgent>
-          metadata_agent,
-      webapps::mojom::WebPageMetadataPtr web_page_metadata);
-
-  void DownloadIcon(const GURL& url);
-
-  void DidDownloadFavicon(int id,
-                          int http_status_code,
-                          const GURL& image_url,
-                          const std::vector<SkBitmap>& bitmaps,
-                          const std::vector<gfx::Size>& sizes);
-
-  void MaybeCompleteImageDownloadAndSelfDestruct();
-
-  void OnCompleteSelfDestruct(Result result, base::Location here = FROM_HERE);
-
-  void OnMetadataFetchError();
-
-  base::raw_ref<content::RenderFrameHost> frame_host_;
-  FetchIconsFromDocumentCallback callback_;
-
-  bool metadata_fetch_complete_ = false;
-  int num_pending_image_requests_ = 0;
-  std::vector<SkBitmap> icons_;
-
-  base::WeakPtrFactory<FetchIconsFromDocumentTask> weak_factory_{this};
-};
-
-}  // namespace shortcuts
-
-#endif  // CHROME_BROWSER_SHORTCUTS_FETCH_ICONS_FROM_DOCUMENT_TASK_H_
diff --git a/chrome/browser/shortcuts/platform_util_mac.h b/chrome/browser/shortcuts/platform_util_mac.h
deleted file mode 100644
index 21a3b69..0000000
--- a/chrome/browser/shortcuts/platform_util_mac.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2024 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_SHORTCUTS_PLATFORM_UTIL_MAC_H_
-#define CHROME_BROWSER_SHORTCUTS_PLATFORM_UTIL_MAC_H_
-
-#include "base/functional/callback_forward.h"
-
-@class NSError;
-@class NSImage;
-@class NSURL;
-
-namespace base {
-class FilePath;
-}
-
-namespace shortcuts {
-
-// Wrapper around NSWorkspace setIcon:forFile: that can be called from any
-// thread. While the underlying NSWorkspace method can also be called from any
-// thread, it is not reentrancy safe (i.e. multiple calls to it need to be
-// sequenced). This wrapper takes care of the sequencing needed. The `callback`
-// will be called on the calling sequence.
-void SetIconForFile(NSImage* image,
-                    const base::FilePath& file,
-                    base::OnceCallback<void(bool)> callback);
-
-// Wrapper around NSWorkspace setDefaultApplicationAtURL:toOpenFileAtURL:. The
-// NSWorkspace method only exists on macOS 12.0 and newer; this method polyfills
-// its implementation for older macOS versions.
-void SetDefaultApplicationToOpenFile(
-    NSURL* file_url,
-    NSURL* application_url,
-    base::OnceCallback<void(NSError*)> callback);
-
-}  // namespace shortcuts
-
-#endif  // CHROME_BROWSER_SHORTCUTS_PLATFORM_UTIL_MAC_H_
diff --git a/chrome/browser/shortcuts/platform_util_mac.mm b/chrome/browser/shortcuts/platform_util_mac.mm
deleted file mode 100644
index 11d4416..0000000
--- a/chrome/browser/shortcuts/platform_util_mac.mm
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2024 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/shortcuts/platform_util_mac.h"
-
-#import <AppKit/AppKit.h>
-
-#import "base/apple/foundation_util.h"
-#include "base/files/file_path.h"
-#include "base/functional/callback.h"
-#include "base/functional/callback_helpers.h"
-#include "base/task/bind_post_task.h"
-#include "base/task/lazy_thread_pool_task_runner.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/task_traits.h"
-
-namespace shortcuts {
-
-namespace {
-base::LazyThreadPoolSequencedTaskRunner g_set_icon_task_runner =
-    LAZY_THREAD_POOL_SEQUENCED_TASK_RUNNER_INITIALIZER(
-        base::TaskTraits({base::MayBlock(), base::TaskPriority::USER_VISIBLE,
-                          base::TaskShutdownBehavior::BLOCK_SHUTDOWN}));
-}  // namespace
-
-void SetIconForFile(NSImage* image,
-                    const base::FilePath& file,
-                    base::OnceCallback<void(bool)> callback) {
-  g_set_icon_task_runner.Get()->PostTaskAndReplyWithResult(
-      FROM_HERE,
-      base::BindOnce(
-          [](NSImage* image, const base::FilePath& file) {
-            return [NSWorkspace.sharedWorkspace
-                setIcon:image
-                forFile:base::apple::FilePathToNSString(file)
-                options:NSExcludeQuickDrawElementsIconCreationOption];
-          },
-          image, file),
-      std::move(callback));
-}
-
-void SetDefaultApplicationToOpenFile(
-    NSURL* file_url,
-    NSURL* application_url,
-    base::OnceCallback<void(NSError*)> callback) {
-  if (@available(macOS 12.0, *)) {
-    [NSWorkspace.sharedWorkspace
-        setDefaultApplicationAtURL:application_url
-                   toOpenFileAtURL:file_url
-                 completionHandler:base::CallbackToBlock(
-                                       base::BindPostTaskToCurrentDefault(
-                                           std::move(callback)))];
-  } else {
-    // Older macOS versions don't have a nice API for this, but doing what
-    // setDefaultApplicationAtURL:toOpenFileAtURL: does directly seems to work
-    // just fine on those versions as well, so that is what this branch does.
-    NSError* error = nil;
-    [file_url setResourceValue:application_url
-                        forKey:@"_NSURLStrongBindingKey"
-                         error:&error];
-    base::BindPostTaskToCurrentDefault(std::move(callback)).Run(error);
-  }
-}
-
-}  // namespace shortcuts
diff --git a/chrome/browser/shortcuts/platform_util_mac_unittest.mm b/chrome/browser/shortcuts/platform_util_mac_unittest.mm
deleted file mode 100644
index 5658a1d..0000000
--- a/chrome/browser/shortcuts/platform_util_mac_unittest.mm
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2024 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/shortcuts/platform_util_mac.h"
-
-#import <AppKit/AppKit.h>
-
-#import "base/apple/foundation_util.h"
-#include "base/files/scoped_temp_file.h"
-#include "base/test/task_environment.h"
-#include "base/test/test_future.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#import "testing/gtest_mac.h"
-
-namespace shortcuts {
-
-namespace {
-NSImage* GetNSImageForColor(NSColor* color) {
-  return [NSImage imageWithSize:NSMakeSize(32, 32)
-                        flipped:NO
-                 drawingHandler:^(NSRect rect) {
-                   [color set];
-                   NSRectFill(rect);
-                   return YES;
-                 }];
-}
-
-NSColor* ColorFromImage(NSImage* image) {
-  NSBitmapImageRep* bitmap =
-      [[NSBitmapImageRep alloc] initWithData:image.TIFFRepresentation];
-  NSColor* color = [bitmap colorAtX:0 y:0];
-  return color;
-}
-}  // namespace
-
-TEST(ShortcutsPlatformUtilMacTest, SetIconForFile) {
-  base::test::TaskEnvironment task_environment;
-
-  base::ScopedTempFile test_file1;
-  ASSERT_TRUE(test_file1.Create());
-  base::ScopedTempFile test_file2;
-  ASSERT_TRUE(test_file2.Create());
-
-  base::test::TestFuture<bool> result1;
-  SetIconForFile(GetNSImageForColor(NSColor.redColor), test_file1.path(),
-                 result1.GetCallback());
-  base::test::TestFuture<bool> result2;
-  SetIconForFile(GetNSImageForColor(NSColor.blueColor), test_file2.path(),
-                 result2.GetCallback());
-
-  EXPECT_TRUE(result1.Get());
-  EXPECT_TRUE(result2.Get());
-
-  NSImage* image1 = [NSWorkspace.sharedWorkspace
-      iconForFile:base::apple::FilePathToNSString(test_file1.path())];
-  NSColor* color1 = ColorFromImage(image1);
-  EXPECT_EQ(1.0f, color1.redComponent);
-  EXPECT_EQ(0.0f, color1.greenComponent);
-  EXPECT_EQ(0.0f, color1.blueComponent);
-  NSImage* image2 = [NSWorkspace.sharedWorkspace
-      iconForFile:base::apple::FilePathToNSString(test_file2.path())];
-  NSColor* color2 = ColorFromImage(image2);
-  EXPECT_EQ(0.0f, color2.redComponent);
-  EXPECT_EQ(0.0f, color2.greenComponent);
-  EXPECT_EQ(1.0f, color2.blueComponent);
-}
-
-TEST(ShortcutsPlatformUtilMacTest, SetDefaultApplicationToOpenFile) {
-  base::test::TaskEnvironment task_environment;
-
-  base::ScopedTempFile test_file;
-  ASSERT_TRUE(test_file.Create());
-  NSURL* file_url = base::apple::FilePathToNSURL(test_file.path());
-
-  // This test needs an arbitrary (but valid) url for an application. Safari
-  // always exists, so is as good as any app to use.
-  NSURL* app_url = [NSWorkspace.sharedWorkspace
-      URLForApplicationWithBundleIdentifier:@"com.apple.Safari"];
-
-  base::test::TestFuture<NSError*> result;
-  SetDefaultApplicationToOpenFile(file_url, app_url, result.GetCallback());
-  EXPECT_FALSE(result.Get());
-
-  NSURL* got_app_url =
-      [NSWorkspace.sharedWorkspace URLForApplicationToOpenURL:file_url];
-  EXPECT_NSEQ(app_url, got_app_url);
-}
-
-}  // namespace shortcuts
diff --git a/chrome/browser/support_tool/screenshot_data_collector_unittest.cc b/chrome/browser/support_tool/screenshot_data_collector_unittest.cc
index 45c1d56c..c032212 100644
--- a/chrome/browser/support_tool/screenshot_data_collector_unittest.cc
+++ b/chrome/browser/support_tool/screenshot_data_collector_unittest.cc
@@ -109,5 +109,5 @@
   ReadFileContents(output_dir.Append(FILE_PATH_LITERAL("screenshot"))
                        .AddExtension(FILE_PATH_LITERAL(".jpg")),
                    output_file_contents);
-  EXPECT_EQ(output_file_contents, jpeg_data_->as_string());
+  EXPECT_EQ(output_file_contents, jpeg_data_->data());
 }
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc
index 3535a0b..4420a8f 100644
--- a/chrome/browser/themes/browser_theme_pack.cc
+++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -437,8 +437,9 @@
     PngMap::const_iterator exact_png_it = png_map_.find(scale_factor);
     if (exact_png_it != png_map_.end()) {
       SkBitmap bitmap;
-      if (!gfx::PNGCodec::Decode(exact_png_it->second->data(),
-                                 exact_png_it->second->size(), &bitmap)) {
+      if (!gfx::PNGCodec::Decode(exact_png_it->second->front(),
+                                 exact_png_it->second->size(),
+                                 &bitmap)) {
         NOTREACHED();
         return gfx::ImageSkiaRep();
       }
@@ -468,7 +469,7 @@
         bitmap_map_.find(available_scale_factor);
     if (available_bitmap_it == bitmap_map_.end()) {
       SkBitmap available_bitmap;
-      if (!gfx::PNGCodec::Decode(available_png_it->second->data(),
+      if (!gfx::PNGCodec::Decode(available_png_it->second->front(),
                                  available_png_it->second->size(),
                                  &available_bitmap)) {
         NOTREACHED();
@@ -1545,7 +1546,7 @@
           image_memory_[raw_id] = raw_data;
         } else {
           SkBitmap bitmap;
-          if (gfx::PNGCodec::Decode(raw_data->data(), raw_data->size(),
+          if (gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(),
                                     &bitmap)) {
             image_skia.AddRepresentation(gfx::ImageSkiaRep(
                 bitmap, ui::GetScaleForResourceScaleFactor(scale_factor)));
@@ -1983,7 +1984,8 @@
 void BrowserThemePack::AddRawImagesTo(const RawImages& images,
                                       RawDataForWriting* out) const {
   for (const auto& pair : images) {
-    (*out)[pair.first] = base::as_string_view(*pair.second);
+    (*out)[pair.first] =
+        std::string_view(pair.second->front_as<char>(), pair.second->size());
   }
 }
 
@@ -2074,7 +2076,8 @@
   int available_raw_id = GetRawIDByPersistentID(prs_id, available_scale_factor);
   RawImages::const_iterator it = image_memory_.find(available_raw_id);
   SkBitmap available_bitmap;
-  if (!gfx::PNGCodec::Decode(it->second->data(), it->second->size(),
+  if (!gfx::PNGCodec::Decode(it->second->front(),
+                             it->second->size(),
                              &available_bitmap)) {
     NOTREACHED() << "Unable to decode theme image for prs_id=" << prs_id
                  << " for scale_factor=" << available_scale_factor;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index c8592dd..00911d7 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4488,8 +4488,6 @@
       "cocoa/applescript/tab_applescript.mm",
       "cocoa/applescript/window_applescript.h",
       "cocoa/applescript/window_applescript.mm",
-      "cocoa/apps/app_shim_menu_controller_mac.h",
-      "cocoa/apps/app_shim_menu_controller_mac.mm",
       "cocoa/apps/quit_with_apps_controller_mac.cc",
       "cocoa/apps/quit_with_apps_controller_mac.h",
       "cocoa/apps/titlebar_background_view.h",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index f6bf81e..44bec2b 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Handler;
 import android.os.SystemClock;
@@ -20,7 +21,9 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ActivityState;
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.TraceEvent;
 import org.chromium.base.metrics.RecordUserAction;
@@ -852,13 +855,22 @@
                 && !mListPropertyModel.get(SuggestionListProperties.VISIBLE)) {
             mDelegate.setKeyboardVisibility(true, false);
             updateOmniboxSuggestionsVisibility(true);
-            mAnimationDriver.onShowAnimationAboutToStart();
+            if (isKeyboardShowAnimationAboutToStart()) {
+                mAnimationDriver.onShowAnimationAboutToStart();
+            }
         }
 
         mListPropertyModel.set(SuggestionListProperties.LIST_IS_FINAL, isFinal);
         measureSuggestionRequestToUiModelTime(isFinal);
     }
 
+    private boolean isKeyboardShowAnimationAboutToStart() {
+        return mContext.getResources().getConfiguration().keyboard == Configuration.KEYBOARD_NOKEYS
+                // IME animation dispatch is broken in multi-window pre API level 34.
+                && !ApiCompatibilityUtils.isInMultiWindowMode(
+                        ContextUtils.activityFromContext(mContext));
+    }
+
     /**
      * Load the url corresponding to the typed omnibox text.
      *
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
index 304fa45..57b5f47c 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
@@ -23,6 +23,8 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import android.app.Activity;
+import android.content.res.Configuration;
 import android.os.Handler;
 import android.util.SparseArray;
 import android.view.View;
@@ -41,6 +43,8 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
+import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -49,6 +53,7 @@
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ContextUtils;
+import org.chromium.base.MathUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -72,6 +77,8 @@
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.browser.tabmodel.TabWindowManager;
+import org.chromium.components.browser_ui.widget.InsetObserver;
+import org.chromium.components.browser_ui.widget.InsetObserverSupplier;
 import org.chromium.components.favicon.LargeIconBridge;
 import org.chromium.components.favicon.LargeIconBridgeJni;
 import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.PageClassification;
@@ -140,7 +147,7 @@
     private @Mock ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     private @Mock WindowAndroid mWindowAndroid;
     private @Mock OmniboxSuggestionsDropdownEmbedder mEmbedder;
-
+    private @Mock InsetObserver mInsetObserver;
     private @Captor ArgumentCaptor<OmniboxLoadUrlParams> mOmniboxLoadUrlParamsCaptor;
 
     private PropertyModel mListModel;
@@ -149,6 +156,7 @@
     private AutocompleteResult mAutocompleteResult;
     private ModelList mSuggestionModels;
     private ObservableSupplierImpl<TabWindowManager> mTabWindowManagerSupplier;
+    private Activity mActivity = Robolectric.buildActivity(Activity.class).setup().get();
 
     // TemplateUrlServiceFactory shadow that can return <null> TemplateUrlService.
     @Implements(TemplateUrlServiceFactory.class)
@@ -201,10 +209,11 @@
         mListModel.set(SuggestionListProperties.SUGGESTION_MODELS, mSuggestionModels);
 
         mTabWindowManagerSupplier = new ObservableSupplierImpl<>();
+        InsetObserverSupplier.setInstanceForTesting(mInsetObserver);
 
         mMediator =
                 new AutocompleteMediator(
-                        ContextUtils.getApplicationContext(),
+                        mActivity,
                         mAutocompleteDelegate,
                         mTextStateProvider,
                         mListModel,
@@ -426,6 +435,39 @@
 
     @Test
     @SmallTest
+    @EnableFeatures(ChromeFeatureList.ANIMATE_SUGGESTIONS_LIST_APPEARANCE)
+    public void updateSuggestionsList_triggersAnimation() {
+        mListModel.set(SuggestionListProperties.ALPHA, 1.0f);
+        mMediator.onNativeInitialized();
+
+        mMediator.onSuggestionsReceived(
+                AutocompleteResult.fromCache(mSuggestionsList, null), "", true);
+        assertEquals(mListModel.get(SuggestionListProperties.ALPHA), 0.0f, MathUtils.EPSILON);
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ChromeFeatureList.ANIMATE_SUGGESTIONS_LIST_APPEARANCE)
+    public void updateSuggestionsList_doesNotTriggerAnimationWhenSystemAnimationNotRun() {
+        mListModel.set(SuggestionListProperties.ALPHA, 1.0f);
+        mMediator.onNativeInitialized();
+
+        mActivity.getResources().getConfiguration().keyboard = Configuration.KEYBOARD_QWERTY;
+        mMediator.onSuggestionsReceived(
+                AutocompleteResult.fromCache(mSuggestionsList, null), "", true);
+        assertEquals(mListModel.get(SuggestionListProperties.ALPHA), 1.0f, MathUtils.EPSILON);
+
+        mActivity.getResources().getConfiguration().keyboard = Configuration.KEYBOARD_NOKEYS;
+        mListModel.set(SuggestionListProperties.VISIBLE, false);
+        Shadows.shadowOf(mActivity).setInMultiWindowMode(true);
+
+        mMediator.onSuggestionsReceived(
+                AutocompleteResult.fromCache(mSuggestionsList, null), "", true);
+        assertEquals(mListModel.get(SuggestionListProperties.ALPHA), 1.0f, MathUtils.EPSILON);
+    }
+
+    @Test
+    @SmallTest
     public void onTextChanged_emptyTextTriggersZeroSuggest() {
         mMediator.setAutocompleteProfile(mProfile);
 
diff --git a/chrome/browser/ui/ash/picker/picker_client_impl.cc b/chrome/browser/ui/ash/picker/picker_client_impl.cc
index a1b9b3c..a4b19aef 100644
--- a/chrome/browser/ui/ash/picker/picker_client_impl.cc
+++ b/chrome/browser/ui/ash/picker/picker_client_impl.cc
@@ -43,6 +43,7 @@
 #include "chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom-forward.h"
 #include "chrome/browser/ui/webui/ash/emoji/emoji_picker.mojom-shared.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/storage_partition.h"
@@ -155,6 +156,10 @@
 }
 
 ash::input_method::EditorMediator* GetEditorMediator(Profile* profile) {
+  if (!chromeos::features::IsOrcaEnabled()) {
+    return nullptr;
+  }
+
   return ash::input_method::EditorMediatorFactory::GetInstance()->GetForProfile(
       profile);
 }
diff --git a/chrome/browser/ui/ash/picker/picker_client_impl_unittest.cc b/chrome/browser/ui/ash/picker/picker_client_impl_unittest.cc
index aa2796c9..f4497d6 100644
--- a/chrome/browser/ui/ash/picker/picker_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/picker/picker_client_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "ash/picker/picker_controller.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "chrome/browser/ash/drive/drive_integration_service.h"
 #include "chrome/browser/ash/drive/drivefs_test_support.h"
@@ -30,6 +31,7 @@
 #include "chromeos/ash/components/disks/disk_mount_manager.h"
 #include "chromeos/ash/components/disks/fake_disk_mount_manager.h"
 #include "chromeos/ash/components/drivefs/fake_drivefs.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "components/history/core/browser/history_database_params.h"
@@ -486,7 +488,18 @@
 };
 
 TEST_F(PickerClientImplEditorTest,
+       CacheEditorContextReturnsNullCallbackWhenEditorFlagDisabled) {
+  ash::PickerController controller;
+  PickerClientImpl client(&controller, user_manager());
+  GetEditorMediator(profile()).OverrideEditorModeForTesting(
+      ash::input_method::EditorMode::kBlocked);
+
+  EXPECT_TRUE(client.CacheEditorContext().is_null());
+}
+
+TEST_F(PickerClientImplEditorTest,
        CacheEditorContextReturnsNullCallbackWhenBlocked) {
+  base::test::ScopedFeatureList features(chromeos::features::kOrcaDogfood);
   ash::PickerController controller;
   PickerClientImpl client(&controller, user_manager());
   GetEditorMediator(profile()).OverrideEditorModeForTesting(
@@ -497,6 +510,7 @@
 
 TEST_F(PickerClientImplEditorTest,
        CacheEditorContextReturnsCallbackWhenNotBlocked) {
+  base::test::ScopedFeatureList features(chromeos::features::kOrcaDogfood);
   ash::PickerController controller;
   PickerClientImpl client(&controller, user_manager());
   GetEditorMediator(profile()).OverrideEditorModeForTesting(
@@ -506,6 +520,7 @@
 }
 
 TEST_F(PickerClientImplEditorTest, CacheEditorContextCachesCaretBounds) {
+  base::test::ScopedFeatureList features(chromeos::features::kOrcaDogfood);
   ash::PickerController controller;
   PickerClientImpl client(&controller, user_manager());
   GetEditorMediator(profile()).OverrideEditorModeForTesting(
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc
index 8afe724..b797e69 100644
--- a/chrome/browser/ui/browser_focus_uitest.cc
+++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/view_ids.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/chrome_test_utils.h"
@@ -53,12 +54,17 @@
 #include "ui/base/test/ui_controls.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/views/focus/focus_manager.h"
+#include "ui/views/test/widget_activation_waiter.h"
 #include "ui/views/widget/widget.h"
 
 #if BUILDFLAG(IS_MAC)
 #include "base/mac/mac_util.h"
 #endif
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "base/test/scoped_feature_list.h"
+#endif
+
 namespace {
 
 constexpr char kGetFocusedElementJS[] = "getFocusedElement();";
@@ -135,6 +141,72 @@
 const char kStealFocusPage[] = "/focus/page_steals_focus.html";
 const char kTypicalPage[] = "/focus/typical_page.html";
 
+class BrowserFocusBasicTest : public InProcessBrowserTest {
+ public:
+  BrowserFocusBasicTest() {
+    // interactive_ui_tests set `ui_test_utils::BringBrowserWindowToFront()` for
+    // the setup function, which interferes with what the test wants to test so
+    // unset it.
+    set_global_browser_set_up_function(nullptr);
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_LACROS)
+    // For CHROME_HEADLESS, which is currently used for browser tests, native
+    // window occlusion is turned off. Turn it on to match the production
+    // environment.
+    base::FieldTrialParams field_trial_params{
+        { features::kApplyNativeOcclusionToCompositorType.Get(),
+          features::kApplyNativeOcclusionToCompositorTypeRelease }};
+    scoped_feature_list_.InitWithFeaturesAndParameters(
+        /*enabled_features=*/
+        {{features::kAlwaysTrackNativeWindowOcclusionForTest, {}},
+         { features::kApplyNativeOcclusionToCompositor,
+           field_trial_params }},
+        /*disabled_features=*/{});
+#endif
+  }
+
+  views::Widget* GetWidgetForBrowser(Browser* browser) {
+    BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
+    CHECK(browser_view);
+    views::Widget* widget = browser_view->GetWidget();
+    CHECK(widget);
+    return widget;
+  }
+
+  bool IsBrowserActive(Browser* browser) {
+    return GetWidgetForBrowser(browser)->IsActive();
+  }
+
+ private:
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  base::test::ScopedFeatureList scoped_feature_list_;
+#endif
+};
+
+// A basic test to check that a newly opened browser window has focus and the
+// focus is on the omnibox.
+IN_PROC_BROWSER_TEST_F(BrowserFocusBasicTest, BrowserFocusedOnCreation) {
+  // Ensure that the initialization of the browser window is completed.
+  ui_test_utils::CreateAsyncWidgetRequestWaiter(*browser()).Wait();
+  // Widget activation happens asynchronously after window creation on some
+  // platforms like Linux so absorb the difference by waiting for the
+  // activation.
+  views::test::WaitForWidgetActive(GetWidgetForBrowser(browser()), true);
+  // Check that when a browser is created, it's active.
+  EXPECT_TRUE(IsBrowserActive(browser()));
+  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
+
+  // Use `chrome::OpenEmptyWindow()` instead of directly creating a `Browser`
+  // instance with `Browser::Create()` and calling `BrowserView::Show()` like
+  // some tests do because this is what the production code does when opening a
+  // new window. The difference is that it makes sure that there is at least one
+  // tab on the window before calling `BrowserView::Show()`.
+  Browser* browser2 = chrome::OpenEmptyWindow(browser()->profile());
+  ui_test_utils::CreateAsyncWidgetRequestWaiter(*browser2).Wait();
+  views::test::WaitForWidgetActive(GetWidgetForBrowser(browser2), true);
+  EXPECT_TRUE(IsBrowserActive(browser2));
+  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser2, VIEW_ID_OMNIBOX));
+}
+
 class BrowserFocusTest : public InProcessBrowserTest {
  public:
   // InProcessBrowserTest overrides:
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h
deleted file mode 100644
index 863e570..0000000
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 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_COCOA_APPS_APP_SHIM_MENU_CONTROLLER_MAC_H_
-#define CHROME_BROWSER_UI_COCOA_APPS_APP_SHIM_MENU_CONTROLLER_MAC_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include <string>
-
-@class DoppelgangerMenuItem;
-
-// This controller listens to NSWindowDidBecomeMainNotification and
-// NSWindowDidResignMainNotification and modifies the main menu bar to mimic a
-// main menu for the app. When an app window becomes main, all Chrome menu items
-// are hidden and menu items for the app are appended to the main menu. When the
-// app window resigns main, its menu items are removed and all Chrome menu items
-// are unhidden.
-@interface AppShimMenuController : NSObject {
- @private
-  // The extension id of the currently focused packaged app.
-  std::string _appId;
-
-  // Items that need a doppelganger.
-  DoppelgangerMenuItem* __strong _aboutDoppelganger;
-  DoppelgangerMenuItem* __strong _hideDoppelganger;
-  DoppelgangerMenuItem* __strong _quitDoppelganger;
-  DoppelgangerMenuItem* __strong _newDoppelganger;
-  DoppelgangerMenuItem* __strong _openDoppelganger;
-  DoppelgangerMenuItem* __strong _closeWindowDoppelganger;
-  DoppelgangerMenuItem* __strong _allToFrontDoppelganger;
-
-  // Menu items for the currently focused packaged app.
-  NSMenuItem* __strong _appMenuItem;
-  NSMenuItem* __strong _fileMenuItem;
-  NSMenuItem* __strong _editMenuItem;
-  NSMenuItem* __strong _windowMenuItem;
-
-  // Additional menu items for hosted apps.
-  NSMenuItem* __strong _viewMenuItem;
-  NSMenuItem* __strong _historyMenuItem;
-}
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_APPS_APP_SHIM_MENU_CONTROLLER_MAC_H_
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
deleted file mode 100644
index 7139810..0000000
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
+++ /dev/null
@@ -1,547 +0,0 @@
-// Copyright 2013 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/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h"
-
-#include "base/apple/scoped_nsautorelease_pool.h"
-#include "base/containers/adapters.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
-#include "chrome/browser/apps/platform_apps/app_window_registry_util.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/web_applications/web_app_helpers.h"
-#include "chrome/grit/generated_resources.h"
-#include "extensions/browser/app_window/app_window.h"
-#include "extensions/browser/app_window/native_app_window.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/common/extension.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/l10n/l10n_util_mac.h"
-
-using extensions::Extension;
-using extensions::ExtensionRegistry;
-
-namespace {
-
-// Gets an item from the main menu given the tag of the top level item
-// |menu_tag| and the tag of the item |item_tag|.
-NSMenuItem* GetItemByTag(NSInteger menu_tag, NSInteger item_tag) {
-  return [[[[NSApp mainMenu] itemWithTag:menu_tag] submenu]
-      itemWithTag:item_tag];
-}
-
-// Finds a top level menu item using |menu_tag| and creates a new NSMenuItem
-// with the same title.
-NSMenuItem* NewTopLevelItemFrom(NSInteger menu_tag) {
-  NSMenuItem* original = [[NSApp mainMenu] itemWithTag:menu_tag];
-  NSMenuItem* item = [[NSMenuItem alloc] initWithTitle:[original title]
-                                                action:nil
-                                         keyEquivalent:@""];
-  DCHECK([original hasSubmenu]);
-  NSMenu* sub_menu = [[NSMenu alloc] initWithTitle:[[original submenu] title]];
-  [item setSubmenu:sub_menu];
-  return item;
-}
-
-// Finds an item using |menu_tag| and |item_tag| and adds a duplicate of it to
-// the submenu of |top_level_item|.
-void AddDuplicateItem(NSMenuItem* top_level_item,
-                      NSInteger menu_tag,
-                      NSInteger item_tag) {
-  NSMenuItem* item = [GetItemByTag(menu_tag, item_tag) copy];
-  DCHECK(item);
-  [[top_level_item submenu] addItem:item];
-}
-
-// Finds an item with |item_tag| and removes it from the submenu of
-// |top_level_item|.
-void RemoveMenuItemWithTag(NSMenuItem* top_level_item,
-                           NSInteger item_tag,
-                           bool remove_following_separator) {
-  NSMenu* submenu = [top_level_item submenu];
-  NSInteger index = [submenu indexOfItemWithTag:item_tag];
-  if (index < 0)
-    return;
-
-  [submenu removeItemAtIndex:index];
-
-  if (!remove_following_separator || index == [submenu numberOfItems])
-    return;
-
-  NSMenuItem* nextItem = [submenu itemAtIndex:index];
-  if ([nextItem isSeparatorItem])
-    [submenu removeItem:nextItem];
-}
-
-// Sets the menu item with |item_tag| in |top_level_item| visible.
-// If |has_alternate| is true, the item immediately following |item_tag| is
-// assumed to be its (only) alternate. Since AppKit is unable to hide items
-// with alternates, |has_alternate| will cause -[NSMenuItem alternate] to be
-// removed when hiding and restored when showing.
-void SetItemWithTagVisible(NSMenuItem* top_level_item,
-                           NSInteger item_tag,
-                           bool visible,
-                           bool has_alternate) {
-  NSMenu* submenu = [top_level_item submenu];
-  NSMenuItem* menu_item = [submenu itemWithTag:item_tag];
-  DCHECK(menu_item);
-
-  if (visible != [menu_item isHidden])
-    return;
-
-  if (!has_alternate) {
-    [menu_item setHidden:!visible];
-    return;
-  }
-
-  NSInteger next_index = [submenu indexOfItem:menu_item] + 1;
-  DCHECK_LT(next_index, [submenu numberOfItems]);
-
-  NSMenuItem* alternate_item = [submenu itemAtIndex:next_index];
-  if (!visible) {
-    // When hiding (only), we can verify the assumption that the item following
-    // |item_tag| is actually an alternate.
-    DCHECK([alternate_item isAlternate]);
-  }
-
-  // The alternate item visibility should always be in sync.
-  DCHECK_EQ([alternate_item isHidden], [menu_item isHidden]);
-  [alternate_item setAlternate:visible];
-  [alternate_item setHidden:!visible];
-  [menu_item setHidden:!visible];
-}
-
-// Retrieve the Extension and (optionally) Profile for an NSWindow.
-const Extension* GetExtensionForNSWindow(NSWindow* window,
-                                         Profile** profile = nullptr) {
-  if (extensions::AppWindow* app_window =
-          AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile(
-              window)) {
-    if (profile)
-      *profile = Profile::FromBrowserContext(app_window->browser_context());
-    return app_window->GetExtension();
-  }
-  // If there is no corresponding AppWindow, this could be a hosted app, so
-  // check for a browser.
-  if (Browser* browser = chrome::FindBrowserWithWindow(window)) {
-    const std::string app_id =
-        web_app::GetAppIdFromApplicationName(browser->app_name());
-    if (profile)
-      *profile = browser->profile();
-    ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
-    const Extension* extension = registry->enabled_extensions().GetByID(app_id);
-    if (extension &&
-        (extension->is_platform_app() || extension->is_hosted_app())) {
-      return extension;
-    }
-  }
-  return nullptr;
-}
-
-extensions::AppWindowRegistry::AppWindowList GetAppWindowsForNSWindow(
-    NSWindow* window) {
-  Profile* profile = nullptr;
-  if (const Extension* extension = GetExtensionForNSWindow(window, &profile)) {
-    return extensions::AppWindowRegistry::Get(profile)->GetAppWindowsForApp(
-        extension->id());
-  }
-  return extensions::AppWindowRegistry::AppWindowList();
-}
-
-}  // namespace
-
-// Used by AppShimMenuController to manage menu items that are a copy of a
-// Chrome menu item but with a different action. This manages unsetting and
-// restoring the original item's key equivalent, so that we can use the same
-// key equivalent in the copied item with a different action. If |resourceId_|
-// is non-zero, this will also update the title to include the app name.
-// If the copy (menuItem) has no key equivalent, and the title does not have the
-// app name, then enableForApp and disable do not need to be called. I.e. the
-// doppelganger just copies the item and sets a new action.
-@interface DoppelgangerMenuItem : NSObject {
- @private
-  NSMenuItem* __strong _menuItem;
-  NSMenuItem* __strong _sourceItem;
-  NSString* __strong _sourceKeyEquivalent;
-  int _resourceId;
-}
-
-@property(readonly, nonatomic) NSMenuItem* menuItem;
-
-// Get the source item using the tags and create the menu item.
-- (instancetype)initWithController:(AppShimMenuController*)controller
-                           menuTag:(NSInteger)menuTag
-                           itemTag:(NSInteger)itemTag
-                        resourceId:(int)resourceId
-                            action:(SEL)action
-                     keyEquivalent:(NSString*)keyEquivalent;
-// Retain the source item given |menuTag| and |sourceItemTag|. Copy
-// the menu item given |menuTag| and |targetItemTag|.
-// This is useful when we want a doppelganger with a different source item.
-// For example, if there are conflicting key equivalents.
-- (instancetype)initWithMenuTag:(NSInteger)menuTag
-                  sourceItemTag:(NSInteger)sourceItemTag
-                  targetItemTag:(NSInteger)targetItemTag
-                  keyEquivalent:(NSString*)keyEquivalent;
-// Set the title using |resourceId_| and unset the source item's key equivalent.
-- (void)enableForApp:(const Extension*)app;
-// Restore the source item's key equivalent.
-- (void)disable;
-@end
-
-@implementation DoppelgangerMenuItem
-
-- (NSMenuItem*)menuItem {
-  return _menuItem;
-}
-
-- (instancetype)initWithController:(AppShimMenuController*)controller
-                           menuTag:(NSInteger)menuTag
-                           itemTag:(NSInteger)itemTag
-                        resourceId:(int)resourceId
-                            action:(SEL)action
-                     keyEquivalent:(NSString*)keyEquivalent {
-  if ((self = [super init])) {
-    _sourceItem = GetItemByTag(menuTag, itemTag);
-    DCHECK(_sourceItem);
-    _sourceKeyEquivalent = [[_sourceItem keyEquivalent] copy];
-    _menuItem = [[NSMenuItem alloc] initWithTitle:[_sourceItem title]
-                                           action:action
-                                    keyEquivalent:keyEquivalent];
-    [_menuItem setTarget:controller];
-    [_menuItem setTag:itemTag];
-    _resourceId = resourceId;
-  }
-  return self;
-}
-
-- (instancetype)initWithMenuTag:(NSInteger)menuTag
-                  sourceItemTag:(NSInteger)sourceItemTag
-                  targetItemTag:(NSInteger)targetItemTag
-                  keyEquivalent:(NSString*)keyEquivalent {
-  if ((self = [super init])) {
-    _menuItem = [GetItemByTag(menuTag, targetItemTag) copy];
-    _sourceItem = GetItemByTag(menuTag, sourceItemTag);
-    DCHECK(_menuItem);
-    DCHECK(_sourceItem);
-    _sourceKeyEquivalent = [[_sourceItem keyEquivalent] copy];
-  }
-  return self;
-}
-
-- (void)enableForApp:(const Extension*)app {
-  // It seems that two menu items that have the same key equivalent must also
-  // have the same action for the keyboard shortcut to work. (This refers to the
-  // original keyboard shortcut, regardless of any overrides set in OSX).
-  // In order to let the app menu items have a different action, we remove the
-  // key equivalent of the original items and restore them later.
-  [_sourceItem setKeyEquivalent:@""];
-  if (!_resourceId)
-    return;
-
-  [_menuItem setTitle:l10n_util::GetNSStringF(_resourceId,
-                                              base::UTF8ToUTF16(app->name()))];
-}
-
-- (void)disable {
-  // Restore the keyboard shortcut to Chrome. This just needs to be set back to
-  // the original keyboard shortcut, regardless of any overrides in OSX. The
-  // overrides still work as they are based on the title of the menu item.
-  [_sourceItem setKeyEquivalent:_sourceKeyEquivalent];
-}
-
-@end
-
-@interface AppShimMenuController ()
-// Construct the NSMenuItems for apps.
-- (void)buildAppMenuItems;
-// Register for NSWindow notifications.
-- (void)registerEventHandlers;
-// If the window is an app window, add or remove menu items.
-- (void)windowMainStatusChanged:(NSNotification*)notification;
-// Called when |app| becomes the main window in the Chrome process.
-- (void)appBecameMain:(const Extension*)app;
-// Called when there is no main window, or if the main window is not an app.
-- (void)chromeBecameMain;
-// Add menu items for an app and hide Chrome menu items.
-- (void)addMenuItems:(const Extension*)app;
-// If the window belongs to the currently focused app, remove the menu items and
-// unhide Chrome menu items.
-- (void)removeMenuItems;
-// If the currently focused window belongs to a platform app, quit the app.
-- (void)quitCurrentPlatformApp;
-// If the currently focused window belongs to a platform app, hide the app.
-- (void)hideCurrentPlatformApp;
-// If the currently focused window belongs to a platform app, focus the app.
-- (void)focusCurrentPlatformApp;
-@end
-
-@implementation AppShimMenuController
-
-- (instancetype)init {
-  if ((self = [super init])) {
-    [self buildAppMenuItems];
-    [self registerEventHandlers];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [NSNotificationCenter.defaultCenter removeObserver:self];
-}
-
-- (void)buildAppMenuItems {
-  _aboutDoppelganger =
-      [[DoppelgangerMenuItem alloc] initWithController:self
-                                               menuTag:IDC_CHROME_MENU
-                                               itemTag:IDC_ABOUT
-                                            resourceId:IDS_ABOUT_MAC
-                                                action:nil
-                                         keyEquivalent:@""];
-  _hideDoppelganger = [[DoppelgangerMenuItem alloc]
-      initWithController:self
-                 menuTag:IDC_CHROME_MENU
-                 itemTag:IDC_HIDE_APP
-              resourceId:IDS_HIDE_APP_MAC
-                  action:@selector(hideCurrentPlatformApp)
-           keyEquivalent:@"h"];
-  _quitDoppelganger = [[DoppelgangerMenuItem alloc]
-      initWithController:self
-                 menuTag:IDC_CHROME_MENU
-                 itemTag:IDC_EXIT
-              resourceId:IDS_EXIT_MAC
-                  action:@selector(quitCurrentPlatformApp)
-           keyEquivalent:@"q"];
-  _newDoppelganger =
-      [[DoppelgangerMenuItem alloc] initWithController:self
-                                               menuTag:IDC_FILE_MENU
-                                               itemTag:IDC_NEW_WINDOW
-                                            resourceId:0
-                                                action:nil
-                                         keyEquivalent:@"n"];
-  // Since the "Close Window" menu item will have the same shortcut as "Close
-  // Tab" on the Chrome menu, we need to create a doppelganger.
-  _closeWindowDoppelganger =
-      [[DoppelgangerMenuItem alloc] initWithMenuTag:IDC_FILE_MENU
-                                      sourceItemTag:IDC_CLOSE_TAB
-                                      targetItemTag:IDC_CLOSE_WINDOW
-                                      keyEquivalent:@"w"];
-  // For apps, the "Window" part of "New Window" is dropped to match the default
-  // menu set given to Cocoa Apps.
-  [[_newDoppelganger menuItem] setTitle:l10n_util::GetNSString(IDS_NEW_MAC)];
-  _openDoppelganger =
-      [[DoppelgangerMenuItem alloc] initWithController:self
-                                               menuTag:IDC_FILE_MENU
-                                               itemTag:IDC_OPEN_FILE
-                                            resourceId:0
-                                                action:nil
-                                         keyEquivalent:@"o"];
-  _allToFrontDoppelganger = [[DoppelgangerMenuItem alloc]
-      initWithController:self
-                 menuTag:IDC_WINDOW_MENU
-                 itemTag:IDC_ALL_WINDOWS_FRONT
-              resourceId:0
-                  action:@selector(focusCurrentPlatformApp)
-           keyEquivalent:@""];
-
-  // The app's menu.
-  _appMenuItem = [[NSMenuItem alloc] initWithTitle:@""
-                                            action:nil
-                                     keyEquivalent:@""];
-  NSMenu* appMenu = [[NSMenu alloc] initWithTitle:@""];
-  [_appMenuItem setSubmenu:appMenu];
-  [appMenu setAutoenablesItems:NO];
-
-  [appMenu addItem:[_aboutDoppelganger menuItem]];
-  [[_aboutDoppelganger menuItem] setEnabled:NO];  // Not implemented yet.
-  [appMenu addItem:[NSMenuItem separatorItem]];
-  [appMenu addItem:[_hideDoppelganger menuItem]];
-  [appMenu addItem:[NSMenuItem separatorItem]];
-  [appMenu addItem:[_quitDoppelganger menuItem]];
-
-  // File menu.
-  _fileMenuItem = NewTopLevelItemFrom(IDC_FILE_MENU);
-  [[_fileMenuItem submenu] addItem:[_newDoppelganger menuItem]];
-  [[_fileMenuItem submenu] addItem:[_openDoppelganger menuItem]];
-  [[_fileMenuItem submenu] addItem:[NSMenuItem separatorItem]];
-  [[_fileMenuItem submenu] addItem:[_closeWindowDoppelganger menuItem]];
-
-  // Edit menu. We copy the menu because the last two items, "Start Dictation"
-  // and "Special Characters" are added by OSX, so we can't copy them
-  // explicitly.
-  _editMenuItem = [[[NSApp mainMenu] itemWithTag:IDC_EDIT_MENU] copy];
-
-  // View menu. Remove "Always Show Bookmark Bar" and separator.
-  _viewMenuItem = [[[NSApp mainMenu] itemWithTag:IDC_VIEW_MENU] copy];
-  RemoveMenuItemWithTag(_viewMenuItem, IDC_SHOW_BOOKMARK_BAR, YES);
-
-  // History menu.
-  _historyMenuItem = NewTopLevelItemFrom(IDC_HISTORY_MENU);
-  AddDuplicateItem(_historyMenuItem, IDC_HISTORY_MENU, IDC_BACK);
-  AddDuplicateItem(_historyMenuItem, IDC_HISTORY_MENU, IDC_FORWARD);
-
-  // Window menu.
-  _windowMenuItem = NewTopLevelItemFrom(IDC_WINDOW_MENU);
-  AddDuplicateItem(_windowMenuItem, IDC_WINDOW_MENU, IDC_MINIMIZE_WINDOW);
-  AddDuplicateItem(_windowMenuItem, IDC_WINDOW_MENU, IDC_MAXIMIZE_WINDOW);
-  [[_windowMenuItem submenu] addItem:[NSMenuItem separatorItem]];
-  [[_windowMenuItem submenu] addItem:[_allToFrontDoppelganger menuItem]];
-}
-
-- (void)registerEventHandlers {
-  [[NSNotificationCenter defaultCenter]
-      addObserver:self
-         selector:@selector(windowMainStatusChanged:)
-             name:NSWindowDidBecomeMainNotification
-           object:nil];
-
-  [[NSNotificationCenter defaultCenter]
-      addObserver:self
-         selector:@selector(windowMainStatusChanged:)
-             name:NSWindowDidResignMainNotification
-           object:nil];
-}
-
-- (void)windowMainStatusChanged:(NSNotification*)notification {
-  // A Yosemite AppKit bug causes this notification to be sent during the
-  // -dealloc for a specific NSWindow. Any autoreleases sent to that window
-  // must be drained before the window finishes -dealloc. In this method, an
-  // autorelease is sent by the invocation of [NSApp windows].
-  // http://crbug.com/406944.
-  base::apple::ScopedNSAutoreleasePool pool;
-
-  NSString* name = [notification name];
-  if ([name isEqualToString:NSWindowDidBecomeMainNotification]) {
-    id window = [notification object];
-    // Ignore is_browser: if a window becomes main that does not belong to an
-    // extension or browser, treat it the same as switching to a browser.
-    const Extension* extension = GetExtensionForNSWindow(window);
-    if (extension)
-      [self appBecameMain:extension];
-    else
-      [self chromeBecameMain];
-  } else if ([name isEqualToString:NSWindowDidResignMainNotification]) {
-    // When a window resigns main status, reset back to the Chrome menu.
-    // In the past we've tried:
-    // - Only doing this when a window closes, but this would not be triggered
-    // when an app becomes hidden (Cmd+h), and there are no Chrome windows to
-    // become main.
-    // - Scanning [NSApp windows] to predict whether we could
-    // expect another Chrome window to become main, and skip the reset. However,
-    // panels need to do strange things during window close to ensure panels
-    // never get chosen for key status over a browser window (which is likely
-    // because they are given an elevated [NSWindow level]). Trying to handle
-    // this case is not robust.
-    //
-    // Unfortunately, resetting the menu to Chrome
-    // unconditionally means that if another packaged app window becomes key,
-    // the menu will flicker. TODO(tapted): Investigate restoring the logic when
-    // the panel code is removed.
-    [self chromeBecameMain];
-  } else {
-    NOTREACHED();
-  }
-}
-
-- (void)appBecameMain:(const Extension*)app {
-  if (_appId == app->id())
-    return;
-
-  if (!_appId.empty())
-    [self removeMenuItems];
-
-  _appId = app->id();
-  [self addMenuItems:app];
-}
-
-- (void)chromeBecameMain {
-  if (_appId.empty())
-    return;
-
-  _appId.clear();
-  [self removeMenuItems];
-}
-
-- (void)addMenuItems:(const Extension*)app {
-  DCHECK_EQ(_appId, app->id());
-  NSString* title = base::SysUTF8ToNSString(app->name());
-
-  // Hide Chrome menu items.
-  NSMenu* mainMenu = [NSApp mainMenu];
-  for (NSMenuItem* item in [mainMenu itemArray])
-    [item setHidden:YES];
-
-  [_aboutDoppelganger enableForApp:app];
-  [_hideDoppelganger enableForApp:app];
-  [_quitDoppelganger enableForApp:app];
-  [_newDoppelganger enableForApp:app];
-  [_openDoppelganger enableForApp:app];
-  [_closeWindowDoppelganger enableForApp:app];
-
-  [_appMenuItem setTitle:base::SysUTF8ToNSString(_appId)];
-  [[_appMenuItem submenu] setTitle:title];
-
-  [mainMenu addItem:_appMenuItem];
-  [mainMenu addItem:_fileMenuItem];
-
-  SetItemWithTagVisible(_editMenuItem,
-                        IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE,
-                        app->is_hosted_app(), true);
-  SetItemWithTagVisible(_editMenuItem, IDC_FIND_MENU, app->is_hosted_app(),
-                        false);
-  [mainMenu addItem:_editMenuItem];
-
-  if (app->is_hosted_app()) {
-    [mainMenu addItem:_viewMenuItem];
-    [mainMenu addItem:_historyMenuItem];
-  }
-  [mainMenu addItem:_windowMenuItem];
-}
-
-- (void)removeMenuItems {
-  NSMenu* mainMenu = [NSApp mainMenu];
-  [mainMenu removeItem:_appMenuItem];
-  [mainMenu removeItem:_fileMenuItem];
-  if ([mainMenu indexOfItem:_viewMenuItem] >= 0)
-    [mainMenu removeItem:_viewMenuItem];
-  if ([mainMenu indexOfItem:_historyMenuItem] >= 0)
-    [mainMenu removeItem:_historyMenuItem];
-  [mainMenu removeItem:_editMenuItem];
-  [mainMenu removeItem:_windowMenuItem];
-
-  // Restore the Chrome main menu bar.
-  for (NSMenuItem* item in [mainMenu itemArray])
-    [item setHidden:NO];
-
-  [_aboutDoppelganger disable];
-  [_hideDoppelganger disable];
-  [_quitDoppelganger disable];
-  [_newDoppelganger disable];
-  [_openDoppelganger disable];
-  [_closeWindowDoppelganger disable];
-}
-
-- (void)quitCurrentPlatformApp {
-  auto windows = GetAppWindowsForNSWindow([NSApp keyWindow]);
-  for (extensions::AppWindow* window : base::Reversed(windows))
-    window->GetBaseWindow()->Close();
-}
-
-- (void)hideCurrentPlatformApp {
-  auto windows = GetAppWindowsForNSWindow([NSApp keyWindow]);
-  for (extensions::AppWindow* window : base::Reversed(windows))
-    window->GetBaseWindow()->Hide();
-}
-
-- (void)focusCurrentPlatformApp {
-  auto windows = GetAppWindowsForNSWindow([NSApp keyWindow]);
-  for (extensions::AppWindow* window : base::Reversed(windows))
-    window->GetBaseWindow()->Show();
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
deleted file mode 100644
index 96d6f36..0000000
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2013 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/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h"
-
-#import <Cocoa/Cocoa.h>
-
-#import "base/apple/foundation_util.h"
-#import "base/apple/scoped_objc_class_swizzler.h"
-#include "base/command_line.h"
-#include "base/memory/raw_ptr.h"
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
-#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/launch_util.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "content/public/test/browser_test.h"
-#include "extensions/browser/app_window/app_window_registry.h"
-#include "extensions/browser/app_window/native_app_window.h"
-#include "extensions/browser/uninstall_reason.h"
-#include "extensions/common/extension.h"
-#include "extensions/test/extension_test_message_listener.h"
-#import "ui/base/test/scoped_fake_nswindow_focus.h"
-
-namespace {
-
-class AppShimMenuControllerBrowserTest
-    : public extensions::PlatformAppBrowserTest {
- public:
-  AppShimMenuControllerBrowserTest(const AppShimMenuControllerBrowserTest&) =
-      delete;
-  AppShimMenuControllerBrowserTest& operator=(
-      const AppShimMenuControllerBrowserTest&) = delete;
-
- protected:
-  // The apps that can be installed and launched by SetUpApps().
-  enum AvailableApps { PACKAGED_1 = 0x1, PACKAGED_2 = 0x2, HOSTED = 0x4 };
-
-  AppShimMenuControllerBrowserTest() = default;
-
-  // Start testing apps and wait for them to launch. |flags| is a bitmask of
-  // AvailableApps.
-  void SetUpApps(int flags) {
-
-    if (flags & PACKAGED_1) {
-      ExtensionTestMessageListener listener_1("Launched");
-      app_1_ = InstallAndLaunchPlatformApp("minimal_id");
-      ASSERT_TRUE(listener_1.WaitUntilSatisfied());
-    }
-
-    if (flags & PACKAGED_2) {
-      ExtensionTestMessageListener listener_2("Launched");
-      app_2_ = InstallAndLaunchPlatformApp("minimal");
-      ASSERT_TRUE(listener_2.WaitUntilSatisfied());
-    }
-
-    if (flags & HOSTED) {
-      hosted_app_ = InstallHostedApp();
-
-      // Explicitly set the launch type to open in a new window.
-      extensions::SetLaunchType(profile(), hosted_app_->id(),
-                                extensions::LAUNCH_TYPE_WINDOW);
-      LaunchHostedApp(hosted_app_);
-    }
-
-    initial_menu_item_count_ = [[[NSApp mainMenu] itemArray] count];
-  }
-
-  void CheckHasAppMenus(const extensions::Extension* app) const {
-    NSArray* item_array = [[NSApp mainMenu] itemArray];
-    ASSERT_EQ(initial_menu_item_count_, [item_array count]);
-
-    // The extra app menus are added from the start when NSApp has an activation
-    // policy.
-    const int kExtraTopLevelItems = 4;
-    for (NSUInteger i = 0; i < initial_menu_item_count_ - kExtraTopLevelItems;
-         ++i) {
-      EXPECT_TRUE([item_array[i] isHidden]);
-    }
-
-    NSMenuItem* app_menu =
-        item_array[initial_menu_item_count_ - kExtraTopLevelItems];
-    EXPECT_EQ(app->id(), base::SysNSStringToUTF8([app_menu title]));
-    EXPECT_EQ(app->name(),
-              base::SysNSStringToUTF8([[app_menu submenu] title]));
-    for (NSUInteger i = initial_menu_item_count_ - kExtraTopLevelItems;
-         i < initial_menu_item_count_; ++i) {
-      NSMenuItem* menu = item_array[i];
-      EXPECT_GT([[menu submenu] numberOfItems], 0);
-      EXPECT_FALSE([menu isHidden]);
-    }
-  }
-
-  void CheckNoAppMenus() const {
-    const int kExtraTopLevelItems = 4;
-    NSArray* item_array = [[NSApp mainMenu] itemArray];
-    EXPECT_EQ(initial_menu_item_count_ - kExtraTopLevelItems,
-              [item_array count]);
-    for (NSUInteger i = 0; i < initial_menu_item_count_ - kExtraTopLevelItems;
-         ++i) {
-      EXPECT_FALSE([item_array[i] isHidden]);
-    }
-  }
-
-  void CheckEditMenu(const extensions::Extension* app) const {
-    const int edit_menu_index = initial_menu_item_count_ + 2;
-
-    NSMenuItem* edit_menu = [[NSApp mainMenu] itemArray][edit_menu_index];
-    NSMenu* edit_submenu = [edit_menu submenu];
-    NSMenuItem* paste_match_style_menu_item =
-        [edit_submenu itemWithTag:IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE];
-    NSMenuItem* find_menu_item = [edit_submenu itemWithTag:IDC_FIND_MENU];
-    if (app->is_hosted_app()) {
-      EXPECT_FALSE([paste_match_style_menu_item isHidden]);
-      EXPECT_FALSE([find_menu_item isHidden]);
-    } else {
-      EXPECT_TRUE([paste_match_style_menu_item isHidden]);
-      EXPECT_TRUE([find_menu_item isHidden]);
-    }
-  }
-
-  extensions::AppWindow* FirstWindowForApp(const extensions::Extension* app) {
-    extensions::AppWindowRegistry::AppWindowList window_list =
-        extensions::AppWindowRegistry::Get(profile())
-            ->GetAppWindowsForApp(app->id());
-    EXPECT_FALSE(window_list.empty());
-    return window_list.front();
-  }
-
-  raw_ptr<const extensions::Extension, AcrossTasksDanglingUntriaged> app_1_ =
-      nullptr;
-  raw_ptr<const extensions::Extension, AcrossTasksDanglingUntriaged> app_2_ =
-      nullptr;
-  raw_ptr<const extensions::Extension, AcrossTasksDanglingUntriaged>
-      hosted_app_ = nullptr;
-  NSUInteger initial_menu_item_count_ = 0;
-};
-
-// Test that focusing an app window changes the menu bar.
-// Disabled; https://crbug.com/1493413.
-IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
-                       DISABLED_PlatformAppFocusUpdatesMenuBar) {
-  SetUpApps(PACKAGED_1 | PACKAGED_2);
-  // When an app is focused, all Chrome menu items should be hidden, and a menu
-  // item for the app should be added.
-  extensions::AppWindow* app_1_app_window = FirstWindowForApp(app_1_);
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:app_1_app_window->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckHasAppMenus(app_1_);
-
-  // When another app is focused, the menu item for the app should change.
-  extensions::AppWindow* app_2_app_window = FirstWindowForApp(app_2_);
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:app_2_app_window->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckHasAppMenus(app_2_);
-
-  // When a browser window is focused, the menu items for the app should be
-  // removed.
-  BrowserWindow* chrome_window =
-      (*BrowserList::GetInstance()->begin())->window();
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:chrome_window->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckNoAppMenus();
-
-  // When an app window is closed and there are no other app windows, the menu
-  // items for the app should be removed.
-  app_1_app_window->GetBaseWindow()->Close();
-  chrome_window->Close();
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:app_2_app_window->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckHasAppMenus(app_2_);
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidResignMainNotification
-                    object:app_2_app_window->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  app_2_app_window->GetBaseWindow()->Close();
-  CheckNoAppMenus();
-}
-
-// Test that closing windows without main status do not update the menu.
-// Disabled; https://crbug.com/1322740.
-IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
-                       DISABLED_ClosingBackgroundWindowLeavesMenuBar) {
-  // Start with app1 active.
-  SetUpApps(PACKAGED_1);
-  extensions::AppWindow* app_1_app_window = FirstWindowForApp(app_1_);
-
-  {
-    ui::test::ScopedFakeNSWindowFocus fake_focus;
-    [app_1_app_window->GetNativeWindow().GetNativeNSWindow() makeMainWindow];
-    CheckHasAppMenus(app_1_);
-
-    // Closing a background window without focusing it should not change menus.
-    BrowserWindow* chrome_window =
-        (*BrowserList::GetInstance()->begin())->window();
-    chrome_window->Close();
-    [[NSNotificationCenter defaultCenter]
-        postNotificationName:NSWindowWillCloseNotification
-                      object:chrome_window->GetNativeWindow()
-                                 .GetNativeNSWindow()];
-    CheckHasAppMenus(app_1_);
-
-    // |fake_focus| going out of scope sends NSWindowWillResignMainNotification.
-  }
-  app_1_app_window->GetBaseWindow()->Close();
-  CheckNoAppMenus();
-}
-
-// Test that uninstalling an app restores the main menu.
-// Disabled per crbug.com/1513792.
-IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
-                       DISABLED_ExtensionUninstallUpdatesMenuBar) {
-  SetUpApps(PACKAGED_1 | PACKAGED_2);
-
-  FirstWindowForApp(app_2_)->GetBaseWindow()->Close();
-  (*BrowserList::GetInstance()->begin())->window()->Close();
-  NSWindow* app_1_window =
-      FirstWindowForApp(app_1_)->GetNativeWindow().GetNativeNSWindow();
-
-  ui::test::ScopedFakeNSWindowFocus fake_focus;
-  [app_1_window makeMainWindow];
-
-  CheckHasAppMenus(app_1_);
-  extension_service()->UninstallExtension(
-      app_1_->id(), extensions::UNINSTALL_REASON_FOR_TESTING,
-      nullptr /* nullptr */);
-
-  // OSX will send NSWindowWillResignMainNotification when a main window is
-  // closed.
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidResignMainNotification
-                    object:app_1_window];
-  CheckNoAppMenus();
-}
-
-}  // namespace
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.cc b/chrome/browser/ui/lens/lens_overlay_controller.cc
index 4eb07d5..057317e 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller.cc
@@ -450,7 +450,7 @@
     return;
   }
   current_screenshot_data_uri_ =
-      webui::MakeDataURIForImage(data->as_vector(), "jpeg");
+      webui::MakeDataURIForImage(data->data(), "jpeg");
 
   ShowOverlayWidget();
 
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index 50fa4f2..926d5255 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -143,10 +143,12 @@
 
   // Get the front and end of the image bytes in order to store them in the
   // search_args to be sent as part of the PostContent in the request
+  size_t image_bytes_size = image.As1xPNGBytes()->size();
+  const unsigned char* image_bytes_begin = image.As1xPNGBytes()->front();
+  const unsigned char* image_bytes_end = image_bytes_begin + image_bytes_size;
   content_type = "image/png";
   image_format = lens::mojom::ImageFormat::PNG;
-  auto bytes = image.As1xPNGBytes();
-  data.assign(bytes->begin(), bytes->end());
+  data.assign(image_bytes_begin, image_bytes_end);
   return data;
 }
 
diff --git a/chrome/browser/ui/views/content_setting_site_row_view.cc b/chrome/browser/ui/views/content_setting_site_row_view.cc
index 79c0caf8..b6ec152 100644
--- a/chrome/browser/ui/views/content_setting_site_row_view.cc
+++ b/chrome/browser/ui/views/content_setting_site_row_view.cc
@@ -84,7 +84,7 @@
     const favicon_base::FaviconRawBitmapResult& favicon_result) {
   if (favicon_result.is_valid()) {
     favicon_->SetImage(ui::ImageModel::FromImage(
-        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->data(),
+        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->front(),
                                          favicon_result.bitmap_data->size())));
   } else {
     favicon_->SetImage(ui::ImageModel::FromVectorIcon(
diff --git a/chrome/browser/ui/views/download/download_shelf_view.cc b/chrome/browser/ui/views/download/download_shelf_view.cc
index b94bae97..7c97ce4 100644
--- a/chrome/browser/ui/views/download/download_shelf_view.cc
+++ b/chrome/browser/ui/views/download/download_shelf_view.cc
@@ -271,7 +271,7 @@
 void DownloadShelfView::ConfigureButtonForTheme(views::MdTextButton* button) {
   const auto* const cp = GetColorProvider();
   DCHECK(cp);
-  button->SetBgColorOverride(cp->GetColor(kColorDownloadShelfButtonBackground));
+  button->SetBgColorIdOverride(kColorDownloadShelfButtonBackground);
   button->SetEnabledTextColors(cp->GetColor(kColorDownloadShelfButtonText));
 }
 
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
index 51584ffe..451eefc2 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
@@ -25,6 +25,7 @@
 #include "extensions/common/extension_id.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/text_constants.h"
 #include "ui/gfx/vector_icon_types.h"
@@ -418,12 +419,18 @@
                                      views::MaximumFlexSizeRule::kUnbounded)),
                 views::Builder<views::MdTextButton>()
                     .SetCallback(base::BindRepeating(dismiss_callback_, id))
+                    .SetStyle(ui::ButtonStyle::kText)
+                    .SetBgColorIdOverride(
+                        kColorExtensionsMenuHighlightedBackground)
                     .SetText(l10n_util::GetStringUTF16(
                         IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_DISMISS_BUTTON_TEXT))
                     .SetTooltipText(l10n_util::GetStringUTF16(
                         IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_DISMISS_BUTTON_TOOLTIP)),
                 views::Builder<views::MdTextButton>()
                     .SetCallback(base::BindRepeating(allow_callback_, id))
+                    .SetStyle(ui::ButtonStyle::kText)
+                    .SetBgColorIdOverride(
+                        kColorExtensionsMenuHighlightedBackground)
                     .SetText(l10n_util::GetStringUTF16(
                         IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_ALLOW_BUTTON_TEXT))
                     .SetTooltipText(l10n_util::GetStringUTF16(
diff --git a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.cc b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.cc
index 57ed60f5..91e86e4 100644
--- a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.cc
+++ b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.cc
@@ -4,7 +4,10 @@
 
 #include "chrome/browser/ui/views/global_media_controls/cast_device_selector_view.h"
 
+#include "chrome/browser/ui/views/controls/hover_button.h"
+#include "chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h"
 #include "chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.h"
+#include "chrome/browser/ui/views/media_router/cast_dialog_helper.h"
 #include "components/global_media_controls/public/views/media_item_ui_updated_view.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
@@ -17,16 +20,20 @@
 namespace {
 
 constexpr gfx::Size kPreferredSize{370, 0};
+constexpr gfx::Size kCloseButtonSize{20, 20};
 
 constexpr int kBackgroundBorderThickness = 1;
 constexpr int kBackgroundCornerRadius = 8;
+constexpr int kDeviceEntryCornerRadius = 4;
+constexpr int kBackgroundSeparator = 8;
+constexpr int kDeviceContainerSeparator = 4;
+constexpr int kDeviceEntrySeparator = 8;
+constexpr int kCloseButtonIconSize = 16;
+constexpr int kDeviceEntryIconSize = 20;
 
 constexpr gfx::Insets kBackgroundInsets = gfx::Insets::VH(16, 8);
 constexpr gfx::Insets kCastToRowInsets = gfx::Insets::VH(0, 8);
 
-constexpr int kCloseButtonIconSize = 16;
-constexpr gfx::Size kCloseButtonSize = gfx::Size(20, 20);
-
 }  // namespace
 
 CastDeviceSelectorView::CastDeviceSelectorView(
@@ -47,7 +54,8 @@
       media_color_theme_.device_selector_background_color_id,
       kBackgroundCornerRadius));
   SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical, kBackgroundInsets));
+      views::BoxLayout::Orientation::kVertical, kBackgroundInsets,
+      kBackgroundSeparator));
 
   // |cast_to_row| holds the cast to label and the close button.
   auto* cast_to_row = AddChildView(std::make_unique<views::BoxLayoutView>());
@@ -79,6 +87,7 @@
       AddChildView(std::make_unique<views::BoxLayoutView>());
   device_container_view_->SetOrientation(
       views::BoxLayout::Orientation::kVertical);
+  device_container_view_->SetBetweenChildSpacing(kDeviceContainerSeparator);
 
   if (show_devices) {
     ShowDevices();
@@ -120,11 +129,10 @@
     std::vector<global_media_controls::mojom::DevicePtr> devices) {
   device_container_view_->RemoveAllChildViews();
   for (const auto& device : devices) {
-    auto device_view = std::make_unique<CastDeviceEntryViewAsh>(
+    auto device_view = BuildCastDeviceEntryView(
         base::BindRepeating(&CastDeviceSelectorView::OnCastDeviceSelected,
                             base::Unretained(this), device->id),
-        media_color_theme_.primary_foreground_color_id,
-        media_color_theme_.secondary_foreground_color_id, device);
+        base::UTF8ToUTF16(device->name), device->icon);
     device_container_view_->AddChildView(std::move(device_view));
   }
   if (media_item_ui_updated_view_) {
@@ -137,6 +145,31 @@
 ///////////////////////////////////////////////////////////////////////////////
 // CastDeviceSelectorView implementations:
 
+std::unique_ptr<HoverButton> CastDeviceSelectorView::BuildCastDeviceEntryView(
+    views::Button::PressedCallback callback,
+    const std::u16string& text,
+    global_media_controls::mojom::IconType icon) {
+  std::unique_ptr<HoverButton> device_entry_button;
+  if (icon == global_media_controls::mojom::IconType::kThrobber) {
+    device_entry_button = std::make_unique<HoverButton>(
+        std::move(callback), media_router::CreateThrobber(), text);
+  } else {
+    device_entry_button = std::make_unique<HoverButton>(
+        std::move(callback),
+        ui::ImageModel::FromVectorIcon(
+            GetVectorIcon(icon),
+            media_color_theme_.secondary_foreground_color_id,
+            kDeviceEntryIconSize),
+        text);
+  }
+  device_entry_button->SetLabelStyle(views::style::STYLE_BODY_2);
+  device_entry_button->SetEnabledTextColorIds(
+      media_color_theme_.secondary_foreground_color_id);
+  device_entry_button->SetImageLabelSpacing(kDeviceEntrySeparator);
+  device_entry_button->SetFocusRingCornerRadius(kDeviceEntryCornerRadius);
+  return device_entry_button;
+}
+
 void CastDeviceSelectorView::OnCastDeviceSelected(
     const std::string& device_id) {
   if (device_list_host_) {
@@ -167,5 +200,9 @@
   return close_button_;
 }
 
+views::View* CastDeviceSelectorView::GetDeviceContainerViewForTesting() {
+  return device_container_view_;
+}
+
 BEGIN_METADATA(CastDeviceSelectorView)
 END_METADATA
diff --git a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.h b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.h
index 7a6ebd7..a0c9f7e 100644
--- a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.h
+++ b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view.h
@@ -21,6 +21,8 @@
 class BoxLayoutView;
 }  // namespace views
 
+class HoverButton;
+
 // CastDeviceSelectorView holds a list of devices available for casting the
 // given media session. This is used within MediaDialogView on non-CrOS desktop
 // platforms and replaces MediaItemUIDeviceSelectorView when the
@@ -58,10 +60,16 @@
 
   // Helper functions for testing:
   global_media_controls::MediaActionButton* GetCloseButtonForTesting();
+  views::View* GetDeviceContainerViewForTesting();
 
  private:
-  friend class CastDeviceSelectorViewTest;
+  // Build a device entry view for the given device information.
+  std::unique_ptr<HoverButton> BuildCastDeviceEntryView(
+      views::Button::PressedCallback callback,
+      const std::u16string& text,
+      global_media_controls::mojom::IconType icon);
 
+  // Callback for when a device is selected by user.
   void OnCastDeviceSelected(const std::string& device_id);
 
   // Update the visibility of the whole view which changes its size too.
diff --git a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view_unittest.cc b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view_unittest.cc
index 851043d..560f1155 100644
--- a/chrome/browser/ui/views/global_media_controls/cast_device_selector_view_unittest.cc
+++ b/chrome/browser/ui/views/global_media_controls/cast_device_selector_view_unittest.cc
@@ -61,6 +61,7 @@
     return devices;
   }
 
+  MockDeviceListHost* device_list_host() { return device_list_host_.get(); }
   CastDeviceSelectorView* view() { return cast_device_selector_view_; }
 
  private:
@@ -100,3 +101,16 @@
                                   gfx::Point(), ui::EventTimeForNow(), 0, 0));
   EXPECT_FALSE(view()->GetVisible());
 }
+
+TEST_F(CastDeviceSelectorViewTest, DeviceEntryCheck) {
+  CreateCastDeviceSelectorView(/*show_devices=*/true);
+  view()->OnDevicesUpdated(CreateDevices());
+  EXPECT_NE(view()->GetDeviceContainerViewForTesting(), nullptr);
+  for (views::View* child :
+       view()->GetDeviceContainerViewForTesting()->children()) {
+    EXPECT_CALL(*device_list_host(), SelectDevice(kTestDeviceId));
+    views::test::ButtonTestApi(static_cast<views::Button*>(child))
+        .NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+                                    gfx::Point(), ui::EventTimeForNow(), 0, 0));
+  }
+}
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.cc b/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.cc
index a53a6199..941ea46d 100644
--- a/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/global_media_controls/cast_media_notification_item.h"
@@ -311,3 +312,21 @@
   theme.focus_ring_color_id = ui::kColorSysStateFocusRing;
   return theme;
 }
+
+const gfx::VectorIcon& GetVectorIcon(
+    global_media_controls::mojom::IconType icon) {
+  switch (icon) {
+    case global_media_controls::mojom::IconType::kInfo:
+      return kInfoIcon;
+    case global_media_controls::mojom::IconType::kSpeaker:
+      return kSpeakerIcon;
+    case global_media_controls::mojom::IconType::kSpeakerGroup:
+      return kSpeakerGroupIcon;
+    case global_media_controls::mojom::IconType::kInput:
+      return kInputIcon;
+    case global_media_controls::mojom::IconType::kThrobber:
+    case global_media_controls::mojom::IconType::kTv:
+    case global_media_controls::mojom::IconType::kUnknown:
+      return kTvIcon;
+  }
+}
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h b/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h
index b9cc04d0..8aa4251 100644
--- a/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h
+++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h
@@ -21,6 +21,10 @@
 class BrowserContext;
 }  // namespace content
 
+namespace gfx {
+struct VectorIcon;
+}  // namespace gfx
+
 namespace global_media_controls {
 class MediaItemUIDeviceSelector;
 class MediaItemUIFooter;
@@ -112,4 +116,8 @@
 // Returns the MediaColorTheme for the updated media UI.
 media_message_center::MediaColorTheme GetMediaColorTheme();
 
+// Return the vector icon for display for the given cast device icon type.
+const gfx::VectorIcon& GetVectorIcon(
+    global_media_controls::mojom::IconType icon);
+
 #endif  // CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_ITEM_UI_HELPER_H_
diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.cc b/chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.cc
index 1e70d59..97634fa8a 100644
--- a/chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.cc
@@ -8,6 +8,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ui/views/global_media_controls/media_item_ui_helper.h"
 #include "chrome/browser/ui/views/media_router/cast_dialog_helper.h"
 #include "components/global_media_controls/public/mojom/device_service.mojom.h"
 #include "components/vector_icons/vector_icons.h"
@@ -53,26 +54,6 @@
   }
 }
 
-const gfx::VectorIcon* GetVectorIcon(
-    global_media_controls::mojom::IconType icon) {
-  switch (icon) {
-    case global_media_controls::mojom::IconType::kInfo:
-      return &vector_icons::kInfoOutlineIcon;
-    case global_media_controls::mojom::IconType::kSpeaker:
-      return &kSpeakerIcon;
-    case global_media_controls::mojom::IconType::kSpeakerGroup:
-      return &kSpeakerGroupIcon;
-    case global_media_controls::mojom::IconType::kInput:
-      return &kInputIcon;
-    case global_media_controls::mojom::IconType::kTv:
-      return &kTvIcon;
-    // In these cases the icon is a placeholder and doesn't actually get shown.
-    case global_media_controls::mojom::IconType::kThrobber:
-    case global_media_controls::mojom::IconType::kUnknown:
-      return &kTvIcon;
-  }
-}
-
 // foreground_color_id is only set for CastDeviceEntryViewAsh.
 std::unique_ptr<views::ImageView> CreateIconView(
     const gfx::VectorIcon* icon,
@@ -96,7 +77,7 @@
   if (icon == global_media_controls::mojom::IconType::kThrobber) {
     return media_router::CreateThrobber();
   }
-  return CreateIconView(GetVectorIcon(icon), foreground_color_id);
+  return CreateIconView(&GetVectorIcon(icon), foreground_color_id);
 }
 
 std::unique_ptr<views::ImageView> GetAudioDeviceIcon() {
@@ -178,7 +159,7 @@
     SkColor foreground_color,
     SkColor background_color,
     const global_media_controls::mojom::DevicePtr& device)
-    : DeviceEntryUI(device->id, device->name, GetVectorIcon(device->icon)),
+    : DeviceEntryUI(device->id, device->name, &GetVectorIcon(device->icon)),
       HoverButton(std::move(callback),
                   CreateIconView(device->icon),
                   base::UTF8ToUTF16(device->name),
@@ -230,7 +211,7 @@
     ui::ColorId foreground_color_id,
     ui::ColorId background_color_id,
     const global_media_controls::mojom::DevicePtr& device)
-    : DeviceEntryUI(device->id, device->name, GetVectorIcon(device->icon)),
+    : DeviceEntryUI(device->id, device->name, &GetVectorIcon(device->icon)),
       HoverButton(std::move(callback),
                   CreateIconView(device->icon, foreground_color_id),
                   base::UTF8ToUTF16(device->name)),
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_two_origins_view.cc b/chrome/browser/ui/views/permissions/permission_prompt_bubble_two_origins_view.cc
index 6cfef0d6..2ab7ec3c 100644
--- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_two_origins_view.cc
+++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_two_origins_view.cc
@@ -219,7 +219,7 @@
 
   if (favicon_result.is_valid()) {
     favicon_right_->SetImage(ui::ImageModel::FromImage(
-        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->data(),
+        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->front(),
                                          favicon_result.bitmap_data->size())));
   }
   MaybeShow();
@@ -233,7 +233,7 @@
 
   if (favicon_result.is_valid()) {
     favicon_left_->SetImage(ui::ImageModel::FromImage(
-        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->data(),
+        gfx::Image::CreateFrom1xPNGBytes(favicon_result.bitmap_data->front(),
                                          favicon_result.bitmap_data->size())));
   }
   MaybeShow();
diff --git a/chrome/browser/ui/views/tabs/tab_scrubber_chromeos.cc b/chrome/browser/ui/views/tabs/tab_scrubber_chromeos.cc
index 03da7046..79c5143 100644
--- a/chrome/browser/ui/views/tabs/tab_scrubber_chromeos.cc
+++ b/chrome/browser/ui/views/tabs/tab_scrubber_chromeos.cc
@@ -23,6 +23,7 @@
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/gesture_detection/gesture_configuration.h"
+#include "ui/views/widget/widget.h"
 #include "ui/wm/public/activation_client.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -88,10 +89,13 @@
   // event passed from wayland.
   ui::EventType event_type =
       is_fling_scroll_event ? ui::ET_SCROLL_FLING_START : ui::ET_SCROLL;
+  // Set `y_offset` as zero so that its absolute value is always not larger than
+  // that of `x_offset` to represent the horizontal scroll.
+  constexpr float y_offset = 0.f;
   ui::ScrollEvent event(event_type, gfx::PointF(), gfx::PointF(),
                         ui::EventTimeForNow(),
-                        /*flags=*/0, x_offset,
-                        /*y_offset=*/0.f, /*x_offset_ordinal=*/0.f,
+                        /*flags=*/0, x_offset, y_offset,
+                        /*x_offset_ordinal=*/0.f,
                         /*y_offset_ordinal=*/0.f, kFingerCount);
   OnScrollEvent(&event);
 }
@@ -155,6 +159,12 @@
     return;
   }
 
+  // If the scroll is vertical, do not start scrubbing.
+  if (!scrubbing_ &&
+      std::abs(event->x_offset()) < std::abs(event->y_offset())) {
+    return;
+  }
+
   // We are handling the event.
   event->SetHandled();
 
@@ -202,6 +212,14 @@
   if (browser != browser_)
     return;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  if (browser_) {
+    BrowserView::GetBrowserViewForBrowser(browser_)
+        ->GetWidget()
+        ->ReleaseCapture();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
   activate_timer_.Stop();
   swipe_x_ = -1;
   swipe_y_ = -1;
@@ -273,6 +291,13 @@
   }
 
   tab_strip_->AddObserver(this);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Capture the event so that the scroll event will not be handled by other
+  // clients. This is required to work well with overview mode gesture, and not
+  // needed for Lacros since the overview mode handling is done on Ash.
+  browser_view->GetWidget()->SetCapture(/*view=*/nullptr);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 bool TabScrubberChromeOS::FinishScrub(bool activate) {
@@ -281,6 +306,11 @@
 
   if (browser_ && browser_->window()) {
     BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    browser_view->GetWidget()->ReleaseCapture();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
     TabStrip* tab_strip = browser_view->tabstrip();
     if (activate && highlighted_tab_ != -1) {
       Tab* tab = tab_strip->tab_at(highlighted_tab_);
diff --git a/chrome/browser/ui/views/tabs/tab_scrubber_chromeos_browsertest.cc b/chrome/browser/ui/views/tabs/tab_scrubber_chromeos_browsertest.cc
index aefefe9..424271af 100644
--- a/chrome/browser/ui/views/tabs/tab_scrubber_chromeos_browsertest.cc
+++ b/chrome/browser/ui/views/tabs/tab_scrubber_chromeos_browsertest.cc
@@ -604,6 +604,48 @@
   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
 }
 
+IN_PROC_BROWSER_TEST_F(TabScrubberChromeOSTest, VerticalAndHorizontalScroll) {
+  auto event_generator = CreateEventGenerator(browser());
+  constexpr int kOffset = 100;
+
+  {
+    // If y offset is larger than x offset, the event should be recognized as a
+    // vertical scroll and should not begin scrubbing.
+    ui::ScrollEvent vertical_scroll_event(
+        ui::ET_SCROLL, gfx::Point(0, 0), ui::EventTimeForNow(), 0,
+        /*x_offset=*/0, /*y_offset=*/kOffset,
+        /*x_offset_ordinal_=*/0, /*y_offset=*/kOffset,
+        kScrubbingGestureFingerCount);
+    event_generator->Dispatch(&vertical_scroll_event);
+    EXPECT_FALSE(vertical_scroll_event.handled());
+  }
+
+  {
+    // If x offset is larger than y offset, the event should be recognized as a
+    // horizontal scroll and should begin scrubbing.
+    ui::ScrollEvent horizontal_scroll_event(
+        ui::ET_SCROLL, gfx::Point(0, 0), ui::EventTimeForNow(), 0,
+        /*x_offset=*/kOffset, /*y_offset=*/0,
+        /*x_offset_ordinal_=*/kOffset, /*y_offset=*/0,
+        kScrubbingGestureFingerCount);
+    event_generator->Dispatch(&horizontal_scroll_event);
+    EXPECT_TRUE(horizontal_scroll_event.handled());
+  }
+
+  {
+    // Finish scrubbing by dispatching fling scroll event. For finishing the
+    // event, it is not required to be horizontal scroll. This happens for
+    // example when the user start scrubbing with a horizontal scroll and the
+    // fingers go up at the end of the scroll.
+    ui::ScrollEvent fling_scroll_event(
+        ui::ET_SCROLL_FLING_START, gfx::Point(0, 0), ui::EventTimeForNow(), 0,
+        /*x_offset=*/0, /*y_offset=*/kOffset,
+        /*x_offset_ordinal_=*/0, /*y_offset=*/kOffset, 0);
+    event_generator->Dispatch(&fling_scroll_event);
+    EXPECT_TRUE(fling_scroll_event.handled());
+  }
+}
+
 // Check scroll events other than 3-fingers scroll are not handled by
 // TabScrubber.
 IN_PROC_BROWSER_TEST_F(TabScrubberChromeOSTest, EventHandling) {
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
index 7a243ab7..7d7b9b2f 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -93,12 +93,12 @@
     if (color_utils::GetContrastRatio(dialog_background_color,
                                       *brand_background_color_) <
         color_utils::kMinimumVisibleContrastRatio) {
-      SetBgColorOverride(std::nullopt);
+      SetBgColorOverrideDeprecated(std::nullopt);
       SetEnabledTextColors(std::nullopt);
       return;
     }
 
-    SetBgColorOverride(*brand_background_color_);
+    SetBgColorOverrideDeprecated(*brand_background_color_);
     SkColor text_color;
     if (brand_text_color_) {
       // IdpNetworkRequestManager ensures that `brand_text_color_` is only set
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
index 2832886..22c4d97 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
@@ -592,7 +592,7 @@
   views::MdTextButton* button =
       static_cast<views::MdTextButton*>(chooser_children[1]);
   ASSERT_TRUE(button);
-  EXPECT_EQ(*(button->GetBgColorOverride()), bg_color);
+  EXPECT_EQ(*(button->GetBgColorOverrideDeprecated()), bg_color);
 }
 
 TEST_F(AccountSelectionBubbleViewTest,
@@ -639,7 +639,7 @@
       static_cast<views::MdTextButton*>(chooser_children[1]);
   ASSERT_TRUE(button);
   // The button color is not customized by the IDP.
-  EXPECT_FALSE(button->GetBgColorOverride());
+  EXPECT_FALSE(button->GetBgColorOverrideDeprecated());
 }
 
 TEST_F(AccountSelectionBubbleViewTest, Verifying) {
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
index da7bd0c..2200554e 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
@@ -272,6 +272,17 @@
         "IdpClosePopupToBrowserShowAccountsDuration",
         base::TimeTicks::Now() - idp_close_popup_time_);
   }
+
+  if (GetDialogType() == DialogType::MODAL &&
+      (state_ == State::SINGLE_ACCOUNT_PICKER ||
+       state_ == State::MULTI_ACCOUNT_PICKER)) {
+    // This is a placeholder assuming the tab containing the account chooser
+    // will be closed. This will be updated upon user action i.e. clicking on
+    // account row, cancel button or use other account button. If we do not
+    // receive any of these actions by time the dialog is closed, it means our
+    // placeholder assumption is true i.e. the user has closed the tab.
+    modal_account_chooser_state_ = AccountChooserResult::kTabClosed;
+  }
 }
 
 void FedCmAccountSelectionView::OnAccountsDisplayed() {
@@ -603,6 +614,10 @@
     return;
   }
 
+  if (modal_account_chooser_state_) {
+    modal_account_chooser_state_ = AccountChooserResult::kAccountRow;
+  }
+
   // If the account is a returning user or if the account is selected from UI
   // which shows the disclosure text or if the dialog doesn't need to ask for
   // the user's permission to share their id/email/name/picture, show the
@@ -676,12 +691,21 @@
     return;
   }
 
-  UMA_HISTOGRAM_BOOLEAN("Blink.FedCm.CloseVerifySheet.Desktop",
-                        state_ == State::VERIFYING);
+  if (GetDialogType() == DialogType::BUBBLE) {
+    UMA_HISTOGRAM_BOOLEAN("Blink.FedCm.CloseVerifySheet.Desktop",
+                          state_ == State::VERIFYING);
 
-  // Record the sheet type that the user was closing.
-  UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.ClosedSheetType.Desktop",
-                            GetSheetType(), SheetType::COUNT);
+    // Record the sheet type that the user was closing.
+    UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.ClosedSheetType.Desktop",
+                              GetSheetType(), SheetType::COUNT);
+  }
+
+  // Check that state_ at the time of closing is an account chooser, otherwise,
+  // closing other dialogs can override the modal_account_chooser_state_.
+  if (modal_account_chooser_state_ && (state_ == State::SINGLE_ACCOUNT_PICKER ||
+                                       state_ == State::MULTI_ACCOUNT_PICKER)) {
+    modal_account_chooser_state_ = AccountChooserResult::kCancelButton;
+  }
 
   // This may have been set to false when the user triggers the use other
   // account pop-up on the modal to prevent dismissing when the user closes the
@@ -700,11 +724,19 @@
   }
 
   delegate_->OnLoginToIdP(idp_config_url, idp_login_url);
-  is_mismatch_continue_clicked_ = true;
-  popup_window_state_ =
-      PopupWindowResult::kAccountsNotReceivedAndPopupNotClosedByIdp;
-  UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
-                            MismatchDialogResult::kContinued);
+
+  if (state_ == State::IDP_SIGNIN_STATUS_MISMATCH) {
+    is_mismatch_continue_clicked_ = true;
+    popup_window_state_ =
+        PopupWindowResult::kAccountsNotReceivedAndPopupNotClosedByIdp;
+    UMA_HISTOGRAM_ENUMERATION(
+        "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
+        MismatchDialogResult::kContinued);
+  }
+
+  if (modal_account_chooser_state_) {
+    modal_account_chooser_state_ = AccountChooserResult::kUseOtherAccountButton;
+  }
 }
 
 void FedCmAccountSelectionView::OnGotIt(const ui::Event& event) {
@@ -896,6 +928,12 @@
                               *popup_window_state_);
   }
 
+  // If a modal account chooser was open, record the outcome.
+  if (modal_account_chooser_state_) {
+    UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Button.AccountChooserResult",
+                              *modal_account_chooser_state_);
+  }
+
   ResetAccountSelectionView();
   input_protector_.reset();
 
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h
index d4f349a..dc1a7be 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h
@@ -163,6 +163,8 @@
                            IdpSigninStatusPopupClosedAfterAccountsPopulated);
   FRIEND_TEST_ALL_PREFIXES(FedCmAccountSelectionViewDesktopTest,
                            ClosePopupAfterVerifyingSheetShouldNotify);
+  FRIEND_TEST_ALL_PREFIXES(FedCmAccountSelectionViewDesktopTest,
+                           AccountChooserResultMetric);
 
   enum class State {
     // User is shown message that they are not currently signed-in to IdP.
@@ -227,6 +229,19 @@
     kMaxValue = kAccountsNotReceivedAndPopupNotClosedByIdp
   };
 
+  // This enum describes the outcome an account chooser and is used for
+  // histograms. Do not remove or modify existing values, but you may add new
+  // values at the end. This enum should be kept in sync with
+  // FedCmAccountChooserResult in tools/metrics/histograms/enums.xml.
+  enum class AccountChooserResult {
+    kAccountRow,
+    kCancelButton,
+    kUseOtherAccountButton,
+    kTabClosed,
+
+    kMaxValue = kTabClosed
+  };
+
   // views::WidgetObserver:
   void OnWidgetDestroying(views::Widget* widget) override;
 
@@ -339,6 +354,10 @@
   // This is nullopt when no popup window has been opened.
   std::optional<PopupWindowResult> popup_window_state_;
 
+  // The current state of the modal account chooser, if initiated by user. This
+  // is nullopt when no modal account chooser has been opened.
+  std::optional<AccountChooserResult> modal_account_chooser_state_;
+
   // An AccountSelectionViewBase to render bubble dialogs for widget flows,
   // otherwise returns an AccountSelectionViewBase to render modal dialogs
   // for button flows.
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
index a186ba5..99fb01c 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
@@ -283,6 +283,7 @@
     dialog_widget_.reset(CreateTestWidget().release());
     account_selection_view_ =
         std::make_unique<TestAccountSelectionView>(dialog_widget_.get());
+    histogram_tester_ = std::make_unique<base::HistogramTester>();
   }
 
   IdentityProviderDisplayData CreateIdentityProviderDisplayData(
@@ -303,6 +304,29 @@
         request_permission, has_login_status_mismatch);
   }
 
+  std::vector<content::IdentityRequestAccount> CreateAccount(
+      LoginState login_state,
+      std::string account_id = kAccountId1) {
+    return {{account_id, "", "", "", GURL(),
+             /*login_hints=*/std::vector<std::string>(),
+             /*domain_hints=*/std::vector<std::string>(),
+             /*labels=*/std::vector<std::string>(), /*login_state=*/login_state,
+             /*browser_trusted_login_state=*/login_state}};
+  }
+
+  content::IdentityProviderData CreateIdentityProviderData(
+      std::vector<content::IdentityRequestAccount> accounts,
+      bool has_login_status_mismatch = false,
+      bool request_permission = true) {
+    return {kIdpEtldPlusOne,
+            accounts,
+            content::IdentityProviderMetadata(),
+            content::ClientMetadata(GURL(), GURL(), GURL()),
+            blink::mojom::RpContext::kSignIn,
+            request_permission,
+            has_login_status_mismatch};
+  }
+
   std::unique_ptr<TestFedCmAccountSelectionView> CreateAndShow(
       const std::vector<content::IdentityRequestAccount>& accounts,
       SignInMode sign_in_mode,
@@ -421,8 +445,7 @@
   views::ViewsTestBase::WidgetAutoclosePtr dialog_widget_;
   std::unique_ptr<TestAccountSelectionView> account_selection_view_;
   std::unique_ptr<StubAccountSelectionViewDelegate> delegate_;
-
-  base::HistogramTester histogram_tester_;
+  std::unique_ptr<base::HistogramTester> histogram_tester_;
 };
 
 TEST_F(FedCmAccountSelectionViewDesktopTest, SingleAccountFlow) {
@@ -695,12 +718,12 @@
   const std::vector<Account>& accounts = idp_data.accounts;
   std::unique_ptr<TestFedCmAccountSelectionView> controller =
       CreateAndShow(accounts, SignInMode::kAuto);
-  histogram_tester_.ExpectTotalCount("Blink.FedCm.ClosedSheetType.Desktop", 0);
+  histogram_tester_->ExpectTotalCount("Blink.FedCm.ClosedSheetType.Desktop", 0);
 
   AccountSelectionViewBase::Observer* observer =
       static_cast<AccountSelectionViewBase::Observer*>(controller.get());
   observer->OnCloseButtonClicked(CreateMouseEvent());
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.ClosedSheetType.Desktop",
       static_cast<int>(FedCmAccountSelectionView::SheetType::AUTO_REAUTHN), 1);
 }
@@ -711,7 +734,7 @@
        MismatchDialogDismissedByCloseIconMetric) {
   std::unique_ptr<TestFedCmAccountSelectionView> controller =
       CreateAndShowMismatchDialog();
-  histogram_tester_.ExpectTotalCount(
+  histogram_tester_->ExpectTotalCount(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult", 0);
 
   // Emulate user clicking the close icon.
@@ -719,7 +742,7 @@
       views::Widget::ClosedReason::kCloseButtonClicked);
   controller->OnWidgetDestroying(dialog_widget_.get());
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
       static_cast<int>(FedCmAccountSelectionView::MismatchDialogResult::
                            kDismissedByCloseIcon),
@@ -732,14 +755,14 @@
        MismatchDialogDismissedForOtherReasonsMetric) {
   std::unique_ptr<TestFedCmAccountSelectionView> controller =
       CreateAndShowMismatchDialog();
-  histogram_tester_.ExpectTotalCount(
+  histogram_tester_->ExpectTotalCount(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult", 0);
 
   // Emulate user closing the mismatch dialog for an unspecified reason.
   dialog_widget_->CloseWithReason(views::Widget::ClosedReason::kUnspecified);
   controller->OnWidgetDestroying(dialog_widget_.get());
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
       static_cast<int>(FedCmAccountSelectionView::MismatchDialogResult::
                            kDismissedForOtherReasons),
@@ -752,11 +775,11 @@
   {
     std::unique_ptr<TestFedCmAccountSelectionView> controller =
         CreateAndShowMismatchDialog();
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.MismatchDialogResult", 0);
   }
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
       static_cast<int>(FedCmAccountSelectionView::MismatchDialogResult::
                            kDismissedForOtherReasons),
@@ -771,14 +794,14 @@
       CreateAndShowMismatchDialog();
   AccountSelectionViewBase::Observer* observer =
       static_cast<AccountSelectionViewBase::Observer*>(controller.get());
-  histogram_tester_.ExpectTotalCount(
+  histogram_tester_->ExpectTotalCount(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult", 0);
 
   // Emulate user clicking on "Continue" button in the mismatch dialog.
   observer->OnLoginToIdP(GURL(kConfigUrl), GURL(kLoginUrl), CreateMouseEvent());
   CreateAndShowPopupWindow(*controller);
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
       static_cast<int>(
           FedCmAccountSelectionView::MismatchDialogResult::kContinued),
@@ -795,7 +818,7 @@
         CreateAndShowMismatchDialog();
     AccountSelectionViewBase::Observer* observer =
         static_cast<AccountSelectionViewBase::Observer*>(controller.get());
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.MismatchDialogResult", 0);
 
     // Emulate user clicking on "Continue" button in the mismatch dialog.
@@ -804,7 +827,7 @@
     CreateAndShowPopupWindow(*controller);
   }
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.MismatchDialogResult",
       static_cast<int>(
           FedCmAccountSelectionView::MismatchDialogResult::kContinued),
@@ -840,11 +863,11 @@
     // an accounts dialog yet.
     EXPECT_FALSE(dialog_widget_->IsVisible());
 
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus."
         "IdpClosePopupToBrowserShowAccountsDuration",
         0);
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.PopupWindowResult", 0);
 
     // Emulate IdP sending the IdP sign-in status header which updates the
@@ -861,10 +884,10 @@
     EXPECT_FALSE(account_selection_view_->show_back_button_);
   }
 
-  histogram_tester_.ExpectTotalCount(
+  histogram_tester_->ExpectTotalCount(
       "Blink.FedCm.IdpSigninStatus.IdpClosePopupToBrowserShowAccountsDuration",
       1);
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.PopupWindowResult",
       static_cast<int>(FedCmAccountSelectionView::PopupWindowResult::
                            kAccountsReceivedAndPopupClosedByIdp),
@@ -904,11 +927,11 @@
     // been closed yet.
     EXPECT_FALSE(dialog_widget_->IsVisible());
 
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus."
         "IdpClosePopupToBrowserShowAccountsDuration",
         0);
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.PopupWindowResult", 0);
 
     // Emulate IdP closing the pop-up window.
@@ -918,11 +941,11 @@
     EXPECT_TRUE(dialog_widget_->IsVisible());
   }
 
-  histogram_tester_.ExpectTotalCount(
+  histogram_tester_->ExpectTotalCount(
       "Blink.FedCm.IdpSigninStatus."
       "IdpClosePopupToBrowserShowAccountsDuration",
       1);
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.PopupWindowResult",
       static_cast<int>(FedCmAccountSelectionView::PopupWindowResult::
                            kAccountsReceivedAndPopupClosedByIdp),
@@ -954,11 +977,11 @@
     Show(*controller, idp_data.accounts, SignInMode::kExplicit,
          blink::mojom::RpMode::kWidget);
 
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.PopupWindowResult", 0);
   }
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.PopupWindowResult",
       static_cast<int>(FedCmAccountSelectionView::PopupWindowResult::
                            kAccountsReceivedAndPopupNotClosedByIdp),
@@ -985,11 +1008,11 @@
     // Emulate IdentityProvider.close() being called in the pop-up window.
     controller->CloseModalDialog();
 
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.PopupWindowResult", 0);
   }
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.PopupWindowResult",
       static_cast<int>(FedCmAccountSelectionView::PopupWindowResult::
                            kAccountsNotReceivedAndPopupClosedByIdp),
@@ -1013,11 +1036,11 @@
                            CreateMouseEvent());
     CreateAndShowPopupWindow(*controller);
 
-    histogram_tester_.ExpectTotalCount(
+    histogram_tester_->ExpectTotalCount(
         "Blink.FedCm.IdpSigninStatus.PopupWindowResult", 0);
   }
 
-  histogram_tester_.ExpectUniqueSample(
+  histogram_tester_->ExpectUniqueSample(
       "Blink.FedCm.IdpSigninStatus.PopupWindowResult",
       static_cast<int>(FedCmAccountSelectionView::PopupWindowResult::
                            kAccountsNotReceivedAndPopupNotClosedByIdp),
@@ -1207,19 +1230,10 @@
 
   IdentityProviderDisplayData idp_data = CreateIdentityProviderDisplayData(
       {{kAccountId1, LoginState::kSignUp}, {kAccountId2, LoginState::kSignUp}});
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId1, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(), LoginState::kSignUp}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignUp);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, idp_data.accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kWidget, new_idp_data);
@@ -1267,19 +1281,10 @@
   IdentityProviderDisplayData idp_data2 = CreateIdentityProviderDisplayData(
       {{kAccountId1, LoginState::kSignUp}, {kAccountId2, LoginState::kSignUp}});
   // The new account would be kAccountId2.
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId2, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(), LoginState::kSignUp}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignUp, kAccountId2);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, idp_data2.accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kWidget, new_idp_data);
@@ -1331,19 +1336,10 @@
   IdentityProviderDisplayData idp_data2 = CreateIdentityProviderDisplayData(
       {{kAccountId1, LoginState::kSignUp}, {kAccountId2, LoginState::kSignUp}});
   // The new account would be kAccountId2.
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId2, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(), LoginState::kSignUp}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignUp, kAccountId2);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, idp_data2.accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kButton, new_idp_data);
@@ -1389,20 +1385,10 @@
   IdentityProviderDisplayData idp_data2 = CreateIdentityProviderDisplayData(
       {{kAccountId1, LoginState::kSignUp}, {kAccountId2, LoginState::kSignUp}});
   // The new account would be kAccountId2 whose login state is kSignIn.
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId2, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(), LoginState::kSignIn,
-       LoginState::kSignIn}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignIn, kAccountId2);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, idp_data2.accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kButton, new_idp_data);
@@ -1429,21 +1415,10 @@
   // pop-up window and sending new accounts.
   controller->CloseModalDialog();
 
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId1, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(),
-       /*login_state=*/LoginState::kSignIn,
-       /*browser_trusted_login_state=*/LoginState::kSignIn}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignIn);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, new_accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kButton, new_idp_data);
@@ -1470,21 +1445,10 @@
   // pop-up window and sending new accounts.
   controller->CloseModalDialog();
 
-  std::vector<content::IdentityRequestAccount> new_accounts = {
-      {kAccountId1, "", "", "", GURL(),
-       /*login_hints=*/std::vector<std::string>(),
-       /*domain_hints=*/std::vector<std::string>(),
-       /*labels=*/std::vector<std::string>(),
-       /*login_state=*/LoginState::kSignIn,
-       /*browser_trusted_login_state=*/LoginState::kSignUp}};
-  content::IdentityProviderData new_idp_data = {
-      kIdpEtldPlusOne,
-      new_accounts,
-      content::IdentityProviderMetadata(),
-      content::ClientMetadata(GURL(), GURL(), GURL()),
-      blink::mojom::RpContext::kSignIn,
-      /*request_permission=*/true,
-      /*has_login_status_mismatch=*/false};
+  std::vector<content::IdentityRequestAccount> new_accounts =
+      CreateAccount(LoginState::kSignUp);
+  content::IdentityProviderData new_idp_data =
+      CreateIdentityProviderData(new_accounts);
 
   Show(*controller, new_accounts, SignInMode::kExplicit,
        blink::mojom::RpMode::kButton, new_idp_data);
@@ -2078,3 +2042,141 @@
               account_selection_view_->sheet_type_);
   }
 }
+
+// Tests that the correct account chooser result metrics are recorded.
+TEST_F(FedCmAccountSelectionViewDesktopTest, AccountChooserResultMetric) {
+  IdentityProviderDisplayData idp_data =
+      CreateIdentityProviderDisplayData({{kAccountId1, LoginState::kSignUp}});
+  auto CheckForSampleAndReset(
+      [&](FedCmAccountSelectionView::AccountChooserResult result) {
+        histogram_tester_->ExpectUniqueSample(
+            "Blink.FedCm.Button.AccountChooserResult", static_cast<int>(result),
+            1);
+        histogram_tester_ = std::make_unique<base::HistogramTester>();
+      });
+
+  // The AccountChooserResult metric is recorded in OnDismiss, therefore, we
+  // check for the histogram after the TestFedCmAccountSelectionView goes out
+  // of scope.
+  {
+    // User clicks on account row.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShow(idp_data.accounts, SignInMode::kExplicit,
+                      blink::mojom::RpMode::kButton);
+    AccountSelectionViewBase::Observer* observer =
+        static_cast<AccountSelectionViewBase::Observer*>(controller.get());
+    observer->OnAccountSelected(idp_data.accounts[0], idp_data,
+                                CreateMouseEvent());
+  }
+  CheckForSampleAndReset(
+      FedCmAccountSelectionView::AccountChooserResult::kAccountRow);
+
+  {
+    // User clicks on cancel button.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShow(idp_data.accounts, SignInMode::kExplicit,
+                      blink::mojom::RpMode::kButton);
+    AccountSelectionViewBase::Observer* observer =
+        static_cast<AccountSelectionViewBase::Observer*>(controller.get());
+    observer->OnCloseButtonClicked(CreateMouseEvent());
+  }
+  CheckForSampleAndReset(
+      FedCmAccountSelectionView::AccountChooserResult::kCancelButton);
+
+  {
+    // User clicks on use other account button.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShow(idp_data.accounts, SignInMode::kExplicit,
+                      blink::mojom::RpMode::kButton);
+    AccountSelectionViewBase::Observer* observer =
+        static_cast<AccountSelectionViewBase::Observer*>(controller.get());
+    observer->OnLoginToIdP(GURL(kConfigUrl), GURL(kLoginUrl),
+                           CreateMouseEvent());
+  }
+  CheckForSampleAndReset(
+      FedCmAccountSelectionView::AccountChooserResult::kUseOtherAccountButton);
+
+  {
+    // User closes the tab or window.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShow(idp_data.accounts, SignInMode::kExplicit,
+                      blink::mojom::RpMode::kButton);
+  }
+  CheckForSampleAndReset(
+      FedCmAccountSelectionView::AccountChooserResult::kTabClosed);
+
+  {
+    // Widget flow should not record a sample.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShow(idp_data.accounts, SignInMode::kExplicit,
+                      blink::mojom::RpMode::kWidget);
+  }
+  histogram_tester_->ExpectTotalCount("Blink.FedCm.Button.AccountChooserResult",
+                                      0);
+
+  {
+    // Non-returning user signing in via IDP sign-in pop-up should not record a
+    // sample.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShowLoadingDialog();
+    AccountSelectionViewBase::Observer* observer =
+        static_cast<AccountSelectionViewBase::Observer*>(controller.get());
+
+    // Emulate the login to IdP flow.
+    observer->OnLoginToIdP(GURL(kConfigUrl), GURL(kLoginUrl),
+                           CreateMouseEvent());
+    CreateAndShowPopupWindow(*controller);
+
+    // Emulate user completing the sign-in flow and IdP prompts closing the
+    // pop-up window and sending new accounts.
+    controller->CloseModalDialog();
+
+    std::vector<content::IdentityRequestAccount> new_accounts =
+        CreateAccount(LoginState::kSignUp);
+    content::IdentityProviderData new_idp_data =
+        CreateIdentityProviderData(new_accounts);
+
+    Show(*controller, new_accounts, SignInMode::kExplicit,
+         blink::mojom::RpMode::kButton, new_idp_data);
+
+    // User is shown the request permission dialog, skipping the account
+    // chooser.
+    EXPECT_EQ(TestAccountSelectionView::SheetType::kRequestPermission,
+              account_selection_view_->sheet_type_);
+  }
+  histogram_tester_->ExpectTotalCount("Blink.FedCm.Button.AccountChooserResult",
+                                      0);
+
+  {
+    // Returning user signing in via IDP sign-in pop-up should not record a
+    // sample.
+    std::unique_ptr<TestFedCmAccountSelectionView> controller =
+        CreateAndShowLoadingDialog();
+    AccountSelectionViewBase::Observer* observer =
+        static_cast<AccountSelectionViewBase::Observer*>(controller.get());
+
+    // Emulate the login to IdP flow.
+    observer->OnLoginToIdP(GURL(kConfigUrl), GURL(kLoginUrl),
+                           CreateMouseEvent());
+    CreateAndShowPopupWindow(*controller);
+
+    // Emulate user completing the sign-in flow and IdP prompts closing the
+    // pop-up window and sending new accounts.
+    controller->CloseModalDialog();
+
+    std::vector<content::IdentityRequestAccount> new_accounts =
+        CreateAccount(LoginState::kSignIn);
+    content::IdentityProviderData new_idp_data =
+        CreateIdentityProviderData(new_accounts);
+
+    Show(*controller, new_accounts, SignInMode::kExplicit,
+         blink::mojom::RpMode::kButton, new_idp_data);
+
+    // User is shown the verifying dialog, skipping both the account chooser and
+    // request permission dialog.
+    EXPECT_EQ(TestAccountSelectionView::SheetType::kVerifying,
+              account_selection_view_->sheet_type_);
+  }
+  histogram_tester_->ExpectTotalCount("Blink.FedCm.Button.AccountChooserResult",
+                                      0);
+}
diff --git a/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.cc b/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.cc
index ee59eb0..3291884 100644
--- a/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.cc
+++ b/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.cc
@@ -85,6 +85,14 @@
   GetWidget()->SetBounds(widget_bounds);
 }
 
+void MakoRewriteView::SetContentsBounds(content::WebContents* source,
+                                        const gfx::Rect& bounds) {
+  if (views::WebView* web_view_ptr = web_view()) {
+    web_view_ptr->SetPreferredSize(bounds.size());
+  }
+  GetWidget()->SetBounds(bounds);
+}
+
 void MakoRewriteView::ShowUI() {
   WebUIBubbleDialogView::ShowUI();
   // TODO(b/321585877): Remove feature flag for dragging support.
diff --git a/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.h b/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.h
index e9e4c98..712ee7d2 100644
--- a/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.h
+++ b/chrome/browser/ui/webui/ash/mako/mako_rewrite_view.h
@@ -34,6 +34,8 @@
   void DraggableRegionsChanged(
       const std::vector<blink::mojom::DraggableRegionPtr>& regions,
       content::WebContents* contents) override;
+  void SetContentsBounds(content::WebContents* source,
+                         const gfx::Rect& new_size) override;
 
   // MakoBubbleEventHandler::Delegate
   const std::optional<SkRegion> GetDraggableRegion() override;
diff --git a/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc b/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
index ab1a469e..54cbdc6 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
@@ -1432,6 +1432,11 @@
           "ChromeOS.Settings.Accessibility.ReducedAnimations.Enabled",
           value.GetBool());
       return true;
+    case mojom::Setting::kPdfOcrOnOff:
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Accessibility.PdfOcr.Enabled",
+          value.GetBool());
+      return true;
     default:
       return false;
   }
diff --git a/chrome/browser/ui/webui/ash/user_image_source.cc b/chrome/browser/ui/webui/ash/user_image_source.cc
index 98fae4b..ecf41dfe 100644
--- a/chrome/browser/ui/webui/ash/user_image_source.cc
+++ b/chrome/browser/ui/webui/ash/user_image_source.cc
@@ -84,10 +84,10 @@
   gfx::ImageSkia* image =
       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
   float scale = ui::GetScaleForResourceScaleFactor(scale_factor);
-  auto data = base::MakeRefCounted<base::RefCountedBytes>();
+  scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes);
   gfx::PNGCodec::EncodeBGRASkBitmap(image->GetRepresentation(scale).GetBitmap(),
                                     false /* discard transparency */,
-                                    &data->as_vector());
+                                    &data->data());
   return data;
 }
 
@@ -114,7 +114,7 @@
   }
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes);
   gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false /* discard transparency */,
-                                    &data->as_vector());
+                                    &data->data());
   return data;
 }
 
@@ -143,7 +143,7 @@
         scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes);
         gfx::PNGCodec::EncodeBGRASkBitmap(*user->GetImage().bitmap(),
                                           false /* discard transparency */,
-                                          &data->as_vector());
+                                          &data->data());
         return data;
       }
     }
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.cc b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
index 0e39174..a80e3f2 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.cc
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
@@ -46,7 +46,7 @@
 
 scoped_refptr<base::RefCountedMemory> BitmapToMemory(const SkBitmap* image) {
   auto image_bytes = base::MakeRefCounted<base::RefCountedBytes>();
-  gfx::PNGCodec::EncodeBGRASkBitmap(*image, false, &image_bytes->as_vector());
+  gfx::PNGCodec::EncodeBGRASkBitmap(*image, false, &image_bytes->data());
   return image_bytes;
 }
 
@@ -251,9 +251,8 @@
     std::move(request->callback).Run(bitmap_result.bitmap_data.get());
     ClearData(request_id);
   } else {
-    FinalizeImage(ToBitmap(bitmap_result.bitmap_data->data(),
-                           bitmap_result.bitmap_data->size()),
-                  request_id);
+    FinalizeImage(ToBitmap(bitmap_result.bitmap_data->front(),
+                           bitmap_result.bitmap_data->size()), request_id);
   }
 }
 
diff --git a/chrome/browser/ui/webui/fileicon_source.cc b/chrome/browser/ui/webui/fileicon_source.cc
index 2c5a10d..5bd039c 100644
--- a/chrome/browser/ui/webui/fileicon_source.cc
+++ b/chrome/browser/ui/webui/fileicon_source.cc
@@ -89,7 +89,7 @@
     scoped_refptr<base::RefCountedBytes> icon_data(new base::RefCountedBytes);
     gfx::PNGCodec::EncodeBGRASkBitmap(
         icon->ToImageSkia()->GetRepresentation(scale_factor).GetBitmap(), false,
-        &icon_data->as_vector());
+        &icon_data->data());
 
     std::move(callback).Run(icon_data.get());
   } else {
@@ -138,7 +138,7 @@
     scoped_refptr<base::RefCountedBytes> icon_data(new base::RefCountedBytes);
     gfx::PNGCodec::EncodeBGRASkBitmap(
         icon.ToImageSkia()->GetRepresentation(details.scale_factor).GetBitmap(),
-        false, &icon_data->as_vector());
+        false, &icon_data->data());
 
     std::move(details.callback).Run(icon_data.get());
   } else {
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
index f21d71a..0b3c1eb 100644
--- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -577,7 +577,7 @@
         IDR_SECURITY_INTERSTITIAL_UI_HTML);
   }
   scoped_refptr<base::RefCountedString> html_bytes = new base::RefCountedString;
-  html_bytes->as_string() = html;
+  html_bytes->data().assign(html.begin(), html.end());
   std::move(callback).Run(html_bytes.get());
 }
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index d8b91e7..195b1e6a 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -1377,7 +1377,7 @@
     }
     auto image_doodle = new_tab_page::mojom::AllModeImageDoodle::New();
     image_doodle->light = MakeImageDoodle(
-        logo->metadata.type, logo->encoded_image->as_string(),
+        logo->metadata.type, logo->encoded_image->data(),
         logo->metadata.mime_type, logo->metadata.animated_url,
         logo->metadata.width_px, logo->metadata.height_px, "#ffffff",
         logo->metadata.share_button_x, logo->metadata.share_button_y,
@@ -1386,7 +1386,7 @@
         logo->metadata.cta_log_url);
     if (logo->dark_encoded_image) {
       image_doodle->dark = MakeImageDoodle(
-          logo->metadata.type, logo->dark_encoded_image->as_string(),
+          logo->metadata.type, logo->dark_encoded_image->data(),
           logo->metadata.dark_mime_type, logo->metadata.dark_animated_url,
           logo->metadata.dark_width_px, logo->metadata.dark_height_px,
           logo->metadata.dark_background_color,
diff --git a/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc b/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
index 7e95371..6e74e2c 100644
--- a/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
+++ b/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
@@ -44,8 +44,10 @@
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
   scoped_refptr<base::RefCountedMemory> bytes =
       bundle.LoadDataResourceBytes(resource_id);
+  base::StringPiece string_piece(reinterpret_cast<const char*>(bytes->front()),
+                                 bytes->size());
   return ui::ReplaceTemplateExpressions(
-      base::as_string_view(*bytes), replacements,
+      string_piece, replacements,
       /* skip_unexpected_placeholder_check= */ true);
 }
 
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index 870aad36..a385abe 100644
--- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -87,8 +87,10 @@
 std::string ReplaceTemplateExpressions(
     const scoped_refptr<base::RefCountedMemory>& bytes,
     const ui::TemplateReplacements& replacements) {
-  return ui::ReplaceTemplateExpressions(base::as_string_view(*bytes),
-                                        replacements);
+  return ui::ReplaceTemplateExpressions(
+      base::StringPiece(reinterpret_cast<const char*>(bytes->front()),
+                        bytes->size()),
+      replacements);
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index 8220870..a6a2c76 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -288,7 +288,7 @@
 
 std::string RefCountedMemoryToString(
     scoped_refptr<base::RefCountedMemory> memory) {
-  return std::string(base::as_string_view(*memory));
+  return std::string(memory->front_as<char>(), memory->size());
 }
 
 // Fake PwgRasterConverter used in the tests.
@@ -322,7 +322,7 @@
       return;
     }
 
-    memory.mapping.GetMemoryAsSpan<uint8_t>().copy_from(*data);
+    memcpy(memory.mapping.memory(), data->front(), data->size());
     conversion_settings_ = conversion_settings;
     bitmap_settings_ = bitmap_settings;
     std::move(callback).Run(std::move(memory.region));
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 705accaa..1a1296f 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -730,6 +730,7 @@
     return;
   }
   DCHECK(data->size());
+  DCHECK(data->front());
 
   // After validating |settings|, record metrics.
   const mojom::RequestPrintPreviewParams* request_params = GetRequestParams();
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 375729b4..54651b6 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -409,7 +409,8 @@
                            base::Value::Dict settings,
                            scoped_refptr<base::RefCountedMemory> data,
                            const std::string& callback_id) override {
-    ASSERT_EQ(base::as_string_view(*data), kTestData);
+    ASSERT_EQ(base::StringPiece(data->front_as<const char>(), data->size()),
+              kTestData);
     print_called_after_scan_ = true;
     PrintPreviewHandler::FinishHandleDoPrint(user_action, std::move(settings),
                                              data, callback_id);
diff --git a/chrome/browser/ui/webui/sanitized_image_source.cc b/chrome/browser/ui/webui/sanitized_image_source.cc
index 0f7b0001..163ff18 100644
--- a/chrome/browser/ui/webui/sanitized_image_source.cc
+++ b/chrome/browser/ui/webui/sanitized_image_source.cc
@@ -347,10 +347,10 @@
             const bool success =
                 encode_type == RequestAttributes::EncodeType::kWebP
                     ? gfx::WebpCodec::Encode(bitmap, /*quality=*/90,
-                                             &encoded->as_vector())
+                                             &encoded->data())
                     : gfx::PNGCodec::EncodeBGRASkBitmap(
                           bitmap, /*discard_transparency=*/false,
-                          &encoded->as_vector());
+                          &encoded->data());
             return success ? encoded
                            : base::MakeRefCounted<base::RefCountedBytes>();
           },
diff --git a/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui_browsertest.cc b/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui_browsertest.cc
index 5713b7d..af8b179d 100644
--- a/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui_browsertest.cc
@@ -297,7 +297,13 @@
   base::CallbackListSubscription create_services_subscription_;
 };
 
-IN_PROC_BROWSER_TEST_P(SearchEngineChoiceUIPixelTest, InvokeUi_default) {
+// TODO(crbug.com/335549659): Re-enable test.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_InvokeUi_default DISABLED_InvokeUi_default
+#else
+#define MAYBE_InvokeUi_default InvokeUi_default
+#endif
+IN_PROC_BROWSER_TEST_P(SearchEngineChoiceUIPixelTest, MAYBE_InvokeUi_default) {
   ShowAndVerifyUi();
 }
 
diff --git a/chrome/browser/ui/webui/test_files_request_filter.cc b/chrome/browser/ui/webui/test_files_request_filter.cc
index 906a1173..5d94301 100644
--- a/chrome/browser/ui/webui/test_files_request_filter.cc
+++ b/chrome/browser/ui/webui/test_files_request_filter.cc
@@ -43,7 +43,7 @@
       &contents));
 
   base::RefCountedString* ref_contents = new base::RefCountedString();
-  ref_contents->as_string() = contents;
+  ref_contents->data() = contents;
   std::move(callback).Run(ref_contents);
 }
 
diff --git a/chrome/browser/ui/webui/theme_source.cc b/chrome/browser/ui/webui/theme_source.cc
index b7a7542..04e8979 100644
--- a/chrome/browser/ui/webui/theme_source.cc
+++ b/chrome/browser/ui/webui/theme_source.cc
@@ -73,7 +73,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const gfx::ImageSkiaRep& rep = image.GetRepresentation(scale);
   gfx::PNGCodec::EncodeBGRASkBitmap(
-      rep.GetBitmap(), false /* discard transparency */, &data->as_vector());
+      rep.GetBitmap(), false /* discard transparency */, &data->data());
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.cc b/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.cc
index ed6d9f8..1e5b78c7 100644
--- a/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.cc
+++ b/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.cc
@@ -213,6 +213,13 @@
   }
 }
 
+void WebUIContentsWrapper::SetContentsBounds(content::WebContents* source,
+                                             const gfx::Rect& bounds) {
+  if (host_) {
+    host_->SetContentsBounds(source, bounds);
+  }
+}
+
 void WebUIContentsWrapper::PrimaryPageChanged(content::Page& page) {
   if (webui_resizes_host_) {
     EnableAutoResizeForWebContents(web_contents_.get());
diff --git a/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.h b/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.h
index 22a8449..e878fa6 100644
--- a/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.h
+++ b/chrome/browser/ui/webui/top_chrome/webui_contents_wrapper.h
@@ -65,6 +65,8 @@
     virtual void DraggableRegionsChanged(
         const std::vector<blink::mojom::DraggableRegionPtr>& regions,
         content::WebContents* contents) {}
+    virtual void SetContentsBounds(content::WebContents* source,
+                                   const gfx::Rect& bounds) {}
   };
 
   WebUIContentsWrapper(const GURL& webui_url,
@@ -105,6 +107,8 @@
   void DraggableRegionsChanged(
       const std::vector<blink::mojom::DraggableRegionPtr>& regions,
       content::WebContents* contents) override;
+  void SetContentsBounds(content::WebContents* source,
+                         const gfx::Rect& bounds) override;
 
   // content::WebContentsObserver:
   void PrimaryPageChanged(content::Page& page) override;
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index ef596c7..747624c 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -447,7 +447,6 @@
     "//chrome/browser/browsing_data:constants",
     "//chrome/browser/favicon",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/shortcuts",
     "//chrome/common",
     "//chrome/common:chrome_features",
     "//chrome/common:non_code_constants",
@@ -712,7 +711,6 @@
     "//content/test:test_support",
     "//services/data_decoder/public/cpp:test_support",
     "//testing/gtest",
-    "//ui/gfx:test_support",
     "//ui/webui",
   ]
   if (is_chromeos_ash) {
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
index 4c021cd..449bf07c 100644
--- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
@@ -56,7 +56,6 @@
 #include "ui/color/color_provider_utils.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/gfx/test/sk_gmock_support.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/components/arc/mojom/intent_helper.mojom.h"
@@ -72,6 +71,54 @@
 namespace web_app {
 namespace {
 
+MATCHER_P(EqualsBitmap, expected_bmp, "") {
+  // Number of pixels with an error
+  int error_pixels_count = 0;
+
+  gfx::Rect error_bounding_rect = gfx::Rect();
+
+  // Check that bitmaps have identical dimensions.
+  if (arg.width() != expected_bmp.width()) {
+    *result_listener << "where widths do not match, actual: " << arg.width()
+                     << ", expected: " << expected_bmp.width();
+    return false;
+  }
+  if (arg.height() != expected_bmp.height()) {
+    *result_listener << "where heights do not match, actual: " << arg.height()
+                     << ", expected: " << expected_bmp.height();
+    return false;
+  }
+
+  for (int x = 0; x < arg.width(); ++x) {
+    for (int y = 0; y < arg.height(); ++y) {
+      SkColor actual_color = arg.getColor(x, y);
+      SkColor expected_color = expected_bmp.getColor(x, y);
+      if (actual_color != expected_color) {
+        ++error_pixels_count;
+        error_bounding_rect.Union(gfx::Rect(x, y, 1, 1));
+      }
+    }
+  }
+
+  if (error_pixels_count != 0) {
+    *result_listener << "Number of pixel with an error: " << error_pixels_count
+                     << "\nError Bounding Box : "
+                     << error_bounding_rect.ToString() << "\n";
+    int sample_x = expected_bmp.width() / 2;
+    int sample_y = expected_bmp.height() / 2;
+    std::string expected_color = color_utils::SkColorToRgbaString(
+        expected_bmp.getColor(sample_x, sample_y));
+    std::string actual_color =
+        color_utils::SkColorToRgbaString(arg.getColor(sample_x, sample_y));
+    *result_listener << "Sample pixel comparison at " << sample_x << "x"
+                     << sample_y << ": Expected " << expected_color
+                     << ", actual " << actual_color;
+    return false;
+  }
+
+  return true;
+}
+
 class FetchManifestAndInstallCommandTest : public WebAppTest {
  public:
   const GURL kWebAppUrl = GURL("https://example.com/path/index.html");
@@ -997,7 +1044,7 @@
   ASSERT_TRUE(icons_future.Wait());
   std::map<SquareSizePx, SkBitmap> bitmaps = icons_future.Get();
   EXPECT_THAT(bitmaps[icon_size::k256],
-              gfx::test::EqualsBitmap(GenerateExpected256Icon()));
+              EqualsBitmap(GenerateExpected256Icon()));
 
   EXPECT_EQ(IsDiyApp(), provider()->registrar_unsafe().IsDiyApp(app_id));
 
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
index 6b14fbf..c2553ac 100644
--- a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
+++ b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
@@ -52,7 +52,6 @@
 #include "cc/paint/paint_flags.h"
 #import "chrome/browser/mac/dock.h"
 #include "chrome/browser/shell_integration.h"
-#include "chrome/browser/shortcuts/platform_util_mac.h"
 #include "chrome/browser/web_applications/os_integration/icns_encoder.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_test_override.h"
 #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
@@ -721,7 +720,7 @@
 
 using ResourceIDToImage = std::map<int, NSImageRep*>;
 
-// Generates a map of NSImageReps used by SetWorkspaceIconOnWorkerThread and
+// Generates a map of NSImageReps used by SetWorkspaceIconOnFILEThread and
 // passes it to |io_task|. Since ui::ResourceBundle can only be used on UI
 // thread, this function also needs to run on UI thread, and the gfx::Images
 // need to be converted to NSImageReps on the UI thread due to non-thread-safety
@@ -735,15 +734,18 @@
       std::make_unique<ResourceIDToImage>();
 
   // These resource ID should match to the ones used by
-  // SetWorkspaceIconOnWorkerThread below.
+  // SetWorkspaceIconOnFILEThread below.
   for (int id : {IDR_APPS_FOLDER_16, IDR_APPS_FOLDER_32,
                  IDR_APPS_FOLDER_OVERLAY_128, IDR_APPS_FOLDER_OVERLAY_512}) {
     gfx::Image image = resource_bundle.GetNativeImageNamed(id);
     (*result)[id] = ImageRepForGFXImage(image);
   }
 
-  internals::GetShortcutIOTaskRunner()->PostTask(
-      FROM_HERE, base::BindOnce(std::move(io_task), std::move(result)));
+  base::ThreadPool::PostTask(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+       base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+      base::BindOnce(std::move(io_task), std::move(result)));
 }
 
 void SetWorkspaceIconOnWorkerThread(const base::FilePath& apps_directory,
@@ -776,8 +778,10 @@
     if (with_overlay)
       [folder_icon_image addRepresentation:with_overlay];
   }
-  shortcuts::SetIconForFile(folder_icon_image, apps_directory,
-                            base::DoNothing());
+  [NSWorkspace.sharedWorkspace
+      setIcon:folder_icon_image
+      forFile:base::apple::FilePathToNSString(apps_directory)
+      options:0];
 }
 
 // Adds a localized strings file for the Chrome Apps directory using the current
@@ -1589,8 +1593,8 @@
       LOG(ERROR) << "Couldn't find an Applications directory to copy app to.";
       return false;
     }
-    // Only set folder icons and a localized name once, as nothing should be
-    // changing the folder icon and name.
+    // Only set folder icons and a localized name once. This avoids concurrent
+    // calls to -[NSWorkspace setIcon:..], which is not reentrant.
     if (!g_have_localized_app_dir_name) {
       g_have_localized_app_dir_name =
           UpdateAppShortcutsSubdirLocalizedName(applications_dir);
diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc
index 9f71ebc..5347292 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager.cc
@@ -242,14 +242,14 @@
   TRACE_EVENT0("ui", "web_app_icon_manager::ReadIconBlocking");
   base::FilePath icon_file = GetIconFileName(web_apps_directory, icon_id);
   auto icon_data = base::MakeRefCounted<base::RefCountedString>();
-  if (!utils->ReadFileToString(icon_file, &icon_data->as_string())) {
+  if (!utils->ReadFileToString(icon_file, &icon_data->data())) {
     return {.error_log = {CreateError(
                 {"Could not read icon file: ", icon_file.AsUTF8Unsafe()})}};
   }
 
   TypedResult<SkBitmap> result;
 
-  if (!gfx::PNGCodec::Decode(icon_data->data(), icon_data->size(),
+  if (!gfx::PNGCodec::Decode(icon_data->front(), icon_data->size(),
                              &result.value)) {
     return {.error_log = {CreateError({"Could not decode icon data for file: ",
                                        icon_file.AsUTF8Unsafe()})}};
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
index 8fedd02..a3b7364d 100644
--- a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
+++ b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
@@ -639,8 +639,9 @@
       DownloadAuthenticationFactorsRegistrationStateResult::State::kRecoverable;
   registration_state_result.key_version = kSecretVersion;
   registration_state_result.gpm_pin_metadata = trusted_vault::GpmPinMetadata(
-      "public key", EnclaveManager::MakeWrappedPINForTesting(
-                        kSecurityDomainSecret, "123456"));
+      "public key",
+      EnclaveManager::MakeWrappedPINForTesting(kSecurityDomainSecret, "123456"),
+      /*expiry=*/base::Time::Now() + base::Seconds(10000));
   SetMockVaultConnectionOnRequestDelegate(std::move(registration_state_result));
 
   security_domain_service_->pretend_there_are_members();
diff --git a/chrome/browser/webauthn/enclave_manager.cc b/chrome/browser/webauthn/enclave_manager.cc
index 7f6ad4c7..d5e4806 100644
--- a/chrome/browser/webauthn/enclave_manager.cc
+++ b/chrome/browser/webauthn/enclave_manager.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/webauthn/enclave_manager.h"
 
+#include <cstdint>
 #include <utility>
 #include <variant>
 
@@ -14,6 +15,7 @@
 #include "base/files/important_file_writer.h"
 #include "base/functional/overloaded.h"
 #include "base/memory/ref_counted.h"
+#include "base/sequence_checker.h"
 #include "base/stl_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
@@ -60,6 +62,7 @@
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/google_service_auth_error.h"
+#include "net/base/features.h"
 #include "net/base/url_util.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/resource_request.h"
@@ -90,6 +93,7 @@
 struct EnclaveManager::PendingAction {
   EnclaveManager::Callback callback;
   bool want_registration = false;
+  bool renew_pin = false;
   std::unique_ptr<StoreKeysArgs> store_keys_args;
   bool setup_account = false;
   std::string pin;                  // the PIN to add to an account.
@@ -174,6 +178,13 @@
   return base::span<const uint8_t, N>(data, N);
 }
 
+template <size_t N>
+std::array<uint8_t, N> ToArray(base::span<const uint8_t, N> in) {
+  std::array<uint8_t, N> ret;
+  base::ranges::copy(in, ret.begin());
+  return ret;
+}
+
 std::vector<uint8_t> ToVector(const std::string& s) {
   const auto span = ToSpan(s);
   return std::vector<uint8_t>(span.begin(), span.end());
@@ -469,6 +480,22 @@
   return requests;
 }
 
+// Build an enclave request to renew a PIN.
+cbor::Value BuildPINRenewalRequest(std::string cert_xml,
+                                   std::string sig_xml,
+                                   base::span<const uint8_t> wrapped_secret,
+                                   base::span<const uint8_t> wrapped_pin) {
+  cbor::Value::MapValue request;
+  request.emplace(enclave::kRequestCommandKey,
+                  enclave::kRecoveryKeyStoreRewrapCommandName);
+  request.emplace(enclave::kRecoveryKeyStoreCertXml, ToVector(cert_xml));
+  request.emplace(enclave::kRecoveryKeyStoreSigXml, ToVector(sig_xml));
+  request.emplace(enclave::kRequestWrappedSecretKey, wrapped_secret);
+  request.emplace(enclave::kRequestWrappedPINDataKey, wrapped_pin);
+
+  return cbor::Value(std::move(request));
+}
+
 cbor::Value ConcatEnclaveRequests(cbor::Value::ArrayValue head,
                                   cbor::Value::ArrayValue tail) {
   for (auto& request : tail) {
@@ -677,13 +704,28 @@
   return cert_path;
 }
 
+// Stores public metadata about a PIN. This is recorded in, for example, the
+// Vault metadata so that MagicArch can show the correct UI and accept GPM PIN
+// entries.
+struct PinMetadata {
+  static PinMetadata FromProto(const EnclaveLocalState::WrappedPIN& pin) {
+    return PinMetadata{
+        .n = pin.hash_difficulty(),
+        .is_six_digits =
+            pin.form() == EnclaveLocalState::WrappedPIN::FORM_SIX_DIGITS,
+        .salt = ToArray<16>(ToSizedSpan<16>(pin.hash_salt()))};
+  }
+
+  int n = 0;  // The scrypt `N` parameter.
+  bool is_six_digits = false;
+  std::array<uint8_t, 16> salt;
+};
+
 // Convert the response to an enclave "recovery_key_store/wrap" command, into a
 // protobuf that can be sent to the recovery key store service.
 std::optional<std::unique_ptr<trusted_vault_pb::Vault>>
 RecoveryKeyStoreWrapResponseToProto(
-    base::span<const uint8_t> scrypt_salt,
-    int scrypt_n,
-    bool is_six_digits,
+    const PinMetadata& pin_metadata,
     const cbor::Value& recovery_key_store_wrap_response) {
   if (!recovery_key_store_wrap_response.is_map()) {
     return std::nullopt;
@@ -750,12 +792,12 @@
   asymmetric_key_pair->set_wrapping_key(VecToString(wrapped_wrapping_key));
 
   trusted_vault_pb::VaultMetadata metadata;
-  metadata.set_lskf_type(is_six_digits
+  metadata.set_lskf_type(pin_metadata.is_six_digits
                              ? trusted_vault_pb::VaultMetadata::PIN
                              : trusted_vault_pb::VaultMetadata::PASSWORD);
   metadata.set_hash_type(trusted_vault_pb::VaultMetadata::SCRYPT);
-  metadata.set_hash_salt(VecToString(scrypt_salt));
-  metadata.set_hash_difficulty(scrypt_n);
+  metadata.set_hash_salt(VecToString(pin_metadata.salt));
+  metadata.set_hash_difficulty(pin_metadata.n);
   metadata.set_cert_path(std::move(*cert_path));
 
   std::string metadata_bytes;
@@ -818,37 +860,35 @@
     auto ret = std::make_unique<EnclaveLocalState::WrappedPIN>();
     ret->set_claim_key(VecToString(claim_key));
     ret->set_generation(generation);
-    ret->set_form(this->is_six_digits
+    ret->set_form(this->metadata.is_six_digits
                       ? EnclaveLocalState::WrappedPIN::FORM_SIX_DIGITS
                       : EnclaveLocalState::WrappedPIN::FORM_ARBITRARY);
     ret->set_hash(EnclaveLocalState::WrappedPIN::HASH_SCRYPT);
-    ret->set_hash_difficulty(this->n);
-    ret->set_hash_salt(VecToString(this->salt));
+    ret->set_hash_difficulty(this->metadata.n);
+    ret->set_hash_salt(VecToString(this->metadata.salt));
 
     return ret;
   }
 
-  int n = 0;  // The scrypt `N` parameter.
-  bool is_six_digits = false;
-  uint8_t salt[16];
+  PinMetadata metadata;
   uint8_t hashed[32];
 };
 
 std::unique_ptr<HashedPIN> HashPINSlowly(std::string_view pin) {
   auto hashed = std::make_unique<HashedPIN>();
-  RAND_bytes(hashed->salt, sizeof(hashed->salt));
+  RAND_bytes(hashed->metadata.salt.data(), hashed->metadata.salt.size());
   // This is the primary work factor in scrypt. This value matches
   // the original recommended parameters. Those are a little out
   // of date in 2024, but Android is using 4096. Since this work
   // factor falls on the server when MagicArch is used, I've stuck
   // with this norm.
-  hashed->n = 16384;
-  hashed->is_six_digits =
+  hashed->metadata.n = 16384;
+  hashed->metadata.is_six_digits =
       pin.size() == 6 && base::ranges::all_of(pin, [](char c) -> bool {
         return c >= '0' && c <= '9';
       });
-  CHECK(EVP_PBE_scrypt(pin.data(), pin.size(), hashed->salt,
-                       sizeof(hashed->salt), hashed->n, 8, 1,
+  CHECK(EVP_PBE_scrypt(pin.data(), pin.size(), hashed->metadata.salt.data(),
+                       hashed->metadata.salt.size(), hashed->metadata.n, 8, 1,
                        /*max_mem=*/0, hashed->hashed, sizeof(hashed->hashed)));
   return hashed;
 }
@@ -891,6 +931,46 @@
   return wrapped_pin;
 }
 
+// Parse a Vault and security domain member keys from a CBOR map. These maps
+// result from enclave operations that return a Vault for insertion into the
+// security domain.
+static std::optional<std::pair<std::unique_ptr<trusted_vault_pb::Vault>,
+                               trusted_vault::MemberKeysSource>>
+ParseVaultAndMemberResponse(const int32_t key_version,
+                            const PinMetadata& pin_metadata,
+                            const cbor::Value::MapValue& response) {
+  auto it = response.find(cbor::Value("wrapped"));
+  if (it == response.end()) {
+    FIDO_LOG(ERROR) << "response missing 'wrapped'";
+    return std::nullopt;
+  }
+  std::optional<std::unique_ptr<trusted_vault_pb::Vault>> vault =
+      RecoveryKeyStoreWrapResponseToProto(pin_metadata, it->second);
+  if (!vault) {
+    FIDO_LOG(ERROR) << "Failed to translate response into an UpdateVaultProto";
+    return std::nullopt;
+  }
+
+  it = response.find(cbor::Value("wrapped_sds"));
+  if (it == response.end() || !it->second.is_bytestring()) {
+    FIDO_LOG(ERROR) << "response has invalid 'wrapped_sds'";
+    return std::nullopt;
+  }
+  const std::vector<uint8_t>& wrapped_sds = it->second.GetBytestring();
+
+  it = response.find(cbor::Value("member_proof"));
+  if (it == response.end() || !it->second.is_bytestring()) {
+    FIDO_LOG(ERROR) << "response has invalid 'member_proof'";
+    return std::nullopt;
+  }
+  const std::vector<uint8_t>& member_proof = it->second.GetBytestring();
+
+  auto member_keys_source = trusted_vault::PrecomputedMemberKeys(
+      key_version, wrapped_sds, member_proof);
+
+  return std::make_pair(std::move(*vault), std::move(member_keys_source));
+}
+
 }  // namespace
 
 // StateMachine performs a sequence of actions, as specified by the public
@@ -940,6 +1020,7 @@
     kJoiningPINToDomain,
     kJoiningUpdatedPINToDomain,
     kChangingPIN,
+    kRenewingPIN,
   };
 
   enum class FetchedFile {
@@ -1055,6 +1136,10 @@
       case State::kJoiningUpdatedPINToDomain:
         DoJoiningUpdatedPINToDomain(std::move(event));
         break;
+
+      case State::kRenewingPIN:
+        DoRenewingPIN(std::move(event));
+        break;
     }
 
     FIDO_LOG(EVENT) << ToString(initial_state) << " -" << event_str << "-> "
@@ -1122,6 +1207,8 @@
         return "ChangingPIN";
       case State::kJoiningUpdatedPINToDomain:
         return "JoiningUpdatedPINToDomain";
+      case State::kRenewingPIN:
+        return "RenewingPIN";
     }
   }
 
@@ -1263,6 +1350,18 @@
       return;
     }
 
+    if (action_->renew_pin) {
+      if (!user_->registered()) {
+        state_ = State::kStop;
+        return;
+      }
+
+      is_pin_renewal_ = true;
+      state_ = State::kDownloadingRecoveryKeyStoreKeys;
+      DownloadRecoveryKeyStoreKeys();
+      return;
+    }
+
     success_ = true;
     state_ = State::kStop;
   }
@@ -1579,17 +1678,8 @@
     }
     wrapped_pin_proto_ = hashed_pin_->ToWrappedPIN(generation);
 
-    cert_xml_loader_ = FetchURL(
-        manager_->url_loader_factory_.get(),
-        device::enclave::kRecoveryKeyStoreCertFileURL,
-        base::BindOnce(&StateMachine::FetchComplete,
-                       weak_ptr_factory_.GetWeakPtr(), FetchedFile::kCertFile));
-    sig_xml_loader_ = FetchURL(
-        manager_->url_loader_factory_.get(),
-        device::enclave::kRecoveryKeyStoreSigFileURL,
-        base::BindOnce(&StateMachine::FetchComplete,
-                       weak_ptr_factory_.GetWeakPtr(), FetchedFile::kSigFile));
     state_ = State::kDownloadingRecoveryKeyStoreKeys;
+    DownloadRecoveryKeyStoreKeys();
   }
 
   void DoDownloadingRecoveryKeyStoreKeys(Event event) {
@@ -1640,13 +1730,15 @@
     std::string token = std::move(absl::get_if<AccessToken>(&event)->value());
 
     if (is_pin_update_) {
-      // The commands to send to the enclave are different if changing a PIN.
       SendPINChangeRequest(std::move(token));
-      return;
+    } else if (is_pin_renewal_) {
+      SendPINRenewalRequest(std::move(token));
+    } else {
+      SendPINWrappingRequest(std::move(token));
     }
+  }
 
-    // We have everything needed to make the enclave request to wrap the hashed
-    // PIN for transmission to the recovery key store.
+  void SendPINWrappingRequest(std::string token) {
     state_ = State::kWrappingPIN;
     enclave::Transact(
         manager_->network_context_factory_, enclave::GetEnclaveIdentity(),
@@ -1704,6 +1796,19 @@
                        weak_ptr_factory_.GetWeakPtr()));
   }
 
+  void SendPINRenewalRequest(std::string token) {
+    state_ = State::kRenewingPIN;
+    enclave::Transact(
+        manager_->network_context_factory_, enclave::GetEnclaveIdentity(),
+        std::move(token), std::nullopt,
+        BuildPINRenewalRequest(std::move(*cert_xml_), std::move(*sig_xml_),
+                               GetCurrentWrappedSecretForUser(user_).second,
+                               ToSpan(user_->wrapped_pin().wrapped_pin())),
+        manager_->HardwareKeySigningCallback(),
+        base::BindOnce(&StateMachine::OnEnclaveResponse,
+                       weak_ptr_factory_.GetWeakPtr()));
+  }
+
   void DoWrappingPIN(Event event) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -1728,8 +1833,7 @@
             ->second;
 
     std::optional<std::unique_ptr<trusted_vault_pb::Vault>> vault =
-        RecoveryKeyStoreWrapResponseToProto(hashed_pin_->salt, hashed_pin_->n,
-                                            hashed_pin_->is_six_digits,
+        RecoveryKeyStoreWrapResponseToProto(hashed_pin_->metadata,
                                             recovery_key_store_wrap_response);
     if (!vault) {
       FIDO_LOG(ERROR)
@@ -1772,7 +1876,8 @@
       return;
     }
 
-    if (!is_pin_update_) {
+    const bool updating_pin_member = is_pin_update_ || is_pin_renewal_;
+    if (!updating_pin_member) {
       CHECK(wrapped_pin_proto_->wrapped_pin().empty());
       wrapped_pin_proto_->set_wrapped_pin(BuildWrappedPIN(
           *hashed_pin_, /*generation=*/0,
@@ -1791,18 +1896,18 @@
     const std::string previous_pin_public_key = user_->pin_public_key();
     // If changing the PIN, there must be a previous PIN member public key.
     // If setting a first PIN, there must not be one.
-    CHECK(!previous_pin_public_key.empty() == is_pin_update_);
+    CHECK_EQ(!previous_pin_public_key.empty(), updating_pin_member);
     user_->set_pin_public_key(vault_public_key);
 
-    state_ = is_pin_update_ ? State::kJoiningUpdatedPINToDomain
-                            : State::kJoiningPINToDomain;
+    state_ = updating_pin_member ? State::kJoiningUpdatedPINToDomain
+                                 : State::kJoiningPINToDomain;
     std::optional<trusted_vault::MemberKeysSource> member_keys_source =
         std::move(member_keys_source_);
-    // If changing a PIN then `member_keys_source` will have been populated by
-    // the enclave. Otherwise a new PIN is being set and
+    // If changing or renewing a PIN then `member_keys_source` will have been
+    // populated by the enclave. Otherwise a new PIN is being set and
     // `store_keys_args_for_joining_` will contain the security domain secret,
     // which is sufficient for calculating the member keys.
-    CHECK_EQ(member_keys_source.has_value(), is_pin_update_);
+    CHECK_EQ(member_keys_source.has_value(), updating_pin_member);
     if (!member_keys_source) {
       member_keys_source = trusted_vault::GetTrustedVaultKeysWithVersions(
           store_keys_args_for_joining_->keys,
@@ -1812,7 +1917,8 @@
         *primary_account_info_, std::move(*member_keys_source),
         *secure_box_pub_key,
         trusted_vault::GpmPinMetadata(previous_pin_public_key,
-                                      std::move(wrapped_pin_proto_serialized)),
+                                      std::move(wrapped_pin_proto_serialized),
+                                      /*expiry=*/base::Time()),
         base::BindOnce(&StateMachine::OnJoinedSecurityDomain,
                        weak_ptr_factory_.GetWeakPtr()));
   }
@@ -1892,51 +1998,59 @@
     wrapped_pin_proto_->set_wrapped_pin(
         VecToString(wrapped_pin_value.GetBytestring()));
 
-    const cbor::Value& wrap_as_member_response_value =
-        response.GetArray()[1]
-            .GetMap()
+    UploadVaultAndMemberFromResponse(hashed_pin_->metadata,
+                                     response.GetArray()[1]);
+  }
+
+  void DoRenewingPIN(Event event) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+    state_ = State::kStop;
+    if (absl::holds_alternative<Failure>(event)) {
+      return;
+    }
+
+    cbor::Value response =
+        std::move(absl::get_if<EnclaveResponse>(&event)->value());
+    if (!IsAllOk(response, 1)) {
+      FIDO_LOG(ERROR) << "PIN renewal resulted in error response: "
+                      << cbor::DiagnosticWriter::Write(response);
+      return;
+    }
+
+    // The new wrapped PIN is the same as the current one.
+    wrapped_pin_proto_ =
+        std::make_unique<EnclaveLocalState::WrappedPIN>(user_->wrapped_pin());
+
+    UploadVaultAndMemberFromResponse(
+        PinMetadata::FromProto(*wrapped_pin_proto_), response.GetArray()[0]);
+  }
+
+  // Start the process of uploading a Vault, and inserting it into the security
+  // domain, based on an enclave response. The `response` value should be an
+  // element from an enclave's response array. I.e. including the "ok" wrapping.
+  // It's assumed that `IsAllOk` has been checked and that the response is not
+  // an error. The `vault_` and `member_keys_source_` fields will be updated on
+  // success.
+  bool UploadVaultAndMemberFromResponse(const PinMetadata& pin_metadata,
+                                        const cbor::Value& response) {
+    const cbor::Value& response_value =
+        response.GetMap()
             .find(cbor::Value(enclave::kResponseSuccessKey))
             ->second;
-    if (!wrap_as_member_response_value.is_map()) {
-      FIDO_LOG(ERROR) << "wrap_as_member response was not a map";
-      return;
+    if (!response_value.is_map()) {
+      FIDO_LOG(ERROR) << "response was not a map";
+      return false;
     }
-    const cbor::Value::MapValue& wrap_as_member_response =
-        wrap_as_member_response_value.GetMap();
-
-    auto it = wrap_as_member_response.find(cbor::Value("wrapped"));
-    if (it == wrap_as_member_response.end()) {
-      FIDO_LOG(ERROR) << "wrap_as_member response missing 'wrapped'";
-      return;
+    const int32_t key_version = GetCurrentWrappedSecretForUser(user_).first;
+    std::optional<std::pair<std::unique_ptr<trusted_vault_pb::Vault>,
+                            trusted_vault::MemberKeysSource>>
+        result = ParseVaultAndMemberResponse(key_version, pin_metadata,
+                                             response_value.GetMap());
+    if (!result) {
+      return false;
     }
-    std::optional<std::unique_ptr<trusted_vault_pb::Vault>> vault =
-        RecoveryKeyStoreWrapResponseToProto(hashed_pin_->salt, hashed_pin_->n,
-                                            hashed_pin_->is_six_digits,
-                                            it->second);
-    if (!vault) {
-      FIDO_LOG(ERROR)
-          << "Failed to translate response into an UpdateVaultProto";
-      return;
-    }
-    vault_ = std::move(*vault);
-
-    it = wrap_as_member_response.find(cbor::Value("wrapped_sds"));
-    if (it == wrap_as_member_response.end() || !it->second.is_bytestring()) {
-      FIDO_LOG(ERROR) << "wrap_as_member has invalid 'wrapped_sds'";
-      return;
-    }
-    const std::vector<uint8_t>& wrapped_sds = it->second.GetBytestring();
-
-    it = wrap_as_member_response.find(cbor::Value("member_proof"));
-    if (it == wrap_as_member_response.end() || !it->second.is_bytestring()) {
-      FIDO_LOG(ERROR) << "wrap_as_member has invalid 'member_proof'";
-      return;
-    }
-    const std::vector<uint8_t>& member_proof = it->second.GetBytestring();
-
-    int32_t key_version = GetCurrentWrappedSecretForUser(user_).first;
-    member_keys_source_ = trusted_vault::PrecomputedMemberKeys(
-        key_version, wrapped_sds, member_proof);
+    std::tie(vault_, member_keys_source_) = std::move(*result);
 
     state_ = State::kWaitingForRecoveryKeyStore;
     recovery_key_store_request_ =
@@ -1951,6 +2065,7 @@
                   machine->Process(status);
                 },
                 weak_ptr_factory_.GetWeakPtr()));
+    return true;
   }
 
   void JoinSecurityDomain() {
@@ -2043,6 +2158,19 @@
     return VecToString(EncryptWrappedPIN(security_domain_secret, cbor_bytes));
   }
 
+  void DownloadRecoveryKeyStoreKeys() {
+    cert_xml_loader_ = FetchURL(
+        manager_->url_loader_factory_.get(),
+        device::enclave::kRecoveryKeyStoreCertFileURL,
+        base::BindOnce(&StateMachine::FetchComplete,
+                       weak_ptr_factory_.GetWeakPtr(), FetchedFile::kCertFile));
+    sig_xml_loader_ = FetchURL(
+        manager_->url_loader_factory_.get(),
+        device::enclave::kRecoveryKeyStoreSigFileURL,
+        base::BindOnce(&StateMachine::FetchComplete,
+                       weak_ptr_factory_.GetWeakPtr(), FetchedFile::kSigFile));
+  }
+
   const raw_ptr<EnclaveManager> manager_;
   // local_state_ contains a copy of the EnclaveManager's state from when this
   // StateMachine was created.
@@ -2076,6 +2204,8 @@
   // True if a PIN is being hashed in order to change it, rather than to set
   // a new PIN on an account.
   bool is_pin_update_ = false;
+  // True if the GPM PIN is being renewed without knowing or changing it.
+  bool is_pin_renewal_ = false;
   // If changing a PIN, this holds a ReAuthentication Proof Token (RAPT), if
   // the user is authenticating the request via doing a GAIA reauth.
   std::optional<std::string> rapt_;
@@ -2246,6 +2376,18 @@
   Act();
 }
 
+void EnclaveManager::RenewPIN(EnclaveManager::Callback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(user_->registered());
+  CHECK(user_->has_wrapped_pin());
+
+  auto action = std::make_unique<PendingAction>();
+  action->callback = std::move(callback);
+  action->renew_pin = true;
+  pending_actions_.emplace_back(std::move(action));
+  Act();
+}
+
 void EnclaveManager::GetHardwareKeyForSignature(
     base::OnceCallback<void(
         scoped_refptr<unexportable_keys::RefCountedUnexportableSigningKey>)>
diff --git a/chrome/browser/webauthn/enclave_manager.h b/chrome/browser/webauthn/enclave_manager.h
index 44e0f55..fc89b5b0 100644
--- a/chrome/browser/webauthn/enclave_manager.h
+++ b/chrome/browser/webauthn/enclave_manager.h
@@ -152,6 +152,8 @@
   void ChangePIN(std::string updated_pin,
                  std::optional<std::string> rapt,
                  Callback callback);
+  // Renew the current PIN. Requires `has_wrapped_pin` to be true.
+  void RenewPIN(Callback callback);
 
   // Get a callback to sign with the registered "hw" key. Only valid to call if
   // `is_ready`.
diff --git a/chrome/browser/webauthn/enclave_manager_unittest.cc b/chrome/browser/webauthn/enclave_manager_unittest.cc
index d718c20d..4be409b 100644
--- a/chrome/browser/webauthn/enclave_manager_unittest.cc
+++ b/chrome/browser/webauthn/enclave_manager_unittest.cc
@@ -626,7 +626,8 @@
   BoolCallback add_callback;
   ASSERT_TRUE(manager_.AddDeviceToAccount(
       trusted_vault::GpmPinMetadata(std::string(kTestPINPublicKey),
-                                    GetTestWrappedPIN().SerializeAsString()),
+                                    GetTestWrappedPIN().SerializeAsString(),
+                                    /*expiry=*/base::Time()),
       add_callback.callback()));
   add_callback.WaitForCallback();
 
@@ -652,7 +653,8 @@
   // A wrapped PIN that isn't a valid protobuf should be rejected.
   EXPECT_FALSE(manager_.AddDeviceToAccount(
       trusted_vault::GpmPinMetadata(std::string(kTestPINPublicKey),
-                                    "nonsense wrapped PIN"),
+                                    "nonsense wrapped PIN",
+                                    /*expiry=*/base::Time()),
       add_callback.callback()));
 
   // A valid protobuf, but which fails invariants, should be rejected.
@@ -660,7 +662,8 @@
   wrapped_pin.set_wrapped_pin("too short");
   EXPECT_FALSE(manager_.AddDeviceToAccount(
       trusted_vault::GpmPinMetadata(std::string(kTestPINPublicKey),
-                                    wrapped_pin.SerializeAsString()),
+                                    wrapped_pin.SerializeAsString(),
+                                    /*expiry=*/base::Time()),
       add_callback.callback()));
 }
 
@@ -805,7 +808,8 @@
   BoolCallback add_callback;
   ASSERT_TRUE(manager_.AddDeviceToAccount(
       trusted_vault::GpmPinMetadata(std::string(kTestPINPublicKey),
-                                    GetTestWrappedPIN().SerializeAsString()),
+                                    GetTestWrappedPIN().SerializeAsString(),
+                                    /*expiry=*/base::Time()),
       add_callback.callback()));
   add_callback.WaitForCallback();
   EXPECT_FALSE(std::get<0>(add_callback.result().value()));
@@ -826,6 +830,37 @@
   EXPECT_FALSE(std::get<0>(add_callback.result().value()));
 }
 
+TEST_F(EnclaveManagerTest, RenewPIN) {
+  ASSERT_TRUE(Register());
+
+  const std::string pin = "123456";
+
+  BoolCallback setup_callback;
+  manager_.SetupWithPIN(pin, setup_callback.callback());
+  setup_callback.WaitForCallback();
+  ASSERT_TRUE(manager_.is_ready());
+  ASSERT_TRUE(manager_.has_wrapped_pin());
+
+  EXPECT_EQ(security_domain_service_->num_physical_members(), 1u);
+  EXPECT_EQ(security_domain_service_->num_pin_members(), 1u);
+
+  BoolCallback renew_callback;
+  manager_.RenewPIN(renew_callback.callback());
+  renew_callback.WaitForCallback();
+  EXPECT_TRUE(std::get<0>(renew_callback.result().value()));
+
+  // The number of PIN members must not have increased because the upload should
+  // have reused the vault handle etc of the original.
+  EXPECT_EQ(security_domain_service_->num_physical_members(), 1u);
+  EXPECT_EQ(security_domain_service_->num_pin_members(), 1u);
+
+  const std::optional<std::vector<uint8_t>> security_domain_secret =
+      FakeMagicArch::RecoverWithPIN(pin, *security_domain_service_,
+                                    *recovery_key_store_);
+  CHECK(security_domain_secret.has_value());
+  EXPECT_EQ(manager_.TakeSecret()->second, *security_domain_secret);
+}
+
 // Tests that rely on `ScopedMockUnexportableKeyProvider` only work on
 // platforms where EnclaveManager uses `GetUnexportableKeyProvider`, as opposed
 // to `GetSoftwareUnsecureUnexportableKeyProvider`.
diff --git a/chrome/browser/webauthn/gpm_enclave_controller.cc b/chrome/browser/webauthn/gpm_enclave_controller.cc
index 9925d3f..6e8fec7 100644
--- a/chrome/browser/webauthn/gpm_enclave_controller.cc
+++ b/chrome/browser/webauthn/gpm_enclave_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/webauthn/gpm_enclave_controller.h"
 
+#include "base/i18n/time_formatting.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -377,7 +378,12 @@
 
   FIDO_LOG(EVENT) << "Download account state result: " << state_str
                   << ", key_version: " << result.key_version.value_or(0)
-                  << ", has PIN: " << result.gpm_pin_metadata.has_value();
+                  << ", has PIN: " << result.gpm_pin_metadata.has_value()
+                  << ", expiry: "
+                  << (result.gpm_pin_metadata.has_value()
+                          ? base::TimeFormatAsIso8601(
+                                result.gpm_pin_metadata->expiry)
+                          : "<none>");
 
   if (result.gpm_pin_metadata) {
     pin_metadata_ = std::move(result.gpm_pin_metadata);
diff --git a/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImpl.java b/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImpl.java
index f6e309993..7760eff 100644
--- a/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImpl.java
+++ b/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImpl.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.xsurface_provider;
 
 import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
@@ -32,6 +34,7 @@
     private final @Nullable LibraryResolver mLibraryResolver;
     private final PrivacyPreferencesManager mPrivacyPreferencesManager;
     private final String mApiKey;
+    private final ConnectivityManager mConnectivityManager;
 
     private static boolean sEnableAppFlowDebugging;
 
@@ -48,6 +51,8 @@
         } else {
             mLibraryResolver = null;
         }
+        mConnectivityManager =
+                (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
     }
 
     @Override
@@ -193,6 +198,17 @@
         return sEnableAppFlowDebugging;
     }
 
+    @Override
+    public boolean isNetworkOnline() {
+        NetworkCapabilities capabilities =
+                mConnectivityManager.getNetworkCapabilities(
+                        mConnectivityManager.getActiveNetwork());
+        return capabilities != null
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
+    }
+
     @VisibleForTesting
     public static void setEnableAppFlowDebugging(boolean enable) {
         sEnableAppFlowDebugging = enable;
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 8be39e33..4131eb2b 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1713376773-43d7ce96b696638803b20e56b1ff70a14fef9c10-8cc1a248d1d7e9332208a6174ed0d44ee621affa.profdata
+chrome-android32-main-1713397897-ea7f8ee2d790f07efbdacf084eb763eae582bdfb-f29000031566649b8b556aaacd29de0c72815056.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index 7695fa40..203d81f4 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1713355171-82b9fffaaaf88e5be6e6386b342d9944098829fa-3b980d0bd50a84f848f2bf420646bf9fbcbb1b98.profdata
+chrome-chromeos-amd64-generic-main-1713398652-0acc8709c6d81b447327cd91a25831bb3d66c59a-c5099ca899261d2fcd68eb95d0570fa651dd6924.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index af497f7..63adbcbd 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1713376773-7b0566891c51886cbdb77315dbb14db01a5e90e1-8cc1a248d1d7e9332208a6174ed0d44ee621affa.profdata
+chrome-linux-main-1713397897-10dbf240db2f9878c7047ee93914740c364f23ea-f29000031566649b8b556aaacd29de0c72815056.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 885be35c..476aed6 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1713376773-0a2138f96e5d869c1903f37004a43d6ebfd3852e-8cc1a248d1d7e9332208a6174ed0d44ee621affa.profdata
+chrome-win32-main-1713397897-8fd73f876686ca33d89172f4fd7a785fb9577d6b-f29000031566649b8b556aaacd29de0c72815056.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index b9ee36b..4b1de17 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1713376773-ca688a73be5affd1e7003c753db25cbe2adae9e3-8cc1a248d1d7e9332208a6174ed0d44ee621affa.profdata
+chrome-win64-main-1713397897-b2dc7451d7b0a056d6205a12951ec438f70f844b-f29000031566649b8b556aaacd29de0c72815056.profdata
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc
index fc58798b..68758f09 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -787,7 +787,11 @@
       .SetMethod("getDisplayNameForLocale",
                  &ReadAnythingAppController::GetDisplayNameForLocale)
       .SetMethod("logMetric",
-                 &ReadAnythingAppController::LogUmaHistogramLongTimes);
+                 &ReadAnythingAppController::LogUmaHistogramLongTimes)
+      .SetMethod("sendGetVoicePackInfoRequest",
+                 &ReadAnythingAppController::SendGetVoicePackInfoRequest)
+      .SetMethod("sendInstallVoicePackRequest",
+                 &ReadAnythingAppController::SendInstallVoicePackRequest);
 }
 
 ui::AXNodeID ReadAnythingAppController::RootId() const {
@@ -1054,8 +1058,15 @@
 }
 
 void ReadAnythingAppController::OnGetVoicePackInfoResponse(
-    read_anything::mojom::VoicePackInfoPtr voice_pack_info) const {
-  // TODO (b/40927698) Send the voice_pack_info to the read-aloud UI
+    read_anything::mojom::VoicePackInfoPtr voice_pack_info) {
+  std::string status =
+      voice_pack_info->pack_state->is_installation_state()
+          ? base::ToString(
+                voice_pack_info->pack_state->get_installation_state())
+          : base::ToString(voice_pack_info->pack_state->get_error_code());
+
+  ExecuteJavaScript("chrome.readingMode.updateVoicePackStatus(\'" +
+                    voice_pack_info->language + "\', \'" + status + "\');");
 }
 
 void ReadAnythingAppController::SendInstallVoicePackRequest(
@@ -1067,12 +1078,21 @@
 }
 
 void ReadAnythingAppController::OnInstallVoicePackResponse(
-    read_anything::mojom::VoicePackInfoPtr voice_pack_info) const {
-  // TODO (b/40927698) Send the voice_pack_info to the read-aloud UI.
+    read_anything::mojom::VoicePackInfoPtr voice_pack_info) {
   // TODO (b/40927698) Investigate the fact that VoicePackManager doesn't return
   // the expected pack_state. Even when a voice is unavailable and not
   // installed, it responds "INSTALLED" in the InstallVoicePackCallback. So we
   // probably need to rely on GetVoicePackInfo for the pack_state.
+
+  std::string status =
+      voice_pack_info->pack_state->is_installation_state()
+          ? base::ToString(
+                voice_pack_info->pack_state->get_installation_state())
+          : base::ToString(voice_pack_info->pack_state->get_error_code());
+
+  ExecuteJavaScript(
+      "chrome.readingMode.updateVoicePackStatusFromInstallResponse(\'" +
+      voice_pack_info->language + "\', \'" + status + "\');");
 }
 
 std::string ReadAnythingAppController::GetAltText(
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h
index 5757341..05f8154 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.h
+++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -155,10 +155,10 @@
   std::string GetAltText(ui::AXNodeID ax_node_id) const;
   void SendGetVoicePackInfoRequest(const std::string& language) const;
   void OnGetVoicePackInfoResponse(
-      read_anything::mojom::VoicePackInfoPtr voice_pack_info) const;
+      read_anything::mojom::VoicePackInfoPtr voice_pack_info);
   void SendInstallVoicePackRequest(const std::string& language) const;
   void OnInstallVoicePackResponse(
-      read_anything::mojom::VoicePackInfoPtr voice_pack_info) const;
+      read_anything::mojom::VoicePackInfoPtr voice_pack_info);
   bool ShouldBold(ui::AXNodeID ax_node_id) const;
   bool IsOverline(ui::AXNodeID ax_node_id) const;
   bool IsLeafNode(ui::AXNodeID ax_node_id) const;
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc
index eaca3b73..f24964b 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.cc
+++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -1347,8 +1347,12 @@
         segment.text_start = 0;
         segment.text_end = index_in_new_node;
         current_granularity.AddSegment(segment);
+        int current_text_length = current_granularity.text.length();
         current_granularity.text +=
             anchor_node->GetTextContentUTF16().substr(0, index_in_new_node);
+        current_granularity.index_map.insert(
+            {{current_text_length, current_granularity.text.length()},
+             segment.id});
         current_text_index_ = index_in_new_node;
         if (current_text_index_ != (int)base_text.length()) {
           // If we're in the middle of the node, there's no need to attempt
@@ -1386,8 +1390,11 @@
     segment.text_start = start_index;
     segment.text_end = new_current_text_index;
     current_granularity.AddSegment(segment);
+    int current_text_length = current_granularity.text.length();
     current_granularity.text += anchor_node->GetTextContentUTF16().substr(
         start_index, current_text_index_ - start_index);
+    current_granularity.index_map.insert(
+        {{current_text_length, current_granularity.text.length()}, segment.id});
 
     // After adding the most recent granularity segment, if we're not at the
     //  end of the node, the current nodes can be returned, as we know there's
@@ -1607,3 +1614,27 @@
          (position->CompareTo(*other).value_or(-1) == 0) &&
          (position->text_offset() == other->text_offset());
 }
+
+ui::AXNodeID ReadAnythingAppModel::GetNodeIdForCurrentSegmentIndex(
+    int index) const {
+  // If the granularity index isn't valid, return an invalid id.
+  if (processed_granularity_index_ >=
+      processed_granularities_on_current_page_.size()) {
+    return ui::kInvalidAXNodeID;
+  }
+
+  ReadAnythingAppModel::ReadAloudCurrentGranularity current_granularity =
+      processed_granularities_on_current_page_[processed_granularity_index_];
+  std::map<std::pair<int, int>, ui::AXNodeID> index_map =
+      current_granularity.index_map;
+  for (const auto& [range, id] : index_map) {
+    if (range.first <= index && range.second >= index) {
+      // If the given index is within a range, return the associated node id.
+      return id;
+    }
+  }
+
+  // If the index isn't part of the current granularity's ranges, return an
+  // invalid id.
+  return ui::kInvalidAXNodeID;
+}
diff --git a/chrome/renderer/accessibility/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything_app_model.h
index d48a37a..65a1441 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.h
+++ b/chrome/renderer/accessibility/read_anything_app_model.h
@@ -103,6 +103,20 @@
     // TypeScript also store the node ids as a vector for easier retrieval.
     std::vector<ui::AXNodeID> node_ids;
 
+    // Map of text start and end indices of text to a specific AXNodeID.
+    // The text for a given segment may span multiple AXNodes, such as
+    // Node 1: This is a
+    // Node 2: link
+    // Node 3: in a separate node.
+    // which is presented as a single segment when using sentence granularity.
+    // However, when we get word callbacks, we get them in terms of the text
+    // index across the entire segment of text, not by node. Therefore, this
+    // mapping helps us better parse callbacks for different types of
+    // granularity highlighting.
+    // TODO(b/40927698): Investigate using this to replace
+    // highlightedNodeToOffsetInParent in app.ts
+    std::map<std::pair<int, int>, ui::AXNodeID> index_map;
+
     // The human readable text represented by this segment of node ids. This
     // is stored separately for easier retrieval for non-sentence granularity
     // highlighting.
@@ -279,6 +293,17 @@
   // next sentence is equivalent to text.substr(0, <returned_index>).
   int GetNextSentence(const std::u16string& text);
 
+  // Given a text index for the current granularity, return the AXNodeID for
+  // that part of the text.
+  // For example, if a current granularity segment has text:
+  // "Hello darkness, my old friend."
+  // Composed of nodes:
+  // Node: {id: 113, text: "Hello darkness, "}
+  // Node: {id: 207, text: "my old friend."}
+  // Then GetNodeIdForCurrentSegmentIndex for index=0-16 will return "113"
+  // and for index=17-29 will return "207"
+  ui::AXNodeID GetNodeIdForCurrentSegmentIndex(int index) const;
+
   // PDF handling.
   void set_is_pdf(bool is_pdf) { is_pdf_ = is_pdf; }
   bool is_pdf() const { return is_pdf_; }
diff --git a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc
index d966c49..5689530 100644
--- a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc
+++ b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc
@@ -244,6 +244,23 @@
     return model_->GetNextSentence(text);
   }
 
+  ui::AXNodeID GetNodeIdForCurrentSegmentIndex(int index) {
+    ui::AXNodeID id = model_->GetNodeIdForCurrentSegmentIndex(index);
+    return id;
+  }
+
+  std::vector<ui::AXNodeID> GetCurrentText() {
+    return model_->GetCurrentText();
+  }
+
+  void MovePositionToNextGranularity() {
+    return model_->MovePositionToNextGranularity();
+  }
+
+  void MovePositionToPreviousGranularity() {
+    return model_->MovePositionToPreviousGranularity();
+  }
+
   int GetCurrentTextStartIndex(ui::AXNodeID id) {
     return model_->GetCurrentTextStartIndex(id);
   }
@@ -1739,3 +1756,203 @@
   new_position = GetNextNodePosition(current_granularity);
   EXPECT_EQ(new_position->anchor_id(), static_text2.id);
 }
+
+TEST_F(ReadAnythingAppModelTest,
+       GetNodeIdForCurrentSegmentIndex_ReturnsCorrectNodes) {
+  std::u16string sentence1 = u"Never feel heavy ";
+  std::u16string sentence2 = u"or earthbound, ";
+  std::u16string sentence3 = u"no worries or doubts interfere.";
+  ui::AXTreeUpdate update;
+  SetUpdateTreeID(&update);
+  ui::AXNodeData static_text1;
+  static_text1.id = 2;
+  static_text1.role = ax::mojom::Role::kStaticText;
+  static_text1.SetNameChecked(sentence1);
+
+  ui::AXNodeData static_text2;
+  static_text2.id = 3;
+  static_text2.role = ax::mojom::Role::kStaticText;
+  static_text2.SetNameChecked(sentence2);
+
+  ui::AXNodeData static_text3;
+  static_text3.id = 4;
+  static_text3.role = ax::mojom::Role::kStaticText;
+  static_text3.SetNameChecked(sentence3);
+  update.nodes = {static_text1, static_text2, static_text3};
+  AccessibilityEventReceived({update});
+  ProcessDisplayNodes({static_text1.id, static_text2.id, static_text3.id});
+  InitAXPosition(update.nodes[0].id);
+
+  // Before there are any processed granularities,
+  // GetNodeIdForCurrentSegmentIndex should return an invalid id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(1), ui::kInvalidAXNodeID);
+
+  std::vector<ui::AXNodeID> node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 3);
+
+  // Spot check that indices 0->sentence1.length() map to the first node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(0), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(7), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length()),
+            static_text1.id);
+
+  // Spot check that indices in sentence 2 map to the second node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length() + 1),
+            static_text2.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(26), static_text2.id);
+  EXPECT_EQ(
+      GetNodeIdForCurrentSegmentIndex(sentence1.length() + sentence2.length()),
+      static_text2.id);
+
+  // Spot check that indices in sentence 3 map to the third node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length() +
+                                            sentence2.length() + 1),
+            static_text3.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(40), static_text3.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(
+                sentence1.length() + sentence2.length() + sentence3.length()),
+            static_text3.id);
+
+  // Out-of-bounds nodes return invalid.
+  EXPECT_EQ(
+      GetNodeIdForCurrentSegmentIndex(sentence1.length() + sentence2.length() +
+                                      sentence3.length() + 1),
+      ui::kInvalidAXNodeID);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(535), ui::kInvalidAXNodeID);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(-10), ui::kInvalidAXNodeID);
+}
+
+TEST_F(ReadAnythingAppModelTest,
+       GetNodeIdForCurrentSegmentIndex_AfterNext_ReturnsCorrectNodes) {
+  std::u16string sentence1 = u"Never feel heavy or earthbound. ";
+  std::u16string sentence2 = u"No worries or doubts ";
+  std::u16string sentence3 = u"interfere.";
+  ui::AXTreeUpdate update;
+  SetUpdateTreeID(&update);
+  ui::AXNodeData static_text1;
+  static_text1.id = 2;
+  static_text1.role = ax::mojom::Role::kStaticText;
+  static_text1.SetNameChecked(sentence1);
+
+  ui::AXNodeData static_text2;
+  static_text2.id = 3;
+  static_text2.role = ax::mojom::Role::kStaticText;
+  static_text2.SetNameChecked(sentence2);
+
+  ui::AXNodeData static_text3;
+  static_text3.id = 4;
+  static_text3.role = ax::mojom::Role::kStaticText;
+  static_text3.SetNameChecked(sentence3);
+  update.nodes = {static_text1, static_text2, static_text3};
+  AccessibilityEventReceived({update});
+  ProcessDisplayNodes({static_text1.id, static_text2.id, static_text3.id});
+  InitAXPosition(update.nodes[0].id);
+
+  // Before there are any processed granularities,
+  // GetNodeIdForCurrentSegmentIndex should return an invalid id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(1), ui::kInvalidAXNodeID);
+
+  std::vector<ui::AXNodeID> node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 1);
+
+  // Spot check that indices 0->sentence1.length() map to the first node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(0), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(7), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length()),
+            static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length() + 1),
+            ui::kInvalidAXNodeID);
+
+  // Move to the next granularity.
+  MovePositionToNextGranularity();
+  node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 2);
+
+  // Spot check that indices in sentence 2 map to the second node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(0), static_text2.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(7), static_text2.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence2.length()),
+            static_text2.id);
+
+  // Spot check that indices in sentence 3 map to the third node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence2.length() + 1),
+            static_text3.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(27), static_text3.id);
+  EXPECT_EQ(
+      GetNodeIdForCurrentSegmentIndex(sentence2.length() + sentence3.length()),
+      static_text3.id);
+
+  // Out-of-bounds nodes return invalid.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence2.length() +
+                                            sentence3.length() + 1),
+            ui::kInvalidAXNodeID);
+}
+
+TEST_F(ReadAnythingAppModelTest,
+       GetNodeIdForCurrentSegmentIndex_AfterPrevious_ReturnsCorrectNodes) {
+  std::u16string sentence1 = u"There's nothing but you ";
+  std::u16string sentence2 = u"looking down on the view from up here. ";
+  std::u16string sentence3 = u"Stretch out with the wind behind you.";
+  ui::AXTreeUpdate update;
+  SetUpdateTreeID(&update);
+  ui::AXNodeData static_text1;
+  static_text1.id = 2;
+  static_text1.role = ax::mojom::Role::kStaticText;
+  static_text1.SetNameChecked(sentence1);
+
+  ui::AXNodeData static_text2;
+  static_text2.id = 3;
+  static_text2.role = ax::mojom::Role::kStaticText;
+  static_text2.SetNameChecked(sentence2);
+
+  ui::AXNodeData static_text3;
+  static_text3.id = 4;
+  static_text3.role = ax::mojom::Role::kStaticText;
+  static_text3.SetNameChecked(sentence3);
+  update.nodes = {static_text1, static_text2, static_text3};
+  AccessibilityEventReceived({update});
+  ProcessDisplayNodes({static_text1.id, static_text2.id, static_text3.id});
+  InitAXPosition(update.nodes[0].id);
+
+  // Before there are any processed granularities,
+  // GetNodeIdForCurrentSegmentIndex should return an invalid id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(1), ui::kInvalidAXNodeID);
+
+  std::vector<ui::AXNodeID> node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 2);
+
+  // Move forward.
+  MovePositionToNextGranularity();
+  node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 1);
+
+  // Spot check that indices 0->sentence3.length() map to the third node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(0), static_text3.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(7), static_text3.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence3.length()),
+            static_text3.id);
+
+  // Move backwards.
+  MovePositionToPreviousGranularity();
+  node_ids = GetCurrentText();
+  EXPECT_EQ((int)node_ids.size(), 2);
+
+  // Spot check that indices in sentence 1 map to the first node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(0), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(6), static_text1.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length()),
+            static_text1.id);
+
+  // Spot check that indices in sentence 2 map to the second node id.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length() + 1),
+            static_text2.id);
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(27), static_text2.id);
+  EXPECT_EQ(
+      GetNodeIdForCurrentSegmentIndex(sentence1.length() + sentence2.length()),
+      static_text2.id);
+
+  // Out-of-bounds nodes return invalid.
+  EXPECT_EQ(GetNodeIdForCurrentSegmentIndex(sentence1.length() +
+                                            sentence2.length() + 1),
+            ui::kInvalidAXNodeID);
+}
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 958c811..1b55f1f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3333,7 +3333,6 @@
         "../browser/ui/cocoa/applescript/browsercrapplication+applescript_browsertest.mm",
         "../browser/ui/cocoa/applescript/tab_applescript_browsertest.mm",
         "../browser/ui/cocoa/applescript/window_applescript_browsertest.mm",
-        "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm",
         "../browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm",
         "../browser/ui/cocoa/browser_window_mac_browsertest.mm",
         "../browser/ui/cocoa/color_panel_cocoa_unittest.mm",
@@ -3509,10 +3508,7 @@
         "../browser/lifetime/application_lifetime_browsertest.cc",
         "../browser/ui/views/enable_link_capturing_infobar_browsertest.cc",
       ]
-      deps += [
-        "//chrome/browser/apps/link_capturing",
-        "//chrome/browser/shortcuts:browser_tests",
-      ]
+      deps += [ "//chrome/browser/apps/link_capturing" ]
     }
 
     if (is_win || is_chromeos || is_mac) {
@@ -9351,7 +9347,6 @@
     deps += [
       "//chrome/browser/extensions:cws_item_service_proto",
       "//chrome/browser/extensions:test_support",
-      "//chrome/browser/shortcuts:unit_tests",
       "//chrome/browser/ui/web_applications:unit_tests",
       "//chrome/browser/web_applications:unit_tests",
       "//chrome/browser/web_applications:web_applications_unit_tests",
diff --git a/chrome/test/data/pdf/navigator_test.ts b/chrome/test/data/pdf/navigator_test.ts
index 2a7a7fcc..90c4d21 100644
--- a/chrome/test/data/pdf/navigator_test.ts
+++ b/chrome/test/data/pdf/navigator_test.ts
@@ -275,7 +275,7 @@
     chrome.test.succeed();
   },
 
-  async function testNavigateInvalidUrls() {
+  async function testNavigateDisallowedSchemes() {
     const url = 'https://example.com/some-web-document.pdf';
 
     // From non-file: to file:
@@ -284,7 +284,7 @@
     await doNavigationUrlTests(url, 'chrome://version', undefined);
 
     await doNavigationUrlTests(
-        url, 'javascript:// this is not a document.pdf', undefined);
+        url, 'javascript://this-is-not-a-document.pdf', undefined);
 
     await doNavigationUrlTests(
         url, 'this-is-not-a-valid-scheme://path.pdf', undefined);
diff --git a/chrome/test/data/shortcuts/default_icon_has_two/16_favicon_part.png b/chrome/test/data/shortcuts/default_icon_has_two/16_favicon_part.png
deleted file mode 100644
index 4d217e8..0000000
--- a/chrome/test/data/shortcuts/default_icon_has_two/16_favicon_part.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/shortcuts/default_icon_has_two/32_favicon_part.png b/chrome/test/data/shortcuts/default_icon_has_two/32_favicon_part.png
deleted file mode 100644
index 81e1fa4..0000000
--- a/chrome/test/data/shortcuts/default_icon_has_two/32_favicon_part.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/shortcuts/default_icon_has_two/favicon.ico b/chrome/test/data/shortcuts/default_icon_has_two/favicon.ico
deleted file mode 100644
index e27eec3..0000000
--- a/chrome/test/data/shortcuts/default_icon_has_two/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/shortcuts/default_icon_has_two/index.html b/chrome/test/data/shortcuts/default_icon_has_two/index.html
deleted file mode 100644
index 94d7fa4..0000000
--- a/chrome/test/data/shortcuts/default_icon_has_two/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<html>
-
-<title>Page without default favicon</title>
-
-<head></head>
-
-<body>
-  <h1>This page has a default favicon, with two icons inside it.</h1>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/chrome/test/data/shortcuts/green.png b/chrome/test/data/shortcuts/green.png
deleted file mode 100644
index c7510d38..0000000
--- a/chrome/test/data/shortcuts/green.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/shortcuts/no_icons_page.html b/chrome/test/data/shortcuts/no_icons_page.html
deleted file mode 100644
index 42d323d..0000000
--- a/chrome/test/data/shortcuts/no_icons_page.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
-<title>Page without icons</title>
-
-<head></head>
-
-<body>
-  <h1>This page has no icons.</h1>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/chrome/test/data/shortcuts/noise.png b/chrome/test/data/shortcuts/noise.png
deleted file mode 100644
index 81acb31..0000000
--- a/chrome/test/data/shortcuts/noise.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/shortcuts/page_icons.html b/chrome/test/data/shortcuts/page_icons.html
deleted file mode 100644
index 40f787d91..0000000
--- a/chrome/test/data/shortcuts/page_icons.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<html>
-<title>Page with icon links</title>
-
-<head>
-  <link rel="apple-touch-icon" href="green.png" />
-  <link rel="icon" href="noise.png" />
-</head>
-
-<body>
-  <h1>Page with icon links</h1>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 9cab175..bfa34f8 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -167,4 +167,8 @@
   # b/324521903 temporary disabled until the test fixes
   tast_disabled_tests_from_chrome_all +=
       [ "secagentd.AuthenticationEvents.mainline@octopus" ]
+
+  # b/274341001: By design, ui.ChromeCrashEarly.strict fails on non-official
+  # builds.
+  tast_disabled_tests_from_lacros_all += [ "ui.ChromeCrashEarly.strict_lacros" ]
 }
diff --git a/clank b/clank
index 4ccf9ec..9fac960 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 4ccf9ec2cc92967d39ca0e3d0b0158bfd7937c81
+Subproject commit 9fac960efbf41bbdaa05ce10d5caaf74f2ee6347
diff --git a/components/dbus/properties/types.cc b/components/dbus/properties/types.cc
index d9f4aff6..888ebf8 100644
--- a/components/dbus/properties/types.cc
+++ b/components/dbus/properties/types.cc
@@ -146,7 +146,8 @@
 
 bool DbusByteArray::IsEqual(const DbusType& other_type) const {
   const DbusByteArray* other = static_cast<const DbusByteArray*>(&other_type);
-  return value_->Equals(other->value_);
+  return value_->size() == other->value_->size() &&
+         !memcmp(value_->front(), other->value_->front(), value_->size());
 }
 
 void DbusByteArray::Write(dbus::MessageWriter* writer) const {
diff --git a/components/favicon/core/favicon_backend.cc b/components/favicon/core/favicon_backend.cc
index 53a940a..b09db7b 100644
--- a/components/favicon/core/favicon_backend.cc
+++ b/components/favicon/core/favicon_backend.cc
@@ -565,7 +565,7 @@
   for (size_t i = 0; i < bitmaps.size(); ++i) {
     scoped_refptr<base::RefCountedBytes> bitmap_data(new base::RefCountedBytes);
     if (!gfx::PNGCodec::EncodeBGRASkBitmap(bitmaps[i], false,
-                                           &bitmap_data->as_vector())) {
+                                           &bitmap_data->data())) {
       continue;
     }
     to_add.push_back(std::make_pair(
diff --git a/components/favicon/core/favicon_handler_unittest.cc b/components/favicon/core/favicon_handler_unittest.cc
index 2bc6dcf..b4f0eb59 100644
--- a/components/favicon/core/favicon_handler_unittest.cc
+++ b/components/favicon/core/favicon_handler_unittest.cc
@@ -100,7 +100,7 @@
     int edge_size = gfx::kFaviconSize,
     SkColor color = SK_ColorRED) {
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
-  data->as_vector() = FillBitmapWithEdgeSize(edge_size, color);
+  data->data() = FillBitmapWithEdgeSize(edge_size, color);
   FaviconRawBitmapResult bitmap_result;
   bitmap_result.expired = expired;
   bitmap_result.bitmap_data = data;
diff --git a/components/favicon/core/favicon_util.cc b/components/favicon/core/favicon_util.cc
index 618e197..a4ee3d5 100644
--- a/components/favicon/core/favicon_util.cc
+++ b/components/favicon/core/favicon_util.cc
@@ -19,7 +19,7 @@
   favicon_base::FaviconImageResult result;
   if (bitmap_result.is_valid()) {
     result.image = gfx::Image::CreateFrom1xPNGBytes(
-        bitmap_result.bitmap_data->data(), bitmap_result.bitmap_data->size());
+        bitmap_result.bitmap_data->front(), bitmap_result.bitmap_data->size());
     result.icon_url = bitmap_result.icon_url;
     std::move(callback).Run(result);
     return;
diff --git a/components/favicon/core/history_ui_favicon_request_handler_impl_unittest.cc b/components/favicon/core/history_ui_favicon_request_handler_impl_unittest.cc
index a39cc2d..ad93431 100644
--- a/components/favicon/core/history_ui_favicon_request_handler_impl_unittest.cc
+++ b/components/favicon/core/history_ui_favicon_request_handler_impl_unittest.cc
@@ -39,7 +39,7 @@
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
   gfx::PNGCodec::EncodeBGRASkBitmap(
       gfx::test::CreateBitmap(desired_size_in_pixel, SK_ColorRED), false,
-      &data->as_vector());
+      &data->data());
   favicon_base::FaviconRawBitmapResult result;
   result.bitmap_data = data;
   result.icon_url = icon_url;
diff --git a/components/favicon/core/large_icon_service_impl_unittest.cc b/components/favicon/core/large_icon_service_impl_unittest.cc
index 633165a..b7264e7 100644
--- a/components/favicon/core/large_icon_service_impl_unittest.cc
+++ b/components/favicon/core/large_icon_service_impl_unittest.cc
@@ -76,7 +76,7 @@
   // Create bitmap and fill with |color|.
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
   gfx::PNGCodec::EncodeBGRASkBitmap(gfx::test::CreateBitmap(w, h, color), false,
-                                    &data->as_vector());
+                                    &data->data());
   result.bitmap_data = data;
 
   result.pixel_size = gfx::Size(w, h);
diff --git a/components/favicon/core/large_icon_worker.cc b/components/favicon/core/large_icon_worker.cc
index 2ae56e0..221d23c 100644
--- a/components/favicon/core/large_icon_worker.cc
+++ b/components/favicon/core/large_icon_worker.cc
@@ -36,7 +36,7 @@
     const favicon_base::FaviconRawBitmapResult& db_result,
     int desired_size) {
   gfx::Image image = gfx::Image::CreateFrom1xPNGBytes(
-      db_result.bitmap_data->data(), db_result.bitmap_data->size());
+      db_result.bitmap_data->front(), db_result.bitmap_data->size());
 
   if (desired_size == 0 || db_result.pixel_size.width() == desired_size) {
     return image;
diff --git a/components/favicon_base/favicon_util.cc b/components/favicon_base/favicon_util.cc
index cdbe236d..56ab7b77 100644
--- a/components/favicon_base/favicon_util.cc
+++ b/components/favicon_base/favicon_util.cc
@@ -204,8 +204,9 @@
       continue;
 
     SkBitmap bitmap;
-    if (gfx::PNGCodec::Decode(png_data[i].bitmap_data->data(),
-                              png_data[i].bitmap_data->size(), &bitmap)) {
+    if (gfx::PNGCodec::Decode(png_data[i].bitmap_data->front(),
+                              png_data[i].bitmap_data->size(),
+                              &bitmap)) {
       bitmaps.push_back(bitmap);
     }
   }
@@ -232,8 +233,9 @@
     scoped_refptr<base::RefCountedBytes> png_bytes(new base::RefCountedBytes());
     if (gfx::PNGCodec::EncodeBGRASkBitmap(
             resized_image_skia_reps[i].GetBitmap(), false,
-            &png_bytes->as_vector())) {
-      png_reps.emplace_back(png_bytes, resized_image_skia_reps[i].scale());
+            &png_bytes->data())) {
+      png_reps.push_back(
+          gfx::ImagePNGRep(png_bytes, resized_image_skia_reps[i].scale()));
     }
   }
 
diff --git a/components/feedback/content/content_tracing_manager_browsertest.cc b/components/feedback/content/content_tracing_manager_browsertest.cc
index f7d4abb..95014451 100644
--- a/components/feedback/content/content_tracing_manager_browsertest.cc
+++ b/components/feedback/content/content_tracing_manager_browsertest.cc
@@ -106,7 +106,7 @@
   EXPECT_EQ(trace_id, 1);
   tracing_manager->GetTraceData(trace_id, future.GetCallback());
   // The actual trace data varies.
-  EXPECT_TRUE(future.Get()->size() > 0u);
+  EXPECT_TRUE(future.Get()->data().size() > 0);
 }
 
 // Test that FeedbackData.CompressSystemInfo will not gather trace data when the
diff --git a/components/feedback/feedback_data.cc b/components/feedback/feedback_data.cc
index 4975ebf6..08f7fe6 100644
--- a/components/feedback/feedback_data.cc
+++ b/components/feedback/feedback_data.cc
@@ -131,9 +131,7 @@
   if (tracing_manager_)
     tracing_manager_->DiscardTraceData(trace_id);
 
-  std::string s;
-  std::swap(s, trace_data->as_string());
-  AddFile(kTraceFilename, std::move(s));
+  AddFile(kTraceFilename, std::move(trace_data->data()));
 
   set_category_tag(kPerformanceCategoryTag);
   --pending_op_count_;
diff --git a/components/global_media_controls/BUILD.gn b/components/global_media_controls/BUILD.gn
index e3cf8ac..3bf33e1f 100644
--- a/components/global_media_controls/BUILD.gn
+++ b/components/global_media_controls/BUILD.gn
@@ -61,6 +61,8 @@
   sources = [
     "media_item_manager_impl.cc",
     "media_item_manager_impl.h",
+    "media_view_utils.cc",
+    "media_view_utils.h",
     "public/media_item_ui_observer_set.cc",
     "public/media_session_item_producer.cc",
     "public/media_session_notification_item.cc",
@@ -86,6 +88,7 @@
 
   sources = [
     "media_item_manager_impl_unittest.cc",
+    "media_view_utils_unittest.cc",
     "public/media_session_item_producer_unittest.cc",
     "public/media_session_notification_item_unittest.cc",
     "public/views/media_action_button_unittest.cc",
@@ -96,6 +99,10 @@
     "public/views/media_progress_view_unittest.cc",
   ]
 
+  if (is_chromeos_ash) {
+    sources += [ "public/views/chapter_item_view_unittest.cc" ]
+  }
+
   deps = [
     ":global_media_controls",
     ":test_support",
diff --git a/components/global_media_controls/media_view_utils.cc b/components/global_media_controls/media_view_utils.cc
new file mode 100644
index 0000000..3fdc31d8
--- /dev/null
+++ b/components/global_media_controls/media_view_utils.cc
@@ -0,0 +1,83 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/global_media_controls/media_view_utils.h"
+
+#include <algorithm>
+#include <string>
+
+#include "base/i18n/number_formatting.h"
+#include "base/i18n/time_formatting.h"
+#include "base/i18n/unicodestring.h"
+#include "base/no_destructor.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
+#include "third_party/icu/source/i18n/unicode/measfmt.h"
+#include "third_party/icu/source/i18n/unicode/measunit.h"
+#include "third_party/icu/source/i18n/unicode/measure.h"
+
+namespace global_media_controls {
+
+namespace {
+
+// Returns a singleton `icu::MeasureFormat` object, so that it doesn't have to
+// be recreated each time when formatting a time duration.
+const icu::MeasureFormat& GetMeasureFormat() {
+  static const base::NoDestructor<icu::MeasureFormat> measure_format([] {
+    UErrorCode status = U_ZERO_ERROR;
+    icu::MeasureFormat measure_format(
+        icu::Locale::getDefault(), UMeasureFormatWidth::UMEASFMT_WIDTH_NUMERIC,
+        status);
+    CHECK(U_SUCCESS(status));
+    return measure_format;
+  }());
+  return *measure_format;
+}
+
+}  // namespace
+
+gfx::Size ScaleImageSizeToFitView(const gfx::Size& image_size,
+                                  const gfx::Size& view_size) {
+  const float scale =
+      std::max(view_size.width() / static_cast<float>(image_size.width()),
+               view_size.height() / static_cast<float>(image_size.height()));
+  return gfx::ScaleToFlooredSize(image_size, scale);
+}
+
+std::u16string GetFormattedDuration(const base::TimeDelta& duration) {
+  UErrorCode status = U_ZERO_ERROR;
+
+  std::vector<icu::Measure> measures;
+
+  const int64_t total_seconds =
+      base::ClampRound<int64_t>(duration.InSecondsF());
+  const int64_t hours = total_seconds / base::Time::kSecondsPerHour;
+  if (hours != 0) {
+    measures.emplace_back(hours, icu::MeasureUnit::createHour(status), status);
+  }
+
+  const int64_t minutes =
+      (total_seconds - hours * base::Time::kSecondsPerHour) /
+      base::Time::kSecondsPerMinute;
+  measures.emplace_back(minutes, icu::MeasureUnit::createMinute(status),
+                        status);
+
+  const int64_t seconds = total_seconds % base::Time::kSecondsPerMinute;
+  measures.emplace_back(seconds, icu::MeasureUnit::createSecond(status),
+                        status);
+
+  icu::UnicodeString formatted;
+  icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
+  GetMeasureFormat().formatMeasures(&measures[0], measures.size(), formatted,
+                                    ignore, status);
+
+  if (U_SUCCESS(status)) {
+    return base::i18n::UnicodeStringToString16(formatted);
+  }
+
+  // If any step has error, returns the duration in seconds.
+  return base::NumberToString16(std::ceil(duration.InSecondsF()));
+}
+
+}  // namespace global_media_controls
diff --git a/components/global_media_controls/media_view_utils.h b/components/global_media_controls/media_view_utils.h
new file mode 100644
index 0000000..10072895
--- /dev/null
+++ b/components/global_media_controls/media_view_utils.h
@@ -0,0 +1,45 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_GLOBAL_MEDIA_CONTROLS_MEDIA_VIEW_UTILS_H_
+#define COMPONENTS_GLOBAL_MEDIA_CONTROLS_MEDIA_VIEW_UTILS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+#include "base/time/time.h"
+#include "services/media_session/public/mojom/media_session.mojom.h"
+#include "third_party/icu/source/i18n/unicode/measfmt.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace global_media_controls {
+
+// The corner radius of the images in the media views.
+inline constexpr int kArtworkCornerRadius = 12;
+
+// View ID's.
+// Buttons are using the `MediaSessionAction` enum as their view IDs. To avoid
+// conflicts, the other views' IDs start from the
+// `MediaSessionAction::kMaxValue`.
+inline constexpr int kChapterItemViewTitleId =
+    static_cast<int>(media_session::mojom::MediaSessionAction::kMaxValue) + 1;
+inline constexpr int kChapterItemViewStartTimeId = kChapterItemViewTitleId + 1;
+
+// If the image does not fit the view, scale the image to fill the view even if
+// part of the image is cropped.
+gfx::Size ScaleImageSizeToFitView(const gfx::Size& image_size,
+                                  const gfx::Size& view_size);
+
+// Adapts the functionality of `base::TimeDurationFormat` to format a
+// `TimeDelta` object. Returns a formatted time string (e.g., "0:30", "3:30",
+// "3:03:30").
+// Uses the Singleton `GetMeasureFormat()` for efficient formatting. This avoids
+// recreating `measure_format` on each function call. Provides a default
+// formatted string if the `formatMeasures()` function encounters an error.
+COMPONENT_EXPORT(GLOBAL_MEDIA_CONTROLS)
+std::u16string GetFormattedDuration(const base::TimeDelta& duration);
+
+}  // namespace global_media_controls
+
+#endif  // COMPONENTS_GLOBAL_MEDIA_CONTROLS_MEDIA_VIEW_UTILS_H_
diff --git a/components/global_media_controls/media_view_utils_unittest.cc b/components/global_media_controls/media_view_utils_unittest.cc
new file mode 100644
index 0000000..2ffaf53
--- /dev/null
+++ b/components/global_media_controls/media_view_utils_unittest.cc
@@ -0,0 +1,36 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/global_media_controls/media_view_utils.h"
+
+#include "base/time/time.h"
+#include "ui/views/test/views_test_base.h"
+
+namespace global_media_controls {
+
+using MediaViewUtilsUnitTest = testing::Test;
+
+TEST_F(MediaViewUtilsUnitTest, FormatDurationWithHours) {
+  auto long_duration = base::Seconds(5698721);
+  EXPECT_EQ(u"1,582:58:41", GetFormattedDuration(long_duration));
+
+  auto with_zero_duration = base::Seconds(3600);
+  EXPECT_EQ(u"1:00:00", GetFormattedDuration(with_zero_duration));
+}
+
+TEST_F(MediaViewUtilsUnitTest, FormatDurationWithoutHours) {
+  auto long_duration = base::Seconds(3538);
+  EXPECT_EQ(u"58:58", GetFormattedDuration(long_duration));
+
+  auto with_zero_duration = base::Seconds(61);
+  EXPECT_EQ(u"1:01", GetFormattedDuration(with_zero_duration));
+
+  auto no_minute_duration = base::Seconds(3);
+  EXPECT_EQ(u"0:03", GetFormattedDuration(no_minute_duration));
+
+  auto zero_duration = base::Seconds(0);
+  EXPECT_EQ(u"0:00", GetFormattedDuration(zero_duration));
+}
+
+}  // namespace global_media_controls
diff --git a/components/global_media_controls/public/views/chapter_item_view.cc b/components/global_media_controls/public/views/chapter_item_view.cc
index f581bbb..78977be 100644
--- a/components/global_media_controls/public/views/chapter_item_view.cc
+++ b/components/global_media_controls/public/views/chapter_item_view.cc
@@ -9,11 +9,13 @@
 #include "base/containers/fixed_flat_map.h"
 #include "base/functional/bind.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/global_media_controls/media_view_utils.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/highlight_path_generator.h"
@@ -25,7 +27,8 @@
 namespace global_media_controls {
 
 namespace {
-constexpr auto kItemCornerRadius = gfx::RoundedCornersF(12);
+constexpr auto kItemCornerRadius = gfx::RoundedCornersF(kArtworkCornerRadius);
+constexpr gfx::Size kImageSize(64, 40);
 
 // A `HighlightPathGenerator` that uses caller-supplied rounded rect corners.
 class RoundedCornerHighlightPathGenerator
@@ -57,8 +60,7 @@
     const media_message_center::MediaColorTheme& theme,
     base::RepeatingCallback<void(const base::TimeDelta time)>
         on_chapter_pressed)
-    : title_(chapter.title()),
-      start_time_(chapter.startTime()),
+    : chapter_(chapter),
       theme_(theme),
       on_chapter_pressed_callback_(std::move(on_chapter_pressed)) {
   SetCallback(base::BindRepeating(&ChapterItemView::PerformAction,
@@ -78,12 +80,13 @@
               .AddChildren(
                   views::Builder<views::ImageView>()
                       .CopyAddressTo(&artwork_view_)
-                      .SetPreferredSize(gfx::Size(64, 40)),
+                      .SetPreferredSize(kImageSize),
                   views::Builder<views::BoxLayoutView>()
                       .SetOrientation(views::BoxLayout::Orientation::kVertical)
                       .AddChildren(
                           views::Builder<views::Label>()
-                              .SetText(title_)
+                              .SetText(chapter.title())
+                              .SetID(kChapterItemViewTitleId)
                               .SetFontList(gfx::FontList(
                                   {"Google Sans"}, gfx::Font::NORMAL, 13,
                                   gfx::Font::Weight::NORMAL))
@@ -91,8 +94,9 @@
                               .SetEnabledColorId(
                                   theme_.primary_foreground_color_id),
                           views::Builder<views::Label>()
-                              .SetText(base::ASCIIToUTF16(base::NumberToString(
-                                  (start_time_.InSeconds()))))
+                              .SetText(
+                                  GetFormattedDuration(chapter.startTime()))
+                              .SetID(kChapterItemViewStartTimeId)
                               .SetFontList(gfx::FontList(
                                   {"Google Sans"}, gfx::Font::NORMAL, 12,
                                   gfx::Font::Weight::NORMAL))
@@ -109,12 +113,27 @@
 ChapterItemView::~ChapterItemView() = default;
 
 void ChapterItemView::UpdateArtwork(const gfx::ImageSkia& image) {
-  artwork_view_->SetVisible(true);
+  if (image.isNull()) {
+    // Hide the image so the other contents will adjust to fill the container.
+    artwork_view_->SetVisible(false);
+  }
+
+  // Rescales the image.
+  artwork_view_->SetImageSize(
+      ScaleImageSizeToFitView(image.size(), kImageSize));
   artwork_view_->SetImage(ui::ImageModel::FromImageSkia(image));
+
+  // Draws the image with rounded corners.
+  auto path = SkPath().addRoundRect(
+      RectToSkRect(gfx::Rect(kImageSize.width(), kImageSize.height())),
+      kArtworkCornerRadius, kArtworkCornerRadius);
+  artwork_view_->SetClipPath(path);
+
+  artwork_view_->SetVisible(true);
 }
 
 void ChapterItemView::PerformAction(const ui::Event& event) {
-  on_chapter_pressed_callback_.Run(start_time_);
+  on_chapter_pressed_callback_.Run(chapter_.startTime());
 }
 
 void ChapterItemView::SetUpFocusHighlight(
diff --git a/components/global_media_controls/public/views/chapter_item_view.h b/components/global_media_controls/public/views/chapter_item_view.h
index 45ba869..88c9861 100644
--- a/components/global_media_controls/public/views/chapter_item_view.h
+++ b/components/global_media_controls/public/views/chapter_item_view.h
@@ -5,8 +5,6 @@
 #ifndef COMPONENTS_GLOBAL_MEDIA_CONTROLS_PUBLIC_VIEWS_CHAPTER_ITEM_VIEW_H_
 #define COMPONENTS_GLOBAL_MEDIA_CONTROLS_PUBLIC_VIEWS_CHAPTER_ITEM_VIEW_H_
 
-#include <string>
-
 #include "base/memory/raw_ptr.h"
 #include "components/media_message_center/notification_theme.h"
 #include "services/media_session/public/cpp/chapter_information.h"
@@ -33,9 +31,8 @@
   // Updates the image of this chapter item view.
   void UpdateArtwork(const gfx::ImageSkia& image);
 
-  // For testing:
-  std::u16string get_title_for_testing() const { return title_; }
-  base::TimeDelta get_start_time_for_testing() const { return start_time_; }
+  // Gets the chapter information.
+  media_session::ChapterInformation chapter() { return chapter_; }
 
  private:
   // Jumps to the `start_time_` to play this chapter.
@@ -46,8 +43,8 @@
   // same corner rounding as the view.
   void SetUpFocusHighlight(const gfx::RoundedCornersF& item_corner_radius);
 
-  const std::u16string title_;
-  const base::TimeDelta start_time_;
+  // The passed in chapter information.
+  const media_session::ChapterInformation chapter_;
 
   // The color theme for all the colors in this view.
   const media_message_center::MediaColorTheme theme_;
diff --git a/components/global_media_controls/public/views/chapter_item_view_unittest.cc b/components/global_media_controls/public/views/chapter_item_view_unittest.cc
new file mode 100644
index 0000000..7cb16a72
--- /dev/null
+++ b/components/global_media_controls/public/views/chapter_item_view_unittest.cc
@@ -0,0 +1,88 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/global_media_controls/public/views/chapter_item_view.h"
+
+#include <memory>
+#include <string>
+
+#include "base/time/time.h"
+#include "components/global_media_controls/media_view_utils.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/test/button_test_api.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/view_utils.h"
+
+namespace global_media_controls {
+
+namespace {
+
+// Consts for this test.
+const std::u16string kChapterTitle = u"Chapter 1";
+const base::TimeDelta kChapterStartTime = base::Seconds(3661);
+
+}  // anonymous namespace
+
+class ChapterItemViewTest : public views::ViewsTestBase {
+ public:
+  // Mock callback:
+  MOCK_METHOD(void, OnChapterPressed, (const base::TimeDelta time), ());
+
+  void SetUp() override {
+    ViewsTestBase::SetUp();
+
+    widget_ = CreateTestWidget();
+
+    media_session::MediaImage test_image;
+    test_image.src = GURL("https://www.google.com");
+    media_session::ChapterInformation test_chapter(
+        /*title=*/kChapterTitle, /*startTime=*/kChapterStartTime,
+        /*artwork=*/{test_image});
+
+    view_ = widget_->SetContentsView(std::make_unique<ChapterItemView>(
+        test_chapter, media_message_center::MediaColorTheme(),
+        /*on_chapter_pressed=*/
+        base::BindRepeating(&ChapterItemViewTest::OnChapterPressed,
+                            base::Unretained(this))));
+
+    widget_->SetBounds(gfx::Rect(500, 500));
+    widget_->Show();
+  }
+
+  void TearDown() override {
+    view_ = nullptr;
+    widget_.reset();
+
+    ViewsTestBase::TearDown();
+  }
+
+  ChapterItemView* view() const { return view_; }
+
+ private:
+  std::unique_ptr<views::Widget> widget_;
+  raw_ptr<ChapterItemView> view_ = nullptr;
+};
+
+TEST_F(ChapterItemViewTest, Labels) {
+  EXPECT_EQ(views::AsViewClass<views::Label>(
+                view()->GetViewByID(kChapterItemViewTitleId))
+                ->GetText(),
+            kChapterTitle);
+  EXPECT_EQ(views::AsViewClass<views::Label>(
+                view()->GetViewByID(kChapterItemViewStartTimeId))
+                ->GetText(),
+            u"1:01:01");
+}
+
+TEST_F(ChapterItemViewTest, ClickOnView) {
+  EXPECT_CALL(*this, OnChapterPressed(kChapterStartTime)).Times(1);
+  views::test::ButtonTestApi(view()).NotifyClick(
+      ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+                     ui::EventTimeForNow(), 0, 0));
+  testing::Mock::VerifyAndClearExpectations(this);
+}
+
+}  // namespace global_media_controls
diff --git a/components/global_media_controls/public/views/media_item_ui_detailed_view.cc b/components/global_media_controls/public/views/media_item_ui_detailed_view.cc
index 317cc84b..c9515dfe 100644
--- a/components/global_media_controls/public/views/media_item_ui_detailed_view.cc
+++ b/components/global_media_controls/public/views/media_item_ui_detailed_view.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/metrics/histogram_functions.h"
+#include "components/global_media_controls/media_view_utils.h"
 #include "components/global_media_controls/public/views/media_action_button.h"
 #include "components/global_media_controls/public/views/media_progress_view.h"
 #include "components/media_message_center/media_notification_container.h"
@@ -49,7 +50,6 @@
     gfx::Insets::VH(1, 1);
 
 constexpr int kBackgroundCornerRadius = 16;
-constexpr int kArtworkCornerRadius = 12;
 constexpr int kSourceTextLineHeight = 18;
 constexpr int kTextLineHeight = 20;
 constexpr int kFontSize = 12;
@@ -106,16 +106,6 @@
 BEGIN_METADATA(MediaLabelButton)
 END_METADATA
 
-// If the image does not fit the square view, scale the image to fill the view
-// even if part of the image is cropped.
-gfx::Size ScaleImageSizeToFitView(const gfx::Size& image_size,
-                                  const gfx::Size& view_size) {
-  const float scale =
-      std::max(view_size.width() / static_cast<float>(image_size.width()),
-               view_size.height() / static_cast<float>(image_size.height()));
-  return gfx::ScaleToFlooredSize(image_size, scale);
-}
-
 }  // namespace
 
 MediaItemUIDetailedView::MediaItemUIDetailedView(
@@ -396,42 +386,8 @@
   title_label_->SetText(metadata.title);
   artist_label_->SetText(metadata.artist);
 
+  UpdateChapterListViewWithMetadata(metadata);
   container_->OnMediaSessionMetadataChanged(metadata);
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (!base::FeatureList::IsEnabled(media::kBackgroundListening)) {
-    return;
-  }
-
-  if (!chapter_list_view_ && metadata.chapters.empty()) {
-    return;
-  }
-
-  if (metadata.chapters.empty()) {
-    chapter_list_view_->RemoveAllChildViews();
-    return;
-  }
-
-  if (!chapter_list_view_) {
-    chapter_list_view_ = AddChildView(
-        views::Builder<views::BoxLayoutView>()
-            .SetOrientation(views::BoxLayout::Orientation::kVertical)
-            .SetInsideBorderInsets(gfx::Insets::TLBR(16, 8, 8, 8))
-            .Build());
-  } else {
-    chapter_list_view_->RemoveAllChildViews();
-  }
-
-  for (int index = 0; index < static_cast<int>(metadata.chapters.size());
-       index++) {
-    chapters_[index] =
-        chapter_list_view_->AddChildView(std::make_unique<ChapterItemView>(
-            metadata.chapters[index], theme_,
-            /*on_chapter_pressed=*/
-            base::BindRepeating(&MediaItemUIDetailedView::SeekToTimestamp,
-                                weak_factory_.GetWeakPtr())));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 void MediaItemUIDetailedView::UpdateWithMediaActions(
@@ -702,6 +658,67 @@
   container_->OnDeviceSelectorViewSizeChanged();
 }
 
+void MediaItemUIDetailedView::UpdateChapterListViewWithMetadata(
+    const media_session::MediaMetadata& metadata) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  if (!base::FeatureList::IsEnabled(media::kBackgroundListening)) {
+    return;
+  }
+
+  if (!chapter_list_view_ && metadata.chapters.empty()) {
+    return;
+  }
+
+  if (metadata.chapters.empty()) {
+    chapter_list_view_->RemoveAllChildViews();
+    chapters_.clear();
+    return;
+  }
+
+  // Ensures the chapter list view exists and is up-to-date:
+  //  1) Creates the chapter list view if it doesn't exist.
+  //  2) Compares existing chapter item views to new metadata:
+  //     a) If chapters match, no updates are needed.
+  //     b) If chapters differ, the list is cleared and updated with the new
+  // chapters.
+  if (!chapter_list_view_) {
+    chapter_list_view_ = AddChildView(
+        views::Builder<views::BoxLayoutView>()
+            .SetOrientation(views::BoxLayout::Orientation::kVertical)
+            .SetInsideBorderInsets(gfx::Insets::TLBR(16, 8, 8, 8))
+            .Build());
+  } else {
+    bool chapters_not_changed = metadata.chapters.size() == chapters_.size();
+    // Further checks if every chapter is the same.
+    if (chapters_not_changed) {
+      for (int index = 0; index < static_cast<int>(metadata.chapters.size());
+           index++) {
+        if (!chapters_[index] ||
+            chapters_[index]->chapter() != metadata.chapters[index]) {
+          chapters_not_changed = false;
+          break;
+        }
+      }
+    }
+    if (chapters_not_changed) {
+      return;
+    }
+    chapter_list_view_->RemoveAllChildViews();
+  }
+
+  chapters_.clear();
+  for (int index = 0; index < static_cast<int>(metadata.chapters.size());
+       index++) {
+    chapters_[index] =
+        chapter_list_view_->AddChildView(std::make_unique<ChapterItemView>(
+            metadata.chapters[index], theme_,
+            /*on_chapter_pressed=*/
+            base::BindRepeating(&MediaItemUIDetailedView::SeekToTimestamp,
+                                weak_factory_.GetWeakPtr())));
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+}
+
 // Helper functions for testing:
 views::ImageView* MediaItemUIDetailedView::GetArtworkViewForTesting() {
   return artwork_view_;
diff --git a/components/global_media_controls/public/views/media_item_ui_detailed_view.h b/components/global_media_controls/public/views/media_item_ui_detailed_view.h
index 9b273e2..471f3460 100644
--- a/components/global_media_controls/public/views/media_item_ui_detailed_view.h
+++ b/components/global_media_controls/public/views/media_item_ui_detailed_view.h
@@ -164,6 +164,10 @@
   // Update the display states of UI elements for casting devices.
   void UpdateCastingState();
 
+  // Updates the chapter list view's chapter items with the new `metadata`.
+  void UpdateChapterListViewWithMetadata(
+      const media_session::MediaMetadata& metadata);
+
   // Raw pointer to the container holding this view. The |container_| should
   // never be nullptr.
   const raw_ptr<media_message_center::MediaNotificationContainer> container_;
diff --git a/components/global_media_controls/public/views/media_item_ui_detailed_view_unittest.cc b/components/global_media_controls/public/views/media_item_ui_detailed_view_unittest.cc
index b9dc350..a27159f0 100644
--- a/components/global_media_controls/public/views/media_item_ui_detailed_view_unittest.cc
+++ b/components/global_media_controls/public/views/media_item_ui_detailed_view_unittest.cc
@@ -481,22 +481,22 @@
 
   EXPECT_EQ(view()->GetTitleLabelForTesting()->GetText(), metadata.title);
   EXPECT_EQ(view()->GetChapterListViewForTesting()->children().size(), 2u);
-  EXPECT_EQ(
-      view()->GetChaptersForTesting().find(0)->second->get_title_for_testing(),
-      u"chapter1");
-  EXPECT_EQ(
-      view()->GetChaptersForTesting().find(1)->second->get_title_for_testing(),
-      u"chapter2");
+  EXPECT_EQ(view()->GetChaptersForTesting().find(0)->second->chapter().title(),
+            u"chapter1");
+  EXPECT_EQ(view()->GetChaptersForTesting().find(1)->second->chapter().title(),
+            u"chapter2");
   EXPECT_EQ(view()
                 ->GetChaptersForTesting()
                 .find(0)
-                ->second->get_start_time_for_testing()
+                ->second->chapter()
+                .startTime()
                 .InSeconds(),
             10);
   EXPECT_EQ(view()
                 ->GetChaptersForTesting()
                 .find(1)
-                ->second->get_start_time_for_testing()
+                ->second->chapter()
+                .startTime()
                 .InSeconds(),
             20);
 
diff --git a/components/omnibox/browser/clipboard_provider.cc b/components/omnibox/browser/clipboard_provider.cc
index ab0942d..ef7ba12 100644
--- a/components/omnibox/browser/clipboard_provider.cc
+++ b/components/omnibox/browser/clipboard_provider.cc
@@ -583,7 +583,7 @@
   match.search_terms_args =
       std::make_unique<TemplateURLRef::SearchTermsArgs>(u"");
   match.search_terms_args->image_thumbnail_content.assign(
-      base::as_string_view(*image_bytes));
+      image_bytes->front_as<char>(), image_bytes->size());
   TemplateURLRef::PostContent post_content;
   GURL result(default_url->image_url_ref().ReplaceSearchTerms(
       *match.search_terms_args.get(), url_service->search_terms_data(),
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index a2e21ab..e306a76 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit a2e21ab67af8c7fd133c90ec13d3b248640c199e
+Subproject commit e306a767178bbe3e17c4404a2713992423162b39
diff --git a/components/search_provider_logos/google_logo_api_unittest.cc b/components/search_provider_logos/google_logo_api_unittest.cc
index 53b299c..e57385f 100644
--- a/components/search_provider_logos/google_logo_api_unittest.cc
+++ b/components/search_provider_logos/google_logo_api_unittest.cc
@@ -181,8 +181,8 @@
 
   ASSERT_FALSE(failed);
   ASSERT_TRUE(logo);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
-  EXPECT_EQ("xyz", logo->dark_encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
+  EXPECT_EQ("xyz", logo->dark_encoded_image->data());
   EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
 }
 
@@ -218,7 +218,7 @@
 
   ASSERT_FALSE(failed);
   ASSERT_TRUE(logo);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
   EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
   EXPECT_EQ("https://g.co/", logo->metadata.short_link);
 
@@ -266,7 +266,7 @@
 
   ASSERT_FALSE(failed);
   ASSERT_TRUE(logo);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
   EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
   ASSERT_TRUE(logo->metadata.short_link.is_empty());
   ASSERT_TRUE(logo->metadata.share_button_icon.empty());
@@ -311,7 +311,7 @@
 
   ASSERT_FALSE(failed);
   ASSERT_TRUE(logo);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
   EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
   ASSERT_FALSE(logo->metadata.short_link.is_valid());
   ASSERT_TRUE(logo->metadata.share_button_icon.empty());
@@ -363,7 +363,7 @@
   ASSERT_TRUE(logo);
   EXPECT_EQ(GURL("https://www.doodle.com/image.gif"),
             logo->metadata.animated_url);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
   EXPECT_EQ(LogoType::ANIMATED, logo->metadata.type);
   EXPECT_EQ("https://g.co/", logo->metadata.short_link);
 
@@ -413,8 +413,8 @@
   EXPECT_EQ(GURL("https://www.doodle.com/dark_image.gif"),
             logo->metadata.dark_animated_url);
   EXPECT_EQ("#ABCDEF", logo->metadata.dark_background_color);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
-  EXPECT_EQ("xyz", logo->dark_encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
+  EXPECT_EQ("xyz", logo->dark_encoded_image->data());
   EXPECT_EQ(LogoType::ANIMATED, logo->metadata.type);
 }
 
@@ -529,7 +529,7 @@
   EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.full_page_url);
   EXPECT_EQ(0, logo->metadata.iframe_width_px);
   EXPECT_EQ(0, logo->metadata.iframe_height_px);
-  EXPECT_EQ("abc", logo->encoded_image->as_string());
+  EXPECT_EQ("abc", logo->encoded_image->data());
 }
 
 TEST(GoogleNewLogoApiTest, DefaultsInteractiveIframeSize) {
diff --git a/components/search_provider_logos/logo_cache.cc b/components/search_provider_logos/logo_cache.cc
index a7d8404..6603a2a 100644
--- a/components/search_provider_logos/logo_cache.cc
+++ b/components/search_provider_logos/logo_cache.cc
@@ -170,7 +170,7 @@
   if (logo_num_bytes_ != 0) {
     encoded_image = new base::RefCountedString();
 
-    if (!base::ReadFileToString(logo_path, &encoded_image->as_string())) {
+    if (!base::ReadFileToString(logo_path, &encoded_image->data())) {
       UpdateMetadata(nullptr);
       return nullptr;
     }
@@ -187,8 +187,7 @@
   if (dark_logo_num_bytes_ != 0) {
     dark_encoded_image = new base::RefCountedString();
 
-    if (!base::ReadFileToString(dark_logo_path,
-                                &dark_encoded_image->as_string())) {
+    if (!base::ReadFileToString(dark_logo_path, &dark_encoded_image->data())) {
       UpdateMetadata(nullptr);
       return nullptr;
     }
diff --git a/components/search_provider_logos/logo_cache_unittest.cc b/components/search_provider_logos/logo_cache_unittest.cc
index 976e338..21a74670 100644
--- a/components/search_provider_logos/logo_cache_unittest.cc
+++ b/components/search_provider_logos/logo_cache_unittest.cc
@@ -76,7 +76,7 @@
 
 base::RefCountedString* CreateExampleImage(size_t num_bytes) {
   base::RefCountedString* encoded_image_str = new base::RefCountedString();
-  std::string& str = encoded_image_str->as_string();
+  std::string& str = encoded_image_str->data();
   str.resize(num_bytes);
   for (size_t i = 0; i < num_bytes; ++i)
     str[i] = static_cast<char>(i);
diff --git a/components/search_provider_logos/logo_service_impl.cc b/components/search_provider_logos/logo_service_impl.cc
index c172e7e3..4ff10ad 100644
--- a/components/search_provider_logos/logo_service_impl.cc
+++ b/components/search_provider_logos/logo_service_impl.cc
@@ -397,7 +397,7 @@
     scoped_refptr<base::RefCountedString> encoded_image =
         cached_logo->encoded_image;
     image_decoder_->DecodeImage(
-        encoded_image->as_string(), gfx::Size(),  // No particular size desired.
+        encoded_image->data(), gfx::Size(),  // No particular size desired.
         /*data_decoder=*/nullptr,
         ImageDecodedHandlerWithTimeout::Wrap(base::BindOnce(
             &LogoServiceImpl::OnLightCachedImageDecoded,
@@ -437,8 +437,7 @@
       cached_logo->dark_encoded_image;
 
   image_decoder_->DecodeImage(
-      dark_encoded_image->as_string(),
-      gfx::Size(),  // No particular size desired.
+      dark_encoded_image->data(), gfx::Size(),  // No particular size desired.
       /*data_decoder=*/nullptr,
       ImageDecodedHandlerWithTimeout::Wrap(base::BindOnce(
           &LogoServiceImpl::OnCachedLogoAvailable,
@@ -533,7 +532,7 @@
     scoped_refptr<base::RefCountedString> encoded_image = logo->encoded_image;
 
     image_decoder_->DecodeImage(
-        encoded_image->as_string(), gfx::Size(),  // No particular size desired.
+        encoded_image->data(), gfx::Size(),  // No particular size desired.
         /*data_decoder=*/nullptr,
         ImageDecodedHandlerWithTimeout::Wrap(base::BindOnce(
             &LogoServiceImpl::OnLightFreshImageDecoded,
@@ -561,8 +560,7 @@
       logo->dark_encoded_image;
 
   image_decoder_->DecodeImage(
-      dark_encoded_image->as_string(),
-      gfx::Size(),  // No particular size desired.
+      dark_encoded_image->data(), gfx::Size(),  // No particular size desired.
       /*data_decoder=*/nullptr,
       ImageDecodedHandlerWithTimeout::Wrap(base::BindOnce(
           &LogoServiceImpl::OnFreshLogoAvailable,
diff --git a/components/search_provider_logos/logo_service_impl_unittest.cc b/components/search_provider_logos/logo_service_impl_unittest.cc
index be68a5fa..acede1c3 100644
--- a/components/search_provider_logos/logo_service_impl_unittest.cc
+++ b/components/search_provider_logos/logo_service_impl_unittest.cc
@@ -77,13 +77,14 @@
     const SkBitmap& bitmap) {
   scoped_refptr<base::RefCountedMemory> png_bytes =
       gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes();
-  return base::MakeRefCounted<base::RefCountedString>(
-      std::string(base::as_string_view(*png_bytes)));
+  scoped_refptr<base::RefCountedString> str = new base::RefCountedString();
+  str->data().assign(png_bytes->front_as<char>(), png_bytes->size());
+  return str;
 }
 
 std::string EncodeBitmapAsPNGBase64(const SkBitmap& bitmap) {
   scoped_refptr<base::RefCountedString> png_bytes = EncodeBitmapAsPNG(bitmap);
-  return base::Base64Encode(*png_bytes);
+  return base::Base64Encode(png_bytes->data());
 }
 
 SkBitmap MakeBitmap(int width, int height) {
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc
index 62fe453..21e75b2 100644
--- a/components/sync_bookmarks/bookmark_specifics_conversions.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -110,8 +110,9 @@
                                              bookmark_node->GetTitle());
 
   const std::string& icon_bytes_str = specifics.favicon();
-  auto icon_bytes = base::MakeRefCounted<base::RefCountedString>();
-  icon_bytes->as_string().assign(icon_bytes_str);
+  scoped_refptr<base::RefCountedString> icon_bytes(
+      new base::RefCountedString());
+  icon_bytes->data().assign(icon_bytes_str);
 
   GURL icon_url(specifics.icon_url());
 
@@ -324,7 +325,7 @@
   }
 
   if (favicon_bytes.get() && favicon_bytes->size() != 0) {
-    bm_specifics->set_favicon(favicon_bytes->data(), favicon_bytes->size());
+    bm_specifics->set_favicon(favicon_bytes->front(), favicon_bytes->size());
     // Avoid sync-ing favicon URLs that are unreasonably large, as determined by
     // |kMaxFaviconUrlSize|. Most notably, URLs prefixed with the data: scheme
     // to embed the content of the image itself in the URL may be arbitrarily
diff --git a/components/trusted_vault/proto/vault.proto b/components/trusted_vault/proto/vault.proto
index 99017f6..4ecedec 100644
--- a/components/trusted_vault/proto/vault.proto
+++ b/components/trusted_vault/proto/vault.proto
@@ -38,7 +38,20 @@
   SecurityDomainDetails security_domain_details = 3;
 }
 
+message Timestamp {
+  // Represents seconds of UTC time since Unix epoch
+  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+  // 9999-12-31T23:59:59Z inclusive.
+  int64 seconds = 1;
+  // Non-negative fractions of a second at nanosecond resolution. Negative
+  // second values with fractions must still have non-negative nanos values
+  // that count forward in time. Must be from 0 to 999,999,999
+  // inclusive.
+  int32 nanos = 2;
+}
+
 message GooglePasswordManagerPinMetadata {
+  Timestamp expiration_time = 1;
   bytes encrypted_pin_hash = 2;
 }
 
diff --git a/components/trusted_vault/trusted_vault_connection.cc b/components/trusted_vault/trusted_vault_connection.cc
index ed7aab0..d25f0f6 100644
--- a/components/trusted_vault/trusted_vault_connection.cc
+++ b/components/trusted_vault/trusted_vault_connection.cc
@@ -23,9 +23,11 @@
     const TrustedVaultKeyAndVersion& other) const = default;
 
 GpmPinMetadata::GpmPinMetadata(std::optional<std::string> in_public_key,
-                               std::string in_wrapped_pin)
+                               std::string in_wrapped_pin,
+                               base::Time in_expiry)
     : public_key(std::move(in_public_key)),
-      wrapped_pin(std::move(in_wrapped_pin)) {}
+      wrapped_pin(std::move(in_wrapped_pin)),
+      expiry(in_expiry) {}
 
 GpmPinMetadata::GpmPinMetadata(const GpmPinMetadata&) = default;
 
diff --git a/components/trusted_vault/trusted_vault_connection.h b/components/trusted_vault/trusted_vault_connection.h
index 41dac5b..e45f823 100644
--- a/components/trusted_vault/trusted_vault_connection.h
+++ b/components/trusted_vault/trusted_vault_connection.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/functional/callback.h"
+#include "base/time/time.h"
 #include "base/types/strong_alias.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
 
@@ -82,7 +83,8 @@
 // a trusted vault.
 struct GpmPinMetadata {
   GpmPinMetadata(std::optional<std::string> public_key,
-                 std::string wrapped_pin);
+                 std::string wrapped_pin,
+                 base::Time expiry);
   GpmPinMetadata(const GpmPinMetadata&);
   GpmPinMetadata& operator=(const GpmPinMetadata&);
   GpmPinMetadata(GpmPinMetadata&&);
@@ -99,6 +101,9 @@
   std::optional<std::string> public_key;
   // The encrypted PIN value, for validation.
   std::string wrapped_pin;
+  // The time when the underlying recovery-key-store entry will expire. Ignored
+  // when uploading.
+  base::Time expiry;
 };
 
 // The result of calling
diff --git a/components/trusted_vault/trusted_vault_connection_impl.cc b/components/trusted_vault/trusted_vault_connection_impl.cc
index c9f4259..f8385c7 100644
--- a/components/trusted_vault/trusted_vault_connection_impl.cc
+++ b/components/trusted_vault/trusted_vault_connection_impl.cc
@@ -257,6 +257,11 @@
       *last_key_version);
 }
 
+base::Time ToTime(const trusted_vault_pb::Timestamp& proto) {
+  return base::Time::UnixEpoch() + base::Seconds(proto.seconds()) +
+         base::Nanoseconds(proto.nanos());
+}
+
 void ProcessDownloadKeysResponse(
     std::unique_ptr<DownloadKeysResponseHandler> response_handler,
     TrustedVaultConnection::DownloadNewKeysCallback callback,
@@ -403,10 +408,11 @@
       if (member.member_type() == trusted_vault_pb::SecurityDomainMember::
                                       MEMBER_TYPE_GOOGLE_PASSWORD_MANAGER_PIN &&
           member.member_metadata().has_google_password_manager_pin_metadata()) {
+        const auto& pin_metadata =
+            member.member_metadata().google_password_manager_pin_metadata();
         result_.gpm_pin_metadata.emplace(
-            member.public_key(), member.member_metadata()
-                                     .google_password_manager_pin_metadata()
-                                     .encrypted_pin_hash());
+            member.public_key(), pin_metadata.encrypted_pin_hash(),
+            ToTime(pin_metadata.expiration_time()));
       }
     }
 
diff --git a/components/trusted_vault/trusted_vault_connection_impl_unittest.cc b/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
index 594e60f..f469d5f 100644
--- a/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
+++ b/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
@@ -83,6 +83,7 @@
 constexpr char kTestSerializedWrappedPIN[] = "wrapped PIN";
 constexpr char kTestMemberPublicKey[] = "public key";
 constexpr int kTestKeyVersion = 100;
+constexpr int kTestGPMExpirySeconds = 1000000;
 
 enum class Member {
   kPhysical,
@@ -126,9 +127,12 @@
         member->set_member_type(trusted_vault_pb::SecurityDomainMember::
                                     MEMBER_TYPE_GOOGLE_PASSWORD_MANAGER_PIN);
         member->mutable_member_metadata()->set_usable_for_retrieval(true);
-        member->mutable_member_metadata()
-            ->mutable_google_password_manager_pin_metadata()
-            ->set_encrypted_pin_hash(kTestSerializedWrappedPIN);
+        auto* gpm_metadata =
+            member->mutable_member_metadata()
+                ->mutable_google_password_manager_pin_metadata();
+        gpm_metadata->mutable_expiration_time()->set_seconds(
+            kTestGPMExpirySeconds);
+        gpm_metadata->set_encrypted_pin_hash(kTestSerializedWrappedPIN);
         break;
     }
   }
@@ -479,7 +483,8 @@
           /*account_info=*/CoreAccountInfo(),
           GetTrustedVaultKeysWithVersions(kTrustedVaultKeys,
                                           /*last_key_version=*/1234),
-          key_pair->public_key(), GpmPinMetadata(old_public_key, metadata),
+          key_pair->public_key(),
+          GpmPinMetadata(old_public_key, metadata, /*expiry=*/base::Time()),
           TrustedVaultConnection::RegisterAuthenticationFactorCallback());
   EXPECT_THAT(request, NotNull());
 
@@ -1100,8 +1105,9 @@
 TEST_P(TrustedVaultConnectionImplTest,
        DownloadAuthenticationFactorsRegistrationState_Cases) {
   using State = DownloadAuthenticationFactorsRegistrationStateResult::State;
-  const GpmPinMetadata gpm_pin_metadata(kTestMemberPublicKey,
-                                        kTestSerializedWrappedPIN);
+  const GpmPinMetadata gpm_pin_metadata(
+      kTestMemberPublicKey, kTestSerializedWrappedPIN,
+      /*expiry=*/base::Time::FromTimeT(kTestGPMExpirySeconds));
   const struct TestCase {
     // responses contains the set of security domain members included in each
     // page of results from the "server".
diff --git a/components/user_manager/DEPS b/components/user_manager/DEPS
index ff33c42f..6a7b22230 100644
--- a/components/user_manager/DEPS
+++ b/components/user_manager/DEPS
@@ -7,6 +7,7 @@
   "+components/crash/core/common",
   "+google_apis/gaia/gaia_auth_util.h",
   "+third_party/skia/include",
+  "+ui/base/l10n",
   "+ui/base/resource",
   "+ui/chromeos/resources",
   "+ui/gfx/codec",
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc
index dddd142..c42c5e00 100644
--- a/components/user_manager/fake_user_manager.cc
+++ b/components/user_manager/fake_user_manager.cc
@@ -378,14 +378,6 @@
   return false;
 }
 
-void FakeUserManager::ScheduleResolveLocale(
-    const std::string& locale,
-    base::OnceClosure on_resolved_callback,
-    std::string* out_resolved_locale) const {
-  NOTIMPLEMENTED();
-  return;
-}
-
 bool FakeUserManager::IsValidDefaultUserImageId(int image_index) const {
   NOTIMPLEMENTED();
   return false;
diff --git a/components/user_manager/fake_user_manager.h b/components/user_manager/fake_user_manager.h
index 9169eedcc..ae32183 100644
--- a/components/user_manager/fake_user_manager.h
+++ b/components/user_manager/fake_user_manager.h
@@ -115,9 +115,6 @@
   void AsyncRemoveCryptohome(const AccountId& account_id) const override;
   bool IsDeprecatedSupervisedAccountId(
       const AccountId& account_id) const override;
-  void ScheduleResolveLocale(const std::string& locale,
-                             base::OnceClosure on_resolved_callback,
-                             std::string* out_resolved_locale) const override;
   bool IsValidDefaultUserImageId(int image_index) const override;
   MultiUserSignInPolicyController* GetMultiUserSignInPolicyController()
       override;
diff --git a/components/user_manager/user_manager.h b/components/user_manager/user_manager.h
index d20e3f43d..7e24f6e0 100644
--- a/components/user_manager/user_manager.h
+++ b/components/user_manager/user_manager.h
@@ -487,13 +487,6 @@
   // user's session.
   virtual bool HasBrowserRestarted() const = 0;
 
-  // Schedules CheckAndResolveLocale using given task runner and
-  // |on_resolved_callback| as reply callback.
-  virtual void ScheduleResolveLocale(
-      const std::string& locale,
-      base::OnceClosure on_resolved_callback,
-      std::string* out_resolved_locale) const = 0;
-
   // Returns true if |image_index| is a valid default user image index.
   virtual bool IsValidDefaultUserImageId(int image_index) const = 0;
 
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc
index 94df840..7981173 100644
--- a/components/user_manager/user_manager_base.cc
+++ b/components/user_manager/user_manager_base.cc
@@ -29,6 +29,8 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
 #include "base/values.h"
 #include "chromeos/ash/components/settings/cros_settings.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
@@ -42,6 +44,7 @@
 #include "components/user_manager/user_names.h"
 #include "components/user_manager/user_type.h"
 #include "google_apis/gaia/gaia_auth_util.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
 #include "ui/gfx/image/image_skia.h"
@@ -1424,29 +1427,31 @@
 
 void UserManagerBase::UpdateUserAccountLocale(const AccountId& account_id,
                                               const std::string& locale) {
-  std::unique_ptr<std::string> resolved_locale(new std::string());
   if (!locale.empty() && locale != delegate_->GetApplicationLocale()) {
-    // std::move will nullptr out |resolved_locale|, so cache the underlying
-    // ptr.
-    std::string* raw_resolved_locale = resolved_locale.get();
-    ScheduleResolveLocale(
-        locale,
+    base::ThreadPool::PostTaskAndReplyWithResult(
+        FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+        base::BindOnce(
+            [](const std::string& locale) {
+              std::string resolved_locale;
+              std::ignore =
+                  l10n_util::CheckAndResolveLocale(locale, &resolved_locale);
+              return resolved_locale;
+            },
+            locale),
         base::BindOnce(&UserManagerBase::DoUpdateAccountLocale,
-                       weak_factory_.GetWeakPtr(), account_id,
-                       std::move(resolved_locale)),
-        raw_resolved_locale);
+                       weak_factory_.GetWeakPtr(), account_id));
   } else {
-    resolved_locale = std::make_unique<std::string>(locale);
-    DoUpdateAccountLocale(account_id, std::move(resolved_locale));
+    DoUpdateAccountLocale(account_id, locale);
   }
 }
 
 void UserManagerBase::DoUpdateAccountLocale(
     const AccountId& account_id,
-    std::unique_ptr<std::string> resolved_locale) {
+    const std::string& resolved_locale) {
   User* user = FindUserAndModify(account_id);
-  if (user && resolved_locale)
-    user->SetAccountLocale(*resolved_locale);
+  if (user) {
+    user->SetAccountLocale(resolved_locale);
+  }
 }
 
 void UserManagerBase::DeleteUser(User* user) {
diff --git a/components/user_manager/user_manager_base.h b/components/user_manager/user_manager_base.h
index e109cd1..c2f063f 100644
--- a/components/user_manager/user_manager_base.h
+++ b/components/user_manager/user_manager_base.h
@@ -401,7 +401,7 @@
 
   // Updates user account after locale was resolved.
   void DoUpdateAccountLocale(const AccountId& account_id,
-                             std::unique_ptr<std::string> resolved_locale);
+                             const std::string& resolved_locale);
 
   void RemoveLegacySupervisedUser(const AccountId& account_id);
 
diff --git a/components/viz/common/yuv_readback_unittest.cc b/components/viz/common/yuv_readback_unittest.cc
index 682ad114..f4d1d1e 100644
--- a/components/viz/common/yuv_readback_unittest.cc
+++ b/components/viz/common/yuv_readback_unittest.cc
@@ -62,10 +62,10 @@
       std::string* output,
       const scoped_refptr<base::RefCountedString>& json_events_str,
       bool has_more_events) {
-    if (output->size() > 1 && !json_events_str->as_string().empty()) {
+    if (output->size() > 1 && !json_events_str->data().empty()) {
       output->append(",");
     }
-    output->append(json_events_str->as_string());
+    output->append(json_events_str->data());
     if (!has_more_events) {
       std::move(quit_closure).Run();
     }
diff --git a/components/webapps/browser/installable/installable_icon_fetcher.cc b/components/webapps/browser/installable/installable_icon_fetcher.cc
index ced7956..eedb405e 100644
--- a/components/webapps/browser/installable/installable_icon_fetcher.cc
+++ b/components/webapps/browser/installable/installable_icon_fetcher.cc
@@ -99,7 +99,7 @@
   SkBitmap decoded;
   if (bitmap_result.is_valid()) {
     base::AssertLongCPUWorkAllowed();
-    gfx::PNGCodec::Decode(bitmap_result.bitmap_data->data(),
+    gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(),
                           bitmap_result.bitmap_data->size(), &decoded);
   }
 
diff --git a/content/browser/background_fetch/storage/image_helpers.cc b/content/browser/background_fetch/storage/image_helpers.cc
index cbd4c80..dbee0df 100644
--- a/content/browser/background_fetch/storage/image_helpers.cc
+++ b/content/browser/background_fetch/storage/image_helpers.cc
@@ -21,8 +21,11 @@
 constexpr int kMaxIconResolution = 256 * 256;
 
 std::string ConvertAndSerializeIcon(const SkBitmap& icon) {
+  std::string serialized_icon;
   auto icon_bytes = gfx::Image::CreateFrom1xBitmap(icon).As1xPNGBytes();
-  return std::string(base::as_string_view(*icon_bytes));
+  serialized_icon.assign(icon_bytes->front_as<char>(),
+                         icon_bytes->front_as<char>() + icon_bytes->size());
+  return serialized_icon;
 }
 
 SkBitmap DeserializeAndConvertIcon(
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc
index c837c64..13dc3d4a 100644
--- a/content/browser/devtools/devtools_agent_host_impl.cc
+++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -382,7 +382,8 @@
     scoped_refptr<base::RefCountedMemory> data) {
   scoped_refptr<DevToolsStreamFile> stream =
       DevToolsStreamFile::Create(GetIOContext(), true /* binary */);
-  stream->Append(std::make_unique<std::string>(base::as_string_view(*data)));
+  std::string text(reinterpret_cast<const char*>(data->front()), data->size());
+  stream->Append(std::make_unique<std::string>(text));
   return stream->handle();
 }
 
diff --git a/content/browser/devtools/devtools_frontend_host_impl.cc b/content/browser/devtools/devtools_frontend_host_impl.cc
index a94ceac..15e152fd 100644
--- a/content/browser/devtools/devtools_frontend_host_impl.cc
+++ b/content/browser/devtools/devtools_frontend_host_impl.cc
@@ -99,7 +99,7 @@
   scoped_refptr<base::RefCountedMemory> bytes = GetFrontendResourceBytes(path);
   if (!bytes)
     return std::string();
-  return std::string(base::as_string_view(*bytes));
+  return std::string(bytes->front_as<char>(), bytes->size());
 }
 
 DevToolsFrontendHostImpl::DevToolsFrontendHostImpl(
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
index 2068552e..724be96 100644
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -701,10 +701,11 @@
   scoped_refptr<base::RefCountedMemory> bytes =
       GetContentClient()->GetDataResourceBytes(kCcompressedProtocolJSON);
   CHECK(bytes) << "Could not load protocol";
+  std::string json_protocol(reinterpret_cast<const char*>(bytes->front()),
+                            bytes->size());
 
   net::HttpServerResponseInfo response(net::HTTP_OK);
-  response.SetBody(std::string(base::as_string_view(*bytes)),
-                   "application/json; charset=UTF-8");
+  response.SetBody(json_protocol, "application/json; charset=UTF-8");
 
   thread_->task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&ServerWrapper::SendResponse,
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc
index 933ccce..531f27b3 100644
--- a/content/browser/devtools/devtools_url_loader_interceptor.cc
+++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -217,7 +217,7 @@
  private:
   void OnDataAvailable(const void* data, size_t num_bytes) override {
     DCHECK(!data_complete_);
-    body_->as_string().append(
+    body_->data().append(
         std::string(static_cast<const char*>(data), num_bytes));
   }
 
@@ -245,7 +245,7 @@
   data_complete_ = true;
   body_pipe_drainer_.reset();
   // TODO(caseq): only encode if necessary.
-  encoded_body_ = base::Base64Encode(*body_);
+  encoded_body_ = base::Base64Encode(body_->data());
   for (auto& cb : callbacks_)
     cb->sendSuccess(encoded_body_, true);
   callbacks_.clear();
@@ -1229,10 +1229,11 @@
       size_t bytes_to_sniff =
           std::min(body_size, static_cast<size_t>(net::kMaxBytesToSniff));
       const std::string hint = head->mime_type;
-      net::SniffMimeType(base::as_string_view(*body).substr(
-                             response_body_offset, bytes_to_sniff),
-                         url, hint, net::ForceSniffFileUrlsForHtml::kDisabled,
-                         &head->mime_type);
+      net::SniffMimeType(
+          std::string_view(body->front_as<const char>() + response_body_offset,
+                           bytes_to_sniff),
+          url, hint, net::ForceSniffFileUrlsForHtml::kDisabled,
+          &head->mime_type);
       head->did_mime_sniff = true;
     } else if (head->mime_type.empty()) {
       head->mime_type.assign("text/plain");
@@ -1372,7 +1373,7 @@
   if (body) {
     size_t num_bytes = body_size;
     MojoResult res = producer_handle->WriteData(
-        body->data() + offset, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
+        body->front() + offset, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
     DCHECK_EQ(0u, res);
     DCHECK_EQ(num_bytes, body_size);
   }
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 61876f1..14c9dd0 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -291,6 +291,7 @@
     switches::kOzonePlatform,
     switches::kDisableExplicitDmaFences,
     switches::kOzoneDumpFile,
+    switches::kEnableNativeGpuMemoryBuffers,
 #endif
 #if BUILDFLAG(IS_LINUX)
     switches::kX11Display,
diff --git a/content/browser/payments/payment_app_provider_impl.cc b/content/browser/payments/payment_app_provider_impl.cc
index dca797b..eacf7fe 100644
--- a/content/browser/payments/payment_app_provider_impl.cc
+++ b/content/browser/payments/payment_app_provider_impl.cc
@@ -84,7 +84,8 @@
 
   gfx::Image decoded_image = gfx::Image::CreateFrom1xBitmap(app_icon);
   scoped_refptr<base::RefCountedMemory> raw_data = decoded_image.As1xPNGBytes();
-  return base::Base64Encode(*raw_data);
+  return base::Base64Encode(
+      std::string_view(raw_data->front_as<char>(), raw_data->size()));
 }
 
 void CheckRegistrationSuccess(base::OnceCallback<void(bool success)> callback,
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index e57f8c14..fad24f0 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -2656,9 +2656,10 @@
   // From the GURL's POV, the only important part here is scheme, it doesn't
   // check the actual content. Thus we can take only the prefix of the url, to
   // avoid unneeded copying of a potentially long string.
-  constexpr size_t kDataUriPrefixMaxLen = 64;
-  const size_t len = std::min(data_url_as_string->size(), kDataUriPrefixMaxLen);
-  GURL data_url(base::as_string_view(*data_url_as_string).substr(0u, len));
+  const size_t kDataUriPrefixMaxLen = 64;
+  GURL data_url(
+      std::string(data_url_as_string->front_as<char>(),
+                  std::min(data_url_as_string->size(), kDataUriPrefixMaxLen)));
   if (!data_url.is_valid() || !data_url.SchemeIs(url::kDataScheme))
     return false;
 
@@ -4034,7 +4035,7 @@
           /*visited_link_salt=*/std::nullopt);
 #if BUILDFLAG(IS_ANDROID)
   if (ValidateDataURLAsString(params.data_url_as_string)) {
-    commit_params->data_url_as_string = params.data_url_as_string->as_string();
+    commit_params->data_url_as_string = params.data_url_as_string->data();
   }
 #endif
 
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc
index 487f0bb..a0825a5 100644
--- a/content/browser/renderer_host/navigation_entry_impl.cc
+++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -473,7 +473,7 @@
     scoped_refptr<base::RefCountedString> data_url) {
   if (data_url) {
     // A quick check that it's actually a data URL.
-    DCHECK(base::StartsWith(base::as_string_view(*data_url), url::kDataScheme,
+    DCHECK(base::StartsWith(data_url->front_as<char>(), url::kDataScheme,
                             base::CompareCase::SENSITIVE));
   }
   data_url_as_string_ = std::move(data_url);
@@ -977,10 +977,9 @@
   // main frames, because loadData* navigations can only happen on the main
   // frame.
   bool is_for_main_frame = (root_node()->frame_entry == &frame_entry);
-  scoped_refptr<const base::RefCountedString> string = GetDataURLAsString();
   if (is_for_main_frame &&
-      NavigationControllerImpl::ValidateDataURLAsString(string)) {
-    commit_params->data_url_as_string = string->as_string();
+      NavigationControllerImpl::ValidateDataURLAsString(GetDataURLAsString())) {
+    commit_params->data_url_as_string = GetDataURLAsString()->data();
   }
 #endif
 
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index d0dad33..c63d7fd 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -328,8 +328,7 @@
   scoped_refptr<ServiceWorkerRegistration> GetLiveRegistration(
       int64_t registration_id);
   void AddLiveRegistration(ServiceWorkerRegistration* registration);
-  // RemoveLiveRegistration removes registration from |live_registrations_|
-  // and notifies all observers of the id of the registration removed.
+  // Erases the live registration for `registration_id`, if found.
   void RemoveLiveRegistration(int64_t registration_id);
   const std::map<int64_t, ServiceWorkerRegistration*>& GetLiveRegistrations()
       const {
diff --git a/content/browser/tracing/cros_tracing_agent.cc b/content/browser/tracing/cros_tracing_agent.cc
index 20715495..3623029a 100644
--- a/content/browser/tracing/cros_tracing_agent.cc
+++ b/content/browser/tracing/cros_tracing_agent.cc
@@ -196,7 +196,7 @@
   // Called on any thread.
   void OnTraceData(base::OnceClosure stop_complete_callback,
                    const scoped_refptr<base::RefCountedString>& events) {
-    if (!events || events->as_string().empty()) {
+    if (!events || events->data().empty()) {
       OnTraceDataCommitted(std::move(stop_complete_callback));
       return;
     }
diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc
index 1d0992c5..9063166 100644
--- a/content/browser/tracing/tracing_ui.cc
+++ b/content/browser/tracing/tracing_ui.cc
@@ -58,7 +58,7 @@
   }
 
   auto res = base::MakeRefCounted<base::RefCountedString>();
-  base::JSONWriter::Write(category_list, &res->as_string());
+  base::JSONWriter::Write(category_list, &res->data());
   std::move(callback).Run(res);
 }
 
@@ -144,7 +144,7 @@
 void TracingCallbackWrapperBase64(WebUIDataSource::GotDataCallback callback,
                                   std::unique_ptr<std::string> data) {
   base::RefCountedString* data_base64 = new base::RefCountedString();
-  data_base64->as_string() = base::Base64Encode(*data);
+  data_base64->data() = base::Base64Encode(*data);
   std::move(callback).Run(data_base64);
 }
 
diff --git a/content/browser/webui/web_ui_data_source_unittest.cc b/content/browser/webui/web_ui_data_source_unittest.cc
index 8d39fbe..02f8fc3 100644
--- a/content/browser/webui/web_ui_data_source_unittest.cc
+++ b/content/browser/webui/web_ui_data_source_unittest.cc
@@ -94,7 +94,7 @@
 
 void EmptyStringsCallback(bool from_js_module,
                           scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find("loadTimeData.data = {"), std::string::npos);
   EXPECT_NE(result.find("};"), std::string::npos);
   bool has_import = result.find("import {loadTimeData}") != std::string::npos;
@@ -112,7 +112,7 @@
 }
 
 void SomeValuesCallback(scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find("\"flag\":true"), std::string::npos);
   EXPECT_NE(result.find("\"counter\":10"), std::string::npos);
   EXPECT_NE(result.find("\"debt\":-456"), std::string::npos);
@@ -133,13 +133,13 @@
 }
 
 void DefaultResourceFoobarCallback(scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
 }
 
 void DefaultResourceStringsCallback(
     scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
 }
 
@@ -151,12 +151,12 @@
 }
 
 void NamedResourceFoobarCallback(scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyResource), std::string::npos);
 }
 
 void NamedResourceStringsCallback(scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
 }
 
@@ -169,7 +169,7 @@
 
 void NamedResourceWithQueryStringCallback(
     scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyResource), std::string::npos);
 }
 
@@ -183,7 +183,7 @@
 void NamedResourceWithUrlFragmentCallback(
     scoped_refptr<base::RefCountedMemory> data) {
   EXPECT_NE(data, nullptr);
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyResource), std::string::npos);
 }
 
@@ -195,7 +195,7 @@
 
 void WebUIDataSourceTest::RequestFilterQueryStringCallback(
     scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   // Check that the query string is passed to the request filter (and not
   // trimmed).
   EXPECT_EQ("foobar?query?string", request_path_);
@@ -282,7 +282,7 @@
 }
 
 void NamedResourceBarJSCallback(scoped_refptr<base::RefCountedMemory> data) {
-  std::string result(base::as_string_view(*data));
+  std::string result(data->front_as<char>(), data->size());
   EXPECT_NE(result.find(kDummyJSResource), std::string::npos);
 }
 
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc
index 3a9a162e..3879322 100644
--- a/content/browser/webui/web_ui_url_loader_factory.cc
+++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -81,7 +81,8 @@
   if (replacements) {
     // We won't know the the final output size ahead of time, so we have to
     // use an intermediate string.
-    auto input = base::as_string_view(*bytes);
+    std::string_view input(reinterpret_cast<const char*>(bytes->front()),
+                           bytes->size());
     std::string temp_str;
     if (replace_in_js) {
       CHECK(
diff --git a/content/browser/webui/web_ui_url_loader_factory_unittest.cc b/content/browser/webui/web_ui_url_loader_factory_unittest.cc
index 78ec7de2..9797c24a 100644
--- a/content/browser/webui/web_ui_url_loader_factory_unittest.cc
+++ b/content/browser/webui/web_ui_url_loader_factory_unittest.cc
@@ -97,12 +97,11 @@
         delete;
 
     // base::RefCountedMemory implementation:
-    base::span<const uint8_t> AsSpan() const override {
-      // SAFETY: This is unsound, but any use of the pointer will crash as the
-      // first page is not mapped. The test does not actually use the pointer.
-      return UNSAFE_BUFFERS(base::span<const uint8_t>(
-          static_cast<const uint8_t*>(nullptr), size_));
+    const unsigned char* front() const override {
+      NOTREACHED();
+      return nullptr;
     }
+    size_t size() const override { return size_; }
 
    private:
     ~OversizedRefCountedMemory() override = default;
diff --git a/content/public/common/content_client.cc b/content/public/common/content_client.cc
index 1045f21..c558c75 100644
--- a/content/public/common/content_client.cc
+++ b/content/public/common/content_client.cc
@@ -125,7 +125,7 @@
       GetDataResourceBytes(resource_id);
   if (!memory)
     return std::string();
-  return std::string(base::as_string_view(*memory));
+  return std::string(memory->front_as<char>(), memory->size());
 }
 
 gfx::Image& ContentClient::GetNativeImageNamed(int resource_id) {
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index b726126e..e6ece0d2 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -415,8 +415,8 @@
   net::GZipHeader::Status header_status = net::GZipHeader::INCOMPLETE_HEADER;
   const char* header_end = nullptr;
   while (header_status == net::GZipHeader::INCOMPLETE_HEADER) {
-    auto chars = base::as_chars(base::span(maybe_gzipped));
-    header_status = header.ReadMore(chars.data(), chars.size(), &header_end);
+    header_status = header.ReadMore(maybe_gzipped.front_as<char>(),
+                                    maybe_gzipped.size(), &header_end);
   }
   return header_status == net::GZipHeader::COMPLETE_HEADER;
 }
@@ -424,13 +424,11 @@
 void AppendGzippedResource(const base::RefCountedMemory& encoded,
                            std::string* to_append) {
   auto source_stream = std::make_unique<net::MockSourceStream>();
-  auto encoded_chars = base::as_chars(base::span(encoded));
-  source_stream->AddReadResult(encoded_chars.data(), encoded_chars.size(),
+  source_stream->AddReadResult(encoded.front_as<char>(), encoded.size(),
                                net::OK, net::MockSourceStream::SYNC);
   // Add an EOF.
-  auto end = encoded_chars.last(0u);
-  source_stream->AddReadResult(end.data(), end.size(), net::OK,
-                               net::MockSourceStream::SYNC);
+  source_stream->AddReadResult(encoded.front_as<char>() + encoded.size(), 0,
+                               net::OK, net::MockSourceStream::SYNC);
   std::unique_ptr<net::GzipSourceStream> filter = net::GzipSourceStream::Create(
       std::move(source_stream), net::SourceStream::TYPE_GZIP);
   scoped_refptr<net::IOBufferWithSize> dest_buffer =
@@ -1915,12 +1913,10 @@
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
           IDR_ASH_WEBUI_COMMON_WEBUI_RESOURCE_TEST_JS);
 
-  if (HasGzipHeader(*bytes)) {
+  if (HasGzipHeader(*bytes))
     AppendGzippedResource(*bytes, &script);
-  } else {
-    auto chars = base::as_chars(base::span(*bytes));
-    script.append(chars.data(), chars.size());
-  }
+  else
+    script.append(bytes->front_as<char>(), bytes->size());
 
   script.append("\n");
   ExecuteScriptAsync(web_contents, script);
diff --git a/content/public/test/web_ui_browsertest_util.cc b/content/public/test/web_ui_browsertest_util.cc
index d08d27c..c0baed3 100644
--- a/content/public/test/web_ui_browsertest_util.cc
+++ b/content/public/test/web_ui_browsertest_util.cc
@@ -49,7 +49,7 @@
   CHECK(base::ReadFileToString(path, &contents)) << path.value();
 
   base::RefCountedString* ref_contents = new base::RefCountedString;
-  ref_contents->as_string() = contents;
+  ref_contents->data() = contents;
   std::move(callback).Run(ref_contents);
 }
 
diff --git a/device/BUILD.gn b/device/BUILD.gn
index 55134a17..9d8800dc 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -177,6 +177,7 @@
       "fido/ctap_request_unittest.cc",
       "fido/ctap_response_unittest.cc",
       "fido/enclave/enclave_protocol_utils_unittest.cc",
+      "fido/enclave/verify/utils_unittest.cc",
       "fido/fake_fido_discovery_unittest.cc",
       "fido/fido_device_authenticator_unittest.cc",
       "fido/fido_device_discovery_unittest.cc",
diff --git a/device/fido/BUILD.gn b/device/fido/BUILD.gn
index 3fdcec61..d0986f4 100644
--- a/device/fido/BUILD.gn
+++ b/device/fido/BUILD.gn
@@ -167,6 +167,8 @@
       "enclave/verify/claim.h",
       "enclave/verify/endorsement.cc",
       "enclave/verify/endorsement.h",
+      "enclave/verify/utils.h",
+      "enclave/verify/utils.cc",
       "enclave/verify/verify.h",
       "fido_authenticator.cc",
       "fido_authenticator.h",
diff --git a/device/fido/enclave/constants.cc b/device/fido/enclave/constants.cc
index b6225a76..dd26b093 100644
--- a/device/fido/enclave/constants.cc
+++ b/device/fido/enclave/constants.cc
@@ -87,6 +87,7 @@
 const char kRequestSecretKey[] = "secret";
 const char kRequestCounterIDKey[] = "counter_id";
 const char kRequestVaultHandleWithoutTypeKey[] = "vault_handle_without_type";
+const char kRequestWrappedPINDataKey[] = "wrapped_pin_data";
 
 const char kResponseSuccessKey[] = "ok";
 const char kResponseErrorKey[] = "err";
@@ -98,6 +99,7 @@
 const char kPasskeysWrapPinCommandName[] = "passkeys/wrap_pin";
 const char kRecoveryKeyStoreWrapAsMemberCommandName[] =
     "recovery_key_store/wrap_as_member";
+const char kRecoveryKeyStoreRewrapCommandName[] = "recovery_key_store/rewrap";
 
 const char kRegisterPubKeysKey[] = "pub_keys";
 const char kRegisterDeviceIdKey[] = "device_id";
diff --git a/device/fido/enclave/constants.h b/device/fido/enclave/constants.h
index 5e575c2..a14a283 100644
--- a/device/fido/enclave/constants.h
+++ b/device/fido/enclave/constants.h
@@ -51,6 +51,7 @@
 COMPONENT_EXPORT(DEVICE_FIDO) extern const char kRequestCounterIDKey[];
 COMPONENT_EXPORT(DEVICE_FIDO)
 extern const char kRequestVaultHandleWithoutTypeKey[];
+COMPONENT_EXPORT(DEVICE_FIDO) extern const char kRequestWrappedPINDataKey[];
 
 // Keys in the top-level of each response.
 COMPONENT_EXPORT(DEVICE_FIDO) extern const char kResponseSuccessKey[];
@@ -65,6 +66,8 @@
 COMPONENT_EXPORT(DEVICE_FIDO) extern const char kPasskeysWrapPinCommandName[];
 COMPONENT_EXPORT(DEVICE_FIDO)
 extern const char kRecoveryKeyStoreWrapAsMemberCommandName[];
+COMPONENT_EXPORT(DEVICE_FIDO)
+extern const char kRecoveryKeyStoreRewrapCommandName[];
 
 // Register request keys
 COMPONENT_EXPORT(DEVICE_FIDO) extern const char kRegisterPubKeysKey[];
diff --git a/device/fido/enclave/enclave_protocol_utils.cc b/device/fido/enclave/enclave_protocol_utils.cc
index 5d0361b..7d74d07 100644
--- a/device/fido/enclave/enclave_protocol_utils.cc
+++ b/device/fido/enclave/enclave_protocol_utils.cc
@@ -50,7 +50,6 @@
 const char kRequestDataKey[] = "request";
 const char kRequestClientDataJSONKey[] = "client_data_json";
 const char kRequestClaimedPINKey[] = "claimed_pin";
-const char kRequestWrappedPINDataKey[] = "wrapped_pin_data";
 
 // JSON keys for GetAssertion request fields.
 const char kGetAssertionRequestProtobufKey[] = "protobuf";
diff --git a/device/fido/enclave/verify/utils.cc b/device/fido/enclave/verify/utils.cc
new file mode 100644
index 0000000..f76464a
--- /dev/null
+++ b/device/fido/enclave/verify/utils.cc
@@ -0,0 +1,22 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/fido/enclave/verify/utils.h"
+
+#include <string>
+
+#include "base/strings/string_util.h"
+
+namespace device::enclave {
+
+constexpr char kPemHeader[] = "-----BEGIN PUBLIC KEY-----";
+constexpr char kPemFooter[] = "-----END PUBLIC KEY-----";
+
+bool LooksLikePem(std::string_view maybe_pem) {
+  std::string_view trimmed =
+      base::TrimWhitespaceASCII(maybe_pem, base::TrimPositions::TRIM_ALL);
+  return trimmed.starts_with(kPemHeader) && trimmed.ends_with(kPemFooter);
+}
+
+}  // namespace device::enclave
diff --git a/device/fido/enclave/verify/utils.h b/device/fido/enclave/verify/utils.h
new file mode 100644
index 0000000..6177794
--- /dev/null
+++ b/device/fido/enclave/verify/utils.h
@@ -0,0 +1,19 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_FIDO_ENCLAVE_VERIFY_UTILS_H_
+#define DEVICE_FIDO_ENCLAVE_VERIFY_UTILS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+
+namespace device::enclave {
+
+// Makes a plausible guess whether the public key is in PEM format.
+bool COMPONENT_EXPORT(DEVICE_FIDO) LooksLikePem(std::string_view maybe_pem);
+
+}  // namespace device::enclave
+
+#endif  // DEVICE_FIDO_ENCLAVE_VERIFY_UTILS_H_
diff --git a/device/fido/enclave/verify/utils_unittest.cc b/device/fido/enclave/verify/utils_unittest.cc
new file mode 100644
index 0000000..217b7e8
--- /dev/null
+++ b/device/fido/enclave/verify/utils_unittest.cc
@@ -0,0 +1,25 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/fido/enclave/verify/utils.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace device::enclave {
+
+constexpr char kTestPem[] =
+    "-----BEGIN PUBLIC KEY-----\n"
+    "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbwRcQY2YvUhp8QpjBDjDYtgrjAWJ\n"
+    "a/ewUKu7URKVMbziN8Idzu7neKcvf2QKPkYXReply6fOufdXZJ+SPVqXBg==\n"
+    "-----END PUBLIC KEY-----";
+
+TEST(UtilsTest, LooksLikePem_WithValidPem_ReturnsTrue) {
+  EXPECT_TRUE(device::enclave::LooksLikePem(kTestPem));
+}
+
+TEST(UtilsTest, LooksLikePem_WithInvalidPem_ReturnsFalse) {
+  EXPECT_FALSE(device::enclave::LooksLikePem("This should return false"));
+}
+
+}  // namespace device::enclave
diff --git a/extensions/browser/api/printer_provider/printer_provider_internal_api.cc b/extensions/browser/api/printer_provider/printer_provider_internal_api.cc
index 119de3df..8b7064d 100644
--- a/extensions/browser/api/printer_provider/printer_provider_internal_api.cc
+++ b/extensions/browser/api/printer_provider/printer_provider_internal_api.cc
@@ -189,7 +189,9 @@
   // |job->document_bytes| are passed to the callback to make sure the ref
   // counted memory does not go away before the memory backed blob is created.
   browser_context()->CreateMemoryBackedBlob(
-      base::span(*job->document_bytes), job->content_type,
+      base::make_span(job->document_bytes->front(),
+                      job->document_bytes->size()),
+      job->content_type,
       base::BindOnce(&PrinterProviderInternalGetPrintDataFunction::OnBlob, this,
                      job->document_bytes));
   return RespondLater();
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index 6e8cc80..b154362 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -80,7 +80,7 @@
   void* memory(size_t plane) override {
     DCHECK(mapped_);
     DCHECK_LT(plane, gfx::NumberOfPlanesForLinearBufferFormat(format_));
-    return bytes_->as_vector().data() +
+    return reinterpret_cast<uint8_t*>(&bytes_->data().front()) +
            gfx::BufferOffsetForBufferFormat(size_, format_, plane);
   }
   void Unmap() override {
diff --git a/infra/config/generated/builders/build/Mac Builder Siso FYI/shadow-properties.json b/infra/config/generated/builders/build/Mac Builder Siso FYI/shadow-properties.json
index 1d6e298..d470256 100644
--- a/infra/config/generated/builders/build/Mac Builder Siso FYI/shadow-properties.json
+++ b/infra/config/generated/builders/build/Mac Builder Siso FYI/shadow-properties.json
@@ -1,4 +1,10 @@
 {
+  "$build/reclient": {
+    "instance": "rbe-chromium-untrusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics",
+    "scandeps_server": true
+  },
   "$build/siso": {
     "configs": [
       "builder"
diff --git a/infra/config/generated/builders/build/Mac13 Tests Siso FYI/properties.json b/infra/config/generated/builders/build/Mac13 Tests Siso FYI/properties.json
index 4e178d5..62f8bf9 100644
--- a/infra/config/generated/builders/build/Mac13 Tests Siso FYI/properties.json
+++ b/infra/config/generated/builders/build/Mac13 Tests Siso FYI/properties.json
@@ -72,15 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted"
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/build/Mac13 Tests Siso FYI/shadow-properties.json b/infra/config/generated/builders/build/Mac13 Tests Siso FYI/shadow-properties.json
deleted file mode 100644
index 1d6e298..0000000
--- a/infra/config/generated/builders/build/Mac13 Tests Siso FYI/shadow-properties.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted"
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/properties.json"
index 83fb9e5c..a777d48 100644
--- "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/properties.json"
index 21e871e..a4e60b2 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Motorola Moto G Power 5G\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/properties.json"
index d07afd1..09b9d5a 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/properties.json"
@@ -74,16 +74,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050NVIDIA Shield TV\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/properties.json"
index d697c90..df011ce 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/properties.json"
index 144b5ad44..6dbe019 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/properties.json"
index f40e420..0159f3c 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/properties.json"
index 4773ea7..accf0983 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/properties.json"
@@ -84,16 +84,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/properties.json"
index 64ad4fb..7efbfad 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/properties.json"
@@ -68,16 +68,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A13\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/properties.json"
index ba5a4e6e..10a4648 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/properties.json"
@@ -68,16 +68,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung A23\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/properties.json"
index 885dc48..14cadd8 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Samsung S23\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android WebView O \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Android WebView O \050dbg\051/properties.json"
index 2024479..a703503 100644
--- "a/infra/config/generated/builders/ci/Android WebView O \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android WebView O \050dbg\051/properties.json"
@@ -92,16 +92,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android WebView O \050dbg\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android WebView O \050dbg\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Android WebView O \050dbg\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android WebView P \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Android WebView P \050dbg\051/properties.json"
index c070563a..36a79db7 100644
--- "a/infra/config/generated/builders/ci/Android WebView P \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Android WebView P \050dbg\051/properties.json"
@@ -92,16 +92,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Android WebView P \050dbg\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Android WebView P \050dbg\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Android WebView P \050dbg\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/properties.json"
index 43e9aae..fe3a3402b 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Nexus 5X\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/properties.json"
index b115a522..0b86c78 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm DEPS Release \050Pixel 4\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/properties.json"
index a85fee9..a4560d9f 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Nexus 5X\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/properties.json"
index 4b553a0..01bfb967 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm Release \050Pixel 4\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/properties.json"
index 5d9822f..a0c2981 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/properties.json"
@@ -76,16 +76,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release \050Pixel 6\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/properties.json"
index 6a7ed6d3..4ad286d 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release \050Pixel 6\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/properties.json"
index 7f83948..95fce2c2 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Pixel 6\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/properties.json"
index 3cac567..c2c69bcd 100644
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Android arm64 Release \050Samsung S24\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/properties.json"
index e360ffc..366fbe9 100644
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050Intel UHD 630\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/properties.json"
index 39ebcfe0..ee920e7 100644
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/properties.json"
index fe8413c..8cec660 100644
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release \050Intel UHD 630\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/properties.json"
index d9e4fe9..a898ab1 100644
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050Intel UHD 630\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/properties.json"
index 92097d84..b7522630 100644
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Linux x64 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/properties.json"
index e9b6473..b59fb48c 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release \050Apple M2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/properties.json"
index eaa34e9..d821321 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/properties.json"
@@ -82,16 +82,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release \050Apple M2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/properties.json"
index 8cdd459..f4a50fa 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/properties.json"
@@ -86,16 +86,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac arm64 Release \050Apple M2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/properties.json"
index fc562e0..e521e4c6 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/properties.json"
index ce3b6db3..0ed01df 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/properties.json"
index 6ca25b4..7dbc1f2 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/properties.json"
index 38c7eb5..4ca1c81 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/properties.json"
index 363231c..2388601 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/properties.json"
index bd85f5d..252ff4d 100644
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Mac x64 Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/properties.json"
index 48cc6bd..7b76d20 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/properties.json"
index 8feb5a9..d1193a6 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/properties.json"
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
index 76b14fe..fa787e4 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/properties.json"
index e58e3146..4af5581 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/properties.json"
index 47e5005..01076df1 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/properties.json"
index 28b7d24..c0902e90 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
index ed0bcc5..d806a1b5 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/properties.json"
index 839bccee..9bc6c05 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
index a75189ae..f02866f 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/properties.json"
index 2d3cd4a..f15d39ea 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/properties.json"
index 176116bb..5b16bd8 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/properties.json"
index 8b97a747..8543f4b 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
index 1c1b35c..523d9122 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/properties.json"
index ce1e830..f301956c9 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/properties.json"
@@ -78,16 +78,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/properties.json"
index a744c0a..89f945d5 100644
--- "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/properties.json"
index 2b19ef5..50de2aa 100644
--- "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Lacros FYI x64 Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/properties.json" "b/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/properties.json"
index 2670b1c..0dc60b2 100644
--- "a/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/properties.json"
@@ -75,16 +75,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Linux ASan LSan Tests \0501\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/properties.json" "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/properties.json"
index 2ca66b2f..b8ecfec 100644
--- "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/properties.json"
@@ -81,16 +81,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
index 10e3a4f..3d0ac62 100644
--- a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
+++ b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/shadow-properties.json b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/properties.json"
index 2313193..00021313 100644
--- "a/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux Debug \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/properties.json"
index 2e759e3..9354ade 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Debug \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/properties.json"
index fa1e956..84325129 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050Intel UHD 630\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/properties.json"
index ed26615..3563fa3 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Experimental Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/properties.json"
index f89ea35..b2041db 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050AMD RX 5500 XT\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/properties.json"
index 6c0f9f74..2ca6342 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 630\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/properties.json"
index 2f1294d7..266fd75 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050Intel UHD 770\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/properties.json"
index 4d73a9f..de7701ec 100644
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/properties.json"
index 913659c..adfb6c6 100644
--- "a/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/properties.json"
@@ -95,16 +95,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Linux Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/properties.json" "b/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/properties.json"
index a0ec0e4f..f3e71e4 100644
--- "a/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Linux Tests \050Wayland\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/properties.json" "b/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/properties.json"
index 17227fe3..13b0cec0 100644
--- "a/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/properties.json"
@@ -78,16 +78,6 @@
       "targets_spec_directory": "src/infra/config/generated/builders/ci/Linux Tests (dbg)(1)/targets"
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Linux Tests \050dbg\051\0501\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Linux Tests/properties.json b/infra/config/generated/builders/ci/Linux Tests/properties.json
index 38ec3ef..db115cf 100644
--- a/infra/config/generated/builders/ci/Linux Tests/properties.json
+++ b/infra/config/generated/builders/ci/Linux Tests/properties.json
@@ -95,16 +95,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Linux Tests/shadow-properties.json b/infra/config/generated/builders/ci/Linux Tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/Linux Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/properties.json" "b/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/properties.json"
index 5623dda..5c2227c 100644
--- "a/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/shadow-properties.json"
deleted file mode 100644
index 5271cc6a..0000000
--- "a/infra/config/generated/builders/ci/Mac ASan 64 Tests \0501\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac Debug \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac Debug \050Intel\051/properties.json"
index 02ec64d..d3ebc37 100644
--- "a/infra/config/generated/builders/ci/Mac Debug \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac Debug \050Intel\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac Debug \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac Debug \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac Debug \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/properties.json"
index f7a89bb..de5a1f6 100644
--- "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/properties.json"
index 3349b6c..d51f5364 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Debug \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/properties.json"
index 290a189..8594ba9 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/properties.json"
@@ -74,16 +74,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/properties.json"
index a830973..5fc86287 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/properties.json"
index ab01ccc..d1e0602 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/properties.json"
index 94194c1..def508f 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/properties.json"
@@ -74,16 +74,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050Apple M2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/properties.json"
index 56eb1605..5530473 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/properties.json"
index 121996b..52b6b2e 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/properties.json"
@@ -74,16 +74,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/properties.json"
index b47d4c4..3c28f74 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/properties.json"
index c9dad3c..5ad323d 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/properties.json"
index 90ae587c..76f8880 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Debug \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/properties.json"
index 2116ae9..2e80e594 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/properties.json"
index 8fa26bb..5d9e78d 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/properties.json"
@@ -74,16 +74,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/properties.json"
index e581f31..478be896 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/properties.json"
index 7cf9c78..82e9aac 100644
--- "a/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac Pro FYI Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Mac Release \050Intel\051/properties.json"
index cdc2c8ce..58648bd 100644
--- "a/infra/config/generated/builders/ci/Mac Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac Release \050Intel\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/properties.json"
index 2849e226..aca19d4d 100644
--- "a/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac Retina Debug \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/properties.json" "b/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/properties.json"
index 9c2cf1e..83706f8 100644
--- "a/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/properties.json"
@@ -77,16 +77,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac Retina Release \050AMD\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json b/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
index f4f5dde6..0e9f55e 100644
--- a/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
+++ b/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
@@ -81,16 +81,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Mac10.15 Tests/shadow-properties.json b/infra/config/generated/builders/ci/Mac10.15 Tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/Mac10.15 Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac11 Tests/properties.json b/infra/config/generated/builders/ci/Mac11 Tests/properties.json
index e808e1b3..2a8f2ee 100644
--- a/infra/config/generated/builders/ci/Mac11 Tests/properties.json
+++ b/infra/config/generated/builders/ci/Mac11 Tests/properties.json
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Mac11 Tests/shadow-properties.json b/infra/config/generated/builders/ci/Mac11 Tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/Mac11 Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac12 Tests/properties.json b/infra/config/generated/builders/ci/Mac12 Tests/properties.json
index bd456f5..0cfce4dd 100644
--- a/infra/config/generated/builders/ci/Mac12 Tests/properties.json
+++ b/infra/config/generated/builders/ci/Mac12 Tests/properties.json
@@ -80,16 +80,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Mac12 Tests/shadow-properties.json b/infra/config/generated/builders/ci/Mac12 Tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/Mac12 Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/properties.json"
index e37e6ed..fc6dc71 100644
--- "a/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Mac13 Tests \050dbg\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac13 Tests/properties.json b/infra/config/generated/builders/ci/Mac13 Tests/properties.json
index fc735a0..a611d44a 100644
--- a/infra/config/generated/builders/ci/Mac13 Tests/properties.json
+++ b/infra/config/generated/builders/ci/Mac13 Tests/properties.json
@@ -84,16 +84,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Mac13 Tests/shadow-properties.json b/infra/config/generated/builders/ci/Mac13 Tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/Mac13 Tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Oreo Phone Tester/properties.json b/infra/config/generated/builders/ci/Oreo Phone Tester/properties.json
index 43ba0faf..e519152 100644
--- a/infra/config/generated/builders/ci/Oreo Phone Tester/properties.json
+++ b/infra/config/generated/builders/ci/Oreo Phone Tester/properties.json
@@ -89,16 +89,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Oreo Phone Tester/shadow-properties.json b/infra/config/generated/builders/ci/Oreo Phone Tester/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/Oreo Phone Tester/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/properties.json"
index 36a9eb06..c6770942 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/properties.json"
index 453af9b..af01d32 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/properties.json"
index 66045c0..99f955f 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/properties.json"
index a6b03422..b10f61c 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
index 5cf97e93..8c156231 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/properties.json"
index b0ed1c8..cad40b8 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/properties.json"
index 6146189f..e6ffea6 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
index ee05ddaa..a1844a5 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/properties.json"
index 30c963e..54234d17 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/properties.json"
index c3559e3..dec71270 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/properties.json"
@@ -67,16 +67,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/properties.json"
index 2e664ad..7601ae7 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/properties.json"
@@ -72,16 +72,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/properties.json"
index 250f330d..d1ad9f0 100644
--- "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
index ef26e5f..1625b45 100644
--- "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/properties.json" "b/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/properties.json"
index 52047ec..b46852c 100644
--- "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/properties.json"
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/shadow-properties.json" "b/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/shadow-properties.json"
deleted file mode 100644
index e70b3b60..0000000
--- "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/shadow-properties.json"
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Win11 Tests x64/properties.json b/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
index 470401a..e94bd29 100644
--- a/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
+++ b/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
@@ -80,16 +80,6 @@
       "retry_failed_shards": true
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Win11 Tests x64/shadow-properties.json b/infra/config/generated/builders/ci/Win11 Tests x64/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/Win11 Tests x64/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-12-x64-dbg-tests/properties.json b/infra/config/generated/builders/ci/android-12-x64-dbg-tests/properties.json
index 8435420..6072810 100644
--- a/infra/config/generated/builders/ci/android-12-x64-dbg-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-12-x64-dbg-tests/properties.json
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-12-x64-dbg-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-12-x64-dbg-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/android-12-x64-dbg-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/properties.json
index 99960915..8c1394d 100644
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/properties.json
index 26245e0..0b92007 100644
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/properties.json
index 9d3d2d09..5de65b3 100644
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/properties.json
index 8c43a13..3b114e3 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/properties.json
index 4238e7a..7d8435bf 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/properties.json
index a0e51e8..91cef15 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/properties.json
index a389adc6..eb81325 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/properties.json
index 4dabb48..d8ad878 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/properties.json
index d9622b83..a252e5d 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/properties.json
index 72b5c8e4..82e94397 100644
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/properties.json
@@ -87,16 +87,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-pie-arm64-dbg/properties.json b/infra/config/generated/builders/ci/android-pie-arm64-dbg/properties.json
index 2ea1889..f7093c8 100644
--- a/infra/config/generated/builders/ci/android-pie-arm64-dbg/properties.json
+++ b/infra/config/generated/builders/ci/android-pie-arm64-dbg/properties.json
@@ -89,16 +89,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-pie-arm64-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-pie-arm64-dbg/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-pie-arm64-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json b/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json
index 61c88a92..48d61b7 100644
--- a/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/properties.json b/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/properties.json
index a4ad9d9..cd193f7 100644
--- a/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/properties.json
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/properties.json b/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/properties.json
index 0398ec9e..587404da 100644
--- a/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/properties.json
+++ b/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/properties.json
@@ -79,16 +79,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/shadow-properties.json b/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/properties.json b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/properties.json
index efc839d3..d81eafd8 100644
--- a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/properties.json
+++ b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/properties.json
@@ -99,16 +99,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/shadow-properties.json b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/properties.json b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/properties.json
index 629caad..53c2904 100644
--- a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/properties.json
+++ b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/properties.json
@@ -95,16 +95,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/shadow-properties.json b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/properties.json
index 5756e46..c20c30e3 100644
--- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/properties.json
+++ b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/properties.json
@@ -99,16 +99,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/shadow-properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/properties.json
index dba232a..c813e06 100644
--- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/properties.json
+++ b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/properties.json
@@ -95,16 +95,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/shadow-properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-gcc-rel/gn-args.json b/infra/config/generated/builders/ci/linux-gcc-rel/gn-args.json
index d87f75bf9..4b0544b 100644
--- a/infra/config/generated/builders/ci/linux-gcc-rel/gn-args.json
+++ b/infra/config/generated/builders/ci/linux-gcc-rel/gn-args.json
@@ -4,7 +4,6 @@
     "is_clang": false,
     "is_component_build": false,
     "is_debug": false,
-    "symbol_level": 1,
-    "use_siso": true
+    "symbol_level": 1
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-gcc-rel/properties.json b/infra/config/generated/builders/ci/linux-gcc-rel/properties.json
index 563c75bd..5ef4a912f 100644
--- a/infra/config/generated/builders/ci/linux-gcc-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-gcc-rel/properties.json
@@ -47,16 +47,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-gcc-rel/shadow-properties.json b/infra/config/generated/builders/ci/linux-gcc-rel/shadow-properties.json
deleted file mode 100644
index 5271cc6a..0000000
--- a/infra/config/generated/builders/ci/linux-gcc-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json b/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
index 9d340d69..bf44fd9 100644
--- a/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
@@ -82,16 +82,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-lacros-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/linux-lacros-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/linux-lacros-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/linux-updater-tester-dbg/properties.json
index b1fc12d..a4cd159 100644
--- a/infra/config/generated/builders/ci/linux-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/linux-updater-tester-dbg/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/linux-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/linux-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/linux-updater-tester-rel/properties.json
index d14027aa..326a747 100644
--- a/infra/config/generated/builders/ci/linux-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-updater-tester-rel/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/linux-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/linux-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/properties.json
index baa2408..c199037a 100644
--- a/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/properties.json
index bc371719..84d9edcc 100644
--- a/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac10.15-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac11-arm64-rel-tests/properties.json b/infra/config/generated/builders/ci/mac11-arm64-rel-tests/properties.json
index 347ed3d..d27ddfd 100644
--- a/infra/config/generated/builders/ci/mac11-arm64-rel-tests/properties.json
+++ b/infra/config/generated/builders/ci/mac11-arm64-rel-tests/properties.json
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac11-arm64-rel-tests/shadow-properties.json b/infra/config/generated/builders/ci/mac11-arm64-rel-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac11-arm64-rel-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/properties.json
index 51a0199..1c267c7 100644
--- a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/properties.json
index 207d297..5ebbdcf0 100644
--- a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/properties.json
index abf9df58..875e6ba 100644
--- a/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/properties.json
index cdb9c2dd..1c997f4 100644
--- a/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac12-arm64-rel-tests/properties.json b/infra/config/generated/builders/ci/mac12-arm64-rel-tests/properties.json
index a1c80b0..29a1d34 100644
--- a/infra/config/generated/builders/ci/mac12-arm64-rel-tests/properties.json
+++ b/infra/config/generated/builders/ci/mac12-arm64-rel-tests/properties.json
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac12-arm64-rel-tests/shadow-properties.json b/infra/config/generated/builders/ci/mac12-arm64-rel-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac12-arm64-rel-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/properties.json
index 1354685..c6288286 100644
--- a/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/properties.json b/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/properties.json
index 000470a..23aa51ce 100644
--- a/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/properties.json
+++ b/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/shadow-properties.json b/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac13-arm64-rel-tests/properties.json b/infra/config/generated/builders/ci/mac13-arm64-rel-tests/properties.json
index d165861..4bbe6f3d 100644
--- a/infra/config/generated/builders/ci/mac13-arm64-rel-tests/properties.json
+++ b/infra/config/generated/builders/ci/mac13-arm64-rel-tests/properties.json
@@ -73,16 +73,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac13-arm64-rel-tests/shadow-properties.json b/infra/config/generated/builders/ci/mac13-arm64-rel-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac13-arm64-rel-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/properties.json
index b3cfd3d..8c7c6559 100644
--- a/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/properties.json
index 7127933..783070be 100644
--- a/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/properties.json
index e3441177..f7b9d7a 100644
--- a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/properties.json
index 1bf6dd3..778f54f 100644
--- a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/properties.json b/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/properties.json
index 3664ba4e..a43f8f9 100644
--- a/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/properties.json
+++ b/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/shadow-properties.json b/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-dbg/properties.json b/infra/config/generated/builders/ci/win10-updater-tester-dbg/properties.json
index 3f78c63..b0963cdf 100644
--- a/infra/config/generated/builders/ci/win10-updater-tester-dbg/properties.json
+++ b/infra/config/generated/builders/ci/win10-updater-tester-dbg/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-dbg/shadow-properties.json b/infra/config/generated/builders/ci/win10-updater-tester-dbg/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-updater-tester-dbg/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/properties.json b/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/properties.json
index a43a945..5009bb1 100644
--- a/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/properties.json
+++ b/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/shadow-properties.json b/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-updater-tester-rel-uac/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/win10-updater-tester-rel/properties.json
index bf53092..5a96a7c 100644
--- a/infra/config/generated/builders/ci/win10-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/win10-updater-tester-rel/properties.json
@@ -71,16 +71,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win10-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/win10-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win10-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win11-arm64-dbg-tests/properties.json b/infra/config/generated/builders/ci/win11-arm64-dbg-tests/properties.json
index f400f71..a556eae 100644
--- a/infra/config/generated/builders/ci/win11-arm64-dbg-tests/properties.json
+++ b/infra/config/generated/builders/ci/win11-arm64-dbg-tests/properties.json
@@ -80,16 +80,6 @@
       "retry_failed_shards": true
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win11-arm64-dbg-tests/shadow-properties.json b/infra/config/generated/builders/ci/win11-arm64-dbg-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win11-arm64-dbg-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win11-arm64-rel-tests/properties.json b/infra/config/generated/builders/ci/win11-arm64-rel-tests/properties.json
index 525761cc..703e0e2 100644
--- a/infra/config/generated/builders/ci/win11-arm64-rel-tests/properties.json
+++ b/infra/config/generated/builders/ci/win11-arm64-rel-tests/properties.json
@@ -82,16 +82,6 @@
       "retry_failed_shards": true
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win11-arm64-rel-tests/shadow-properties.json b/infra/config/generated/builders/ci/win11-arm64-rel-tests/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win11-arm64-rel-tests/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/properties.json b/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/properties.json
index 1e2bb749..e17cda2a 100644
--- a/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/properties.json
+++ b/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/shadow-properties.json b/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win11-updater-tester-rel/properties.json b/infra/config/generated/builders/ci/win11-updater-tester-rel/properties.json
index 45903fe9..a3eb514 100644
--- a/infra/config/generated/builders/ci/win11-updater-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/win11-updater-tester-rel/properties.json
@@ -65,16 +65,6 @@
       ]
     }
   },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 250
-  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win11-updater-tester-rel/shadow-properties.json b/infra/config/generated/builders/ci/win11-updater-tester-rel/shadow-properties.json
deleted file mode 100644
index e70b3b60..0000000
--- a/infra/config/generated/builders/ci/win11-updater-tester-rel/shadow-properties.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 250
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index e2ca3df6..1d99e00 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -120,7 +120,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/build/Mac13 Tests Siso FYI/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/build/Mac13 Tests Siso FYI/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -2575,7 +2574,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Experimental Release (Pixel 6)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Experimental Release (Pixel 6)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -2671,7 +2669,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Motorola Moto G Power 5G)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Motorola Moto G Power 5G)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -2767,7 +2764,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (NVIDIA Shield TV)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (NVIDIA Shield TV)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -2863,7 +2859,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Nexus 5X)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Nexus 5X)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -2959,7 +2954,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3055,7 +3049,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 4)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 4)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3151,7 +3144,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 6)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Pixel 6)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3247,7 +3239,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung A13)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung A13)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3342,7 +3333,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung A23)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung A23)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3437,7 +3427,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung S23)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android FYI Release (Samsung S23)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3629,7 +3618,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android WebView O (dbg)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android WebView O (dbg)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -3725,7 +3713,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Android WebView P (dbg)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Android WebView P (dbg)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -5576,7 +5563,7 @@
           '    "enable_cloud_profiler": true,'
           '    "enable_cloud_trace": true,'
           '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted"'
+          '    "project": "rbe-chromium-untrusted-test"'
           '  }'
           '}'
         dimensions: "free_space:"
@@ -6215,7 +6202,7 @@
           '    "enable_cloud_profiler": true,'
           '    "enable_cloud_trace": true,'
           '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted"'
+          '    "project": "rbe-chromium-untrusted-test"'
           '  }'
           '}'
         dimensions: "free_space:"
@@ -6543,7 +6530,7 @@
           '    "enable_cloud_profiler": true,'
           '    "enable_cloud_trace": true,'
           '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted"'
+          '    "project": "rbe-chromium-untrusted-test"'
           '  }'
           '}'
         dimensions: "free_space:"
@@ -7172,7 +7159,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm DEPS Release (Nexus 5X)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm DEPS Release (Nexus 5X)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7268,7 +7254,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm DEPS Release (Pixel 4)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm DEPS Release (Pixel 4)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7364,7 +7349,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm Release (Nexus 5X)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm Release (Nexus 5X)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7460,7 +7444,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm Release (Pixel 4)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm Release (Pixel 4)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7748,7 +7731,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release (Pixel 6)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 DEPS Release (Pixel 6)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7844,7 +7826,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release (Pixel 6)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Experimental Release (Pixel 6)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7940,7 +7921,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Release (Pixel 6)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Release (Pixel 6)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8036,7 +8016,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Release (Samsung S24)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Android arm64 Release (Samsung S24)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8420,7 +8399,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8516,7 +8494,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8612,7 +8589,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release (Intel UHD 630)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Experimental Release (Intel UHD 630)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8708,7 +8684,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Release (Intel UHD 630)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Release (Intel UHD 630)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -8804,7 +8779,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9088,7 +9062,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release (Apple M2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 DEPS Release (Apple M2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9184,7 +9157,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release (Apple M2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 Experimental Release (Apple M2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9280,7 +9252,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 Release (Apple M2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac arm64 Release (Apple M2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9564,7 +9535,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9660,7 +9630,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 DEPS Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9756,7 +9725,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9852,7 +9820,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Experimental Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -9948,7 +9915,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10044,7 +10010,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Mac x64 Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10236,7 +10201,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10332,7 +10296,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 ASAN Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10620,7 +10583,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10716,7 +10678,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10812,7 +10773,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -10908,7 +10868,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Experimental Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11004,7 +10963,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11100,7 +11058,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11388,7 +11345,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11484,7 +11440,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11580,7 +11535,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11676,7 +11630,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Experimental Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11772,7 +11725,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -11868,7 +11820,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -14729,7 +14680,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Lacros FYI x64 Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Lacros FYI x64 Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -14825,7 +14775,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Lacros FYI x64 Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Lacros FYI x64 Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -16618,7 +16567,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17285,7 +17233,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests (1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests (1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17477,7 +17424,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17573,7 +17519,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Debug (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Debug (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17666,7 +17611,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Debug (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Debug (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17762,7 +17706,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Experimental Release (Intel UHD 630)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Experimental Release (Intel UHD 630)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -17858,7 +17801,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Experimental Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Experimental Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18050,7 +17992,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Release (AMD RX 5500 XT)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Release (AMD RX 5500 XT)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18146,7 +18087,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Release (Intel UHD 630)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Release (Intel UHD 630)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18242,7 +18182,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Release (Intel UHD 770)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Release (Intel UHD 770)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18338,7 +18277,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux FYI Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux FYI Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18626,7 +18564,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -18914,7 +18851,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -19020,7 +18956,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Tests (Wayland)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -19116,7 +19051,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Linux Tests (dbg)(1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -19778,7 +19712,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac ASan 64 Tests (1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac ASan 64 Tests (1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20244,7 +20177,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac Debug (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac Debug (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20337,7 +20269,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI ASAN (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI ASAN (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20433,7 +20364,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Debug (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Debug (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20529,7 +20459,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Release (Apple M1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Release (Apple M1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20625,7 +20554,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20721,7 +20649,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20817,7 +20744,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (Apple M2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (Apple M2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -20913,7 +20839,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Experimental Retina Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21009,7 +20934,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Release (Apple M1)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Release (Apple M1)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21105,7 +21029,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21201,7 +21124,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Retina ASAN (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Retina ASAN (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21297,7 +21219,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Debug (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Debug (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21393,7 +21314,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21489,7 +21409,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (Apple M2)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (Apple M2)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21585,7 +21504,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac FYI Retina Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21681,7 +21599,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac Pro FYI Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac Pro FYI Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21777,7 +21694,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21873,7 +21789,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac Retina Debug (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac Retina Debug (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -21969,7 +21884,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac Retina Release (AMD)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22247,7 +22161,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac10.15 Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac10.15 Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22343,7 +22256,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac11 Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac11 Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22439,7 +22351,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac12 Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac12 Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22535,7 +22446,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac13 Tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac13 Tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22630,7 +22540,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Mac13 Tests (dbg)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Mac13 Tests (dbg)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -22818,7 +22727,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Oreo Phone Tester/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Oreo Phone Tester/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28347,7 +28255,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28443,7 +28350,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28539,7 +28445,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Debug (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Debug (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28635,7 +28540,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28731,7 +28635,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28827,7 +28730,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (AMD RX 5500 XT)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (AMD RX 5500 XT)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -28923,7 +28825,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel UHD 770)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel UHD 770)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29019,7 +28920,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29115,7 +29015,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29211,7 +29110,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release XR Perf (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29306,7 +29204,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x86 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 FYI x86 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29590,7 +29487,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 x64 Debug (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 x64 Debug (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29686,7 +29582,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win10 x64 Release (NVIDIA)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win10 x64 Release (NVIDIA)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29782,7 +29677,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win11 FYI arm64 Release (Qualcomm Adreno 690)/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win11 FYI arm64 Release (Qualcomm Adreno 690)/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -29878,7 +29772,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/Win11 Tests x64/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/Win11 Tests x64/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -30375,7 +30268,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-12-x64-dbg-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-12-x64-dbg-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -31485,16 +31377,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -31556,19 +31438,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -34356,7 +34225,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-12-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -34449,7 +34317,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-13-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -34542,7 +34409,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x64-dbg-14-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -34821,7 +34687,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-10-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -34914,7 +34779,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-11-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -35007,7 +34871,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-lollipop-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -35100,7 +34963,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-marshmallow-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -35193,7 +35055,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-nougat-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -35286,7 +35147,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-oreo-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -35379,7 +35239,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-x86-dbg-pie-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -36150,7 +36009,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-pie-arm64-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-pie-arm64-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -36995,7 +36853,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -37091,7 +36948,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-webview-12-x64-dbg-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -37184,7 +37040,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-webview-13-x64-dbg-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -38327,7 +38182,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-rel-gtest/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -38423,7 +38277,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-rel-tast/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -40410,16 +40263,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -40481,19 +40324,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -42349,7 +42179,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/lacros-amd64-generic-rel-gtest/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -42541,7 +42370,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/lacros-amd64-generic-rel-tast/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -43692,16 +43520,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -43763,19 +43581,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -43879,16 +43684,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -43950,19 +43745,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -46181,7 +45963,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/linux-gcc-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/linux-gcc-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -47487,7 +47268,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/linux-lacros-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -49377,7 +49157,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/linux-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/linux-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -49469,7 +49248,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/linux-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/linux-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -50476,16 +50254,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -50547,19 +50315,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -50913,16 +50668,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -50984,19 +50729,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -53050,7 +52782,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac10.15-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53142,7 +52873,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac10.15-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac10.15-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53325,7 +53055,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac11-arm64-rel-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac11-arm64-rel-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53421,7 +53150,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac11-arm64-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53512,7 +53240,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac11-arm64-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53785,7 +53512,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac11-x64-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53876,7 +53602,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac11-x64-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -53967,7 +53692,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac12-arm64-rel-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac12-arm64-rel-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -54063,7 +53787,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac12-arm64-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -54336,7 +54059,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac12-x64-updater-tester-asan-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -54427,7 +54149,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac13-arm64-rel-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac13-arm64-rel-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -54523,7 +54244,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac13-arm64-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -54796,7 +54516,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/mac13-x64-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -57643,7 +57362,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-32-on-64-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -57734,7 +57452,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-32-on-64-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -57895,16 +57612,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -57966,19 +57673,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -58082,16 +57776,6 @@
         '      ]'
         '    }'
         '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -58153,19 +57837,6 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
@@ -58478,7 +58149,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-updater-tester-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-updater-tester-dbg/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -58570,7 +58240,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-updater-tester-dbg-uac/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -58661,7 +58330,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -58753,7 +58421,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win10-updater-tester-rel-uac/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win10-updater-tester-rel-uac/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -58938,7 +58605,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win11-arm64-dbg-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win11-arm64-dbg-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -59031,7 +58697,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win11-arm64-rel-tests/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win11-arm64-rel-tests/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -59127,7 +58792,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win11-updater-tester-dbg-uac/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -59218,7 +58882,6 @@
         '  },'
         '  "$bootstrap/properties": {'
         '    "properties_file": "infra/config/generated/builders/ci/win11-updater-tester-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/win11-updater-tester-rel/shadow-properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -61110,6 +60773,15 @@
           '    "jobs": 500,'
           '    "metrics_project": "chromium-reclient-metrics",'
           '    "scandeps_server": true'
+          '  },'
+          '  "$build/siso": {'
+          '    "configs": ['
+          '      "builder"'
+          '    ],'
+          '    "enable_cloud_profiler": true,'
+          '    "enable_cloud_trace": true,'
+          '    "experiments": [],'
+          '    "project": "rbe-chromium-untrusted-test"'
           '  }'
           '}'
       }
@@ -106502,15 +106174,6 @@
       }
       properties:
         '{'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-untrusted"'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
@@ -106591,15 +106254,6 @@
       }
       properties:
         '{'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "project": "rbe-chromium-untrusted"'
-        '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
         '    "grouping_keys": ['
diff --git a/infra/config/generated/luci/project.cfg b/infra/config/generated/luci/project.cfg
index a193d43..2dc5849 100644
--- a/infra/config/generated/luci/project.cfg
+++ b/infra/config/generated/luci/project.cfg
@@ -7,7 +7,7 @@
 name: "chromium"
 access: "group:all"
 lucicfg {
-  version: "1.43.6"
+  version: "1.43.5"
   package_dir: "../.."
   config_dir: "generated/luci"
   entry_point: "main.star"
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl
index 35519e72..2c76d32 100644
--- a/infra/config/generated/testing/variants.pyl
+++ b/infra/config/generated/testing/variants.pyl
@@ -299,16 +299,16 @@
   },
   'LACROS_VERSION_SKEW_STABLE': {
     'identifier': 'Lacros version skew testing ash stable',
-    'description': 'Run with ash-chrome version 123.0.6312.112',
+    'description': 'Run with ash-chrome version 123.0.6312.132',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v123.0.6312.112',
-          'revision': 'version:123.0.6312.112',
+          'location': 'lacros_version_skew_tests_v123.0.6312.132',
+          'revision': 'version:123.0.6312.132',
         },
       ],
     },
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index 724fcaf..c59421e 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -111,13 +111,6 @@
     ),
 )
 
-siso = struct(
-    project = struct(
-        DEFAULT_TRUSTED = reclient.instance.DEFAULT_TRUSTED,
-        DEFAULT_UNTRUSTED = reclient.instance.DEFAULT_UNTRUSTED,
-    ),
-)
-
 def _rotation(name):
     return branches.value(
         branch_selector = branches.selector.MAIN,
@@ -365,7 +358,6 @@
     reclient_disable_bq_upload = None,
     siso_enabled = None,
     siso_configs = ["builder"],
-    siso_project = None,
     siso_enable_cloud_profiler = True,
     siso_enable_cloud_trace = True,
     siso_experiments = [],
@@ -378,7 +370,6 @@
     shadow_pool = None,
     shadow_service_account = None,
     shadow_reclient_instance = None,
-    shadow_siso_project = None,
 
     # Provide vars for bucket and executable so users don't have to
     # unnecessarily make wrapper functions
@@ -443,7 +434,6 @@
         reclient_disable_bq_upload = None,
         siso_enabled = args.DEFAULT,
         siso_configs = args.DEFAULT,
-        siso_project = args.DEFAULT,
         siso_enable_cloud_profiler = args.DEFAULT,
         siso_enable_cloud_trace = args.DEFAULT,
         siso_experiments = args.DEFAULT,
@@ -455,7 +445,6 @@
         shadow_pool = args.DEFAULT,
         shadow_service_account = args.DEFAULT,
         shadow_reclient_instance = args.DEFAULT,
-        shadow_siso_project = args.DEFAULT,
         gn_args = None,
         targets = None,
         contact_team_email = args.DEFAULT,
@@ -647,8 +636,6 @@
             be used at compile step.
         siso_configs: a list of siso configs to enable. available values are defined in
             //build/config/siso/config.star.
-        siso_project: a string indicating the GCP project hosting the RBE
-            instance and other Cloud services. e.g. logging, trace etc.
         siso_enable_cloud_profiler: If True, enable cloud profiler in siso.
         siso_enable_cloud_trace: If True, enable cloud trace in siso.
         siso_experiments: a list of experiment flags for siso.
@@ -674,9 +661,6 @@
             use this as the reclient instance instead of reclient_instance. The
             other reclient_* values will continue to be used for the shadow
             build.
-        shadow_siso_project: If set, then led builds for this builder will
-            use this as the siso project instead of siso_project. The other
-            siso_* values will continue to be used for the shadow build.
         gn_args: If set, the GN args config to use for the builder. It can be
             set to the name of a predeclared config or an unnamed
             gn_args.config declaration for an unphased config. A builder can use
@@ -837,8 +821,11 @@
         ensure_verified = reclient_ensure_verified,
         disable_bq_upload = reclient_disable_bq_upload,
     )
+    rbe_project = None
+    shadow_rbe_project = None
     if reclient != None:
         properties["$build/reclient"] = reclient
+        rbe_project = reclient["instance"]
         shadow_reclient_instance = defaults.get_value("shadow_reclient_instance", shadow_reclient_instance)
         shadow_reclient = _reclient_property(
             instance = shadow_reclient_instance,
@@ -855,24 +842,23 @@
         )
         if shadow_reclient:
             shadow_properties["$build/reclient"] = shadow_reclient
-
-    siso_project = defaults.get_value("siso_project", siso_project)
-    use_siso = defaults.get_value("siso_enabled", siso_enabled) and siso_project
+            shadow_rbe_project = shadow_reclient["instance"]
+    use_siso = defaults.get_value("siso_enabled", siso_enabled) and rbe_project
     if use_siso:
         siso = {
             "configs": defaults.get_value("siso_configs", siso_configs),
             "enable_cloud_profiler": defaults.get_value("siso_enable_cloud_profiler", siso_enable_cloud_profiler),
             "enable_cloud_trace": defaults.get_value("siso_enable_cloud_trace", siso_enable_cloud_trace),
             "experiments": defaults.get_value("siso_experiments", siso_experiments),
-            "project": siso_project,
+            "project": rbe_project,
         }
         remote_jobs = defaults.get_value("siso_remote_jobs", siso_remote_jobs)
         if remote_jobs:
             siso["remote_jobs"] = remote_jobs
         properties["$build/siso"] = siso
-        if defaults.get_value("shadow_siso_project", shadow_siso_project):
+        if shadow_rbe_project:
             shadow_siso = dict(siso)
-            shadow_siso["project"] = defaults.get_value("shadow_siso_project", shadow_siso_project)
+            shadow_siso["project"] = shadow_rbe_project
             shadow_properties["$build/siso"] = shadow_siso
 
     pgo = _pgo_property(
diff --git a/infra/config/subprojects/build/build.fyi.star b/infra/config/subprojects/build/build.fyi.star
index 71b47b5..fd0557a 100644
--- a/infra/config/subprojects/build/build.fyi.star
+++ b/infra/config/subprojects/build/build.fyi.star
@@ -4,7 +4,7 @@
 """Definitions of builders in chromium.build.fyi builder group."""
 
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 
@@ -22,10 +22,9 @@
     reclient_instance = reclient.instance.DEFAULT_TRUSTED,
     reclient_jobs = reclient.jobs.DEFAULT,
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
+    shadow_reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
-    shadow_siso_project = siso.project.DEFAULT_UNTRUSTED,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
 )
 
 consoles.console_view(
diff --git a/infra/config/subprojects/build/build.star b/infra/config/subprojects/build/build.star
index a18e8d16..0cdcff16 100644
--- a/infra/config/subprojects/build/build.star
+++ b/infra/config/subprojects/build/build.star
@@ -7,7 +7,7 @@
 
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -101,7 +101,6 @@
         description_html = description_html + "<br>Build stats is show in http://shortn/_gaAdI3x6o6.",
         reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
         reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
-        siso_project = siso.project.DEFAULT_UNTRUSTED,
         use_clang_coverage = True,
         **kwargs
     )
@@ -488,7 +487,6 @@
         description_html = description_html + "<br>Build stats is show in http://shortn/_gaAdI3x6o6.",
         executable = "recipe:chrome_build/build_perf_developer",
         reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
-        siso_project = siso.project.DEFAULT_UNTRUSTED,
         siso_configs = ["remote-library-link", "remote-exec-link"],
         shadow_reclient_instance = None,
         **kwargs
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index a985e16..744662b 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 
 load("//lib/branches.star", "branches")
-load("//lib/builders.star", "builders", "cpu", "reclient", "siso")
+load("//lib/builders.star", "builders", "cpu", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//project.star", "settings")
@@ -19,7 +19,6 @@
     shadow_free_space = None,
     shadow_pool = "luci.chromium.try",
     shadow_reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
-    shadow_siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 luci.bucket(
diff --git a/infra/config/subprojects/chromium/ci/chromium.accessibility.star b/infra/config/subprojects/chromium/ci/chromium.accessibility.star
index 88025f7..ff14fe9c 100644
--- a/infra/config/subprojects/chromium/ci/chromium.accessibility.star
+++ b/infra/config/subprojects/chromium/ci/chromium.accessibility.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -26,7 +26,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
index 657f21b..fede56f 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the chromium.android.fyi builder group."""
 
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index 07f4e63..f1b7efd 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -6,7 +6,7 @@
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
@@ -26,7 +26,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.HIGH_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.angle.star b/infra/config/subprojects/chromium/ci/chromium.angle.star
index e10bdd7..cc6ce8a6 100644
--- a/infra/config/subprojects/chromium/ci/chromium.angle.star
+++ b/infra/config/subprojects/chromium/ci/chromium.angle.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the chromium.angle builder group."""
 
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
 load("//lib/ci.star", "ci")
@@ -26,7 +26,6 @@
     service_account = ci.gpu.SERVICE_ACCOUNT,
     shadow_service_account = ci.gpu.SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
     thin_tester_cores = 2,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.cft.star b/infra/config/subprojects/chromium/ci/chromium.cft.star
index a3125271..29f3d095 100644
--- a/infra/config/subprojects/chromium/ci/chromium.cft.star
+++ b/infra/config/subprojects/chromium/ci/chromium.cft.star
@@ -5,7 +5,7 @@
 
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -25,7 +25,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.HIGH_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
index 2310af6..06989cd 100644
--- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -7,7 +7,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -33,7 +33,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star
index c998073..7f22e10 100644
--- a/infra/config/subprojects/chromium/ci/chromium.clang.star
+++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -7,7 +7,7 @@
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
@@ -150,7 +150,6 @@
     reclient_instance = reclient.instance.DEFAULT_TRUSTED,
     reclient_jobs = reclient.jobs.DEFAULT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.coverage.star b/infra/config/subprojects/chromium/ci/chromium.coverage.star
index 5e5f446..e3746dea 100644
--- a/infra/config/subprojects/chromium/ci/chromium.coverage.star
+++ b/infra/config/subprojects/chromium/ci/chromium.coverage.star
@@ -4,7 +4,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -39,7 +39,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star
index 9870db6..6f460b3 100644
--- a/infra/config/subprojects/chromium/ci/chromium.dawn.star
+++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     service_account = ci.gpu.SERVICE_ACCOUNT,
     shadow_service_account = ci.gpu.SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
     thin_tester_cores = 2,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star
index 781e0e8bc..6d10b8e 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -26,7 +26,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuchsia.star b/infra/config/subprojects/chromium/ci/chromium.fuchsia.star
index 345029c..530e162 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fuchsia.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fuchsia.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "free_space", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "free_space", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -29,7 +29,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.HIGH_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
index ffedb57..5aa13e3 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -6,7 +6,7 @@
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -27,7 +27,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index ee9e044..fc64e7a1 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1440,7 +1440,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     shadow_reclient_instance = reclient.instance.TEST_UNTRUSTED,
     siso_enabled = True,
-    siso_project = reclient.instance.TEST_UNTRUSTED,
 )
 
 fyi_mac_reclient_comparison_builder(
@@ -1487,7 +1486,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     shadow_reclient_instance = reclient.instance.TEST_UNTRUSTED,
     siso_enabled = True,
-    siso_project = reclient.instance.TEST_UNTRUSTED,
 )
 
 fyi_reclient_comparison_builder(
@@ -1510,7 +1508,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     shadow_reclient_instance = reclient.instance.TEST_UNTRUSTED,
     siso_enabled = True,
-    siso_project = reclient.instance.TEST_UNTRUSTED,
 )
 
 fyi_mac_reclient_comparison_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
index 08cee95..43110ed 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -27,7 +27,6 @@
     service_account = ci.gpu.SERVICE_ACCOUNT,
     shadow_service_account = ci.gpu.SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
     thin_tester_cores = 2,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.star b/infra/config/subprojects/chromium/ci/chromium.gpu.star
index a7fe66a8..3cfa64c 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.star
@@ -7,7 +7,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -26,7 +26,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
     thin_tester_cores = 2,
     tree_closing_notifiers = ci.gpu.TREE_CLOSING_NOTIFIERS,
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star
index ecad4529..f86930b 100644
--- a/infra/config/subprojects/chromium/ci/chromium.linux.star
+++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -6,7 +6,7 @@
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "builders", "os", "reclient", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
@@ -30,7 +30,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.HIGH_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star
index eb7a8ef..31b24c7 100644
--- a/infra/config/subprojects/chromium/ci/chromium.mac.star
+++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -7,7 +7,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "cpu", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -28,7 +28,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
     thin_tester_cores = 8,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star b/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star
index 52bfcb4..986f38f 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the chromium.memory.fyi builder group."""
 
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.LOW_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star
index 45fc608e5..ef50c2ba 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -7,7 +7,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -30,7 +30,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.HIGH_JOBS_FOR_CI,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.rust.star b/infra/config/subprojects/chromium/ci/chromium.rust.star
index 8770375b..caf7648 100644
--- a/infra/config/subprojects/chromium/ci/chromium.rust.star
+++ b/infra/config/subprojects/chromium/ci/chromium.rust.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the chromium.rust builder group."""
 
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -25,7 +25,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index f3e8753..6890bdb 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -6,7 +6,7 @@
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "cpu", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
@@ -32,7 +32,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.swangle.star b/infra/config/subprojects/chromium/ci/chromium.swangle.star
index 34eff4b..ee1f5679 100644
--- a/infra/config/subprojects/chromium/ci/chromium.swangle.star
+++ b/infra/config/subprojects/chromium/ci/chromium.swangle.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the chromium.swangle builder group."""
 
-load("//lib/builders.star", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "reclient", "sheriff_rotations")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
 load("//lib/ci.star", "ci")
@@ -23,7 +23,6 @@
     service_account = ci.gpu.SERVICE_ACCOUNT,
     shadow_service_account = ci.gpu.SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star
index 34b6671..c6a66452 100644
--- a/infra/config/subprojects/chromium/ci/chromium.updater.star
+++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "builders", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "builders", "cpu", "os", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.win.star b/infra/config/subprojects/chromium/ci/chromium.win.star
index 2c677b07..3c492307 100644
--- a/infra/config/subprojects/chromium/ci/chromium.win.star
+++ b/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -7,7 +7,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_health_indicators.star", "health_spec")
-load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "siso")
+load("//lib/builders.star", "os", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -30,7 +30,6 @@
     service_account = ci.DEFAULT_SERVICE_ACCOUNT,
     shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_TRUSTED,
     siso_remote_jobs = reclient.jobs.DEFAULT,
 )
 
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star
index 4069495..975513e 100644
--- a/infra/config/subprojects/chromium/gpu.try.star
+++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/gn_args.star", "gn_args")
 
@@ -23,7 +23,6 @@
     reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
     service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
     subproject_list_view = "luci.chromium.try",
     task_template_canary_percentage = 5,
 )
diff --git a/infra/config/subprojects/chromium/swangle.try.star b/infra/config/subprojects/chromium/swangle.try.star
index ddeaf37..8644c6f 100644
--- a/infra/config/subprojects/chromium/swangle.try.star
+++ b/infra/config/subprojects/chromium/swangle.try.star
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -26,7 +26,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
     subproject_list_view = "luci.chromium.try",
     task_template_canary_percentage = 5,
 )
diff --git a/infra/config/subprojects/chromium/try/tryserver.blink.star b/infra/config/subprojects/chromium/try/tryserver.blink.star
index 005472a5..3091cd7 100644
--- a/infra/config/subprojects/chromium/try/tryserver.blink.star
+++ b/infra/config/subprojects/chromium/try/tryserver.blink.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.blink builder group."""
 
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/branches.star", "branches")
 load("//lib/try.star", "try_")
@@ -20,7 +20,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star
index d8df36bd..2d966d8 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.accessibility builder group."""
 
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -20,7 +20,6 @@
     reclient_jobs = 150,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 10454a3..c1374395 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
index 93b33d96..19ca90c 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.angle builder group."""
 
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -21,7 +21,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     service_account = try_.gpu.SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
index 0acb6c1..ec3cd710 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.mac builder group."""
 
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -19,7 +19,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
index d860194d..6d9de7f2 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -26,7 +26,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
index d70e167..fd4fa34 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the tryserver.chromium.swangle builder group."""
 
 load("//lib/branches.star", "branches")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/consoles.star", "consoles")
 load("//lib/try.star", "try_")
 
@@ -22,7 +22,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.gpu.SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
index 98695444..76811aea 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "builders", "os", "reclient", "siso")
+load("//lib/builders.star", "builders", "os", "reclient")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
 load("//lib/try.star", "try_")
@@ -26,7 +26,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
index 1e838f9..19b8ba1 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.fuzz builder group."""
 
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/consoles.star", "consoles")
 load("//lib/try.star", "try_")
 
@@ -19,7 +19,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index a73d554..b8d944f 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
 load("//lib/try.star", "try_")
@@ -25,7 +25,6 @@
     reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index 7b73ae0d..43fb046 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -24,7 +24,6 @@
     reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 def ios_builder(*, name, **kwargs):
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star
index 81ada6a0..a8dbc6c0c 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.rust builder group."""
 
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 
@@ -19,7 +19,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.star b/infra/config/subprojects/chromium/try/tryserver.chromium.star
index 91c4d48..cbf0dbf 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the tryserver.chromium builder group."""
 
 load("//lib/branches.star", "branches")
-load("//lib/builders.star", "cpu", "os", "reclient", "siso")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -21,7 +21,6 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star b/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star
index d8a387b5..b239d71 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.updater builder group."""
 
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//lib/gn_args.star", "gn_args")
@@ -18,7 +18,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index 29f586dd..3738830 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -6,7 +6,7 @@
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/builder_url.star", "linkify_builder")
-load("//lib/builders.star", "os", "reclient", "siso")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
 load("//project.star", "settings")
@@ -27,7 +27,6 @@
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     siso_enabled = True,
-    siso_project = siso.project.DEFAULT_UNTRUSTED,
 )
 
 consoles.list_view(
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star
index 1836276..dc2f68f 100644
--- a/infra/config/subprojects/reclient/reclient.star
+++ b/infra/config/subprojects/reclient/reclient.star
@@ -752,5 +752,4 @@
     reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ,
     shadow_reclient_instance = reclient.instance.TEST_UNTRUSTED,
     siso_enabled = True,
-    siso_project = reclient.instance.TEST_UNTRUSTED,
 )
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json
index a358dd6..d2f79ce 100644
--- a/infra/config/targets/lacros-version-skew-variants.json
+++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -49,16 +49,16 @@
   },
   "LACROS_VERSION_SKEW_STABLE": {
     "args": [
-      "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+      "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
     ],
-    "description": "Run with ash-chrome version 123.0.6312.112",
+    "description": "Run with ash-chrome version 123.0.6312.132",
     "identifier": "Lacros version skew testing ash stable",
     "swarming": {
       "cipd_packages": [
         {
           "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-          "location": "lacros_version_skew_tests_v123.0.6312.112",
-          "revision": "version:123.0.6312.112"
+          "location": "lacros_version_skew_tests_v123.0.6312.132",
+          "revision": "version:123.0.6312.132"
         }
       ]
     }
diff --git a/internal b/internal
index 5178496..f5dce23 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 51784961a549aa3eff970c32af08734422989955
+Subproject commit f5dce23de2e76a39aeabd5418dfcda30b6c8106a
diff --git a/ios/chrome/browser/favicon/model/favicon_loader_unittest.mm b/ios/chrome/browser/favicon/model/favicon_loader_unittest.mm
index 4fe2af3..6e819d6a 100644
--- a/ios/chrome/browser/favicon/model/favicon_loader_unittest.mm
+++ b/ios/chrome/browser/favicon/model/favicon_loader_unittest.mm
@@ -56,10 +56,10 @@
       bitmapResult.expired = false;
 
       // Create bitmap.
-      auto data = base::MakeRefCounted<base::RefCountedBytes>();
+      scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
       SkBitmap bitmap;
       bitmap.allocN32Pixels(30, 30);
-      gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->as_vector());
+      gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->data());
       bitmapResult.bitmap_data = data;
 
       favicon_base::LargeIconResult result(bitmapResult);
diff --git a/ios/chrome/browser/favicon/model/large_icon_cache_unittest.cc b/ios/chrome/browser/favicon/model/large_icon_cache_unittest.cc
index 23cb159e..7b80850 100644
--- a/ios/chrome/browser/favicon/model/large_icon_cache_unittest.cc
+++ b/ios/chrome/browser/favicon/model/large_icon_cache_unittest.cc
@@ -27,7 +27,7 @@
   // Create bitmap and fill with `color`.
   scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
   gfx::PNGCodec::EncodeBGRASkBitmap(gfx::test::CreateBitmap(w, h, color), false,
-                                    &data->as_vector());
+                                    &data->data());
   result.bitmap_data = data;
 
   result.pixel_size = gfx::Size(w, h);
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_mediator.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_mediator.mm
index 96260d9..b97d1c4e 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_mediator.mm
@@ -408,6 +408,11 @@
 
 // Sets the pref for a SetUpList item to indicate it is complete.
 - (void)markSetUpListItemPrefComplete:(SetUpListItemType)type {
+  // Exit early if this is called after `disconnect` which clears _localState.
+  // Item states will be reevaluated the next time this mediator is loaded.
+  if (!_localState) {
+    return;
+  }
   set_up_list_prefs::MarkItemComplete(_localState, type);
 }
 
diff --git a/ios/chrome/browser/ui/ntp/feed_management/follow_management_mediator_unittest.mm b/ios/chrome/browser/ui/ntp/feed_management/follow_management_mediator_unittest.mm
index 80bfe80..9ac2971 100644
--- a/ios/chrome/browser/ui/ntp/feed_management/follow_management_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/ntp/feed_management/follow_management_mediator_unittest.mm
@@ -56,7 +56,7 @@
     scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
     SkBitmap bitmap;
     bitmap.allocN32Pixels(30, 30);
-    gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->as_vector());
+    gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->data());
     bitmapResult.bitmap_data = data;
 
     favicon_base::LargeIconResult result(bitmapResult);
diff --git a/ios/third_party/earl_grey2/src b/ios/third_party/earl_grey2/src
index 26acfe3..2e380858 160000
--- a/ios/third_party/earl_grey2/src
+++ b/ios/third_party/earl_grey2/src
@@ -1 +1 @@
-Subproject commit 26acfe36928095395dfcb6ff3d0578550bd868ac
+Subproject commit 2e38085850ae38e4b0d9325759a38a1f414f815f
diff --git a/ios_internal b/ios_internal
index 4e9a9e1..2e88625 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 4e9a9e1ff027107175ef685b140354acc5bfc1a9
+Subproject commit 2e8862517f6676771a2aaa26c8155238ac1981af
diff --git a/media/base/data_source.cc b/media/base/data_source.cc
index 3944a8b..96803bfd 100644
--- a/media/base/data_source.cc
+++ b/media/base/data_source.cc
@@ -7,6 +7,8 @@
 
 namespace media {
 
+DataSourceInfo::~DataSourceInfo() = default;
+
 DataSource::DataSource() = default;
 
 DataSource::~DataSource() = default;
diff --git a/media/base/data_source.h b/media/base/data_source.h
index f080a93..0e0a102 100644
--- a/media/base/data_source.h
+++ b/media/base/data_source.h
@@ -15,7 +15,26 @@
 
 class CrossOriginDataSource;
 
-class MEDIA_EXPORT DataSource {
+// Abstracting informational methods into DataSourceInfo allows
+// "meta-datasource" objects like HlsDataSourceProvider to query it's entire
+// set of dependent data sources when calculating the data here.
+class MEDIA_EXPORT DataSourceInfo {
+ public:
+  virtual ~DataSourceInfo();
+
+  // The total memory size used.
+  virtual int64_t GetMemoryUsage() = 0;
+
+  // DataSource implementations that might make requests must ensure the value
+  // is accurate for cross origin resources.
+  virtual bool WouldTaintOrigin() = 0;
+
+  // Returns true if we are performing streaming. In this case seeking is
+  // not possible.
+  virtual bool IsStreaming() = 0;
+};
+
+class MEDIA_EXPORT DataSource : public DataSourceInfo {
  public:
   using ReadCB = base::OnceCallback<void(int)>;
 
@@ -39,7 +58,7 @@
   DataSource(const DataSource&) = delete;
   DataSource& operator=(const DataSource&) = delete;
 
-  virtual ~DataSource();
+  ~DataSource() override;
 
   // Reads |size| bytes from |position| into |data|. And when the read is done
   // or failed, |read_cb| is called with the number of bytes read or
@@ -62,10 +81,6 @@
   // retrieved.
   [[nodiscard]] virtual bool GetSize(int64_t* size_out) = 0;
 
-  // Returns true if we are performing streaming. In this case seeking is
-  // not possible.
-  virtual bool IsStreaming() = 0;
-
   // Notify the DataSource of the bitrate of the media.
   // Values of |bitrate| <= 0 are invalid and should be ignored.
   virtual void SetBitrate(int bitrate) = 0;
@@ -75,15 +90,11 @@
   // check.
   virtual bool PassedTimingAllowOriginCheck() = 0;
 
-  // DataSource implementations that might make requests must ensure the value
-  // is accurate for cross origin resources.
-  virtual bool WouldTaintOrigin() = 0;
-
   // Assume fully buffered by default.
   virtual bool AssumeFullyBuffered() const;
 
   // By default this just returns GetSize().
-  virtual int64_t GetMemoryUsage();
+  int64_t GetMemoryUsage() override;
 
   // Adjusts the buffering algorithm (if there is one) based on the given
   // preload value.
diff --git a/media/filters/dav1d_video_decoder.cc b/media/filters/dav1d_video_decoder.cc
index 474e945..3370191 100644
--- a/media/filters/dav1d_video_decoder.cc
+++ b/media/filters/dav1d_video_decoder.cc
@@ -416,14 +416,12 @@
         fake_uv_data_ =
             base::MakeRefCounted<base::RefCountedBytes>(size_needed);
 
-        uint16_t* data =
-            reinterpret_cast<uint16_t*>(fake_uv_data_->as_vector().data());
+        uint16_t* data = fake_uv_data_->front_as<uint16_t>();
         std::fill(data, data + size_needed / 2, kBlankUV);
       }
     }
 
-    u_plane = v_plane =
-        reinterpret_cast<uint8_t*>(fake_uv_data_->as_vector().data());
+    u_plane = v_plane = fake_uv_data_->front_as<uint8_t>();
   }
 
   auto frame = VideoFrame::WrapExternalYuvData(
diff --git a/media/filters/demuxer_manager.cc b/media/filters/demuxer_manager.cc
index 3c37a02b..bab5c96 100644
--- a/media/filters/demuxer_manager.cc
+++ b/media/filters/demuxer_manager.cc
@@ -388,7 +388,9 @@
   if (hls_fallback_ == HlsFallbackImplementation::kBuiltinHlsPlayer ||
       (base::FeatureList::IsEnabled(kBuiltInHlsPlayer) &&
        loaded_url_.path_piece().ends_with(".m3u8"))) {
-    SetDemuxer(CreateHlsDemuxer());
+    std::unique_ptr<Demuxer> demuxer;
+    std::tie(data_source_info_, demuxer) = CreateHlsDemuxer();
+    SetDemuxer(std::move(demuxer));
     return std::move(on_demuxer_created)
         .Run(demuxer_.get(), suspended_mode, /*is_streaming=*/false,
              /*is_static=*/false);
@@ -457,6 +459,7 @@
 
 void DemuxerManager::SetDataSource(std::unique_ptr<DataSource> data_source) {
   data_source_ = std::move(data_source);
+  data_source_info_ = data_source_.get();
 }
 
 void DemuxerManager::OnBufferingHaveEnough(bool enough) {
@@ -478,7 +481,7 @@
 }
 
 int64_t DemuxerManager::GetDataSourceMemoryUsage() {
-  return data_source_ ? data_source_->GetMemoryUsage() : 0;
+  return data_source_info_ ? data_source_info_->GetMemoryUsage() : 0;
 }
 
 void DemuxerManager::OnDataSourcePlaybackRateChange(double rate, bool paused) {
@@ -492,18 +495,26 @@
 }
 
 bool DemuxerManager::WouldTaintOrigin() const {
-  if (hls_fallback_ != HlsFallbackImplementation::kNone) {
-    // HLS manifests might pull segments from a different origin. We can't know
-    // for sure, so we conservatively say yes here.
-    // TODO (crbug/1266991) We will be able to know for sure with the builtin
-    // player, when that's implemented.
-    return true;
+  switch (hls_fallback_) {
+    case HlsFallbackImplementation::kMediaPlayer: {
+      // HLS manifests might pull segments from a different origin. We can't
+      // know for sure, so we conservatively say yes here.
+      return true;
+    }
+    case HlsFallbackImplementation::kBuiltinHlsPlayer: {
+      CHECK(data_source_info_);
+      // TODO(crbug/40057824): return data_source_info_->WouldTaintOrigin();
+      // For now, we should continue to assume that tainting is always true with
+      // HLS content.
+      return true;
+    }
+    case HlsFallbackImplementation::kNone: {
+      // TODO(crbug/1377053): The default |false| value might have to be
+      // re-considered for MediaPlayerRenderer, but for now, leave behavior the
+      // same as it was.
+      return data_source_info_ ? data_source_info_->WouldTaintOrigin() : false;
+    }
   }
-
-  // TODO(crbug/1377053): The default |false| value might have to be
-  // re-considered for MediaPlayerRenderer, but for now, leave behavior the
-  // same as it was.
-  return data_source_ ? data_source_->WouldTaintOrigin() : false;
 }
 
 bool DemuxerManager::HasDataSource() const {
@@ -530,7 +541,7 @@
 }
 
 bool DemuxerManager::IsStreaming() const {
-  return (data_source_ && data_source_->IsStreaming()) ||
+  return (data_source_info_ && data_source_info_->IsStreaming()) ||
          (demuxer_ && !demuxer_->IsSeekable());
 }
 
@@ -593,15 +604,20 @@
 #endif  // BUILDFLAG(ENABLE_FFMPEG)
 
 #if BUILDFLAG(ENABLE_HLS_DEMUXER)
-std::unique_ptr<Demuxer> DemuxerManager::CreateHlsDemuxer() {
+std::tuple<raw_ptr<DataSourceInfo>, std::unique_ptr<Demuxer>>
+DemuxerManager::CreateHlsDemuxer() {
   auto engine = std::make_unique<HlsManifestDemuxerEngine>(
-      client_->GetHlsDataSourceProvider(), media_task_runner_, loaded_url_,
-      media_log_.get());
-  return std::make_unique<ManifestDemuxer>(
-      media_task_runner_,
-      base::BindPostTaskToCurrentDefault(base::BindRepeating(
-          &DemuxerManager::DemuxerRequestsSeek, weak_factory_.GetWeakPtr())),
-      std::move(engine), media_log_.get());
+      client_->GetHlsDataSourceProvider(), media_task_runner_,
+      data_source_info_->WouldTaintOrigin(), loaded_url_, media_log_.get());
+  raw_ptr<DataSourceInfo> datasource_info = engine.get();
+  return std::make_tuple(
+      datasource_info,
+      std::make_unique<ManifestDemuxer>(
+          media_task_runner_,
+          base::BindPostTaskToCurrentDefault(
+              base::BindRepeating(&DemuxerManager::DemuxerRequestsSeek,
+                                  weak_factory_.GetWeakPtr())),
+          std::move(engine), media_log_.get()));
 }
 #endif
 
diff --git a/media/filters/demuxer_manager.h b/media/filters/demuxer_manager.h
index 988be31a..9c867cb 100644
--- a/media/filters/demuxer_manager.h
+++ b/media/filters/demuxer_manager.h
@@ -184,7 +184,8 @@
 #endif  // BUILDFLAG(ENABLE_FFMPEG)
 
 #if BUILDFLAG(ENABLE_HLS_DEMUXER)
-  std::unique_ptr<Demuxer> CreateHlsDemuxer();
+  std::tuple<raw_ptr<DataSourceInfo>, std::unique_ptr<Demuxer>>
+  CreateHlsDemuxer();
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
@@ -246,6 +247,13 @@
   // Holds whichever demuxer implementation is being used.
   std::unique_ptr<Demuxer> demuxer_;
 
+  // Refers to the owned object that can query information about a data source.
+  // For most playbacks, this is a raw ptr to `data_source_`, and so it is safe,
+  // since this class also owns that object. For HLS playback, this object is
+  // the HlsManifestDemuxerEngine, owned by `demuxer_`, so again, it is safe to
+  // keep a raw ptr here.
+  raw_ptr<DataSourceInfo> data_source_info_ = nullptr;
+
   // Holds an optional demuxer that can be passed in at time of creation,
   // which becomes the default demuxer to use.
   std::unique_ptr<Demuxer> demuxer_override_;
diff --git a/media/filters/hls_data_source_provider.h b/media/filters/hls_data_source_provider.h
index d3fabe6..99d6d1a3 100644
--- a/media/filters/hls_data_source_provider.h
+++ b/media/filters/hls_data_source_provider.h
@@ -104,6 +104,18 @@
 
   const uint8_t* raw_data() const { return buffer_.data(); }
 
+  uint64_t memory_usage() const { return memory_usage_; }
+
+  bool would_taint_origin() const { return would_taint_origin_; }
+
+  // Allows the stream creator to update memory usage after the first or after
+  // subsequent reads.
+  void set_total_memory_usage(uint64_t usage) { memory_usage_ = usage; }
+
+  // A stream's origin is considered tainted if any backing data source involved
+  // in this playback is tainted.
+  void set_would_taint_origin() { would_taint_origin_ = true; }
+
   // Often the network data for HLS consists of plain-text manifest files, so
   // this supports accessing the fetched data as a string view.
   std::string_view AsString() const;
@@ -143,6 +155,14 @@
   // size-flexible data structure to avoid resizing.
   std::vector<uint8_t> buffer_;
 
+  // This is critical to security. Once set to true, it must _never_ be set back
+  // to false.
+  bool would_taint_origin_ = false;
+
+  // The memory usage represents the total memory usage for _all_ streams used
+  // in this playback.
+  uint64_t memory_usage_ = 0;
+
   size_t read_position_ = 0;
 
   // The write index into `buffer_`. This gets reset on flush.
diff --git a/media/filters/hls_data_source_provider_impl.cc b/media/filters/hls_data_source_provider_impl.cc
index 7fd5a45..f057e264 100644
--- a/media/filters/hls_data_source_provider_impl.cc
+++ b/media/filters/hls_data_source_provider_impl.cc
@@ -20,11 +20,13 @@
 // a single chunk. Chosen somewhat arbitrarily otherwise.
 constexpr size_t kDefaultReadSize = 1024 * 16;
 
-void OnMultiBufferReadComplete(std::unique_ptr<HlsDataSourceStream> stream,
-                               HlsDataSourceProviderImpl::ReadCb callback,
-                               int requested_read_size,
-                               void* trace_key,
-                               int read_size) {
+void OnMultiBufferReadComplete(
+    std::unique_ptr<HlsDataSourceStream> stream,
+    HlsDataSourceProviderImpl::ReadCb callback,
+    base::OnceCallback<void(HlsDataSourceStream&)> update_metadata,
+    int requested_read_size,
+    uint64_t trace_key,
+    int read_size) {
   TRACE_EVENT_NESTABLE_ASYNC_END1("media", "HLS::ReadExistingStream", trace_key,
                                   "size", read_size);
   switch (read_size) {
@@ -41,6 +43,7 @@
     default: {
       CHECK_GE(read_size, 0);
       stream->UnlockStreamPostWrite(read_size, 0 == read_size);
+      std::move(update_metadata).Run(*stream);
       std::move(callback).Run(std::move(stream));
     }
   }
@@ -79,6 +82,20 @@
   ReadFromExistingStream(std::move(stream), std::move(callback));
 }
 
+void HlsDataSourceProviderImpl::UpdateStreamMetadata(
+    HlsDataSourceStream::StreamId stream_id,
+    HlsDataSourceStream& stream) {
+  uint64_t usage = 0;
+  for (const auto& it : data_source_map_) {
+    usage += it.second->GetMemoryUsage();
+    would_taint_origin_ |= it.second->WouldTaintOrigin();
+  }
+  stream.set_total_memory_usage(usage);
+  if (would_taint_origin_) {
+    stream.set_would_taint_origin();
+  }
+}
+
 void HlsDataSourceProviderImpl::ReadFromExistingStream(
     std::unique_ptr<HlsDataSourceStream> stream,
     ReadCb callback) {
@@ -128,15 +145,16 @@
 
   auto int_read_size = base::checked_cast<int>(read_size);
   auto* buffer_data = stream->LockStreamForWriting(int_read_size);
+  auto stream_id = stream->stream_id();
+  uint64_t async_event_key = reinterpret_cast<std::uintptr_t>(this);
 
-  // `this` used here is _only_ for use as a key in
-  // TRACE_EVENT_NESTABLE_ASYNC_END.
-  it->second->Read(base::checked_cast<int64_t>(pos), int_read_size, buffer_data,
-                   base::BindOnce(&OnMultiBufferReadComplete, std::move(stream),
-                                  std::move(callback), int_read_size,
-                                  // TODO(https://crbug.com/1380714): Remove
-                                  // `UnsafeDanglingUntriaged`
-                                  base::UnsafeDanglingUntriaged(this)));
+  it->second->Read(
+      base::checked_cast<int64_t>(pos), int_read_size, buffer_data,
+      base::BindOnce(
+          &OnMultiBufferReadComplete, std::move(stream), std::move(callback),
+          base::BindOnce(&HlsDataSourceProviderImpl::UpdateStreamMetadata,
+                         weak_factory_.GetWeakPtr(), stream_id),
+          int_read_size, async_event_key));
 }
 
 void HlsDataSourceProviderImpl::OnDataSourceCreated(
@@ -150,6 +168,7 @@
     old_data_source->second->Stop();
     data_source_map_.erase(old_data_source);
   }
+  would_taint_origin_ |= data_source->WouldTaintOrigin();
   auto pair = data_source_map_.try_emplace(stream_id, std::move(data_source));
   // Cross origin data sources have an asynchronous initialize method which
   // must be called after they're put into `data_source_map_`. Other types of
diff --git a/media/filters/hls_data_source_provider_impl.h b/media/filters/hls_data_source_provider_impl.h
index c346098585..46cfa35 100644
--- a/media/filters/hls_data_source_provider_impl.h
+++ b/media/filters/hls_data_source_provider_impl.h
@@ -42,6 +42,8 @@
   void AbortPendingReads(base::OnceClosure cb) override;
 
  private:
+  void UpdateStreamMetadata(HlsDataSourceStream::StreamId,
+                            HlsDataSourceStream& stream);
   void OnDataSourceCreated(std::unique_ptr<HlsDataSourceStream> stream,
                            ReadCb callback,
                            std::unique_ptr<DataSource> data_source);
@@ -57,6 +59,8 @@
   base::flat_map<HlsDataSourceStream::StreamId, std::unique_ptr<DataSource>>
       data_source_map_;
 
+  bool would_taint_origin_ = false;
+
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<HlsDataSourceProviderImpl> weak_factory_{this};
diff --git a/media/filters/hls_manifest_demuxer_engine.cc b/media/filters/hls_manifest_demuxer_engine.cc
index 8640ad84..904d1ce 100644
--- a/media/filters/hls_manifest_demuxer_engine.cc
+++ b/media/filters/hls_manifest_demuxer_engine.cc
@@ -156,12 +156,14 @@
 HlsManifestDemuxerEngine::HlsManifestDemuxerEngine(
     base::SequenceBound<HlsDataSourceProvider> dsp,
     scoped_refptr<base::SequencedTaskRunner> media_task_runner,
+    bool was_already_tainted,
     GURL root_playlist_uri,
     MediaLog* media_log)
     : data_source_provider_(std::move(dsp)),
       media_task_runner_(std::move(media_task_runner)),
       root_playlist_uri_(std::move(root_playlist_uri)),
-      media_log_(media_log->Clone()) {
+      media_log_(media_log->Clone()),
+      origin_tainted_(was_already_tainted) {
   // This is always created on the main sequence, but used on the media sequence
   DETACH_FROM_SEQUENCE(media_sequence_checker_);
 }
@@ -202,6 +204,18 @@
 HlsManifestDemuxerEngine::PlaylistParseInfo::PlaylistParseInfo(
     const PlaylistParseInfo& copy) = default;
 
+int64_t HlsManifestDemuxerEngine::GetMemoryUsage() {
+  return total_stream_memory_;
+}
+
+bool HlsManifestDemuxerEngine::WouldTaintOrigin() {
+  return origin_tainted_;
+}
+
+bool HlsManifestDemuxerEngine::IsStreaming() {
+  return !is_seekable_;
+}
+
 std::string HlsManifestDemuxerEngine::GetName() const {
   return "HlsManifestDemuxer";
 }
@@ -401,18 +415,6 @@
     GURL uri,
     base::OnceCallback<void(bool)> cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(media_sequence_checker_);
-  ProcessAsyncAction<bool>(
-      std::move(cb),
-      base::BindOnce(
-          &HlsManifestDemuxerEngine::UpdateRenditionManifestUriAction,
-          weak_factory_.GetWeakPtr(), std::move(role), std::move(uri)));
-}
-
-void HlsManifestDemuxerEngine::UpdateRenditionManifestUriAction(
-    std::string role,
-    GURL uri,
-    base::OnceCallback<void(bool)> cb) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(media_sequence_checker_);
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "HLS::UpdateRenditionManifest",
                                     this, "uri", uri);
   GURL uri_copy = uri;
@@ -513,6 +515,28 @@
   }
 }
 
+void HlsManifestDemuxerEngine::UpdateHlsDataSourceStats(
+    HlsDataSourceProvider::ReadCb cb,
+    HlsDataSourceProvider::ReadStatus::Or<std::unique_ptr<HlsDataSourceStream>>
+        result) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(media_sequence_checker_);
+  if (!result.has_value()) {
+    std::move(cb).Run(std::move(result).error().AddHere());
+    return;
+  }
+  auto stream = std::move(result).value();
+  origin_tainted_ |= stream->would_taint_origin();
+  total_stream_memory_ = stream->memory_usage();
+  std::move(cb).Run(std::move(stream));
+}
+
+HlsDataSourceProvider::ReadCb HlsManifestDemuxerEngine::BindStatsUpdate(
+    HlsDataSourceProvider::ReadCb cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(media_sequence_checker_);
+  return base::BindOnce(&HlsManifestDemuxerEngine::UpdateHlsDataSourceStats,
+                        weak_factory_.GetWeakPtr(), std::move(cb));
+}
+
 void HlsManifestDemuxerEngine::ReadUntilExhausted(
     HlsDataSourceProvider::ReadCb cb,
     HlsDataSourceProvider::ReadStatus::Or<std::unique_ptr<HlsDataSourceStream>>
@@ -550,10 +574,11 @@
                                     "uri", uri);
   data_source_provider_
       .AsyncCall(&HlsDataSourceProvider::ReadFromCombinedUrlQueue)
-      .WithArgs(std::move(queue),
-                base::BindPostTaskToCurrentDefault(base::BindOnce(
-                    &HlsManifestDemuxerEngine::ReadUntilExhausted,
-                    weak_factory_.GetWeakPtr(), std::move(cb))));
+      .WithArgs(
+          std::move(queue),
+          base::BindPostTaskToCurrentDefault(base::BindOnce(
+              &HlsManifestDemuxerEngine::ReadUntilExhausted,
+              weak_factory_.GetWeakPtr(), BindStatsUpdate(std::move(cb)))));
 }
 
 void HlsManifestDemuxerEngine::ReadMediaSegment(
@@ -585,8 +610,8 @@
 
   data_source_provider_
       .AsyncCall(&HlsDataSourceProvider::ReadFromCombinedUrlQueue)
-      .WithArgs(std::move(queue),
-                base::BindPostTaskToCurrentDefault(std::move(cb)));
+      .WithArgs(std::move(queue), base::BindPostTaskToCurrentDefault(
+                                      BindStatsUpdate(std::move(cb))));
 }
 
 void HlsManifestDemuxerEngine::ReadStream(
@@ -600,8 +625,8 @@
   }
   data_source_provider_
       .AsyncCall(&HlsDataSourceProvider::ReadFromExistingStream)
-      .WithArgs(std::move(stream),
-                base::BindPostTaskToCurrentDefault(std::move(cb)));
+      .WithArgs(std::move(stream), base::BindPostTaskToCurrentDefault(
+                                       BindStatsUpdate(std::move(cb))));
 }
 
 void HlsManifestDemuxerEngine::UpdateNetworkSpeed(uint64_t bps) {
diff --git a/media/filters/hls_manifest_demuxer_engine.h b/media/filters/hls_manifest_demuxer_engine.h
index 7832f22..474c4dc 100644
--- a/media/filters/hls_manifest_demuxer_engine.h
+++ b/media/filters/hls_manifest_demuxer_engine.h
@@ -31,14 +31,21 @@
 // This will use the HLS parsers and rendition selectors to fetch and parse
 // playlists, followed by fetching and appending media segments.
 class MEDIA_EXPORT HlsManifestDemuxerEngine : public ManifestDemuxer::Engine,
-                                              public HlsRenditionHost {
+                                              public HlsRenditionHost,
+                                              public DataSourceInfo {
  public:
   HlsManifestDemuxerEngine(base::SequenceBound<HlsDataSourceProvider> dsp,
                            scoped_refptr<base::SequencedTaskRunner> task_runner,
+                           bool was_already_tainted,
                            GURL root_playlist_uri,
                            MediaLog* media_log);
   ~HlsManifestDemuxerEngine() override;
 
+  // DataSourceInfo implementation
+  int64_t GetMemoryUsage() override;
+  bool WouldTaintOrigin() override;
+  bool IsStreaming() override;
+
   // ManifestDemuxer::Engine implementation
   std::string GetName() const override;
   void Initialize(ManifestDemuxerEngineHost* host,
@@ -158,11 +165,6 @@
                   std::string role,
                   ManifestDemuxer::DelayCallback cb,
                   base::TimeDelta delay_time);
-
-  // Posted by `::UpdateRenditionManifestUri`
-  void UpdateRenditionManifestUriAction(std::string role,
-                                        GURL uri,
-                                        base::OnceCallback<void(bool)> cb);
   void UpdateMediaPlaylistForRole(
       std::string role,
       GURL uri,
@@ -203,6 +205,17 @@
   void Abort(hls::ParseStatus status);
   void Abort(HlsDataSourceProvider::ReadStatus status);
 
+  // Capture the stream before it gets posted to `cb` and update the internal
+  // memory state and origin tainting.
+  void UpdateHlsDataSourceStats(
+      HlsDataSourceProvider::ReadCb cb,
+      HlsDataSourceProvider::ReadStatus::Or<
+          std::unique_ptr<HlsDataSourceStream>> result);
+
+  // Helper to bind `UpdateHlsDataSourceStats` around a response CB.
+  HlsDataSourceProvider::ReadCb BindStatsUpdate(
+      HlsDataSourceProvider::ReadCb cb);
+
   // Read the entire contents of a data source stream before calling cb.
   void ReadUntilExhausted(HlsDataSourceProvider::ReadCb cb,
                           HlsDataSourceProvider::ReadResult result);
@@ -289,6 +302,14 @@
   // Is an action currently running?
   bool action_in_progress_ GUARDED_BY_CONTEXT(media_sequence_checker_) = false;
 
+  // The informational class which can combine memory usage and origin tainting
+  // for all sub-data sources.
+  bool origin_tainted_ = false;
+
+  // The total amount of memory that is used by data sources. It gets updated
+  // after every successful read.
+  uint64_t total_stream_memory_ = 0;
+
   // When renditions are added, this ensures that they are all of the same
   // liveness, and allows access to the liveness check later.
   std::optional<bool> is_seekable_ = std::nullopt;
diff --git a/media/filters/hls_manifest_demuxer_engine_unittest.cc b/media/filters/hls_manifest_demuxer_engine_unittest.cc
index 8c2413b..a89c2f0 100644
--- a/media/filters/hls_manifest_demuxer_engine_unittest.cc
+++ b/media/filters/hls_manifest_demuxer_engine_unittest.cc
@@ -60,6 +60,38 @@
     "#EXTINF:3.003,\n"
     "http://media.example.com/third.ts\n";
 
+const std::string kInitialRequestLiveMediaPlaylist =
+    "#EXTM3U\n"
+    "#EXT-X-TARGETDURATION:10\n"
+    "#EXT-X-VERSION:3\n"
+    "#EXT-X-MEDIA-SEQUENCE:1234\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/a.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/b.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/c.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/d.ts\n";
+
+const std::string kSecondRequestLiveMediaPlaylist =
+    "#EXTM3U\n"
+    "#EXT-X-TARGETDURATION:10\n"
+    "#EXT-X-VERSION:3\n"
+    "#EXT-X-MEDIA-SEQUENCE:1236\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/c.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/d.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/e.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/f.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/g.ts\n"
+    "#EXTINF:9.009,\n"
+    "http://media.example.com/h.ts\n";
+
 const std::string kSingleInfoMediaPlaylist =
     "#EXTM3U\n"
     "#EXT-X-TARGETDURATION:10\n"
@@ -164,35 +196,66 @@
   }
 };
 
+template <typename T>
+class CallbackEnforcer {
+ public:
+  explicit CallbackEnforcer(T expected)
+      : expected_(std::move(expected)), was_called_(false) {}
+
+  base::OnceCallback<void(T)> GetCallback() {
+    return base::BindOnce(
+        [](bool* writeback, T expected, T actual) {
+          *writeback = true;
+          ASSERT_EQ(actual, expected);
+        },
+        &was_called_, expected_);
+  }
+
+  // This method is move only, so it must be std::moved.
+  void AssertAndReset(base::test::TaskEnvironment& env) && {
+    env.RunUntilIdle();
+    ASSERT_TRUE(was_called_);
+  }
+
+ private:
+  T expected_;
+  bool was_called_ = false;
+};
+
 class HlsManifestDemuxerEngineTest : public testing::Test {
  protected:
   std::unique_ptr<MediaLog> media_log_;
   std::unique_ptr<MockManifestDemuxerEngineHost> mock_mdeh_;
   std::unique_ptr<MockHlsDataSourceProvider> mock_dsp_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   std::unique_ptr<HlsManifestDemuxerEngine> engine_;
 
   base::OnceClosure pending_url_fetch_;
 
   template <typename T>
-  void BindUrlToDataSource(std::string url, std::string value) {
+  void BindUrlToDataSource(std::string url,
+                           std::string value,
+                           bool taint_origin = false) {
     EXPECT_CALL(*mock_dsp_, ReadFromCombinedUrlQueue(
                                 SingleSegmentQueue(url, std::nullopt), _))
         .Times(1)
-        .WillOnce(RunOnceCallback<1>(T::CreateStream(value)));
+        .WillOnce(RunOnceCallback<1>(T::CreateStream(value, taint_origin)));
   }
 
   template <typename T>
-  void BindUrlAssignmentThunk(std::string url, std::string value) {
+  void BindUrlAssignmentThunk(std::string url,
+                              std::string value,
+                              bool taint_origin = false) {
     EXPECT_CALL(*mock_dsp_,
                 ReadFromCombinedUrlQueue(
                     SingleSegmentQueue(std::move(url), std::nullopt), _))
         .Times(1)
-        .WillOnce([this, value = std::move(value)](
+        .WillOnce([this, value = std::move(value), taint_origin = taint_origin](
                       HlsDataSourceProvider::SegmentQueue,
                       HlsDataSourceProvider::ReadCb cb) {
-          pending_url_fetch_ =
-              base::BindOnce(std::move(cb), T::CreateStream(std::move(value)));
+          pending_url_fetch_ = base::BindOnce(
+              std::move(cb), T::CreateStream(std::move(value), taint_origin));
         });
   }
 
@@ -316,7 +379,8 @@
 
     engine_ = std::make_unique<HlsManifestDemuxerEngine>(
         std::move(dsp), base::SingleThreadTaskRunner::GetCurrentDefault(),
-        GURL("http://media.example.com/manifest.m3u8"), media_log_.get());
+        false, GURL("http://media.example.com/manifest.m3u8"),
+        media_log_.get());
   }
 
   void InitializeEngine() {
@@ -370,6 +434,94 @@
   ASSERT_FALSE(engine_->IsSeekable());
 }
 
+TEST_F(HlsManifestDemuxerEngineTest, TestLivePlaybackManifestUpdates) {
+  EXPECT_CALL(*mock_mdeh_, SetSequenceMode("primary", true));
+  EXPECT_CALL(*mock_mdeh_,
+              AddRole("primary", RelaxedParserSupportedType::kMP2T));
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/manifest.m3u8",
+      kInitialRequestLiveMediaPlaylist);
+
+  EXPECT_CALL(*this, MockInitComplete(HasStatusCode(PIPELINE_OK)));
+  InitializeEngine();
+  task_environment_.RunUntilIdle();
+
+  // Assume that anything appended is valid, because we actually have no valid
+  // media for this test.
+  EXPECT_CALL(*mock_mdeh_, AppendAndParseData("primary", _, _, _, _, _))
+      .WillRepeatedly(Return(true));
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/a.ts", "Cheese in a cstring is string cheese.");
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/b.ts",
+      "Tomatoes are a fruit. Ketchup is a jam.");
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/c.ts", "You've never been in an empty room.");
+
+  Ranges<base::TimeDelta> after_seg_a;
+  after_seg_a.Add(base::Seconds(0), base::Seconds(9));
+
+  Ranges<base::TimeDelta> after_seg_b;
+  after_seg_b.Add(base::Seconds(0), base::Seconds(18));
+
+  Ranges<base::TimeDelta> after_seg_c;
+  after_seg_c.Add(base::Seconds(0), base::Seconds(27));
+
+  EXPECT_CALL(*mock_mdeh_, GetBufferedRanges(_))
+      .WillOnce(Return(Ranges<base::TimeDelta>()))  // First CheckState
+      .WillOnce(Return(after_seg_a))                // After appending segment A
+      .WillOnce(Return(after_seg_a))                // Second CheckState
+      .WillOnce(Return(after_seg_b))                // After appending segment B
+      .WillOnce(Return(after_seg_b))                // Third CheckState
+      .WillOnce(Return(after_seg_b))                // Fourth CheckState
+      .WillOnce(Return(after_seg_c))                // After appending segment C
+      .WillOnce(Return(after_seg_c))                // Fifth CheckState
+      ;
+
+  // Give a playback-rate=1 time update, signaling start of play. Since a data
+  // append happens, we should ask for a delay of 0.
+  CallbackEnforcer<base::TimeDelta> first(base::Seconds(0));
+  engine_->OnTimeUpdate(base::Seconds(0), 1.0, first.GetCallback());
+  std::move(first).AssertAndReset(task_environment_);
+
+  // Make another request. This time, we have some data, but it's less than the
+  // ideal buffer size, so it will make another request to append data. Again
+  // because there was an append, we ask for a delay of 0.
+  CallbackEnforcer<base::TimeDelta> second(base::Seconds(0));
+  engine_->OnTimeUpdate(base::Seconds(0), 1.0, second.GetCallback());
+  std::move(second).AssertAndReset(task_environment_);
+
+  // Lets pretend time ticked forward 1 second while we were making that network
+  // request for segment 2, and now the range is {0-18}. we calculate that we
+  // can delay for (buffer - ideal/2) => (17 - 10/2) => 12.
+  CallbackEnforcer<base::TimeDelta> third(base::Seconds(12));
+  task_environment_.FastForwardBy(base::Seconds(1));
+  engine_->OnTimeUpdate(base::Seconds(1), 1.0, third.GetCallback());
+  std::move(third).AssertAndReset(task_environment_);
+
+  // Lets fast forward those 12 seconds and make another request. This will
+  // leave a remaining buffer of 5 seconds, which will trigger another segment
+  // read, which means a delay of 0.
+  CallbackEnforcer<base::TimeDelta> fourth(base::Seconds(0));
+  task_environment_.FastForwardBy(base::Seconds(12));
+  engine_->OnTimeUpdate(base::Seconds(13), 1.0, fourth.GetCallback());
+  std::move(fourth).AssertAndReset(task_environment_);
+
+  // This time, The buffer is large enough - 27 seconds is the end while the
+  // media time is only 13 seconds, but we've popped 3/4 segments from the
+  // queue, which leaves 1. Multiplying that by the 10 second max duration, we
+  // find that because it's been 13 seconds since the last manifest update, its
+  // time to make another one. We bind a new data stream to the manifest URL,
+  // which should populate the queue with more segments. There should then
+  // be a response of (27 - 13) - (10/2), or 9 seconds.
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/manifest.m3u8",
+      kSecondRequestLiveMediaPlaylist);
+  CallbackEnforcer<base::TimeDelta> fifth(base::Seconds(9));
+  engine_->OnTimeUpdate(base::Seconds(13), 1.0, fifth.GetCallback());
+  std::move(fifth).AssertAndReset(task_environment_);
+}
+
 TEST_F(HlsManifestDemuxerEngineTest, TestMultivariantPlaylistNoAlternates) {
   EXPECT_CALL(*mock_mdeh_, SetSequenceMode("primary", true));
   EXPECT_CALL(*mock_mdeh_, SetDuration(21.021));
@@ -811,4 +963,20 @@
   task_environment_.RunUntilIdle();
 }
 
+TEST_F(HlsManifestDemuxerEngineTest, TestOriginTainting) {
+  EXPECT_CALL(*mock_mdeh_, SetSequenceMode("primary", true));
+  EXPECT_CALL(*mock_mdeh_, SetDuration(21.021));
+  EXPECT_CALL(*mock_mdeh_,
+              AddRole("primary", RelaxedParserSupportedType::kMP2T));
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://media.example.com/manifest.m3u8", kSimpleMultivariantPlaylist,
+      /*taint_origin=*/true);
+  BindUrlToDataSource<StringHlsDataSourceStreamFactory>(
+      "http://example.com/hi.m3u8", kSimpleMediaPlaylist);
+  EXPECT_CALL(*this, MockInitComplete(HasStatusCode(PIPELINE_OK)));
+  InitializeEngine();
+  task_environment_.RunUntilIdle();
+  ASSERT_TRUE(engine_->WouldTaintOrigin());
+}
+
 }  // namespace media
diff --git a/media/filters/hls_test_helpers.cc b/media/filters/hls_test_helpers.cc
index 1304218..743fbaf 100644
--- a/media/filters/hls_test_helpers.cc
+++ b/media/filters/hls_test_helpers.cc
@@ -16,7 +16,8 @@
 
 // static
 std::unique_ptr<HlsDataSourceStream>
-StringHlsDataSourceStreamFactory::CreateStream(std::string content) {
+StringHlsDataSourceStreamFactory::CreateStream(std::string content,
+                                               bool taint_origin) {
   HlsDataSourceProvider::SegmentQueue segments;
   auto stream = std::make_unique<HlsDataSourceStream>(
       HlsDataSourceStream::StreamId::FromUnsafeValue(42), std::move(segments),
@@ -24,12 +25,16 @@
   auto* buffer = stream->LockStreamForWriting(content.length());
   memcpy(buffer, content.c_str(), content.length());
   stream->UnlockStreamPostWrite(content.length(), true);
+  if (taint_origin) {
+    stream->set_would_taint_origin();
+  }
   return stream;
 }
 
 // static
 std::unique_ptr<HlsDataSourceStream>
-FileHlsDataSourceStreamFactory::CreateStream(std::string filename) {
+FileHlsDataSourceStreamFactory::CreateStream(std::string filename,
+                                             bool taint_origin) {
   base::FilePath file_path = GetTestDataFilePath(filename);
   int64_t file_size = 0;
   CHECK(base::GetFileSize(file_path, &file_size))
@@ -42,6 +47,9 @@
   CHECK_EQ(file_size, base::ReadFile(file_path, reinterpret_cast<char*>(buffer),
                                      file_size));
   stream->UnlockStreamPostWrite(file_size, true);
+  if (taint_origin) {
+    stream->set_would_taint_origin();
+  }
   return stream;
 }
 
diff --git a/media/filters/hls_test_helpers.h b/media/filters/hls_test_helpers.h
index bdca418..ec7fda84 100644
--- a/media/filters/hls_test_helpers.h
+++ b/media/filters/hls_test_helpers.h
@@ -36,12 +36,16 @@
 
 class StringHlsDataSourceStreamFactory {
  public:
-  static std::unique_ptr<HlsDataSourceStream> CreateStream(std::string content);
+  static std::unique_ptr<HlsDataSourceStream> CreateStream(
+      std::string content,
+      bool taint_origin = false);
 };
 
 class FileHlsDataSourceStreamFactory {
  public:
-  static std::unique_ptr<HlsDataSourceStream> CreateStream(std::string file);
+  static std::unique_ptr<HlsDataSourceStream> CreateStream(
+      std::string file,
+      bool taint_origin = false);
 };
 
 class MockManifestDemuxerEngineHost : public ManifestDemuxerEngineHost {
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc
index 02a9121..1588b618 100644
--- a/media/test/pipeline_integration_test_base.cc
+++ b/media/test/pipeline_integration_test_base.cc
@@ -277,7 +277,7 @@
 
   auto engine = std::make_unique<HlsManifestDemuxerEngine>(
       std::move(hls_dsp), task_environment_.GetMainThreadTaskRunner(),
-      manifest_root, &media_log_);
+      /*name=*/false, manifest_root, &media_log_);
   demuxer_ = std::make_unique<ManifestDemuxer>(
       task_environment_.GetMainThreadTaskRunner(), base::DoNothing(),
       std::move(engine), &media_log_);
diff --git a/mojo/public/cpp/base/ref_counted_memory_mojom_traits.cc b/mojo/public/cpp/base/ref_counted_memory_mojom_traits.cc
index 6517def..c5e87ca7 100644
--- a/mojo/public/cpp/base/ref_counted_memory_mojom_traits.cc
+++ b/mojo/public/cpp/base/ref_counted_memory_mojom_traits.cc
@@ -12,7 +12,7 @@
 mojo_base::BigBuffer StructTraits<mojo_base::mojom::RefCountedMemoryDataView,
                                   scoped_refptr<base::RefCountedMemory>>::
     data(const scoped_refptr<base::RefCountedMemory>& in) {
-  return mojo_base::BigBuffer(base::span(*in));
+  return mojo_base::BigBuffer(base::make_span(in->front(), in->size()));
 }
 
 // static
diff --git a/net/base/directory_listing.cc b/net/base/directory_listing.cc
index 0cd2a56..f70f70c6 100644
--- a/net/base/directory_listing.cc
+++ b/net/base/directory_listing.cc
@@ -24,9 +24,8 @@
   DLOG_IF(WARNING, !header) << "Missing resource: directory listing header";
 
   std::string result;
-  if (header) {
-    result = base::as_string_view(*header);
-  }
+  if (header)
+    result.assign(header->front_as<char>(), header->size());
 
   result.append("<script>start(");
   base::EscapeJSONString(title, true, &result);
diff --git a/net/log/trace_net_log_observer_unittest.cc b/net/log/trace_net_log_observer_unittest.cc
index a6ae18e..c29858ed 100644
--- a/net/log/trace_net_log_observer_unittest.cc
+++ b/net/log/trace_net_log_observer_unittest.cc
@@ -124,7 +124,7 @@
       bool has_more_events) {
     DCHECK(trace_events_.empty());
     trace_buffer_.Start();
-    trace_buffer_.AddFragment(events_str->as_string());
+    trace_buffer_.AddFragment(events_str->data());
     trace_buffer_.Finish();
 
     std::optional<base::Value> trace_value;
diff --git a/remoting/host/audio_capturer_linux.cc b/remoting/host/audio_capturer_linux.cc
index 6bf0c6a..5ddcaf2 100644
--- a/remoting/host/audio_capturer_linux.cc
+++ b/remoting/host/audio_capturer_linux.cc
@@ -58,16 +58,13 @@
   DCHECK(!callback_.is_null());
 
   if (silence_detector_.IsSilence(
-          // TODO(danakj): This cast can cause UB, we should copy into integers
-          // or pass it as a byte span.
-          reinterpret_cast<const int16_t*>(data->as_string().data()),
-          data->as_string().size() / sizeof(int16_t) /
-              AudioPipeReader::kChannels)) {
+          reinterpret_cast<const int16_t*>(data->data().data()),
+          data->data().size() / sizeof(int16_t) / AudioPipeReader::kChannels)) {
     return;
   }
 
-  auto packet = std::make_unique<AudioPacket>();
-  packet->add_data(data->as_string());
+  std::unique_ptr<AudioPacket> packet(new AudioPacket());
+  packet->add_data(data->data());
   packet->set_encoding(AudioPacket::ENCODING_RAW);
   packet->set_sampling_rate(AudioPipeReader::kSamplingRate);
   packet->set_bytes_per_sample(AudioPipeReader::kBytesPerSample);
diff --git a/remoting/host/linux/audio_pipe_reader_unittest.cc b/remoting/host/linux/audio_pipe_reader_unittest.cc
index 517f56e..86de440 100644
--- a/remoting/host/linux/audio_pipe_reader_unittest.cc
+++ b/remoting/host/linux/audio_pipe_reader_unittest.cc
@@ -41,7 +41,7 @@
 
   // AudioPipeReader::StreamObserver interface.
   void OnDataRead(scoped_refptr<base::RefCountedString> data) override {
-    read_data_ += data->as_string();
+    read_data_ += data->data();
     if (stop_at_position_ > 0 &&
         static_cast<int>(read_data_.size()) >= stop_at_position_) {
       stop_at_position_ = -1;
diff --git a/remoting/host/linux/x_server_clipboard.cc b/remoting/host/linux/x_server_clipboard.cc
index 4af7cf18..0092f7f7 100644
--- a/remoting/host/linux/x_server_clipboard.cc
+++ b/remoting/host/linux/x_server_clipboard.cc
@@ -208,7 +208,7 @@
         large_selection_property_ = x11::Atom::None;
         if (reply->type != x11::Atom::None) {
           HandleSelectionNotify(event, reply->type, reply->format,
-                                reply->value_len, reply->value->bytes());
+                                reply->value_len, reply->value->data());
           return;
         }
       }
diff --git a/services/device/hid/hid_connection_impl.cc b/services/device/hid/hid_connection_impl.cc
index 677b42d..3b1b56a 100644
--- a/services/device/hid/hid_connection_impl.cc
+++ b/services/device/hid/hid_connection_impl.cc
@@ -58,7 +58,7 @@
   DCHECK_GE(size, 1u);
   std::vector<uint8_t> data;
   if (size > 1) {
-    data = std::vector<uint8_t>(buffer->data() + 1, buffer->data() + size);
+    data = std::vector<uint8_t>(buffer->front() + 1, buffer->front() + size);
   }
   client_->OnInputReport(/*report_id=*/buffer->data()[0], data);
 }
@@ -80,7 +80,7 @@
   }
   DCHECK(buffer);
 
-  std::vector<uint8_t> data(buffer->data() + 1, buffer->data() + size);
+  std::vector<uint8_t> data(buffer->front() + 1, buffer->front() + size);
   std::move(callback).Run(true, buffer->data()[0], data);
 }
 
@@ -90,9 +90,10 @@
   DCHECK(hid_connection_);
 
   auto io_buffer =
-      base::MakeRefCounted<base::RefCountedBytes>(buffer.size() + 1u);
-  io_buffer->as_vector().data()[0u] = report_id;
-  base::span(io_buffer->as_vector()).subspan(1u).copy_from(buffer);
+      base::MakeRefCounted<base::RefCountedBytes>(buffer.size() + 1);
+  io_buffer->data()[0] = report_id;
+
+  base::ranges::copy(buffer, io_buffer->front() + 1);
 
   hid_connection_->Write(io_buffer, base::BindOnce(&HidConnectionImpl::OnWrite,
                                                    weak_factory_.GetWeakPtr(),
@@ -123,7 +124,7 @@
   }
   DCHECK(buffer);
 
-  std::vector<uint8_t> data(buffer->data(), buffer->data() + size);
+  std::vector<uint8_t> data(buffer->front(), buffer->front() + size);
   std::move(callback).Run(true, data);
 }
 
@@ -133,9 +134,10 @@
   DCHECK(hid_connection_);
 
   auto io_buffer =
-      base::MakeRefCounted<base::RefCountedBytes>(buffer.size() + 1u);
-  io_buffer->as_vector()[0u] = report_id;
-  base::span(io_buffer->as_vector()).subspan(1u).copy_from(buffer);
+      base::MakeRefCounted<base::RefCountedBytes>(buffer.size() + 1);
+  io_buffer->data()[0] = report_id;
+
+  base::ranges::copy(buffer, io_buffer->front() + 1);
 
   hid_connection_->SendFeatureReport(
       io_buffer,
diff --git a/services/device/hid/hid_connection_impl_unittest.cc b/services/device/hid/hid_connection_impl_unittest.cc
index 6c44be1..3fc395b2 100644
--- a/services/device/hid/hid_connection_impl_unittest.cc
+++ b/services/device/hid/hid_connection_impl_unittest.cc
@@ -372,7 +372,7 @@
                                     write_future.GetCallback());
   EXPECT_TRUE(write_future.Get());
   ASSERT_TRUE(feature_buffer);
-  EXPECT_THAT(feature_buffer->as_vector(), ElementsAre(kTestReportId));
+  EXPECT_THAT(feature_buffer->data(), ElementsAre(kTestReportId));
 }
 
 }  // namespace device
diff --git a/services/device/hid/hid_connection_linux.cc b/services/device/hid/hid_connection_linux.cc
index 2368fee..02c30ba 100644
--- a/services/device/hid/hid_connection_linux.cc
+++ b/services/device/hid/hid_connection_linux.cc
@@ -66,7 +66,7 @@
         FROM_HERE, base::BlockingType::MAY_BLOCK);
 
     ssize_t result =
-        HANDLE_EINTR(write(fd_.get(), buffer->data(), buffer->size()));
+        HANDLE_EINTR(write(fd_.get(), buffer->front(), buffer->size()));
     if (result < 0) {
       HID_PLOG(EVENT) << "Write failed";
       return false;
@@ -87,7 +87,7 @@
         FROM_HERE, base::BlockingType::MAY_BLOCK);
 
     int result = HANDLE_EINTR(
-        ioctl(fd_.get(), HIDIOCGFEATURE(buffer->size()), buffer->data()));
+        ioctl(fd_.get(), HIDIOCGFEATURE(buffer->size()), buffer->front()));
     if (result < 0) {
       HID_PLOG(EVENT) << "Failed to get feature report";
       return std::make_tuple(false, nullptr, 0);
@@ -98,7 +98,7 @@
       // Linux adds a 0 to the beginning of the data received from the device.
       auto copied_buffer =
           base::MakeRefCounted<base::RefCountedBytes>(result - 1);
-      memcpy(copied_buffer->as_vector().data(), buffer->data() + 1, result - 1);
+      memcpy(copied_buffer->front(), buffer->front() + 1, result - 1);
       return std::make_tuple(true, std::move(copied_buffer), result - 1);
     } else {
       return std::make_tuple(true, std::move(buffer), result);
@@ -111,7 +111,7 @@
         FROM_HERE, base::BlockingType::MAY_BLOCK);
 
     int result = HANDLE_EINTR(
-        ioctl(fd_.get(), HIDIOCSFEATURE(buffer->size()), buffer->data()));
+        ioctl(fd_.get(), HIDIOCSFEATURE(buffer->size()), buffer->front()));
     if (result < 0) {
       HID_PLOG(EVENT) << "Failed to send feature report";
       return false;
@@ -126,7 +126,7 @@
 
     auto buffer =
         base::MakeRefCounted<base::RefCountedBytes>(report_buffer_size_);
-    uint8_t* data = buffer->as_vector().data();
+    uint8_t* data = buffer->front();
     size_t length = report_buffer_size_;
     if (!has_report_id_) {
       // Linux will not prefix the buffer with a report ID if report IDs are not
@@ -207,7 +207,7 @@
   DCHECK_GT(device_info()->max_feature_report_size(), 0u);
   auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
       device_info()->max_feature_report_size() + 1);
-  buffer->as_vector().data()[0] = report_id;
+  buffer->data()[0] = report_id;
 
   auto callback_wrapper = base::BindOnce(
       [](ReadCallback callback,
diff --git a/services/device/hid/hid_connection_mac.cc b/services/device/hid/hid_connection_mac.cc
index c5c66c1..641c140 100644
--- a/services/device/hid/hid_connection_mac.cc
+++ b/services/device/hid/hid_connection_mac.cc
@@ -101,28 +101,24 @@
                                            void* sender,
                                            IOHIDReportType type,
                                            uint32_t report_id,
-                                           uint8_t* report_bytes_ptr,
-                                           CFIndex report_bytes_len) {
+                                           uint8_t* report_bytes,
+                                           CFIndex report_length) {
   HidConnectionMac* connection = static_cast<HidConnectionMac*>(context);
   if (result != kIOReturnSuccess) {
     HID_LOG(EVENT) << "Failed to read input report: " << HexErrorCode(result);
     return;
   }
 
-  // SAFETY: This function is called by macOS with the guarantee that
-  // `report_byte_ptr` will point to at least `report_bytes_len` many bytes.
-  base::span<const uint8_t> report_bytes = UNSAFE_BUFFERS(base::span(
-      report_bytes_ptr, base::checked_cast<size_t>(report_bytes_len)));
-
   scoped_refptr<base::RefCountedBytes> buffer;
   if (connection->device_info()->has_report_id()) {
     // report_id is already contained in report_bytes
-    buffer = base::MakeRefCounted<base::RefCountedBytes>(report_bytes);
+    buffer = base::MakeRefCounted<base::RefCountedBytes>(
+        report_bytes, base::checked_cast<size_t>(report_length));
   } else {
     buffer = base::MakeRefCounted<base::RefCountedBytes>(
-        (base::CheckedNumeric<size_t>(report_bytes.size()) + 1u).ValueOrDie());
-    buffer->as_vector()[0] = 0;
-    base::span(buffer->as_vector()).subspan(1u).copy_from(report_bytes);
+        (base::CheckedNumeric<size_t>(report_length) + 1).ValueOrDie());
+    buffer->front()[0] = 0;
+    memcpy(buffer->front() + 1, report_bytes, report_length);
   }
 
   connection->ProcessInputReport(buffer, buffer->size());
@@ -141,7 +137,7 @@
   // kernel API that this is safe.
   IOReturn result =
       IOHIDDeviceGetReport(device_.get(), kIOHIDReportTypeFeature, report_id,
-                           buffer->as_vector().data(), &report_size);
+                           buffer->front(), &report_size);
   if (result == kIOReturnSuccess) {
     task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&HidConnectionMac::ReturnAsyncResult, this,
@@ -160,12 +156,15 @@
     IOHIDReportType report_type,
     scoped_refptr<base::RefCountedBytes> buffer,
     WriteCallback callback) {
-  auto data = base::span(buffer->as_vector());
-  uint8_t report_id = data[0u];
+  uint8_t* data = buffer->front();
+  size_t size = buffer->size();
+  DCHECK_GE(size, 1u);
+  uint8_t report_id = data[0];
   if (report_id == 0) {
     // OS X only expects the first byte of the buffer to be the report ID if the
     // report ID is non-zero.
-    data = data.subspan(1u);
+    ++data;
+    --size;
   }
 
   // The IOHIDDevice object is shared with the UI thread and so this function
@@ -173,8 +172,8 @@
   // version is NOT IMPLEMENTED. I've examined the open source implementation
   // of this function and believe it is a simple enough wrapper around the
   // kernel API that this is safe.
-  IOReturn result = IOHIDDeviceSetReport(device_.get(), report_type, report_id,
-                                         data.data(), data.size());
+  IOReturn result =
+      IOHIDDeviceSetReport(device_.get(), report_type, report_id, data, size);
   if (result == kIOReturnSuccess) {
     task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&HidConnectionMac::ReturnAsyncResult, this,
diff --git a/services/device/hid/hid_connection_unittest.cc b/services/device/hid/hid_connection_unittest.cc
index f16b681..951ddf92 100644
--- a/services/device/hid/hid_connection_unittest.cc
+++ b/services/device/hid/hid_connection_unittest.cc
@@ -210,9 +210,9 @@
   const char kBufferSize = 9;
   for (char i = 0; i < 8; ++i) {
     auto buffer = base::MakeRefCounted<base::RefCountedBytes>(kBufferSize);
-    buffer->as_vector()[0] = 0;
+    buffer->data()[0] = 0;
     for (unsigned char j = 1; j < kBufferSize; ++j) {
-      buffer->as_vector()[j] = i + j - 1;
+      buffer->data()[j] = i + j - 1;
     }
 
     TestIoCallback write_callback;
@@ -223,9 +223,9 @@
     conn->Read(read_callback.GetReadCallback());
     ASSERT_TRUE(read_callback.WaitForResult());
     ASSERT_EQ(9UL, read_callback.size());
-    ASSERT_EQ(0, read_callback.buffer()->as_vector()[0]);
+    ASSERT_EQ(0, read_callback.buffer()->data()[0]);
     for (unsigned char j = 1; j < kBufferSize; ++j) {
-      ASSERT_EQ(i + j - 1, read_callback.buffer()->as_vector()[j]);
+      ASSERT_EQ(i + j - 1, read_callback.buffer()->data()[j]);
     }
   }
 
diff --git a/services/device/hid/hid_connection_win.cc b/services/device/hid/hid_connection_win.cc
index 89f80047..87bef72d 100644
--- a/services/device/hid/hid_connection_win.cc
+++ b/services/device/hid/hid_connection_win.cc
@@ -149,9 +149,9 @@
   // to the maximum output report size supported by this collection.
   size_t expected_size = device_info()->max_output_report_size() + 1;
   DCHECK(buffer->size() <= expected_size);
-  buffer->as_vector().resize(expected_size);
+  buffer->data().resize(expected_size);
 
-  uint8_t report_id = buffer->as_vector()[0];
+  uint8_t report_id = buffer->data()[0];
   HANDLE file_handle = GetHandleForReportId(report_id);
   if (!IsValidHandle(file_handle)) {
     HID_LOG(DEBUG) << "HID write failed due to invalid handle.";
@@ -162,9 +162,9 @@
   transfers_.push_back(std::make_unique<PendingHidTransfer>(
       buffer, base::BindOnce(&HidConnectionWin::OnWriteComplete, this,
                              file_handle, std::move(callback))));
-  transfers_.back()->TakeResultFromWindowsAPI(
-      WriteFile(file_handle, buffer->data(), static_cast<DWORD>(buffer->size()),
-                NULL, transfers_.back()->GetOverlapped()));
+  transfers_.back()->TakeResultFromWindowsAPI(WriteFile(
+      file_handle, buffer->front(), static_cast<DWORD>(buffer->size()), NULL,
+      transfers_.back()->GetOverlapped()));
 }
 
 void HidConnectionWin::PlatformGetFeatureReport(uint8_t report_id,
@@ -172,7 +172,7 @@
   // The first byte of the destination buffer is the report ID being requested.
   auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
       device_info()->max_feature_report_size() + 1);
-  buffer->as_vector()[0] = report_id;
+  buffer->data()[0] = report_id;
 
   HANDLE file_handle = GetHandleForReportId(report_id);
   if (!IsValidHandle(file_handle)) {
@@ -184,16 +184,16 @@
   transfers_.push_back(std::make_unique<PendingHidTransfer>(
       buffer, base::BindOnce(&HidConnectionWin::OnReadFeatureComplete, this,
                              file_handle, buffer, std::move(callback))));
-  transfers_.back()->TakeResultFromWindowsAPI(DeviceIoControl(
-      file_handle, IOCTL_HID_GET_FEATURE, NULL, 0, buffer->as_vector().data(),
-      static_cast<DWORD>(buffer->as_vector().size()), NULL,
-      transfers_.back()->GetOverlapped()));
+  transfers_.back()->TakeResultFromWindowsAPI(
+      DeviceIoControl(file_handle, IOCTL_HID_GET_FEATURE, NULL, 0,
+                      buffer->front(), static_cast<DWORD>(buffer->size()), NULL,
+                      transfers_.back()->GetOverlapped()));
 }
 
 void HidConnectionWin::PlatformSendFeatureReport(
     scoped_refptr<base::RefCountedBytes> buffer,
     WriteCallback callback) {
-  uint8_t report_id = buffer->as_vector()[0];
+  uint8_t report_id = buffer->data()[0];
   HANDLE file_handle = GetHandleForReportId(report_id);
   if (!IsValidHandle(file_handle)) {
     HID_LOG(DEBUG) << "HID write failed due to invalid handle.";
@@ -206,10 +206,10 @@
   transfers_.push_back(std::make_unique<PendingHidTransfer>(
       buffer, base::BindOnce(&HidConnectionWin::OnWriteComplete, this,
                              file_handle, std::move(callback))));
-  transfers_.back()->TakeResultFromWindowsAPI(DeviceIoControl(
-      file_handle, IOCTL_HID_SET_FEATURE, buffer->as_vector().data(),
-      static_cast<DWORD>(buffer->as_vector().size()), NULL, 0, NULL,
-      transfers_.back()->GetOverlapped()));
+  transfers_.back()->TakeResultFromWindowsAPI(
+      DeviceIoControl(file_handle, IOCTL_HID_SET_FEATURE, buffer->front(),
+                      static_cast<DWORD>(buffer->size()), NULL, 0, NULL,
+                      transfers_.back()->GetOverlapped()));
 }
 
 void HidConnectionWin::SetUpInitialReads() {
@@ -227,9 +227,8 @@
       buffer, base::BindOnce(&HidConnectionWin::OnReadInputReport, this,
                              file_handle, buffer)));
   transfers_.back()->TakeResultFromWindowsAPI(
-      ReadFile(file_handle, buffer->as_vector().data(),
-               static_cast<DWORD>(buffer->as_vector().size()), NULL,
-               transfers_.back()->GetOverlapped()));
+      ReadFile(file_handle, buffer->front(), static_cast<DWORD>(buffer->size()),
+               NULL, transfers_.back()->GetOverlapped()));
 }
 
 void HidConnectionWin::OnReadInputReport(
@@ -255,7 +254,7 @@
     return;
   }
 
-  uint8_t report_id = buffer->as_vector()[0];
+  uint8_t report_id = buffer->data()[0];
   if (!IsReportProtected(report_id, HidReportType::kInput)) {
     // Hold a reference to |this| to prevent a callback executed by
     // ProcessInputReport from freeing this object.
diff --git a/services/device/usb/fake_usb_device_handle.cc b/services/device/usb/fake_usb_device_handle.cc
index b969ade..8cf522b 100644
--- a/services/device/usb/fake_usb_device_handle.cc
+++ b/services/device/usb/fake_usb_device_handle.cc
@@ -88,10 +88,7 @@
     }
 
     if (direction == UsbTransferDirection::INBOUND) {
-      auto source_data = UNSAFE_BUFFERS(base::span(data_, size_));
-      base::span(buffer->as_vector())
-          .first(bytes_transferred)
-          .copy_from(source_data.subspan(position_, bytes_transferred));
+      memcpy(buffer->front(), &data_[position_], bytes_transferred);
       position_ += bytes_transferred;
     }
 
diff --git a/services/device/usb/mojo/device_impl.cc b/services/device/usb/mojo/device_impl.cc
index 724ceb3..11ae873 100644
--- a/services/device/usb/mojo/device_impl.cc
+++ b/services/device/usb/mojo/device_impl.cc
@@ -37,7 +37,7 @@
                   UsbTransferStatus status,
                   scoped_refptr<base::RefCountedBytes> buffer,
                   size_t buffer_size) {
-  auto data = buffer ? base::span(*buffer).first(buffer_size)
+  auto data = buffer ? base::make_span(buffer->front(), buffer_size)
                      : base::span<const uint8_t>();
   std::move(callback).Run(mojo::ConvertTo<mojom::UsbTransferStatus>(status),
                           data);
@@ -59,7 +59,7 @@
       [](const uint32_t& a, const UsbIsochronousPacketPtr& packet) {
         return a + packet->length;
       });
-  auto data = buffer ? base::span(*buffer).first(buffer_size)
+  auto data = buffer ? base::make_span(buffer->front(), buffer_size)
                      : base::span<const uint8_t>();
   std::move(callback).Run(data, std::move(packets));
 }
diff --git a/services/device/usb/usb_descriptors.cc b/services/device/usb/usb_descriptors.cc
index 3b0a3e6..f5f5e8ed 100644
--- a/services/device/usb/usb_descriptors.cc
+++ b/services/device/usb/usb_descriptors.cc
@@ -110,7 +110,7 @@
                             scoped_refptr<base::RefCountedBytes> buffer,
                             size_t length) {
   if (status == UsbTransferStatus::COMPLETED) {
-    if (!desc->Parse(base::span(*buffer).first(length))) {
+    if (!desc->Parse(base::make_span(buffer->front(), length))) {
       LOG(ERROR) << "Failed to parse configuration descriptor.";
     }
   } else {
@@ -128,7 +128,7 @@
                                   size_t length) {
   if (status == UsbTransferStatus::COMPLETED &&
       length == kConfigurationDescriptorLength) {
-    auto data = base::span<const uint8_t>(*header);
+    const uint8_t* data = header->front();
     uint16_t total_length = data[2] | data[3] << 8;
     auto buffer = base::MakeRefCounted<base::RefCountedBytes>(total_length);
     device_handle->ControlTransfer(
@@ -157,7 +157,7 @@
   }
 
   std::unique_ptr<UsbDeviceDescriptor> desc(new UsbDeviceDescriptor());
-  if (!desc->Parse(base::span(*buffer).first(length))) {
+  if (!desc->Parse(base::make_span(buffer->front(), length))) {
     LOG(ERROR) << "Device descriptor parsing error.";
     std::move(callback).Run(nullptr);
     return;
@@ -200,10 +200,10 @@
     scoped_refptr<base::RefCountedBytes> buffer,
     size_t length) {
   std::u16string string;
-  auto to_read = base::span(*buffer).first(length);
   if (status == UsbTransferStatus::COMPLETED &&
       ParseUsbStringDescriptor(
-          std::vector<uint8_t>(to_read.begin(), to_read.end()), &string)) {
+          std::vector<uint8_t>(buffer->front(), buffer->front() + length),
+          &string)) {
     std::move(callback).Run(string);
   } else {
     std::move(callback).Run(std::u16string());
diff --git a/services/device/usb/usb_descriptors_unittest.cc b/services/device/usb/usb_descriptors_unittest.cc
index 4eaf2679..b5b36d7 100644
--- a/services/device/usb/usb_descriptors_unittest.cc
+++ b/services/device/usb/usb_descriptors_unittest.cc
@@ -32,10 +32,7 @@
 
 ACTION_P2(InvokeCallback, data, length) {
   size_t transferred_length = std::min(length, arg6->size());
-  base::span(arg6->as_vector())
-      .first(transferred_length)
-      .copy_from(
-          UNSAFE_BUFFERS(base::span(data, length)).first(transferred_length));
+  memcpy(arg6->front(), data, transferred_length);
   std::move(arg8).Run(UsbTransferStatus::COMPLETED, arg6, transferred_length);
 }
 
diff --git a/services/device/usb/usb_device_handle_impl.cc b/services/device/usb/usb_device_handle_impl.cc
index 3bb1061..c556bd1 100644
--- a/services/device/usb/usb_device_handle_impl.cc
+++ b/services/device/usb/usb_device_handle_impl.cc
@@ -273,11 +273,10 @@
     return nullptr;
   }
 
-  libusb_fill_control_setup(buffer->as_vector().data(), type, request, value,
-                            index, length);
+  libusb_fill_control_setup(buffer->front(), type, request, value, index,
+                            length);
   libusb_fill_control_transfer(transfer->platform_transfer_,
-                               device_handle->handle(),
-                               buffer->as_vector().data(),
+                               device_handle->handle(), buffer->front(),
                                &UsbDeviceHandleImpl::Transfer::PlatformCallback,
                                transfer.get(), timeout);
 
@@ -304,11 +303,10 @@
     return nullptr;
   }
 
-  libusb_fill_bulk_transfer(transfer->platform_transfer_,
-                            device_handle->handle(), endpoint,
-                            buffer->as_vector().data(), length,
-                            &UsbDeviceHandleImpl::Transfer::PlatformCallback,
-                            transfer.get(), timeout);
+  libusb_fill_bulk_transfer(
+      transfer->platform_transfer_, device_handle->handle(), endpoint,
+      buffer->front(), length, &UsbDeviceHandleImpl::Transfer::PlatformCallback,
+      transfer.get(), timeout);
 
   return transfer;
 }
@@ -335,9 +333,8 @@
 
   libusb_fill_interrupt_transfer(
       transfer->platform_transfer_, device_handle->handle(), endpoint,
-      buffer->as_vector().data(), length,
-      &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(),
-      timeout);
+      buffer->front(), length, &UsbDeviceHandleImpl::Transfer::PlatformCallback,
+      transfer.get(), timeout);
 
   return transfer;
 }
@@ -366,7 +363,7 @@
 
   libusb_fill_iso_transfer(
       transfer->platform_transfer_, device_handle->handle(), endpoint,
-      buffer->as_vector().data(), static_cast<int>(length), num_packets,
+      buffer->front(), static_cast<int>(length), num_packets,
       &Transfer::PlatformCallback, transfer.get(), timeout);
 
   for (size_t i = 0; i < packet_lengths.size(); ++i)
@@ -448,9 +445,8 @@
         if (length_ >= (LIBUSB_CONTROL_SETUP_SIZE + actual_length)) {
           auto resized_buffer =
               base::MakeRefCounted<base::RefCountedBytes>(actual_length);
-          base::span(resized_buffer->as_vector())
-              .copy_from(base::span(*buffer_).subspan(LIBUSB_CONTROL_SETUP_SIZE,
-                                                      actual_length));
+          memcpy(resized_buffer->front(),
+                 buffer_->front() + LIBUSB_CONTROL_SETUP_SIZE, actual_length);
           buffer_ = resized_buffer;
         }
       }
@@ -705,9 +701,8 @@
   const size_t resized_length = LIBUSB_CONTROL_SETUP_SIZE + buffer->size();
   auto resized_buffer =
       base::MakeRefCounted<base::RefCountedBytes>(resized_length);
-  base::span(resized_buffer->as_vector())
-      .subspan(LIBUSB_CONTROL_SETUP_SIZE)
-      .copy_from(base::span(*buffer));
+  memcpy(resized_buffer->front() + LIBUSB_CONTROL_SETUP_SIZE, buffer->front(),
+         buffer->size());
 
   std::unique_ptr<Transfer> transfer = Transfer::CreateControlTransfer(
       this, CreateRequestType(direction, request_type, recipient), request,
diff --git a/services/device/usb/usb_device_handle_mac.cc b/services/device/usb/usb_device_handle_mac.cc
index 8ee09f51..9c30e80 100644
--- a/services/device/usb/usb_device_handle_mac.cc
+++ b/services/device/usb/usb_device_handle_mac.cc
@@ -449,7 +449,7 @@
   device_request.wIndex = index;
   device_request.bmRequestType =
       CreateRequestType(direction, request_type, recipient);
-  device_request.pData = buffer->as_vector().data();
+  device_request.pData = buffer->front_as<void*>();
   device_request.wLength = static_cast<uint16_t>(buffer->size());
   device_request.completionTimeout = timeout;
   device_request.noDataTimeout = timeout;
@@ -550,7 +550,7 @@
   kr = (*interface_interface.get())
            ->ReadIsochPipeAsync(interface_interface.get(),
                                 endpoint_it->second.pipe_reference,
-                                buffer->as_vector().data(), bus_frame,
+                                buffer->front_as<void*>(), bus_frame,
                                 static_cast<uint32_t>(packet_lengths.size()),
                                 transfer->frame_list.data(), &AsyncIoCallback,
                                 reinterpret_cast<void*>(transfer_data));
@@ -636,7 +636,7 @@
   kr = (*interface_interface.get())
            ->WriteIsochPipeAsync(interface_interface.get(),
                                  endpoint_it->second.pipe_reference,
-                                 buffer->as_vector().data(), bus_frame,
+                                 buffer->front_as<void*>(), bus_frame,
                                  static_cast<uint32_t>(packet_lengths.size()),
                                  transfer->frame_list.data(), &AsyncIoCallback,
                                  reinterpret_cast<void*>(transfer_data));
@@ -749,7 +749,7 @@
   auto result = transfers_.insert(std::move(transfer));
   IOReturn kr = (*interface_interface.get())
                     ->ReadPipeAsyncTO(interface_interface.get(), pipe_reference,
-                                      buffer->as_vector().data(),
+                                      buffer->front_as<void*>(),
                                       static_cast<uint32_t>(buffer->size()),
                                       timeout, timeout, &AsyncIoCallback,
                                       reinterpret_cast<void*>(transfer_data));
@@ -773,7 +773,7 @@
   IOReturn kr =
       (*interface_interface.get())
           ->WritePipeAsyncTO(interface_interface.get(), pipe_reference,
-                             buffer->as_vector().data(),
+                             buffer->front_as<void*>(),
                              static_cast<uint32_t>(buffer->size()), timeout,
                              timeout, &AsyncIoCallback,
                              reinterpret_cast<void*>(transfer_data));
@@ -795,7 +795,7 @@
   auto result = transfers_.insert(std::move(transfer));
   IOReturn kr = (*interface_interface.get())
                     ->ReadPipeAsync(interface_interface.get(), pipe_reference,
-                                    buffer->as_vector().data(),
+                                    buffer->front_as<void*>(),
                                     static_cast<uint32_t>(buffer->size()),
                                     &AsyncIoCallback,
                                     reinterpret_cast<void*>(transfer_data));
@@ -816,7 +816,7 @@
   auto result = transfers_.insert(std::move(transfer));
   IOReturn kr = (*interface_interface.get())
                     ->WritePipeAsync(interface_interface.get(), pipe_reference,
-                                     buffer->as_vector().data(),
+                                     buffer->front_as<void*>(),
                                      static_cast<uint32_t>(buffer->size()),
                                      &AsyncIoCallback,
                                      reinterpret_cast<void*>(transfer_data));
diff --git a/services/device/usb/usb_device_handle_unittest.cc b/services/device/usb/usb_device_handle_unittest.cc
index 71624c1..3576b69 100644
--- a/services/device/usb/usb_device_handle_unittest.cc
+++ b/services/device/usb/usb_device_handle_unittest.cc
@@ -164,7 +164,7 @@
       base::MakeRefCounted<base::RefCountedBytes>(in_buffer->size());
   TestCompletionCallback out_completion;
   for (size_t i = 0; i < out_buffer->size(); ++i) {
-    out_buffer->as_vector()[i] = i;
+    out_buffer->data()[i] = i;
   }
 
   handle->GenericTransfer(UsbTransferDirection::OUTBOUND, 0x01, out_buffer,
@@ -230,7 +230,7 @@
       base::MakeRefCounted<base::RefCountedBytes>(in_buffer->size());
   TestCompletionCallback out_completion;
   for (size_t i = 0; i < out_buffer->size(); ++i) {
-    out_buffer->as_vector()[i] = i;
+    out_buffer->data()[i] = i;
   }
 
   handle->GenericTransfer(UsbTransferDirection::OUTBOUND, 0x02, out_buffer,
diff --git a/services/device/usb/usb_device_handle_usbfs.cc b/services/device/usb/usb_device_handle_usbfs.cc
index 87c7f6ca..ec4a06a 100644
--- a/services/device/usb/usb_device_handle_usbfs.cc
+++ b/services/device/usb/usb_device_handle_usbfs.cc
@@ -96,18 +96,16 @@
     scoped_refptr<base::RefCountedBytes> original_buffer) {
   auto new_buffer = base::MakeRefCounted<base::RefCountedBytes>(
       original_buffer->size() + sizeof(usb_ctrlrequest));
-  usb_ctrlrequest setup;
-  setup.bRequestType = ConvertEndpointDirection(direction) |
-                       ConvertRequestType(request_type) |
-                       ConvertRecipient(recipient);
-  setup.bRequest = request;
-  setup.wValue = value;
-  setup.wIndex = index;
-  setup.wLength = original_buffer->size();
-  auto [setup_span, remain] =
-      base::span(new_buffer->as_vector()).split_at<sizeof(setup)>();
-  setup_span.copy_from(base::byte_span_from_ref(setup));
-  remain.copy_from(base::span(*original_buffer));
+  usb_ctrlrequest* setup = new_buffer->front_as<usb_ctrlrequest>();
+  setup->bRequestType = ConvertEndpointDirection(direction) |
+                        ConvertRequestType(request_type) |
+                        ConvertRecipient(recipient);
+  setup->bRequest = request;
+  setup->wValue = value;
+  setup->wIndex = index;
+  setup->wLength = original_buffer->size();
+  memcpy(new_buffer->front() + sizeof(usb_ctrlrequest),
+         original_buffer->front(), original_buffer->size());
   return new_buffer;
 }
 
@@ -375,19 +373,19 @@
 }
 
 UsbDeviceHandleUsbfs::Transfer::Transfer(
-    scoped_refptr<base::RefCountedBytes> in_buffer,
+    scoped_refptr<base::RefCountedBytes> buffer,
     TransferCallback callback)
-    : buffer(std::move(in_buffer)), callback(std::move(callback)) {
+    : buffer(buffer), callback(std::move(callback)) {
   urb.usercontext = this;
-  urb.buffer = buffer->as_vector().data();
+  urb.buffer = buffer->front();
 }
 
 UsbDeviceHandleUsbfs::Transfer::Transfer(
-    scoped_refptr<base::RefCountedBytes> in_buffer,
+    scoped_refptr<base::RefCountedBytes> buffer,
     IsochronousTransferCallback callback)
-    : buffer(std::move(in_buffer)), isoc_callback(std::move(callback)) {
+    : buffer(buffer), isoc_callback(std::move(callback)) {
   urb.usercontext = this;
-  urb.buffer = buffer->as_vector().data();
+  urb.buffer = buffer->front();
 }
 
 UsbDeviceHandleUsbfs::Transfer::~Transfer() = default;
@@ -626,9 +624,8 @@
       direction, request_type, recipient, request, value, index, buffer);
   transfer->urb.type = USBDEVFS_URB_TYPE_CONTROL;
   transfer->urb.endpoint = 0;
-  transfer->urb.buffer = transfer->control_transfer_buffer->as_vector().data();
-  transfer->urb.buffer_length =
-      transfer->control_transfer_buffer->as_vector().size();
+  transfer->urb.buffer = transfer->control_transfer_buffer->front();
+  transfer->urb.buffer_length = transfer->control_transfer_buffer->size();
 
   // USBDEVFS_SUBMITURB appears to be non-blocking as completion is reported
   // by USBDEVFS_REAPURBNDELAY.
@@ -920,12 +917,9 @@
     if (transfer->urb.status == 0 &&
         transfer->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
       // Copy the result of the control transfer back into the original buffer.
-      const auto actual_length =
-          base::checked_cast<size_t>(transfer->urb.actual_length);
-      base::span(transfer->buffer->as_vector())
-          .first(actual_length)
-          .copy_from(base::span(*transfer->control_transfer_buffer)
-                         .subspan(8u, actual_length));
+      memcpy(transfer->buffer->front(),
+             transfer->control_transfer_buffer->front() + 8,
+             transfer->urb.actual_length);
     }
 
     transfer->RunCallback(ConvertTransferResult(-transfer->urb.status),
diff --git a/services/device/usb/usb_device_handle_win.cc b/services/device/usb/usb_device_handle_win.cc
index c563d7ae..9164a05 100644
--- a/services/device/usb/usb_device_handle_win.cc
+++ b/services/device/usb/usb_device_handle_win.cc
@@ -461,23 +461,20 @@
                  ((value >> 8) == USB_BOS_DESCRIPTOR_TYPE)) {
         size_t size = sizeof(USB_DESCRIPTOR_REQUEST) + buffer->size();
         auto request_buffer = base::MakeRefCounted<base::RefCountedBytes>(size);
-        USB_DESCRIPTOR_REQUEST descriptor_request;
-        descriptor_request.ConnectionIndex = device_->port_number();
-        descriptor_request.SetupPacket.bmRequest = BMREQUEST_DEVICE_TO_HOST;
-        descriptor_request.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
-        descriptor_request.SetupPacket.wValue = value;
-        descriptor_request.SetupPacket.wIndex = index;
-        descriptor_request.SetupPacket.wLength = buffer->size();
-        base::span(request_buffer->as_vector())
-            .first<sizeof(USB_DESCRIPTOR_REQUEST)>()
-            .copy_from(base::byte_span_from_ref(descriptor_request));
+        USB_DESCRIPTOR_REQUEST* descriptor_request =
+            request_buffer->front_as<USB_DESCRIPTOR_REQUEST>();
+        descriptor_request->ConnectionIndex = device_->port_number();
+        descriptor_request->SetupPacket.bmRequest = BMREQUEST_DEVICE_TO_HOST;
+        descriptor_request->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
+        descriptor_request->SetupPacket.wValue = value;
+        descriptor_request->SetupPacket.wIndex = index;
+        descriptor_request->SetupPacket.wLength = buffer->size();
 
         blocking_task_runner_->PostTaskAndReplyWithResult(
             FROM_HERE,
             base::BindOnce(&DeviceIoControlBlocking, hub_handle_.Get(),
                            IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
-                           request_buffer->as_vector().data(),
-                           request_buffer->as_vector().size()),
+                           request_buffer->front(), size),
             base::BindOnce(&UsbDeviceHandleWin::GotDescriptorFromNodeConnection,
                            weak_factory_.GetWeakPtr(), std::move(callback),
                            request_buffer, buffer));
@@ -563,13 +560,13 @@
   Request* request = MakeRequest(interface);
   BOOL result;
   if (direction == UsbTransferDirection::INBOUND) {
-    result = WinUsb_ReadPipe(
-        interface->handle.Get(), endpoint_address, buffer->as_vector().data(),
-        buffer->as_vector().size(), nullptr, request->overlapped());
+    result = WinUsb_ReadPipe(interface->handle.Get(), endpoint_address,
+                             buffer->front(), buffer->size(), nullptr,
+                             request->overlapped());
   } else {
-    result = WinUsb_WritePipe(
-        interface->handle.Get(), endpoint_address, buffer->as_vector().data(),
-        buffer->as_vector().size(), nullptr, request->overlapped());
+    result = WinUsb_WritePipe(interface->handle.Get(), endpoint_address,
+                              buffer->front(), buffer->size(), nullptr,
+                              request->overlapped());
   }
   DWORD last_error = GetLastError();
   request->MaybeStartWatching(
@@ -979,8 +976,7 @@
 
   Request* control_request = MakeRequest(interface);
   BOOL result = WinUsb_ControlTransfer(
-      interface->handle.Get(), setup, buffer->as_vector().data(),
-      buffer->as_vector().size(),
+      interface->handle.Get(), setup, buffer->front(), buffer->size(),
       /*LengthTransferred=*/nullptr, control_request->overlapped());
   DWORD last_error = GetLastError();
   control_request->MaybeStartWatching(
@@ -1035,11 +1031,8 @@
 
   size_t bytes_transferred =
       std::min(sizeof(USB_DEVICE_DESCRIPTOR), buffer->size());
-  base::span(buffer->as_vector())
-      .first(bytes_transferred)
-      .copy_from(
-          base::byte_span_from_ref(node_connection_info->DeviceDescriptor)
-              .first(bytes_transferred));
+  memcpy(buffer->front(), &node_connection_info->DeviceDescriptor,
+         bytes_transferred);
   std::move(callback).Run(UsbTransferStatus::COMPLETED, buffer,
                           bytes_transferred);
 }
@@ -1070,11 +1063,9 @@
       result_and_bytes_transferred.second - sizeof(USB_DESCRIPTOR_REQUEST);
   bytes_transferred = std::min(bytes_transferred, original_buffer->size());
 
-  base::span(original_buffer->as_vector())
-      .first(bytes_transferred)
-      .copy_from(
-          base::span(*request_buffer)
-              .subspan(sizeof(USB_DESCRIPTOR_REQUEST), bytes_transferred));
+  memcpy(original_buffer->front(),
+         request_buffer->front() + sizeof(USB_DESCRIPTOR_REQUEST),
+         bytes_transferred);
   std::move(callback).Run(UsbTransferStatus::COMPLETED, original_buffer,
                           bytes_transferred);
 }
diff --git a/services/device/usb/webusb_descriptors.cc b/services/device/usb/webusb_descriptors.cc
index 62f7da5..805464b 100644
--- a/services/device/usb/webusb_descriptors.cc
+++ b/services/device/usb/webusb_descriptors.cc
@@ -63,7 +63,7 @@
   }
 
   GURL url;
-  ParseWebUsbUrlDescriptor(base::make_span(buffer->data(), length), &url);
+  ParseWebUsbUrlDescriptor(base::make_span(buffer->front(), length), &url);
   std::move(callback).Run(url);
 }
 
@@ -80,7 +80,7 @@
 
   WebUsbPlatformCapabilityDescriptor descriptor;
   if (!descriptor.ParseFromBosDescriptor(
-          base::make_span(buffer->data(), length))) {
+          base::make_span(buffer->front(), length))) {
     std::move(callback).Run(std::nullopt);
     return;
   }
@@ -99,7 +99,7 @@
     return;
   }
 
-  const uint8_t* data = buffer->data();
+  const uint8_t* data = buffer->front();
   uint16_t new_length = data[2] | (data[3] << 8);
   auto new_buffer = base::MakeRefCounted<base::RefCountedBytes>(new_length);
   device_handle->ControlTransfer(
diff --git a/services/device/usb/webusb_descriptors_unittest.cc b/services/device/usb/webusb_descriptors_unittest.cc
index 6f88256..e338842 100644
--- a/services/device/usb/webusb_descriptors_unittest.cc
+++ b/services/device/usb/webusb_descriptors_unittest.cc
@@ -53,10 +53,7 @@
 
 ACTION_P2(InvokeCallback, data, length) {
   size_t transferred_length = std::min(length, arg6->size());
-  base::span(arg6->as_vector())
-      .first(transferred_length)
-      .copy_from(
-          UNSAFE_BUFFERS(base::span(data, length)).first(transferred_length));
+  memcpy(arg6->front(), data, transferred_length);
   std::move(arg8).Run(UsbTransferStatus::COMPLETED, arg6, transferred_length);
 }
 
diff --git a/services/network/network_service_memory_cache.cc b/services/network/network_service_memory_cache.cc
index b83e98c..2536256 100644
--- a/services/network/network_service_memory_cache.cc
+++ b/services/network/network_service_memory_cache.cc
@@ -135,8 +135,8 @@
   if (decision == orb::ResponseAnalyzer::Decision::kSniffMore) {
     const size_t size =
         std::min(static_cast<size_t>(net::kMaxBytesToSniff), content.size());
-    decision =
-        analyzer->Sniff(base::as_string_view(base::span(content).first(size)));
+    decision = analyzer->Sniff(
+        std::string_view(reinterpret_cast<const char*>(content.front()), size));
     if (decision == orb::ResponseAnalyzer::Decision::kSniffMore) {
       decision = analyzer->HandleEndOfSniffableResponseBody();
     }
diff --git a/services/network/network_service_memory_cache_url_loader.cc b/services/network/network_service_memory_cache_url_loader.cc
index e98edb3..fcb2249 100644
--- a/services/network/network_service_memory_cache_url_loader.cc
+++ b/services/network/network_service_memory_cache_url_loader.cc
@@ -167,9 +167,9 @@
       break;
     }
 
-    MojoResult result = producer_handle_->WriteData(
-        content_->as_vector().data() + write_position_, &write_size,
-        MOJO_WRITE_DATA_FLAG_NONE);
+    MojoResult result =
+        producer_handle_->WriteData(content_->data().data() + write_position_,
+                                    &write_size, MOJO_WRITE_DATA_FLAG_NONE);
     if (result == MOJO_RESULT_SHOULD_WAIT) {
       producer_handle_watcher_->ArmOrNotify();
       break;
@@ -192,8 +192,8 @@
   if (net_log_.IsCapturing()) {
     net_log_.AddByteTransferEvent(
         net::NetLogEventType::IN_MEMORY_CACHE_BYTES_READ, total_write_size,
-        base::as_chars(base::span(*content_).subspan(original_write_position))
-            .data());
+        reinterpret_cast<const char*>(content_->data().data() +
+                                      original_write_position));
   }
 
   if (write_completed) {
diff --git a/services/network/web_bundle/web_bundle_chunked_buffer.cc b/services/network/web_bundle/web_bundle_chunked_buffer.cc
index 8d3da169c..e2592af 100644
--- a/services/network/web_bundle/web_bundle_chunked_buffer.cc
+++ b/services/network/web_bundle/web_bundle_chunked_buffer.cc
@@ -81,7 +81,7 @@
 }
 
 const uint8_t* WebBundleChunkedBuffer::Chunk::data() const {
-  return bytes_->data();
+  return bytes_->data().data();
 }
 
 WebBundleChunkedBuffer::WebBundleChunkedBuffer() = default;
diff --git a/services/tracing/public/cpp/perfetto/producer_test_utils.cc b/services/tracing/public/cpp/perfetto/producer_test_utils.cc
index 878131fc..b22c485 100644
--- a/services/tracing/public/cpp/perfetto/producer_test_utils.cc
+++ b/services/tracing/public/cpp/perfetto/producer_test_utils.cc
@@ -271,8 +271,7 @@
     const scoped_refptr<base::RefCountedString>& chunk,
     bool has_more_events) {
   perfetto::protos::Trace trace;
-  auto chunk_data = base::span(*chunk);
-  bool ok = trace.ParseFromArray(chunk_data.data(), chunk_data.size());
+  bool ok = trace.ParseFromArray(chunk->data().data(), chunk->data().size());
   DCHECK(ok);
   for (const auto& packet : trace.packet()) {
     // Filter out packets from the tracing service.
diff --git a/services/tracing/public/cpp/perfetto/system_trace_writer.h b/services/tracing/public/cpp/perfetto/system_trace_writer.h
index e5e30c2a..5fb7220 100644
--- a/services/tracing/public/cpp/perfetto/system_trace_writer.h
+++ b/services/tracing/public/cpp/perfetto/system_trace_writer.h
@@ -29,7 +29,7 @@
 
 inline const std::string& GetString(
     const scoped_refptr<base::RefCountedString>& string) {
-  return string->as_string();
+  return string->data();
 }
 }  // namespace internal
 
diff --git a/services/webnn/coreml/graph_impl.h b/services/webnn/coreml/graph_impl.h
index a62bd74b..433bc84 100644
--- a/services/webnn/coreml/graph_impl.h
+++ b/services/webnn/coreml/graph_impl.h
@@ -11,9 +11,9 @@
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/sequence_checker.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/timer/elapsed_timer.h"
-
 #include "services/webnn/coreml/graph_builder.h"
 #include "services/webnn/public/mojom/webnn_context_provider.mojom.h"
 #include "services/webnn/public/mojom/webnn_graph.mojom.h"
@@ -106,11 +106,20 @@
   void ComputeImpl(
       base::flat_map<std::string, mojo_base::BigBuffer> named_inputs,
       mojom::WebNNGraph::ComputeCallback callback) override;
+  void DidPredict(base::ElapsedTimer model_predict_timer,
+                  mojom::WebNNGraph::ComputeCallback callback,
+                  id<MLFeatureProvider> output_features,
+                  NSError* error);
 
  private:
+  SEQUENCE_CHECKER(sequence_checker_);
+
   std::unique_ptr<CoreMLFeatureInfoMap> input_feature_info_;
   base::flat_map<std::string, std::string> coreml_name_to_operand_name_;
   MLModel* __strong ml_model_;
+
+  base::WeakPtrFactory<GraphImpl> weak_factory_
+      GUARDED_BY_CONTEXT(sequence_checker_){this};
 };
 
 }  // namespace webnn::coreml
diff --git a/services/webnn/coreml/graph_impl.mm b/services/webnn/coreml/graph_impl.mm
index 7d17790d..3b7b3a6 100644
--- a/services/webnn/coreml/graph_impl.mm
+++ b/services/webnn/coreml/graph_impl.mm
@@ -14,11 +14,13 @@
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/functional/callback_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/checked_math.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/bind_post_task.h"
 #include "base/task/thread_pool.h"
 #include "base/trace_event/trace_event.h"
 #include "base/types/expected_macros.h"
@@ -292,10 +294,13 @@
 void GraphImpl::ComputeImpl(
     base::flat_map<std::string, mojo_base::BigBuffer> named_inputs,
     mojom::WebNNGraph::ComputeCallback callback) {
-  base::ElapsedTimer model_predict_timer;
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   TRACE_EVENT0("gpu", "webnn::coreml::GraphImpl::ComputeImpl");
   CHECK(ml_model_);
-  // Create MLFeatureValue for each of the named_inputs
+
+  base::ElapsedTimer model_predict_timer;
+
+  // Create MLFeatureValue for each of the `named_inputs`.
   NSMutableSet* feature_names = [[NSMutableSet alloc] init];
   NSMutableDictionary* feature_values = [[NSMutableDictionary alloc] init];
   for (auto& [key, buffer] : named_inputs) {
@@ -329,17 +334,28 @@
         [MLFeatureValue featureValueWithMultiArray:placeholder_input];
   }
 
-  // Run the MLModel
+  // Run the MLModel asynchronously.
   WebNNMLFeatureProvider* feature_provider =
       [[WebNNMLFeatureProvider alloc] initWithFeatures:feature_names
                                          featureValues:feature_values];
-  // TODO(https://crbug.com/1522281): Consider using async version of this
-  // API that is available in Mac OS 14.
-  NSError* error;
-  id<MLFeatureProvider> output_features =
-      [ml_model_ predictionFromFeatures:feature_provider error:&error];
+  auto done_callback =
+      base::BindOnce(&GraphImpl::DidPredict, weak_factory_.GetWeakPtr(),
+                     std::move(model_predict_timer), std::move(callback));
+  [ml_model_ predictionFromFeatures:feature_provider
+                  completionHandler:base::CallbackToBlock(
+                                        base::BindPostTaskToCurrentDefault(
+                                            std::move(done_callback)))];
+}
+
+void GraphImpl::DidPredict(base::ElapsedTimer model_predict_timer,
+                           mojom::WebNNGraph::ComputeCallback callback,
+                           id<MLFeatureProvider> output_features,
+                           NSError* error) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   UMA_HISTOGRAM_MEDIUM_TIMES("WebNN.CoreML.TimingMs.ModelPredict",
                              model_predict_timer.Elapsed());
+
   if (error) {
     DLOG(ERROR) << "webnn::coreml predictionError : " << error;
     std::move(callback).Run(mojom::ComputeResult::NewError(mojom::Error::New(
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 7e87c4b..671d35a 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5544,9 +5544,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5556,8 +5556,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -5700,9 +5700,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5712,8 +5712,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 9ab3ee3..73a27a2 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -19724,9 +19724,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -19736,8 +19736,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -19880,9 +19880,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -19892,8 +19892,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index c6f7c67..6330883d 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -41846,9 +41846,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41857,8 +41857,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -41996,9 +41996,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -42007,8 +42007,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -43347,9 +43347,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -43359,8 +43359,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -43503,9 +43503,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -43515,8 +43515,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -44826,9 +44826,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44837,8 +44837,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -44976,9 +44976,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44987,8 +44987,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 0d76443e4..3c57ead 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -15831,12 +15831,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -15846,8 +15846,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
@@ -16007,12 +16007,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 123.0.6312.112",
+        "description": "Run with ash-chrome version 123.0.6312.132",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16022,8 +16022,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v123.0.6312.112",
-              "revision": "version:123.0.6312.112"
+              "location": "lacros_version_skew_tests_v123.0.6312.132",
+              "revision": "version:123.0.6312.132"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 35519e72..2c76d32 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -299,16 +299,16 @@
   },
   'LACROS_VERSION_SKEW_STABLE': {
     'identifier': 'Lacros version skew testing ash stable',
-    'description': 'Run with ash-chrome version 123.0.6312.112',
+    'description': 'Run with ash-chrome version 123.0.6312.132',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.112/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v123.0.6312.132/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v123.0.6312.112',
-          'revision': 'version:123.0.6312.112',
+          'location': 'lacros_version_skew_tests_v123.0.6312.132',
+          'revision': 'version:123.0.6312.132',
         },
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 43446172..6240cd36 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5185,6 +5185,24 @@
             ]
         }
     ],
+    "CrOSLateBootSwapZramTuning": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledGroupA",
+                    "params": {
+                        "multiplier": "1.5"
+                    },
+                    "enable_features": [
+                        "CrOSLateBootSwapZramDisksize"
+                    ]
+                }
+            ]
+        }
+    ],
     "CrOSLateBootSwapZramWriteback": [
         {
             "platforms": [
@@ -7782,33 +7800,6 @@
             ]
         }
     ],
-    "FenderLcpInfluencerScriptsPriority": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "VeryHighPriorityForScriptAndLcpImage_20240215",
-                    "params": {
-                        "lcpscriptobserver_adjust_image_load_priority": "true",
-                        "lcpscriptobserver_image_load_priority": "very_high",
-                        "lcpscriptobserver_script_load_priority": "very_high",
-                        "lcpscriptobserver_script_max_url_count_per_origin": "5",
-                        "lcpscriptobserver_script_max_url_length": "1024"
-                    },
-                    "enable_features": [
-                        "LCPScriptObserver"
-                    ]
-                }
-            ]
-        }
-    ],
     "FenderScriptScheduling": [
         {
             "platforms": [
@@ -11832,7 +11823,7 @@
         {
             "platforms": [
                 "android",
-                "ios",
+                "android_webview",
                 "linux",
                 "mac",
                 "windows"
diff --git a/third_party/angle b/third_party/angle
index d71b8ee..6861da6 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit d71b8ee0f0e26b14a8fa642460df2635c2d7db2f
+Subproject commit 6861da63bb01592964789d531dd8a71a06057547
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 6abb359f..e0c5ef50 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4329,6 +4329,10 @@
 
   kSharedStorageAPI_SelectURLOverallPageloadBudgetInsufficient = 4944,
 
+  kV8LanguageTranslator_Translate_Method = 4945,
+  kV8Translation_CanTranslate_Method = 4946,
+  kV8Translation_CreateTranslator_Method = 4947,
+
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
   // Also, run update_use_counter_feature_enum.py in
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index c613498..0edce16 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -808,6 +808,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_triangular_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_model_generic_session_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_model_generic_session_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_multi_cache_query_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_multi_cache_query_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_navigation_preload_state.cc",
@@ -1387,6 +1389,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gamepad_mapping_type.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_generic_model_availability.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_generic_model_availability.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_availability.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation_availability.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_address_mode.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_address_mode.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_auto_layout_mode.cc",
@@ -2274,6 +2278,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_keyboard_layout_map.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_khr_parallel_shader_compile.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_khr_parallel_shader_compile.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_translator.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_translator.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_launch_params.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_launch_params.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_launch_queue.cc",
@@ -2718,6 +2724,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_track_default.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_track_default_list.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_track_default_list.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_translation.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_url.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_url.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_usb.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index e2f4560..01a8a8d 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -529,6 +529,10 @@
   "//third_party/blink/renderer/modules/notifications/service_worker_global_scope_notifications.idl",
   "//third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.idl",
   "//third_party/blink/renderer/modules/notifications/timestamp_trigger.idl",
+  "//third_party/blink/renderer/modules/on_device_translation/language_translator.idl",
+  "//third_party/blink/renderer/modules/on_device_translation/translation_language_options.idl",
+  "//third_party/blink/renderer/modules/on_device_translation/translation.idl",
+  "//third_party/blink/renderer/modules/on_device_translation/window_or_worker_global_scope_translation.idl",
   "//third_party/blink/renderer/modules/payments/abort_payment_event.idl",
   "//third_party/blink/renderer/modules/payments/address_errors.idl",
   "//third_party/blink/renderer/modules/payments/address_init.idl",
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
index 8a6f30fb..eff7ada 100644
--- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
@@ -97,6 +97,17 @@
   return value->GetAsDouble();
 }
 
+String AnimationDisplayName(const Animation& animation) {
+  if (!animation.id().empty())
+    return animation.id();
+  else if (auto* css_animation = DynamicTo<CSSAnimation>(animation))
+    return css_animation->animationName();
+  else if (auto* css_transition = DynamicTo<CSSTransition>(animation))
+    return css_transition->transitionProperty();
+  else
+    return animation.id();
+}
+
 }  // namespace
 
 InspectorAnimationAgent::InspectorAnimationAgent(
@@ -112,19 +123,6 @@
   DCHECK(css_agent);
 }
 
-String InspectorAnimationAgent::AnimationDisplayName(
-    const Animation& animation) {
-  if (!animation.id().empty()) {
-    return animation.id();
-  } else if (auto* css_animation = DynamicTo<CSSAnimation>(animation)) {
-    return css_animation->animationName();
-  } else if (auto* css_transition = DynamicTo<CSSTransition>(animation)) {
-    return css_transition->transitionProperty();
-  } else {
-    return "";
-  }
-}
-
 void InspectorAnimationAgent::Restore() {
   if (enabled_.Get()) {
     instrumenting_agents_->AddInspectorAnimationAgent(this);
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.h b/third_party/blink/renderer/core/inspector/inspector_animation_agent.h
index efb0271f..e30d32f 100644
--- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.h
@@ -68,7 +68,6 @@
   protocol::Response AssertAnimation(const String& id,
                                      blink::Animation*& result);
 
-  static String AnimationDisplayName(const Animation& animation);
   void Trace(Visitor*) const override;
 
  private:
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
index 501e7f8..14c482b 100644
--- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -26,7 +26,6 @@
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
 #include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
 #include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
-#include "third_party/blink/renderer/core/inspector/inspector_animation_agent.h"
 #include "third_party/blink/renderer/core/inspector/inspector_network_agent.h"
 #include "third_party/blink/renderer/core/inspector/inspector_page_agent.h"
 #include "third_party/blink/renderer/core/layout/hit_test_location.h"
@@ -1582,8 +1581,6 @@
   dict.Add("id", String::Number(animation.SequenceNumber()));
   dict.Add("state", animation.PlayStateString());
   if (const AnimationEffect* effect = animation.effect()) {
-    dict.Add("displayName",
-             InspectorAnimationAgent::AnimationDisplayName(animation));
     dict.Add("name", animation.id());
     if (auto* frame_effect = DynamicTo<KeyframeEffect>(effect)) {
       if (Element* target = frame_effect->EffectTarget())
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index c70e153..dbb7736 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -130,6 +130,7 @@
     "//third_party/blink/renderer/modules/netinfo",
     "//third_party/blink/renderer/modules/nfc",
     "//third_party/blink/renderer/modules/notifications",
+    "//third_party/blink/renderer/modules/on_device_translation",
     "//third_party/blink/renderer/modules/payments",
     "//third_party/blink/renderer/modules/payments/goods",
     "//third_party/blink/renderer/modules/peerconnection",
diff --git a/third_party/blink/renderer/modules/ml/ml_trace_unittest.cc b/third_party/blink/renderer/modules/ml/ml_trace_unittest.cc
index ff99f8dc..c70c8c2 100644
--- a/third_party/blink/renderer/modules/ml/ml_trace_unittest.cc
+++ b/third_party/blink/renderer/modules/ml/ml_trace_unittest.cc
@@ -53,7 +53,7 @@
     base::trace_event::TraceResultBuffer trace_buffer;
     trace_buffer.SetOutputCallback(json_output->GetCallback());
     trace_buffer.Start();
-    trace_buffer.AddFragment(json_events_str->as_string());
+    trace_buffer.AddFragment(json_events_str->data());
     trace_buffer.Finish();
     if (!has_more_events) {
       std::move(quit_closure).Run();
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
index 517033c0..60b8eea 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
@@ -1436,9 +1436,7 @@
           ConvertToComponentOperand(input),
           ConvertToInstanceNormalizationAttributes(options));
   if (!validated_output.has_value()) {
-    exception_state.ThrowDOMException(
-        DOMExceptionCode::kDataError,
-        String::FromUTF8(validated_output.error()));
+    exception_state.ThrowTypeError(String::FromUTF8(validated_output.error()));
     return nullptr;
   }
 
@@ -1450,8 +1448,7 @@
       this, ComponentOperandTypeToBlink(validated_output->data_type),
       Vector<uint32_t>(validated_output->dimensions), instance_normalization);
   if (!output.has_value()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kDataError,
-                                      output.error());
+    exception_state.ThrowTypeError(output.error());
     return nullptr;
   }
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
index 5a482dd..52a4d0d0 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
@@ -2541,230 +2541,6 @@
   }
 }
 
-MLOperand* BuildInstanceNormalization(
-    V8TestingScope& scope,
-    MLGraphBuilder* builder,
-    const MLOperand* input,
-    const MLInstanceNormalizationOptions* options) {
-  auto* output =
-      builder->instanceNormalization(input, options, scope.GetExceptionState());
-  EXPECT_THAT(output, testing::NotNull());
-  EXPECT_EQ(output->Kind(), webnn::mojom::blink::Operand::Kind::kOutput);
-  EXPECT_EQ(output->DataType(), input->DataType());
-  EXPECT_EQ(output->Dimensions(), input->Dimensions());
-  auto* instance_normalization = output->Operator();
-  EXPECT_THAT(instance_normalization, testing::NotNull());
-  EXPECT_EQ(instance_normalization->Kind(),
-            webnn::mojom::blink::Operation::Tag::kInstanceNormalization);
-  EXPECT_TRUE(instance_normalization->IsConnected());
-  EXPECT_THAT(instance_normalization->Options(), testing::NotNull());
-  return output;
-}
-
-TEST_F(MLGraphBuilderTest, InstanceNormalizationTest) {
-  V8TestingScope scope;
-  MLGraphBuilder* builder =
-      CreateMLGraphBuilder(scope.GetExecutionContext(), scope.GetScriptState(),
-                           scope.GetExceptionState());
-  {
-    // Test building instanceNormalization with default options for 4-D input.
-    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    EXPECT_FALSE(options->hasScale());
-    EXPECT_FALSE(options->hasBias());
-    EXPECT_TRUE(options->hasLayout());
-    EXPECT_EQ(options->layout(), V8MLInputOperandLayout::Enum::kNchw);
-    EXPECT_TRUE(options->hasEpsilon());
-    EXPECT_FLOAT_EQ(options->epsilon(), 1e-5);
-    auto* output = BuildInstanceNormalization(scope, builder, input, options);
-    EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 3, 4}));
-  }
-  {
-    // Test building instanceNormalization with default layout NCHW.
-    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* scale =
-        BuildInput(builder, "scale", {2}, V8MLOperandDataType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    options->setScale(scale);
-    auto* bias =
-        BuildInput(builder, "bias", {2}, V8MLOperandDataType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    options->setBias(bias);
-    auto* output = BuildInstanceNormalization(scope, builder, input, options);
-    EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 3, 4}));
-  }
-  {
-    // Test building instanceNormalization with layout = Nhwc.
-    auto* input = BuildInput(builder, "input", {1, 2, 3, 4},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    options->setLayout(V8MLInputOperandLayout::Enum::kNhwc);
-    auto* scale =
-        BuildInput(builder, "scale", {4}, V8MLOperandDataType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    options->setScale(scale);
-    auto* bias =
-        BuildInput(builder, "bias", {4}, V8MLOperandDataType::Enum::kFloat32,
-                   scope.GetExceptionState());
-    options->setScale(bias);
-    auto* output = BuildInstanceNormalization(scope, builder, input, options);
-    EXPECT_EQ(output->Dimensions(), Vector<uint32_t>({1, 2, 3, 4}));
-  }
-  {
-    // Test throwing exception when the input is not a 4-D tensor.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5, 2},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input should be a 4-D tensor.");
-  }
-  {
-    // Test throwing exception when the input data type is not one of floating
-    // point types.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kInt32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "The input type must be one of the floating point types.");
-  }
-  {
-    // Test throwing exception when the scale data type is not the same as the
-    // input data type.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat16,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* scale =
-        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setScale(scale);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(
-        scope.GetExceptionState().Message(),
-        "For scale operand: the data type doesn't match the input data type.");
-  }
-  {
-    // Test throwing exception when the scale operand is not a 1-D tensor.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* scale =
-        BuildConstant(builder, {2, 1}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setScale(scale);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "For scale operand: the operand should be a 1-D tensor.");
-  }
-  {
-    // Test throwing exception when the size of scale operand is not equal
-    // to the size of the feature dimension of the input.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    options->setLayout(V8MLInputOperandLayout::Enum::kNhwc);
-    auto* scale =
-        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setScale(scale);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "For scale operand: the size of operand must be equal to the "
-              "size of the feature dimension of the input.");
-  }
-  {
-    // Test throwing exception when the bias data type is not the same as the
-    // input data type.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat16,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* bias =
-        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setBias(bias);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(
-        scope.GetExceptionState().Message(),
-        "For bias operand: the data type doesn't match the input data type.");
-  }
-  {
-    // Test throwing exception when the bias operand is not a 1-D tensor.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    auto* bias =
-        BuildConstant(builder, {2, 1}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setBias(bias);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "For bias operand: the operand should be a 1-D tensor.");
-  }
-  {
-    // Test throwing exception when the size of bias operand is not equal to
-    // the size of the feature dimension of the input.
-    auto* input = BuildInput(builder, "input", {1, 2, 5, 5},
-                             V8MLOperandDataType::Enum::kFloat32,
-                             scope.GetExceptionState());
-    auto* options = MLInstanceNormalizationOptions::Create();
-    options->setLayout(V8MLInputOperandLayout::Enum::kNhwc);
-    auto* bias =
-        BuildConstant(builder, {2}, V8MLOperandDataType::Enum::kFloat32,
-                      scope.GetExceptionState());
-    options->setBias(bias);
-    auto* output = builder->instanceNormalization(input, options,
-                                                  scope.GetExceptionState());
-    EXPECT_THAT(output, testing::IsNull());
-    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
-              DOMExceptionCode::kDataError);
-    EXPECT_EQ(scope.GetExceptionState().Message(),
-              "For bias operand: the size of operand must be equal to the size "
-              "of the feature dimension of the input.");
-  }
-}
-
 MLOperand* BuildLayerNormalization(V8TestingScope& scope,
                                    MLGraphBuilder* builder,
                                    const MLOperand* input,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
index 0e873d8e..7171c75 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h
@@ -15,7 +15,6 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gru_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_hard_sigmoid_options.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_instance_normalization_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_layer_normalization_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_leaky_relu_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_linear_options.h"
@@ -99,13 +98,6 @@
     const MLOperand* input,
     const MLHardSigmoidOptions* options = MLHardSigmoidOptions::Create());
 
-MLOperand* BuildInstanceNormalization(
-    V8TestingScope& scope,
-    MLGraphBuilder* builder,
-    const MLOperand* input,
-    const MLInstanceNormalizationOptions* options =
-        MLInstanceNormalizationOptions::Create());
-
 MLOperand* BuildLayerNormalization(V8TestingScope& scope,
                                    MLGraphBuilder* builder,
                                    const MLOperand* input,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_mojo_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_mojo_test.cc
index 6f124879..fc11971 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_mojo_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_mojo_test.cc
@@ -2723,186 +2723,6 @@
   }
 }
 
-struct InstanceNormalizationTester {
-  OperandInfoBlink input;
-  struct InstanceNormalizationOptions {
-    std::optional<OperandInfoBlink> scale;
-    std::optional<OperandInfoBlink> bias;
-    std::optional<float> epsilon;
-    std::optional<blink::V8MLInputOperandLayout::Enum> layout;
-  };
-  struct InstanceNormalizationAttributes {
-    std::optional<OperandInfoMojo> scale;
-    std::optional<OperandInfoMojo> bias;
-    float epsilon = 1e-5;
-    blink_mojom::InputOperandLayout layout =
-        blink_mojom::InputOperandLayout::kChannelsFirst;
-  };
-  InstanceNormalizationOptions options;
-  OperandInfoMojo expected_operand;
-  InstanceNormalizationAttributes expected_attributes;
-
-  void Test(MLGraphTestMojo& helper,
-            V8TestingScope& scope,
-            MLGraphBuilder* builder) {
-    // Build the graph.
-    auto* input_operand =
-        BuildInput(builder, "input", input.dimensions, input.data_type,
-                   scope.GetExceptionState());
-    MLInstanceNormalizationOptions* instance_normalization_options =
-        MLInstanceNormalizationOptions::Create();
-    if (options.scale) {
-      instance_normalization_options->setScale(
-          BuildInput(builder, "scale", options.scale->dimensions,
-                     options.scale->data_type, scope.GetExceptionState()));
-    }
-    if (options.bias) {
-      instance_normalization_options->setBias(
-          BuildInput(builder, "bias", options.bias->dimensions,
-                     options.bias->data_type, scope.GetExceptionState()));
-    }
-    if (options.epsilon) {
-      instance_normalization_options->setEpsilon(options.epsilon.value());
-    }
-    if (options.layout) {
-      instance_normalization_options->setLayout(options.layout.value());
-    }
-
-    auto* output_operand = builder->instanceNormalization(
-        input_operand, instance_normalization_options,
-        scope.GetExceptionState());
-    auto [graph, error_name, error_message] =
-        helper.BuildGraph(scope, builder, {{"output", output_operand}});
-    ASSERT_THAT(graph, testing::NotNull());
-
-    auto graph_info = helper.GetGraphInfo();
-    // Verify the graph information of mojo are as expected.
-    ASSERT_EQ(graph_info->operations.size(), 1u);
-    auto& operation = graph_info->operations[0];
-    EXPECT_TRUE(operation->is_instance_normalization());
-    auto& instance_normalization = operation->get_instance_normalization();
-    EXPECT_EQ(instance_normalization->layout, expected_attributes.layout);
-    EXPECT_FLOAT_EQ(instance_normalization->epsilon,
-                    expected_attributes.epsilon);
-    if (options.scale) {
-      auto scale_operand_iter = graph_info->id_to_operand_map.find(
-          instance_normalization->scale_operand_id.value());
-      ASSERT_TRUE(scale_operand_iter != graph_info->id_to_operand_map.end());
-      EXPECT_EQ(scale_operand_iter->value->data_type,
-                expected_attributes.scale->data_type);
-      EXPECT_EQ(scale_operand_iter->value->dimensions,
-                expected_attributes.scale->dimensions);
-    }
-    if (options.bias) {
-      auto bias_operand_iter = graph_info->id_to_operand_map.find(
-          instance_normalization->bias_operand_id.value());
-      ASSERT_TRUE(bias_operand_iter != graph_info->id_to_operand_map.end());
-      EXPECT_EQ(bias_operand_iter->value->data_type,
-                expected_attributes.bias->data_type);
-      EXPECT_EQ(bias_operand_iter->value->dimensions,
-                expected_attributes.bias->dimensions);
-    }
-
-    EXPECT_EQ(graph_info->output_operands.size(), 1u);
-    auto output_operand_id = graph_info->output_operands[0];
-    auto output_operand_iter =
-        graph_info->id_to_operand_map.find(output_operand_id);
-    ASSERT_TRUE(output_operand_iter != graph_info->id_to_operand_map.end());
-    EXPECT_EQ(output_operand_iter->value->data_type,
-              expected_operand.data_type);
-    EXPECT_EQ(output_operand_iter->value->dimensions,
-              expected_operand.dimensions);
-  }
-};
-
-TEST_P(MLGraphTestMojo, InstanceNormalizationTest) {
-  V8TestingScope scope;
-  // Bind fake WebNN Context in the service for testing.
-  ScopedWebNNServiceBinder scoped_setup_binder(*this, scope);
-
-  auto* options = MLContextOptions::Create();
-  // Create WebNN Context with GPU device type.
-  options->setDeviceType(V8MLDeviceType::Enum::kGpu);
-  auto* builder = CreateGraphBuilder(scope, options);
-  ASSERT_THAT(builder, testing::NotNull());
-  {
-    // Test instanceNormalization with default options.
-    InstanceNormalizationTester{
-        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
-                  .dimensions = {1, 3, 5, 5}},
-        .expected_operand = {.data_type =
-                                 blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {1, 3, 5, 5}},
-        .expected_attributes =
-            {.scale = std::nullopt,
-             .bias = std::nullopt,
-             .epsilon = 1e-5,
-             .layout = blink_mojom::InputOperandLayout::kChannelsFirst}}
-        .Test(*this, scope, builder);
-  }
-  {
-    // Test instanceNormalization with layout = nhwc.
-    InstanceNormalizationTester{
-        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
-                  .dimensions = {1, 3, 4, 5}},
-        .options = {.layout = V8MLInputOperandLayout::Enum::kNhwc},
-        .expected_operand = {.data_type =
-                                 blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {1, 3, 4, 5}},
-        .expected_attributes =
-            {.scale = std::nullopt,
-             .bias = std::nullopt,
-             .epsilon = 1e-5,
-             .layout = blink_mojom::InputOperandLayout::kChannelsLast}}
-        .Test(*this, scope, builder);
-  }
-  {
-    // Test instanceNormalization with epsilon = 0.01.
-    InstanceNormalizationTester{
-        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
-                  .dimensions = {1, 3, 4, 5}},
-        .options = {.epsilon = 0.01},
-        .expected_operand = {.data_type =
-                                 blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {1, 3, 4, 5}},
-        .expected_attributes =
-            {.scale = std::nullopt,
-             .bias = std::nullopt,
-             .epsilon = 0.01,
-             .layout = blink_mojom::InputOperandLayout::kChannelsFirst}}
-        .Test(*this, scope, builder);
-  }
-  {
-    // Test instanceNormalization with scale and bias.
-    InstanceNormalizationTester{
-        .input = {.data_type = V8MLOperandDataType::Enum::kFloat32,
-                  .dimensions = {1, 3, 5, 5}},
-        .options = {.scale =
-                        OperandInfoBlink{
-                            .data_type = V8MLOperandDataType::Enum::kFloat32,
-                            .dimensions = {3}},
-                    .bias =
-                        OperandInfoBlink{
-                            .data_type = V8MLOperandDataType::Enum::kFloat32,
-                            .dimensions = {3}}},
-        .expected_operand = {.data_type =
-                                 blink_mojom::Operand::DataType::kFloat32,
-                             .dimensions = {1, 3, 5, 5}},
-        .expected_attributes =
-            {.scale =
-                 OperandInfoMojo{
-                     .data_type = blink_mojom::Operand::DataType::kFloat32,
-                     .dimensions = {3}},
-             .bias =
-                 OperandInfoMojo{
-                     .data_type = blink_mojom::Operand::DataType::kFloat32,
-                     .dimensions = {3}},
-             .epsilon = 1e-5,
-             .layout = blink_mojom::InputOperandLayout::kChannelsFirst}}
-        .Test(*this, scope, builder);
-  }
-}
-
 struct LayerNormalizationTester {
   OperandInfoBlink input;
   struct LayerNormalizationOptions {
diff --git a/third_party/blink/renderer/modules/model_execution/model_manager.idl b/third_party/blink/renderer/modules/model_execution/model_manager.idl
index 7f77c30..17e9e13 100644
--- a/third_party/blink/renderer/modules/model_execution/model_manager.idl
+++ b/third_party/blink/renderer/modules/model_execution/model_manager.idl
@@ -2,16 +2,35 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-enum GenericModelAvailability { "readily", "after-download", "no" };
+enum GenericModelAvailability {
+  "readily",
+  "after-download",
+  "no"
+};
 
 [
   RuntimeEnabled=ModelExecutionAPI,
   Exposed=Window
 ]
 interface ModelManager {
-  [Measure, CallWith=ScriptState, RaisesException] Promise<GenericModelAvailability> canCreateGenericSession();
-  [Measure, CallWith=ScriptState, RaisesException] Promise<ModelGenericSession> createGenericSession(
+  [
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<GenericModelAvailability> canCreateGenericSession();
+  [
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<ModelGenericSession> createGenericSession(
     optional ModelGenericSessionOptions options = {}
   );
-  [Measure, CallWith=ScriptState, RaisesException] Promise<ModelGenericSessionOptions> defaultGenericSessionOptions();
+  [
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<ModelGenericSessionOptions> defaultGenericSessionOptions();
 };
diff --git a/third_party/blink/renderer/modules/on_device_translation/BUILD.gn b/third_party/blink/renderer/modules/on_device_translation/BUILD.gn
new file mode 100644
index 0000000..97efc4c
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2024 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/blink/renderer/modules/modules.gni")
+
+blink_modules_sources("on_device_translation") {
+  sources = [
+    "dom_translation.cc",
+    "dom_translation.h",
+    "language_translator.cc",
+    "language_translator.h",
+    "translation.cc",
+    "translation.h",
+  ]
+
+  public_deps = [ "//third_party/blink/public/mojom:mojom_modules_blink" ]
+}
diff --git a/third_party/blink/renderer/modules/on_device_translation/OWNERS b/third_party/blink/renderer/modules/on_device_translation/OWNERS
new file mode 100644
index 0000000..a640f819
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/model_execution/OWNERS
diff --git a/third_party/blink/renderer/modules/on_device_translation/dom_translation.cc b/third_party/blink/renderer/modules/on_device_translation/dom_translation.cc
new file mode 100644
index 0000000..68194f2
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/dom_translation.cc
@@ -0,0 +1,41 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/on_device_translation/dom_translation.h"
+
+#include "third_party/blink/renderer/modules/on_device_translation/translation.h"
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
+
+namespace blink {
+
+DOMTranslation::DOMTranslation(ExecutionContext& context)
+    : Supplement<ExecutionContext>(context),
+      translation_(MakeGarbageCollected<Translation>(&context)) {}
+
+void DOMTranslation::Trace(Visitor* visitor) const {
+  visitor->Trace(translation_);
+  Supplement<ExecutionContext>::Trace(visitor);
+}
+
+// static
+const char DOMTranslation::kSupplementName[] = "DOMTranslation";
+
+// static
+DOMTranslation& DOMTranslation::From(ExecutionContext& context) {
+  DOMTranslation* supplement =
+      Supplement<ExecutionContext>::From<DOMTranslation>(context);
+  if (!supplement) {
+    supplement = MakeGarbageCollected<DOMTranslation>(context);
+    ProvideTo(context, supplement);
+  }
+  return *supplement;
+}
+
+// static
+Translation* DOMTranslation::translation(ExecutionContext& context) {
+  return From(context).translation_;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/on_device_translation/dom_translation.h b/third_party/blink/renderer/modules/on_device_translation/dom_translation.h
new file mode 100644
index 0000000..20a3d35e
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/dom_translation.h
@@ -0,0 +1,39 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_DOM_TRANSLATION_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_DOM_TRANSLATION_H_
+
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
+#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
+
+namespace blink {
+
+class Translation;
+class ExecutionContext;
+
+// The class that is exposed to the DOM window or worker for the developers
+// to interact with the translation API.
+class DOMTranslation final : public GarbageCollected<DOMTranslation>,
+                             public Supplement<ExecutionContext> {
+ public:
+  static const char kSupplementName[];
+
+  static DOMTranslation& From(ExecutionContext&);
+  static Translation* translation(ExecutionContext&);
+
+  explicit DOMTranslation(ExecutionContext&);
+  DOMTranslation(const DOMTranslation&) = delete;
+  DOMTranslation& operator=(const DOMTranslation&) = delete;
+
+  void Trace(Visitor*) const override;
+
+ private:
+  Member<Translation> translation_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_DOM_TRANSLATION_H_
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_translator.cc b/third_party/blink/renderer/modules/on_device_translation/language_translator.cc
index db7273d..50ab445 100644
--- a/third_party/blink/renderer/modules/on_device_translation/language_translator.cc
+++ b/third_party/blink/renderer/modules/on_device_translation/language_translator.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 
@@ -53,7 +54,16 @@
   translator_remote_->Translate(
       input, WTF::BindOnce(
                  [](ScriptPromiseResolver<IDLString>* resolver,
-                    const WTF::String& output) { resolver->Resolve(output); },
+                    const WTF::String& output) {
+                   if (output.IsNull()) {
+                     resolver->Reject(DOMException::Create(
+                         "Unable to translate the given text.",
+                         DOMException::GetErrorName(
+                             DOMExceptionCode::kNotReadableError)));
+                   } else {
+                     resolver->Resolve(output);
+                   }
+                 },
                  WrapPersistent(resolver)));
 
   return promise;
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_translator.h b/third_party/blink/renderer/modules/on_device_translation/language_translator.h
new file mode 100644
index 0000000..f018a52
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/language_translator.h
@@ -0,0 +1,47 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_TRANSLATOR_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_TRANSLATOR_H_
+
+#include "base/memory/scoped_refptr.h"
+#include "base/task/sequenced_task_runner.h"
+#include "third_party/blink/public/mojom/on_device_translation/translator.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink {
+
+// The class that represents a translator with source and target language.
+class LanguageTranslator final : public ScriptWrappable {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  LanguageTranslator(const WTF::String source_lang,
+                     const WTF::String target_lang,
+                     scoped_refptr<base::SequencedTaskRunner> task_runner);
+  ~LanguageTranslator() override = default;
+
+  void Trace(Visitor* visitor) const override;
+
+  mojo::PendingReceiver<blink::mojom::blink::Translator>
+  GetTranslatorReceiver();
+
+  // language_translator.idl implementation.
+  ScriptPromise<IDLString> translate(ScriptState* script_state,
+                                     const WTF::String& input,
+                                     ExceptionState& exception_state);
+
+ private:
+  const WTF::String source_lang_;
+  const WTF::String target_lang_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  HeapMojoRemote<blink::mojom::blink::Translator> translator_remote_{nullptr};
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_TRANSLATOR_H_
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_translator.idl b/third_party/blink/renderer/modules/on_device_translation/language_translator.idl
new file mode 100644
index 0000000..f447267
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/language_translator.idl
@@ -0,0 +1,16 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+[
+  RuntimeEnabled=TranslationAPI,
+  Exposed=(Window,Worker)
+]
+interface LanguageTranslator {
+  [
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<DOMString> translate(DOMString input);
+};
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.cc b/third_party/blink/renderer/modules/on_device_translation/translation.cc
new file mode 100644
index 0000000..d36bd27
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.cc
@@ -0,0 +1,117 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/on_device_translation/translation.h"
+
+#include "base/metrics/histogram_functions.h"
+#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/modules/on_device_translation/language_translator.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+
+namespace blink {
+
+Translation::Translation(ExecutionContext* context)
+    : ExecutionContextClient(context),
+      task_runner_(context->GetTaskRunner(TaskType::kInternalDefault)) {}
+
+void Translation::Trace(Visitor* visitor) const {
+  ScriptWrappable::Trace(visitor);
+  ExecutionContextClient::Trace(visitor);
+  visitor->Trace(translation_manager_remote_);
+}
+
+HeapMojoRemote<mojom::blink::TranslationManager>&
+Translation::GetTranslationManagerRemote() {
+  if (!translation_manager_remote_.is_bound()) {
+    if (GetExecutionContext()) {
+      GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface(
+          translation_manager_remote_.BindNewPipeAndPassReceiver(task_runner_));
+    }
+  }
+  return translation_manager_remote_;
+}
+
+ScriptPromise<V8TranslationAvailability> Translation::canTranslate(
+    ScriptState* script_state,
+    TranslationLanguageOptions* options,
+    ExceptionState& exception_state) {
+  if (!script_state->ContextIsValid()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "The execution context is not valid.");
+    return ScriptPromise<V8TranslationAvailability>();
+  }
+
+  auto* resolver =
+      MakeGarbageCollected<ScriptPromiseResolver<V8TranslationAvailability>>(
+          script_state);
+  auto promise = resolver->Promise();
+
+  if (!GetTranslationManagerRemote().is_connected()) {
+    resolver->Resolve(
+        V8TranslationAvailability(V8TranslationAvailability::Enum::kNo));
+  } else {
+    GetTranslationManagerRemote()->CanCreateTranslator(
+        options->sourceLanguage(), options->targetLanguage(),
+        WTF::BindOnce(
+            [](ScriptPromiseResolver<V8TranslationAvailability>* resolver,
+               bool can_create) {
+              if (can_create) {
+                resolver->Resolve(V8TranslationAvailability(
+                    V8TranslationAvailability::Enum::kReadily));
+              } else {
+                resolver->Resolve(V8TranslationAvailability(
+                    V8TranslationAvailability::Enum::kNo));
+              }
+            },
+            WrapPersistent(resolver)));
+  }
+
+  return promise;
+}
+
+ScriptPromise<LanguageTranslator> Translation::createTranslator(
+    ScriptState* script_state,
+    TranslationLanguageOptions* options,
+    ExceptionState& exception_state) {
+  if (!script_state->ContextIsValid()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "The execution context is not valid.");
+    return ScriptPromise<LanguageTranslator>();
+  }
+
+  auto* resolver =
+      MakeGarbageCollected<ScriptPromiseResolver<LanguageTranslator>>(
+          script_state);
+  LanguageTranslator* translator = MakeGarbageCollected<LanguageTranslator>(
+      options->sourceLanguage(), options->targetLanguage(), task_runner_);
+  auto promise = resolver->Promise();
+
+  GetTranslationManagerRemote()->CreateTranslator(
+      options->sourceLanguage(), options->targetLanguage(),
+      translator->GetTranslatorReceiver(),
+      WTF::BindOnce(
+          [](ScriptPromiseResolver<LanguageTranslator>* resolver,
+             LanguageTranslator* translator, bool success) {
+            if (success) {
+              resolver->Resolve(translator);
+            } else {
+              resolver->Reject(DOMException::Create(
+                  "Unable to create translator for the given source and target "
+                  "language.",
+                  DOMException::GetErrorName(
+                      DOMExceptionCode::kNotSupportedError)));
+            }
+          },
+          WrapPersistent(resolver), WrapPersistent(translator)));
+
+  return promise;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.h b/third_party/blink/renderer/modules/on_device_translation/translation.h
new file mode 100644
index 0000000..30a5193d
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.h
@@ -0,0 +1,58 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_TRANSLATION_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_TRANSLATION_H_
+
+#include "base/memory/scoped_refptr.h"
+#include "base/task/sequenced_task_runner.h"
+#include "third_party/blink/public/mojom/on_device_translation/translation_manager.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_translation_availability.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
+#include "third_party/blink/renderer/modules/on_device_translation/language_translator.h"
+#include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
+
+namespace blink {
+class LanguageTranslator;
+class V8TranslationAvailability;
+
+// The class that manages the translation APIs that allow developers to
+// create Translators.
+class Translation final : public ScriptWrappable,
+                          public ExecutionContextClient {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  explicit Translation(ExecutionContext* context);
+  ~Translation() override = default;
+
+  void Trace(Visitor* visitor) const override;
+
+  // translation.idl implementation.
+  ScriptPromise<V8TranslationAvailability> canTranslate(
+      ScriptState* script_state,
+      TranslationLanguageOptions* options,
+      ExceptionState& exception_state);
+  ScriptPromise<LanguageTranslator> createTranslator(
+      ScriptState* script_state,
+      TranslationLanguageOptions* options,
+      ExceptionState& exception_state);
+
+ private:
+  HeapMojoRemote<mojom::blink::TranslationManager>&
+  GetTranslationManagerRemote();
+
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  HeapMojoRemote<mojom::blink::TranslationManager> translation_manager_remote_{
+      nullptr};
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_TRANSLATION_H_
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.idl b/third_party/blink/renderer/modules/on_device_translation/translation.idl
new file mode 100644
index 0000000..9330c43
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.idl
@@ -0,0 +1,34 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+enum TranslationAvailability {
+  "readily",
+  "after-download",
+  "no"
+};
+
+[
+  RuntimeEnabled=TranslationAPI,
+  Exposed=(Window,Worker)
+]
+interface Translation {
+  [
+    RuntimeEnabled=TranslationAPI,
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<TranslationAvailability> canTranslate(
+    TranslationLanguageOptions options
+  );
+  [
+    RuntimeEnabled=TranslationAPI,
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
+  Promise<LanguageTranslator> createTranslator(
+    TranslationLanguageOptions options
+  );
+};
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation_language_options.idl b/third_party/blink/renderer/modules/on_device_translation/translation_language_options.idl
new file mode 100644
index 0000000..9a17d9a5
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/translation_language_options.idl
@@ -0,0 +1,8 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+dictionary TranslationLanguageOptions {
+  required DOMString sourceLanguage;
+  required DOMString targetLanguage;
+};
diff --git a/third_party/blink/renderer/modules/on_device_translation/window_or_worker_global_scope_translation.idl b/third_party/blink/renderer/modules/on_device_translation/window_or_worker_global_scope_translation.idl
new file mode 100644
index 0000000..4277004
--- /dev/null
+++ b/third_party/blink/renderer/modules/on_device_translation/window_or_worker_global_scope_translation.idl
@@ -0,0 +1,11 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+[
+    ImplementedAs=DOMTranslation,
+    RuntimeEnabled=TranslationAPI,
+    Exposed=(Window,Worker)
+] partial interface mixin WindowOrWorkerGlobalScope {
+    readonly attribute Translation translation;
+};
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index c023047..8eb97fd 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -3923,6 +3923,11 @@
       name: "TranslateService",
     },
     {
+      name: "TranslationAPI",
+      status: "test",
+      base_feature: "EnableTranslationAPI",
+    },
+    {
       name: "TrustedTypeBeforePolicyCreationEvent",
       status: "experimental",
     },
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations
index a65e3019..02a7276 100644
--- a/third_party/blink/web_tests/LeakExpectations
+++ b/third_party/blink/web_tests/LeakExpectations
@@ -46,8 +46,6 @@
 # Sheriff 2023-04-04
 crbug.com/1430360 [ Linux ] external/wpt/custom-elements/form-associated/label-delegatesFocus.html [ Failure Pass ]
 
-crbug.com/325981758 external/wpt/html/semantics/popovers/popover-light-dismiss.html [ Failure ]
-
 ###########################################################################
 # WARNING: Memory leaks must be fixed asap. Sheriff is expected to revert #
 # culprit CLs instead of suppressing the leaks. If you have any question, #
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index e24e1cb..bb61151 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -7205,6 +7205,10 @@
 [ Mac14 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gpu/conv2d.https.any.worker [ Failure Pass ]
 [ Mac14 ] webexposed/global-interface-listing.html [ Skip Timeout ]
 
+# 2024-04-18 Flaky Suppressor on ci/mac-osxbeta-rel
+[ Mac14 ] http/tests/inspector-protocol/tracing/animation.js [ Failure Pass ]
+[ Mac14 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gpu/reduction.https.any.html [ Timeout Pass ]
+
 # Branch Gardener 2024-03-20
 crbug.com/330547706 [ Debug Mac13 ] virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-multiple-appearance-basic.html [ Crash Pass ]
 
@@ -7245,16 +7249,40 @@
 crbug.com/330761492 external/wpt/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html [ Failure Pass ]
 
 # RubyLineBreakable
+crbug.com/324111880 virtual/ruby-lb/editing/execCommand/insert-paragraph-into-table.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/editing/pasteboard/copy-paste-ruby-text.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-break/ruby-000.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-break/ruby-001.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-break/ruby-002.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-break/ruby-003.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-contain/contain-layout-005.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-contain/contain-paint-008.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-contain/contain-paint-ignored-cases-ruby-containing-block-001.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-contain/content-visibility/display-ruby-text-crash.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-multicol/multicol-fill-balance-021.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-ruby/br-clear-all-002.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-ruby/line-break-around-ruby-001.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-ruby/line-spacing.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-ruby/ruby-line-breaking-002.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-text-decor/ruby-text-decoration-01.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/css/css-writing-modes/direction-upright-002.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/editing/run/inserthorizontalrule.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html [ Crash Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/float-overhang-from-ruby-text.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/line-break-ruby.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/overhang-horizontal.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/overhang-vertical.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/ruby-position-modern-japanese-fonts.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/select-ruby.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/media/track/track-cue-rendering-rtl.html [ Crash ]
+crbug.com/324111880 virtual/ruby-lb/media/track/track-cue-rendering-ruby.html [ Crash Failure ]
+crbug.com/324111880 virtual/ruby-lb/paint/invalidation/ruby-flipped-blocks.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/virtual/text-antialias/emphasis-avoid-ruby.html [ Failure ]
+crbug.com/324111880 virtual/ruby-lb/virtual/text-antialias/whitespace/justification-expansion-crash.html [ Crash ]
 # RubyLineBreakable; NeedsRebaseline
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/after-doesnt-crash.html [ Failure ]
 crbug.com/324111880 virtual/ruby-lb/fast/ruby/before-doesnt-crash.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 80a27013..bdcc52f 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -2840,7 +2840,32 @@
   {
     "prefix": "ruby-lb",
     "platforms": ["Mac"],
-    "bases": ["external/wpt/css/css-ruby", "fast/ruby"],
+    "bases": ["external/wpt/css/css-ruby",
+              "fast/ruby",
+              "editing/execCommand/insert-paragraph-into-table.html",
+              "editing/pasteboard/copy-paste-ruby-text-with-block.html",
+              "editing/pasteboard/copy-paste-ruby-text.html",
+              "external/wpt/css/css-break/ruby-000.html",
+              "external/wpt/css/css-break/ruby-001.html",
+              "external/wpt/css/css-break/ruby-002.html",
+              "external/wpt/css/css-break/ruby-003.html",
+              "external/wpt/css/css-contain/contain-layout-005.html",
+              "external/wpt/css/css-contain/contain-paint-008.html",
+              "external/wpt/css/css-contain/contain-paint-ignored-cases-ruby-containing-block-001.html",
+              "external/wpt/css/css-contain/content-visibility/display-ruby-text-crash.html",
+              "external/wpt/css/css-multicol/multicol-fill-balance-021.html",
+              "external/wpt/css/css-text-decor/ruby-text-decoration-01.html",
+              "external/wpt/css/css-writing-modes/direction-upright-002.html",
+              "external/wpt/editing/run/inserthorizontalrule.html",
+              "external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html",
+              "external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html",
+              "external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html",
+              "external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html",
+              "media/track/track-cue-rendering-rtl.html",
+              "media/track/track-cue-rendering-ruby.html",
+              "paint/invalidation/ruby-flipped-blocks.html",
+              "virtual/text-antialias/emphasis-avoid-ruby.html",
+              "virtual/text-antialias/whitespace/justification-expansion-crash.html"],
     "args": ["--enable-blink-features=RubyLineBreakable"],
     "owners": ["tkent@chromium.org"],
     "expires": "Oct 10, 2024"
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 9c2f85ce..8d2d193 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
@@ -168069,6 +168069,19 @@
        {}
       ]
      ],
+     "selection-over-highlight-001.html": [
+      "57078cf83b38e317c4c070347fe43c9e440ff6f9",
+      [
+       null,
+       [
+        [
+         "/css/css-pseudo/selection-over-highlight-001-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "selection-overlay-and-grammar-001.html": [
       "19768c73897155fc03fa063aa9001c5b74521b6e",
       [
@@ -327682,6 +327695,10 @@
       "c93e8cb92450a3f61a9c25b810268a9589212b5b",
       []
      ],
+     "selection-over-highlight-001-ref.html": [
+      "f75017d5ec5d903bd484f0a6881e3ce1cd826c30",
+      []
+     ],
      "selection-paint-image-notref.html": [
       "ba1e97dffd8e3cbf1d113b8a68a099dd3fb36824",
       []
@@ -353900,8 +353917,44 @@
       "8760e59d21f6f4e5a26de27395fe1b8a5151dac2",
       []
      ],
+     "auction-config-passed-to-worklets.https.window_1-5-expected.txt": [
+      "f77f9c2558b705aa88085378e5053056609c19a9",
+      []
+     ],
+     "auction-config.https.window_1-5-expected.txt": [
+      "4cc1615072d925c84f183ed7a7df430a60857927",
+      []
+     ],
+     "auction-config.https.window_6-10-expected.txt": [
+      "f3d6faf35f280728c0196a886213bfbfc9d83c8d",
+      []
+     ],
+     "component-ads.https.window_16-last-expected.txt": [
+      "bb41d8c0f99cfd686604cc28eac66926ffda45f3",
+      []
+     ],
+     "component-auction.https.window_16-last-expected.txt": [
+      "afdb5eace277d60b5121e56f8c1369463348de83",
+      []
+     ],
+     "deprecated-render-url-replacements.https.window_1-5-expected.txt": [
+      "7f0d162804e0a73856824f74047c0679eb2e2132",
+      []
+     ],
+     "deprecated-render-url-replacements.https.window_11-15-expected.txt": [
+      "661d00139fcde3bfcd43fc70b7951cc86290d949",
+      []
+     ],
+     "deprecated-render-url-replacements.https.window_16-last-expected.txt": [
+      "ccdfedec62359d5afc20d7bfc7a6bf213046983a",
+      []
+     ],
+     "deprecated-render-url-replacements.https.window_6-10-expected.txt": [
+      "8462c72e91f776da0fe2efa81d806f8fac6bac04",
+      []
+     ],
      "kanon-status-below-threshold.https.window-expected.txt": [
-      "89e64d0dde16b3e32e235a39669e7ca954a3aa67",
+      "e27cfa443a0dcc5447592dc9af5d987467910dbd",
       []
      ],
      "resources": {
@@ -353934,7 +353987,7 @@
        []
       ],
       "fledge-util.sub.js": [
-       "32162e933a50ffc83d709e7d83718eeb1bc98914",
+       "a7d0f63830d63bebf964aed74038b1fbbb2a75e7",
        []
       ],
       "fledge_http_server_util.py": [
@@ -354159,7 +354212,7 @@
       []
      ],
      "cross-origin-ancestor-activeelement-after-child-lose-focus-helper.html": [
-      "83d39d5c70d2ec2cf63773e834597d67f00f2aa4",
+      "fe96614517207faf2381b947d713fa9bbc01b886",
       []
      ],
      "focus-already-focused-iframe-deep-different-site-outer.sub.html": [
@@ -441484,6 +441537,13 @@
        {}
       ]
      ],
+     "position-try-backdrop.html": [
+      "6bf2262c69af6ec2f883435177c49db93c135b67",
+      [
+       null,
+       {}
+      ]
+     ],
      "position-try-cascade-layer-reorder.html": [
       "4f38806f604f612065783c9b3253fb1f6bda0184",
       [
@@ -485038,7 +485098,7 @@
    "dpub-aam": {
     "role": {
      "roles.html": [
-      "b9840976e1f001d182540cadfbe88c3c7c4d0403",
+      "62e33b95fa786e007371e1de29a25a260a79206d",
       [
        null,
        {
@@ -519748,7 +519808,7 @@
       ]
      ],
      "auction-config-passed-to-worklets.https.window.js": [
-      "9b12d077baf08afe508279a94f9dde9b2fbcf63b",
+      "7780957739e435825f186500f56a6e102e9c2c32",
       [
        "fledge/tentative/auction-config-passed-to-worklets.https.window.html?1-5",
        {
@@ -519991,7 +520051,7 @@
       ]
      ],
      "auction-config.https.window.js": [
-      "5fa4fa252fde97d02795bf1013ce0df7afdc70e1",
+      "28ed147071858ee6c5f0f3acdaf1d2d636b1ad4a",
       [
        "fledge/tentative/auction-config.https.window.html?1-5",
        {
@@ -520054,7 +520114,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520122,7 +520186,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520190,7 +520258,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520258,7 +520330,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520326,7 +520402,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520394,7 +520474,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520462,7 +520546,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520530,14 +520618,18 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
        }
       ],
       [
-       "fledge/tentative/auction-config.https.window.html?46-last",
+       "fledge/tentative/auction-config.https.window.html?45-50",
        {
         "script_metadata": [
          [
@@ -520598,7 +520690,83 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/auction-config.https.window.html?50-last",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-20"
+         ],
+         [
+          "variant",
+          "?21-25"
+         ],
+         [
+          "variant",
+          "?26-30"
+         ],
+         [
+          "variant",
+          "?31-35"
+         ],
+         [
+          "variant",
+          "?36-40"
+         ],
+         [
+          "variant",
+          "?40-45"
+         ],
+         [
+          "variant",
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520666,7 +520834,11 @@
          ],
          [
           "variant",
-          "?46-last"
+          "?45-50"
+         ],
+         [
+          "variant",
+          "?50-last"
          ]
         ],
         "timeout": "long"
@@ -520853,7 +521025,7 @@
       ]
      ],
      "component-ads.https.window.js": [
-      "6b22585d578959030c508a144dab2ba10dfb11f6",
+      "8493025429ed83b49f5117f0b3f237e03ccf64a5",
       [
        "fledge/tentative/component-ads.https.window.html?1-5",
        {
@@ -521032,7 +521204,7 @@
       ]
      ],
      "component-auction.https.window.js": [
-      "015c20a5c247925aa5e7a0e18ac5eea676083a48",
+      "bf804e68579937f8192ba6bf377e0ed6fdedf501",
       [
        "fledge/tentative/component-auction.https.window.html?1-5",
        {
@@ -521968,6 +522140,185 @@
        }
       ]
      ],
+     "deprecated-render-url-replacements.https.window.js": [
+      "4f8bc1cc7f0f5cd12b78a8cb05f787841b63f120",
+      [
+       "fledge/tentative/deprecated-render-url-replacements.https.window.html?1-5",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/deprecated-render-url-replacements.https.window.html?11-15",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/deprecated-render-url-replacements.https.window.html?16-last",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/deprecated-render-url-replacements.https.window.html?6-10",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ]
+     ],
      "direct-from-seller-signals.https.window.js": [
       "d0c0e550c4232bd4dad1661b0b418084111a48a6",
       [
@@ -529079,7 +529430,7 @@
      ]
     ],
     "cross-origin-ancestor-activeelement-after-child-lose-focus.sub.html": [
-     "35844bc91fb56c0446c9a433114af52b8970ddb1",
+     "1b84b43f1c487b708405e41ed96565b487d8708b",
      [
       null,
       {
@@ -565943,7 +566294,7 @@
         ]
        ],
        "the-anchor-attribute-003.tentative.html": [
-        "ec2d8d5ead9673e307350bc7346a5f3b971a391b",
+        "e8c12c784f53d086e42c16eb8ed5f9572354c25a",
         [
          null,
          {}
@@ -632551,6 +632902,13 @@
        {}
       ]
      ],
+     "navigation-timing-sizes.https.html": [
+      "b3b1b5fe35a0099de2892f387e0f4d0d4876fda0",
+      [
+       null,
+       {}
+      ]
+     ],
      "navigation-timing.https.html": [
       "75cab40458c6d362caa34315388ad762fbb7d2e9",
       [
diff --git a/third_party/blink/web_tests/external/wpt/dpub-aam/role/roles.html b/third_party/blink/web_tests/external/wpt/dpub-aam/role/roles.html
index b984097..62e33b9 100644
--- a/third_party/blink/web_tests/external/wpt/dpub-aam/role/roles.html
+++ b/third_party/blink/web_tests/external/wpt/dpub-aam/role/roles.html
@@ -28,6 +28,7 @@
   "doc-colophon",
   "doc-conclusion",
   "doc-cover",
+  "doc-credit",
   "doc-credits",
   "doc-dedication",
   // "doc-endnote", // deprecated
@@ -60,4 +61,5 @@
 
 </script>
 </body>
-</html>
\ No newline at end of file
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
index e0e006e..1317b62 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
@@ -607,18 +607,18 @@
   const iframe_box = iframe29.getBoundingClientRect();
 
   await actions
-      .pointerMove(iframe_box.width / 2, iframe_box.height / 2, {origin: iframe29})
-      .pointerDown({button: actions.ButtonType.LEFT})
       .pointerMove(1,1,{origin: b29})
+      .pointerDown({button: actions.ButtonType.LEFT})
+      .pointerMove(iframe_box.width / 2, iframe_box.height / 2, {origin: iframe29})
       .pointerUp({button: actions.ButtonType.LEFT})
       .send();
   assert_true(p29.matches(':popover-open'), 'popover should be open after pointerUp in iframe.');
 
   actions = new test_driver.Actions();
   await actions
-      .pointerMove(1,1,{origin: b29})
-      .pointerDown({button: actions.ButtonType.LEFT})
       .pointerMove(iframe_box.width / 2, iframe_box.height / 2, {origin: iframe29})
+      .pointerDown({button: actions.ButtonType.LEFT})
+      .pointerMove(1,1,{origin: b29})
       .pointerUp({button: actions.ButtonType.LEFT})
       .send();
   assert_true(p29.matches(':popover-open'), 'popover should be open after pointerUp on main frame button.');
diff --git a/third_party/blink/web_tests/external/wpt/webnn/validation_tests/instanceNormalization.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/validation_tests/instanceNormalization.https.any.js
index bdd3385..4fc26ec5a 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/validation_tests/instanceNormalization.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/validation_tests/instanceNormalization.https.any.js
@@ -41,3 +41,152 @@
   assert_throws_js(
       TypeError, () => builder.instanceNormalization(input, options));
 }, '[instanceNormalization] throw if bias option is from another builder');
+
+const tests = [
+  {
+    name: '[instanceNormalization] Test with default options for 4-D input.',
+    input: {dataType: 'float32', dimensions: [1, 2, 3, 4]},
+    output: {dataType: 'float32', dimensions: [1, 2, 3, 4]}
+  },
+  {
+    name:
+        '[instanceNormalization] Test with scale, bias and default epsilon value.',
+    input: {dataType: 'float32', dimensions: [1, 2, 3, 4]},
+    options: {
+      scale: {dataType: 'float32', dimensions: [2]},
+      bias: {dataType: 'float32', dimensions: [2]},
+      epsilon: 1e-5,
+    },
+    output: {dataType: 'float32', dimensions: [1, 2, 3, 4]}
+  },
+  {
+    name: '[instanceNormalization] Test with a non-default epsilon value.',
+    input: {dataType: 'float32', dimensions: [1, 2, 3, 4]},
+    options: {
+      epsilon: 1e-4,
+    },
+    output: {dataType: 'float32', dimensions: [1, 2, 3, 4]}
+  },
+  {
+    name: '[instanceNormalization] Test with layout=nhwc.',
+    input: {dataType: 'float32', dimensions: [1, 2, 3, 4]},
+    options: {
+      layout: 'nhwc',
+      scale: {dataType: 'float32', dimensions: [4]},
+      bias: {dataType: 'float32', dimensions: [4]},
+    },
+    output: {dataType: 'float32', dimensions: [1, 2, 3, 4]}
+  },
+  {
+    name: '[instanceNormalization] Test when the input data type is float16.',
+    input: {dataType: 'float16', dimensions: [1, 2, 3, 4]},
+    output: {dataType: 'float16', dimensions: [1, 2, 3, 4]}
+  },
+  {
+    name: '[instanceNormalization] Throw if the input is not a 4-D tensor.',
+    input: {dataType: 'float32', dimensions: [1, 2, 5, 5, 2]},
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the input data type is not one of floating point types.',
+    input: {dataType: 'int32', dimensions: [1, 2, 5, 5]},
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the scale data type is not the same as the input data type.',
+    input: {dataType: 'float16', dimensions: [1, 2, 5, 5]},
+    options: {
+      scale: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the scale operand is not a 1-D tensor.',
+    input: {dataType: 'float32', dimensions: [1, 2, 5, 5]},
+    options: {
+      scale: {dataType: 'float32', dimensions: [2, 1]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the size of scale operand is not equal to the size of the feature dimension of the input with layout=nhwc.',
+    input: {dataType: 'float32', dimensions: [1, 2, 5, 5]},
+    options: {
+      layout: 'nhwc',
+      scale: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the size of scale operand is not equal to the size of the feature dimension of the input with layout=nchw.',
+    input: {dataType: 'float32', dimensions: [1, 5, 5, 2]},
+    options: {
+      layout: 'nchw',
+      scale: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the bias data type is not the same as the input data type.',
+    input: {dataType: 'float16', dimensions: [1, 2, 5, 5]},
+    options: {
+      bias: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the bias operand is not a 1-D tensor.',
+    input: {dataType: 'float32', dimensions: [1, 2, 5, 5]},
+    options: {
+      scale: {dataType: 'float32', dimensions: [2, 1]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the size of bias operand is not equal to the size of the feature dimension of the input with layout=nhwc.',
+    input: {dataType: 'float32', dimensions: [1, 2, 5, 5]},
+    options: {
+      layout: 'nhwc',
+      bias: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+  {
+    name:
+        '[instanceNormalization] Throw if the size of bias operand is not equal to the size of the feature dimension of the input with layout=nchw.',
+    input: {dataType: 'float32', dimensions: [1, 5, 5, 2]},
+    options: {
+      layout: 'nchw',
+      bias: {dataType: 'float32', dimensions: [2]},
+    },
+  },
+];
+
+tests.forEach(
+    test => promise_test(async t => {
+      const input = builder.input(
+          'input',
+          {dataType: test.input.dataType, dimensions: test.input.dimensions});
+
+      if (test.options && test.options.bias) {
+        test.options.bias = builder.input('bias', {
+          dataType: test.options.bias.dataType,
+          dimensions: test.options.bias.dimensions
+        });
+      }
+      if (test.options && test.options.scale) {
+        test.options.scale = builder.input('scale', {
+          dataType: test.options.scale.dataType,
+          dimensions: test.options.scale.dimensions
+        });
+      }
+
+      if (test.output) {
+        const output = builder.instanceNormalization(input, test.options);
+        assert_equals(output.dataType(), test.output.dataType);
+        assert_array_equals(output.shape(), test.output.dimensions);
+      } else {
+        assert_throws_js(
+            TypeError,
+            () => builder.instanceNormalization(input, test.options));
+      }
+    }, test.name));
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/animation.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/animation.html
deleted file mode 100644
index 57061f6..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/animation.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>Simple animation</title>
-    <style>
-      @keyframes simple-animation {
-        from {
-          color: red;
-          transform: translateX(0%);
-        }
-        to {
-          color: yellow;
-          transform: translateX(100%);
-        }
-      }
-
-      div {
-        width: 200px;
-        height: 200px;
-        background-color: red;
-        animation-name: simple-animation;
-        animation-duration: 4s;
-      }
-    </style>
-  </head>
-  <body>
-    <div>hello world. This Animation has an unsupported css property!</div>
-  </body>
-</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation-expected.txt
deleted file mode 100644
index 7bfc627..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation-expected.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-Tests the data of an Animation event
-Recording started
-Tracing complete
-Object: {
-	args: {
-		data: {
-			displayName: simple-animation
-			id: string
-			name: 
-			nodeId: number
-			nodeName: string
-			state: running
-		}
-	}
-	cat: string
-	id2: {
-		local: string
-	}
-	name: Animation
-	ph: b
-	pid: number
-	tid: number
-	ts: number
-}
-Object: {
-	args: {
-		data: {
-			compositeFailed: 8193
-			unsupportedProperties: [
-				string,
-			]
-		}
-	}
-	cat: string
-	id2: {
-		local: string
-	}
-	name: Animation
-	ph: n
-	pid: number
-	tid: number
-	ts: number
-}
-Object: {
-	args: {
-		data: {
-			state: running
-		}
-	}
-	cat: string
-	id2: {
-		local: string
-	}
-	name: Animation
-	ph: n
-	pid: number
-	tid: number
-	ts: number
-}
-
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation.js b/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation.js
deleted file mode 100644
index 0ca120a7..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/animation.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
-    const {session, dp} = await testRunner.startBlank(
-        'Tests the data of an Animation event');
-
-    const TracingHelper =
-        await testRunner.loadScript('../resources/tracing-test.js');
-    const tracingHelper = new TracingHelper(testRunner, session);
-
-    await dp.Page.enable();
-
-    await tracingHelper.startTracing('blink.animations,devtools.timeline,benchmark,rail');
-
-    dp.Page.navigate(
-        {url: 'http://127.0.0.1:8000/inspector-protocol/resources/animation.html'});
-
-    // Wait for the DOM to be interactive.
-    await dp.Page.onceLoadEventFired();
-
-    const events = await tracingHelper.stopTracing(/blink\.animations|devtools\.timeline|benchmark|rail/);
-    const animationEvents = events.filter(event => event.name && event.name === 'Animation').sort((a, b) => a.ts - b.ts);
-    for (const event of animationEvents) {
-        tracingHelper.logEventShape(event, [], ['name', 'data', 'ph', 'state', 'compositeFailed', 'unsupportedProperties', 'displayName']);
-    }
-
-    testRunner.completeTest();
-  });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/rendering-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/rendering-expected.txt
index 86ba1ce1..d12bf3d 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/rendering-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/rendering-expected.txt
@@ -24,7 +24,6 @@
 Object: {
 	args: {
 		data: {
-			displayName: string
 			id: string
 			name: string
 			nodeId: number
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index df73b35..33a84a5 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1101,6 +1101,10 @@
     attribute @@toStringTag
     method addRoutes
     method constructor
+interface LanguageTranslator
+    attribute @@toStringTag
+    method constructor
+    method translate
 interface Lock
     attribute @@toStringTag
     getter mode
@@ -1879,6 +1883,11 @@
     method enqueue
     method error
     method terminate
+interface Translation
+    attribute @@toStringTag
+    method canTranslate
+    method constructor
+    method createTranslator
 interface TrustedHTML
     static method fromLiteral
     attribute @@toStringTag
@@ -3390,6 +3399,7 @@
     getter performance
     getter scheduler
     getter self
+    getter translation
     getter trustedTypes
     method atob
     method btoa
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 45fa006..f36f48dd 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1153,6 +1153,10 @@
 [Worker]     getter selectedTrack
 [Worker]     method @@iterator
 [Worker]     method constructor
+[Worker] interface LanguageTranslator
+[Worker]     attribute @@toStringTag
+[Worker]     method constructor
+[Worker]     method translate
 [Worker] interface Lock
 [Worker]     attribute @@toStringTag
 [Worker]     getter mode
@@ -2109,6 +2113,11 @@
 [Worker]     method enqueue
 [Worker]     method error
 [Worker]     method terminate
+[Worker] interface Translation
+[Worker]     attribute @@toStringTag
+[Worker]     method canTranslate
+[Worker]     method constructor
+[Worker]     method createTranslator
 [Worker] interface TrustedHTML
 [Worker]     static method fromLiteral
 [Worker]     attribute @@toStringTag
@@ -3792,6 +3801,7 @@
 [Worker]     getter performance
 [Worker]     getter scheduler
 [Worker]     getter self
+[Worker]     getter translation
 [Worker]     getter trustedTypes
 [Worker]     method atob
 [Worker]     method btoa
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 83481d7d..42ebc32 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5715,6 +5715,10 @@
     setter composite
     setter pseudoElement
     setter target
+interface LanguageTranslator
+    attribute @@toStringTag
+    method constructor
+    method translate
 interface LargestContentfulPaint : PerformanceEntry
     attribute @@toStringTag
     getter element
@@ -10106,6 +10110,11 @@
     getter propertyName
     getter pseudoElement
     method constructor
+interface Translation
+    attribute @@toStringTag
+    method canTranslate
+    method constructor
+    method createTranslator
 interface TreeWalker
     attribute @@toStringTag
     getter currentNode
@@ -13029,6 +13038,7 @@
     getter styleMedia
     getter toolbar
     getter top
+    getter translation
     getter trustedTypes
     getter visualViewport
     getter window
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index fde4f46..6572382 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1047,6 +1047,10 @@
 [Worker]     getter storageFormat
 [Worker]     getter width
 [Worker]     method constructor
+[Worker] interface LanguageTranslator
+[Worker]     attribute @@toStringTag
+[Worker]     method constructor
+[Worker]     method translate
 [Worker] interface Lock
 [Worker]     attribute @@toStringTag
 [Worker]     getter mode
@@ -1789,6 +1793,11 @@
 [Worker]     method enqueue
 [Worker]     method error
 [Worker]     method terminate
+[Worker] interface Translation
+[Worker]     attribute @@toStringTag
+[Worker]     method canTranslate
+[Worker]     method constructor
+[Worker]     method createTranslator
 [Worker] interface TrustedHTML
 [Worker]     static method fromLiteral
 [Worker]     attribute @@toStringTag
@@ -3295,6 +3304,7 @@
 [Worker]     getter performance
 [Worker]     getter scheduler
 [Worker]     getter self
+[Worker]     getter translation
 [Worker]     getter trustedTypes
 [Worker]     method atob
 [Worker]     method btoa
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index fd8265d..82bb273 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit fd8265d81da88a9c01d40378393da538d67a749e
+Subproject commit 82bb2737369855a67042a9da0fc35105b2007c95
diff --git a/third_party/depot_tools b/third_party/depot_tools
index af97284..6aaae85 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit af97284b58afb6bdb7dd2b353bc651c718ce5bb4
+Subproject commit 6aaae85821254406042a11254d49b14c9d1b44f3
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index 84f6810..e823faa 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit 84f68106afc210db30fb1efa8f76425cb067e82b
+Subproject commit e823faa7a77921dfb5fd356b41ce9685b1ab919f
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index f61a430..01cc0ed 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit f61a43042a8433b9487b37813b0bc19494a01dd7
+Subproject commit 01cc0edfe78cb9f14cdfd7d5cb5cb14af1e6b2af
diff --git a/third_party/inspector_protocol/crdtp/chromium/protocol_traits.cc b/third_party/inspector_protocol/crdtp/chromium/protocol_traits.cc
index 859014b0..ac3d525 100644
--- a/third_party/inspector_protocol/crdtp/chromium/protocol_traits.cc
+++ b/third_party/inspector_protocol/crdtp/chromium/protocol_traits.cc
@@ -23,7 +23,8 @@
 }
 
 std::string Binary::toBase64() const {
-  return base::Base64Encode(base::as_string_view(*bytes_));
+  return base::Base64Encode(base::StringPiece(
+      reinterpret_cast<const char*>(bytes_->front()), bytes_->size()));
 }
 
 // static
@@ -40,7 +41,7 @@
 
 // static
 Binary Binary::fromVector(std::vector<uint8_t> data) {
-  return Binary(base::MakeRefCounted<base::RefCountedBytes>(std::move(data)));
+  return Binary(base::RefCountedBytes::TakeVector(&data));
 }
 
 // static
diff --git a/third_party/inspector_protocol/crdtp/chromium/protocol_traits.h b/third_party/inspector_protocol/crdtp/chromium/protocol_traits.h
index 480b5b2..3633431 100644
--- a/third_party/inspector_protocol/crdtp/chromium/protocol_traits.h
+++ b/third_party/inspector_protocol/crdtp/chromium/protocol_traits.h
@@ -94,15 +94,8 @@
   // Implements Serializable.
   void AppendSerialized(std::vector<uint8_t>* out) const override;
 
-  // Allow explicit conversion to `base::span`.
-  const uint8_t* data() const { return bytes_->data(); }
+  const uint8_t* data() const { return bytes_->front(); }
   size_t size() const { return bytes_->size(); }
-  // data()/size() provide access to Binary's data as a span, but each one
-  // requires a virtual call. Like RefCountedData, provide this operator as an
-  // optimization.
-  explicit operator base::span<const uint8_t>() const {
-    return base::span(*bytes_);
-  }
   scoped_refptr<base::RefCountedMemory> bytes() const { return bytes_; }
 
   std::string toBase64() const;
diff --git a/third_party/jni_zero/jni_zero.h b/third_party/jni_zero/jni_zero.h
index acff661..acbcfb14 100644
--- a/third_party/jni_zero/jni_zero.h
+++ b/third_party/jni_zero/jni_zero.h
@@ -723,7 +723,7 @@
 template <typename ContainerType>
 struct ConvertArray;
 
-#if defined(__cpp_concepts) && __cpp_concepts >= 202002L
+#if defined(__cpp_concepts) && __cpp_concepts >= 201907L
 
 namespace internal {
 template <typename T>
diff --git a/third_party/openscreen/src b/third_party/openscreen/src
index dcd61df..29abac6 160000
--- a/third_party/openscreen/src
+++ b/third_party/openscreen/src
@@ -1 +1 @@
-Subproject commit dcd61dfe0e1e6c27d6d48fd4a29a9117e7d4b666
+Subproject commit 29abac6cf360ba375bba7f88826b75dade7a4a7d
diff --git a/third_party/rust/fend_core/v1/wrapper/fend_core.cc b/third_party/rust/fend_core/v1/wrapper/fend_core.cc
index d4c60f1..cbb508b 100644
--- a/third_party/rust/fend_core/v1/wrapper/fend_core.cc
+++ b/third_party/rust/fend_core/v1/wrapper/fend_core.cc
@@ -12,9 +12,9 @@
 
 namespace fend_core {
 
-std::optional<std::string> evaluate(std::string_view query) {
+std::optional<std::string> evaluate(std::string_view query, unsigned int timeout_in_ms) {
   rust::String rust_result;
-  if (evaluate_using_rust(base::StringPieceToRustSlice(query), rust_result)) {
+  if (evaluate_using_rust(base::StringPieceToRustSlice(query), rust_result, timeout_in_ms)) {
     std::string result(rust_result);
     if (result.ends_with(query) || result.starts_with("\\")) {
       return std::nullopt;
diff --git a/third_party/rust/fend_core/v1/wrapper/fend_core.h b/third_party/rust/fend_core/v1/wrapper/fend_core.h
index 19dcb976..8bd69be 100644
--- a/third_party/rust/fend_core/v1/wrapper/fend_core.h
+++ b/third_party/rust/fend_core/v1/wrapper/fend_core.h
@@ -10,7 +10,10 @@
 
 namespace fend_core {
 
-std::optional<std::string> evaluate(std::string_view query);
+// Try evaluating the query string with fend library, within `timeout_in_ms` ms.
+// Returns the result string if the evaluation succeeded, or std::nullopt if failed.
+// If `timeout_in_ms` = 0, there is no timeout.
+std::optional<std::string> evaluate(std::string_view query, unsigned int timeout_in_ms = 100);
 
 }  // namespace fend_core
 
diff --git a/third_party/rust/fend_core/v1/wrapper/fend_core_ffi_glue.rs b/third_party/rust/fend_core/v1/wrapper/fend_core_ffi_glue.rs
index 1c74a0d..8c90ff3 100644
--- a/third_party/rust/fend_core/v1/wrapper/fend_core_ffi_glue.rs
+++ b/third_party/rust/fend_core/v1/wrapper/fend_core_ffi_glue.rs
@@ -4,13 +4,13 @@
 
 use std::time::Instant;
 
-const TIMEOUT_IN_MS: u128 = 100;
 const NOAPPROX_PREFIX: &str = "@noapprox ";
 
 #[cxx::bridge(namespace = "fend_core")]
 mod ffi {
     extern "Rust" {
-        fn evaluate_using_rust(query: &[u8], out_result: &mut String) -> bool;
+        // If `timeout_in_ms` = 0, there is no timeout.
+        fn evaluate_using_rust(query: &[u8], out_result: &mut String, timeout_in_ms: u32) -> bool;
     }
 }
 
@@ -31,17 +31,19 @@
     }
 }
 
-pub fn evaluate_using_rust(query: &[u8], out_result: &mut String) -> bool {
+pub fn evaluate_using_rust(query: &[u8], out_result: &mut String, timeout_in_ms: u32) -> bool {
     let Ok(query_str) = std::str::from_utf8(query) else {
         return false;
     };
     let mut context = fend_core::Context::new();
-    let interrupt = TimeoutInterrupt::new_with_timeout(TIMEOUT_IN_MS);
-    match fend_core::evaluate_with_interrupt(
-        &(NOAPPROX_PREFIX.to_owned() + query_str),
-        &mut context,
-        &interrupt,
-    ) {
+    let full_query = NOAPPROX_PREFIX.to_owned() + query_str;
+    let result = if timeout_in_ms > 0 {
+        let interrupt = TimeoutInterrupt::new_with_timeout(timeout_in_ms.into());
+        fend_core::evaluate_with_interrupt(&full_query, &mut context, &interrupt)
+    } else {
+        fend_core::evaluate(&full_query, &mut context)
+    };
+    match result {
         Err(_) => false,
         Ok(result) => {
             *out_result = result.get_main_result().to_string();
diff --git a/third_party/rust/fend_core/v1/wrapper/fend_core_unittest.cc b/third_party/rust/fend_core/v1/wrapper/fend_core_unittest.cc
index 269e192..6544f1e 100644
--- a/third_party/rust/fend_core/v1/wrapper/fend_core_unittest.cc
+++ b/third_party/rust/fend_core/v1/wrapper/fend_core_unittest.cc
@@ -25,44 +25,44 @@
 #endif
 
 TEST(MAYBE_FendCoreTest, SimpleMath) {
-  std::optional<std::string> result = evaluate("1 + 1");
+  std::optional<std::string> result = evaluate("1 + 1", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, Optional(Eq("2")));
 }
 
 TEST(MAYBE_FendCoreTest, NoApproxString) {
-  std::optional<std::string> result = evaluate("1/3");
+  std::optional<std::string> result = evaluate("1/3", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, Optional(Eq("0.3333333333")));
 }
 
 TEST(MAYBE_FendCoreTest, FiltersTrivialResult) {
-  std::optional<std::string> result = evaluate("1");
+  std::optional<std::string> result = evaluate("1", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, std::nullopt);
 }
 
 TEST(MAYBE_FendCoreTest, FiltersUnitOnlyQueries) {
-  std::optional<std::string> result = evaluate("meter");
+  std::optional<std::string> result = evaluate("meter", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, std::nullopt);
 }
 
 TEST(MAYBE_FendCoreTest, FiltersLambdaResults) {
-  std::optional<std::string> result = evaluate("sqrt");
+  std::optional<std::string> result = evaluate("sqrt", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, std::nullopt);
 }
 
 TEST(MAYBE_FendCoreTest, UnitConversion) {
-  std::optional<std::string> result = evaluate("2 miles in meters");
+  std::optional<std::string> result = evaluate("2 miles in meters", /*timeout_in_ms=*/0);
   EXPECT_THAT(result, Optional(Eq("3218.688 meters")));
 }
 
 // This test passes MSan as it does not allocate on the Rust side. However, we
 // should still disable this in case `fend_core` starts allocating on this test.
 TEST(MAYBE_FendCoreTest, HandlesInvalidInput) {
-  std::optional<std::string> result = evaluate("abc");
+  std::optional<std::string> result = evaluate("abc", /*timeout_in_ms=*/0);
   EXPECT_EQ(result, std::nullopt);
 }
 
 TEST(MAYBE_FendCoreTest, CanTimeout) {
-  std::optional<std::string> result = evaluate("10**100000");
+  std::optional<std::string> result = evaluate("10**100000", /*timeout_in_ms=*/500);
   EXPECT_EQ(result, std::nullopt);
 }
 
diff --git a/third_party/skia b/third_party/skia
index a3a0165..d221c159 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit a3a016537a8c512df42b50522e78710b320c0faf
+Subproject commit d221c1591d5939b8a3072769cab9507a7a6ba36c
diff --git a/third_party/swiftshader b/third_party/swiftshader
index 632c096..764410d 160000
--- a/third_party/swiftshader
+++ b/third_party/swiftshader
@@ -1 +1 @@
-Subproject commit 632c096c22930608f334235c9e1f83d444406bb4
+Subproject commit 764410d4d65546fd1e536b02059b1f714a390720
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 6066c0d..aa20d19 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 6066c0d57a8bd7d68060336c7b01eeb9a1271589
+Subproject commit aa20d192b8c4e4a617d93d809cc416e0429acacd
diff --git a/third_party/webrtc b/third_party/webrtc
index 85bea5a..b95dcde 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 85bea5a11bf3e771b335671b9875b8a9b033f223
+Subproject commit b95dcde6f8b22436e3af68297f23e42fe65756d4
diff --git a/third_party/wpt_tools/WPTIncludeList b/third_party/wpt_tools/WPTIncludeList
index 7af3893..ef6e7d2 100644
--- a/third_party/wpt_tools/WPTIncludeList
+++ b/third_party/wpt_tools/WPTIncludeList
@@ -480,35 +480,5 @@
 ./tools/wptserve/wptserve/utils.py
 ./tools/wptserve/wptserve/wptserve.py
 ./tools/wptserve/wptserve/ws_h2_handshake.py
-./websockets/handlers/basic_auth_wsh.py
-./websockets/handlers/delayed-passive-close_wsh.py
-./websockets/handlers/echo-cookie_wsh.py
-./websockets/handlers/echo-query_v13_wsh.py
-./websockets/handlers/echo-query_wsh.py
-./websockets/handlers/echo_close_data_wsh.py
-./websockets/handlers/echo_exit_wsh.py
-./websockets/handlers/echo_raw_wsh.py
-./websockets/handlers/echo_wsh.py
-./websockets/handlers/empty-message_wsh.py
-./websockets/handlers/handshake_no_extensions_wsh.py
-./websockets/handlers/handshake_no_protocol_wsh.py
-./websockets/handlers/handshake_protocol_wsh.py
-./websockets/handlers/handshake_sleep_2_wsh.py
-./websockets/handlers/invalid_wsh.py
-./websockets/handlers/origin_wsh.py
-./websockets/handlers/protocol_array_wsh.py
-./websockets/handlers/protocol_wsh.py
-./websockets/handlers/receive-backpressure_wsh.py
-./websockets/handlers/referrer_wsh.py
-./websockets/handlers/send-backpressure_wsh.py
-./websockets/handlers/set-cookie-secure_wsh.py
-./websockets/handlers/set-cookie_http_wsh.py
-./websockets/handlers/set-cookie_wsh.py
-./websockets/handlers/set-cookies-samesite_wsh.py
-./websockets/handlers/simple_handshake_wsh.py
-./websockets/handlers/sleep_10_v13_wsh.py
-./websockets/handlers/stash_responder_blocking_wsh.py
-./websockets/handlers/stash_responder_wsh.py
-./websockets/handlers/wrong_accept_key_wsh.py
 ./wpt
 ./wpt.py
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/basic_auth_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/basic_auth_wsh.py
deleted file mode 100755
index 84f42711..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/basic_auth_wsh.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/python
-
-"""A WebSocket handler that enforces basic HTTP authentication. Username is
-'foo' and password is 'bar'."""
-
-
-from pywebsocket3.handshake import AbortedByUserException
-
-
-def web_socket_do_extra_handshake(request):
-    authorization = request.headers_in.get('authorization')
-    if authorization is None or authorization != 'Basic Zm9vOmJhcg==':
-        if request.protocol == "HTTP/2":
-            request.status = 401
-            request.headers_out["Content-Length"] = "0"
-            request.headers_out['www-authenticate'] = 'Basic realm="camelot"'
-        else:
-            request.connection.write(b'HTTP/1.1 401 Unauthorized\x0d\x0a'
-                                     b'Content-Length: 0\x0d\x0a'
-                                     b'WWW-Authenticate: Basic realm="camelot"\x0d\x0a'
-                                     b'\x0d\x0a')
-        raise AbortedByUserException('Abort the connection')
-
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/delayed-passive-close_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/delayed-passive-close_wsh.py
deleted file mode 100755
index 5da09fd..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/delayed-passive-close_wsh.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/python
-from pywebsocket3 import common
-import time
-
-def web_socket_do_extra_handshake(request):
-    pass
-
-
-def web_socket_transfer_data(request):
-    # Wait for the close frame to arrive.
-    request.ws_stream.receive_message()
-
-
-def web_socket_passive_closing_handshake(request):
-    # Echo close status code and reason
-    code, reason = request.ws_close_code, request.ws_close_reason
-
-    # No status received is a reserved pseudo code representing an empty code,
-    # so echo back an empty code in this case.
-    if code == common.STATUS_NO_STATUS_RECEIVED:
-        code = None
-
-    # The browser may error the connection if the closing handshake takes too
-    # long, but hopefully no browser will have a timeout this short.
-    time.sleep(1)
-
-    return code, reason
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo-cookie_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo-cookie_wsh.py
deleted file mode 100755
index 746eafd..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo-cookie_wsh.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    request.ws_cookie = request.headers_in.get('cookie')
-
-def web_socket_transfer_data(request):
-    if request.ws_cookie is not None:
-        msgutil.send_message(request, request.ws_cookie)
-    else:
-        msgutil.send_message(request, '(none)')
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo-query_v13_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo-query_v13_wsh.py
deleted file mode 100755
index 7fb4cfe..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo-query_v13_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    pass
-
-def web_socket_transfer_data(request):
-    while True:
-        msgutil.send_message(request, request.unparsed_uri.split('?')[1] or '')
-        return
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo-query_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo-query_wsh.py
deleted file mode 100755
index 8869617..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo-query_wsh.py
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    pass  # Always accept.
-
-def web_socket_transfer_data(request):
-    msgutil.send_message(request, request.unparsed_uri.split('?', 1)[1] or '')
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo_close_data_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo_close_data_wsh.py
deleted file mode 100755
index 31ffcbb..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo_close_data_wsh.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/python
-
-_GOODBYE_MESSAGE = u'Goodbye'
-
-def web_socket_do_extra_handshake(request):
-    # This example handler accepts any request. See origin_check_wsh.py for how
-    # to reject access from untrusted scripts based on origin value.
-
-    pass  # Always accept.
-
-
-def web_socket_transfer_data(request):
-    while True:
-        line = request.ws_stream.receive_message()
-        if line is None:
-            return
-        if isinstance(line, str):
-            if line == _GOODBYE_MESSAGE:
-                return
-                request.ws_stream.send_message(line, binary=False)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo_exit_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo_exit_wsh.py
deleted file mode 100755
index 8f6f7f8..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo_exit_wsh.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/python
-
-_GOODBYE_MESSAGE = u'Goodbye'
-
-def web_socket_do_extra_handshake(request):
-    # This example handler accepts any request. See origin_check_wsh.py for how
-    # to reject access from untrusted scripts based on origin value.
-
-    pass  # Always accept.
-
-
-def web_socket_transfer_data(request):
-    while True:
-        line = request.ws_stream.receive_message()
-        if line is None:
-            return
-        if isinstance(line, str):
-            if line == _GOODBYE_MESSAGE:
-                return
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo_raw_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo_raw_wsh.py
deleted file mode 100755
index 5b434cf2..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo_raw_wsh.py
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-
-def web_socket_do_extra_handshake(request):
-    pass  # Always accept.
-
-def web_socket_transfer_data(request):
-    while True:
-        line = msgutil.receive_message(request)
-        if line == b'exit':
-            return
-
-        if line is not None:
-            request.connection.write(line)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/echo_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/echo_wsh.py
deleted file mode 100755
index 35a0a6f..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/echo_wsh.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import common
-
-_GOODBYE_MESSAGE = u'Goodbye'
-
-def web_socket_do_extra_handshake(request):
-    # This example handler accepts any request. See origin_check_wsh.py for how
-    # to reject access from untrusted scripts based on origin value.
-    if request.ws_requested_protocols:
-        if "echo" in request.ws_requested_protocols:
-            request.ws_protocol = "echo"
-
-
-def web_socket_transfer_data(request):
-    while True:
-        line = request.ws_stream.receive_message()
-        if line is None:
-            return
-        if isinstance(line, str):
-            request.ws_stream.send_message(line, binary=False)
-            if line == _GOODBYE_MESSAGE:
-                return
-        else:
-            request.ws_stream.send_message(line, binary=True)
-
-def web_socket_passive_closing_handshake(request):
-    # Echo close status code and reason
-    code, reason = request.ws_close_code, request.ws_close_reason
-
-    # No status received is a reserved pseudo code representing an empty code,
-    # so echo back an empty code in this case.
-    if code == common.STATUS_NO_STATUS_RECEIVED:
-        code = None
-
-    return code, reason
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/empty-message_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/empty-message_wsh.py
deleted file mode 100755
index f791ee1..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/empty-message_wsh.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    pass  # Always accept.
-
-def web_socket_transfer_data(request):
-    line = msgutil.receive_message(request)
-    if line == "":
-        msgutil.send_message(request, 'pass')
-    else:
-        msgutil.send_message(request, 'fail')
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_extensions_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_extensions_wsh.py
deleted file mode 100755
index 0d0f0a8..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_extensions_wsh.py
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/python
-
-
-def web_socket_do_extra_handshake(request):
-    request.ws_extension_processors = []
-
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_protocol_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_protocol_wsh.py
deleted file mode 100755
index ffc2ae8..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/handshake_no_protocol_wsh.py
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/python
-
-def web_socket_do_extra_handshake(request):
-    # Trick pywebsocket into believing no subprotocol was requested.
-    request.ws_requested_protocols = None
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/handshake_protocol_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/handshake_protocol_wsh.py
deleted file mode 100755
index 2ca20c0..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/handshake_protocol_wsh.py
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/python
-
-def web_socket_do_extra_handshake(request):
-    request.ws_protocol = 'foobar'
-
-def web_socket_transfer_data(request):
-    pass
\ No newline at end of file
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/handshake_sleep_2_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/handshake_sleep_2_wsh.py
deleted file mode 100755
index 78de7c7..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/handshake_sleep_2_wsh.py
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/python
-
-import time
-
-def web_socket_do_extra_handshake(request):
-    time.sleep(2)
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/invalid_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/invalid_wsh.py
deleted file mode 100755
index 4bfc3ce..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/invalid_wsh.py
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/python
-
-def web_socket_do_extra_handshake(request):
-    request.connection.write(b"FOO BAR BAZ\r\n\r\n")
-
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/origin_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/origin_wsh.py
deleted file mode 100755
index b833db63..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/origin_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-
-def web_socket_do_extra_handshake(request):
-    pass # Always accept.
-
-
-def web_socket_transfer_data(request):
-    msgutil.send_message(request, request.ws_origin)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/protocol_array_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/protocol_array_wsh.py
deleted file mode 100755
index d8e1229c..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/protocol_array_wsh.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    line = request.headers_in.get('sec-websocket-protocol')
-    request.ws_protocol = line.split(',', 1)[0]
-
-#pass
-
-def web_socket_transfer_data(request):
-    while True:
-        msgutil.send_message(request, request.ws_protocol)
-        return
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/protocol_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/protocol_wsh.py
deleted file mode 100755
index 3a6aeb40..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/protocol_wsh.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    request.ws_protocol = request.headers_in.get('sec-websocket-protocol')
-#pass
-
-def web_socket_transfer_data(request):
-    while True:
-        msgutil.send_message(request, request.ws_protocol)
-        return
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/receive-backpressure_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/receive-backpressure_wsh.py
deleted file mode 100755
index 9c2e470..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/receive-backpressure_wsh.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/python
-
-import time
-
-
-def web_socket_do_extra_handshake(request):
-    # Turn off permessage-deflate, otherwise it shrinks our 8MB buffer to 8KB.
-    request.ws_extension_processors = []
-
-
-def web_socket_transfer_data(request):
-    # Wait two seconds to cause backpressure.
-    time.sleep(2);
-    request.ws_stream.receive_message()
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/referrer_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/referrer_wsh.py
deleted file mode 100755
index 2d183d5..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/referrer_wsh.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    pass
-
-def web_socket_transfer_data(request):
-    referrer = request.headers_in.get("referer")
-    if referrer is None:
-        referrer = "MISSING AS PER FETCH"
-    msgutil.send_message(request, referrer)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/send-backpressure_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/send-backpressure_wsh.py
deleted file mode 100755
index d3288d0..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/send-backpressure_wsh.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/python
-
-import time
-
-# The amount of internal buffering a WebSocket connection has is not
-# standardised, and varies depending upon the OS. Setting this number too small
-# will result in false negatives, as the entire message gets buffered. Setting
-# this number too large will result in false positives, when it takes more than
-# 2 seconds to transmit the message anyway. This number was arrived at by
-# trial-and-error.
-MESSAGE_SIZE = 1024 * 1024
-
-# With Windows 10 and Python 3, the OS will buffer an entire message in memory
-# and return from send() immediately, even if it is very large. To work around
-# this problem, send multiple messages.
-MESSAGE_COUNT = 16
-
-
-def web_socket_do_extra_handshake(request):
-    # Turn off permessage-deflate, otherwise it shrinks our big message to a
-    # tiny message.
-    request.ws_extension_processors = []
-
-
-def web_socket_transfer_data(request):
-    # Send empty message to fill the ReadableStream queue
-    request.ws_stream.send_message(b'', binary=True)
-
-    # TODO(ricea@chromium.org): Use time.perf_counter() when migration to python
-    # 3 is complete. time.time() can go backwards.
-    start_time = time.time()
-
-    # The large messages that will be blocked by backpressure.
-    for i in range(MESSAGE_COUNT):
-        request.ws_stream.send_message(b' ' * MESSAGE_SIZE, binary=True)
-
-    # Report the time taken to send the large message.
-    request.ws_stream.send_message(str(time.time() - start_time),
-                                   binary=False)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie-secure_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/set-cookie-secure_wsh.py
deleted file mode 100755
index 052a8820..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie-secure_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-import urllib
-
-
-def web_socket_do_extra_handshake(request):
-    url_parts = urllib.parse.urlsplit(request.uri)
-    request.extra_headers.append(('Set-Cookie', 'ws_test_'+(url_parts.query or '')+'=test; Secure; Path=/'))
-
-def web_socket_transfer_data(request):
-    # Expect close() from user agent.
-    request.ws_stream.receive_message()
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_http_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_http_wsh.py
deleted file mode 100755
index 5331091..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_http_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-
-import urllib
-
-def web_socket_do_extra_handshake(request):
-    url_parts = urllib.parse.urlsplit(request.uri)
-    request.extra_headers.append(('Set-Cookie', 'ws_test_'+(url_parts.query or '')+'=test; Path=/; HttpOnly\x0D\x0ASec-WebSocket-Origin: '+request.ws_origin))
-
-def web_socket_transfer_data(request):
-    # Expect close from user agent.
-    request.ws_stream.receive_message()
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_wsh.py
deleted file mode 100755
index 5fe3ad9c..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/set-cookie_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-import urllib
-
-
-def web_socket_do_extra_handshake(request):
-    url_parts = urllib.parse.urlsplit(request.uri)
-    request.extra_headers.append(('Set-Cookie', 'ws_test_'+(url_parts.query or '')+'=test; Path=/'))
-
-def web_socket_transfer_data(request):
-    # Expect close from user agent.
-    request.ws_stream.receive_message()
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/set-cookies-samesite_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/set-cookies-samesite_wsh.py
deleted file mode 100644
index 59f0a4a..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/set-cookies-samesite_wsh.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import urllib
-
-
-def web_socket_do_extra_handshake(request):
-    url_parts = urllib.parse.urlsplit(request.uri)
-    max_age = ""
-    if "clear" in url_parts.query:
-        max_age = "; Max-Age=0"
-    value = "1"
-    if "value" in url_parts.query:
-        value = urllib.parse.parse_qs(url_parts.query)["value"][0]
-    cookies = [
-        "samesite-unspecified={}; Path=/".format(value) + max_age,
-        "samesite-lax={}; Path=/; SameSite=Lax".format(value) + max_age,
-        "samesite-strict={}; Path=/; SameSite=Strict".format(value) + max_age,
-        # SameSite=None cookies must be Secure.
-        "samesite-none={}; Path=/; SameSite=None; Secure".format(value) + max_age
-    ]
-    for cookie in cookies:
-        request.extra_headers.append(("Set-Cookie", cookie))
-
-
-def web_socket_transfer_data(request):
-    # Expect close() from user agent.
-    request.ws_stream.receive_message()
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/simple_handshake_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/simple_handshake_wsh.py
deleted file mode 100755
index 23893c95..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/simple_handshake_wsh.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/python
-
-from pywebsocket3 import common, stream
-from pywebsocket3.handshake import AbortedByUserException, hybi
-
-
-def web_socket_do_extra_handshake(request):
-    # Send simple response header. This test implements the handshake manually,
-    # so that we can send the header in the same packet as the close frame.
-    msg = (b'HTTP/1.1 101 Switching Protocols:\x0D\x0A'
-           b'Connection: Upgrade\x0D\x0A'
-           b'Upgrade: WebSocket\x0D\x0A'
-           b'Set-Cookie: ws_test=test\x0D\x0A'
-           b'Sec-WebSocket-Origin: %s\x0D\x0A'
-           b'Sec-WebSocket-Accept: %s\x0D\x0A\x0D\x0A') % (request.ws_origin.encode(
-               'UTF-8'), hybi.compute_accept_from_unicode(request.headers_in.get(common.SEC_WEBSOCKET_KEY_HEADER)))
-    # Create a clean close frame.
-    close_body = stream.create_closing_handshake_body(1001, 'PASS')
-    close_frame = stream.create_close_frame(close_body)
-    # Concatenate the header and the close frame and write them to the socket.
-    request.connection.write(msg + close_frame)
-    # Wait for the responding close frame from the user agent. It's not possible
-    # to use the stream methods at this point because the stream hasn't been
-    # established from pywebsocket's point of view. Instead just read the
-    # correct number of bytes.
-    # Warning: reading the wrong number of bytes here will make the test
-    # flaky.
-    MASK_LENGTH = 4
-    request.connection.read(len(close_frame) + MASK_LENGTH)
-    # Close the socket without pywebsocket sending its own handshake response.
-    raise AbortedByUserException('Abort the connection')
-
-
-def web_socket_transfer_data(request):
-    pass
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/sleep_10_v13_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/sleep_10_v13_wsh.py
deleted file mode 100755
index 4faa42aa..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/sleep_10_v13_wsh.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/python
-
-import sys, urllib, time
-from pywebsocket3 import msgutil
-
-def web_socket_do_extra_handshake(request):
-    time.sleep(10)
-    return
-
-def web_socket_transfer_data(request):
-    while True:
-        line = msgutil.receive_message(request)
-        if line == 'Goodbye':
-            return
-        request.ws_stream.send_message(line, binary=False)
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_blocking_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_blocking_wsh.py
deleted file mode 100755
index 9681568..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_blocking_wsh.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/python
-import json
-import threading
-import wptserve.stash
-from pywebsocket3 import msgutil
-
-address, authkey = wptserve.stash.load_env_config()
-path = "/stash_responder_blocking"
-stash = wptserve.stash.Stash(path, address=address, authkey=authkey)
-cv = threading.Condition()
-
-def handle_set(key, value):
-    with cv:
-      stash.put(key, value)
-      cv.notify_all()
-
-def handle_get(key):
-    with cv:
-        while True:
-            value = stash.take(key)
-            if value is not None:
-                return value
-            cv.wait()
-
-def web_socket_do_extra_handshake(request):
-    pass
-
-def web_socket_transfer_data(request):
-    line = request.ws_stream.receive_message()
-
-    query = json.loads(line)
-    action = query["action"]
-    key = query["key"]
-
-    if action == "set":
-        value = query["value"]
-        handle_set(key, value)
-        response = {}
-    elif action == "get":
-        value = handle_get(key)
-        response = {"value": value}
-    else:
-        response = {}
-
-    msgutil.send_message(request, json.dumps(response))
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_wsh.py
deleted file mode 100755
index b4019974..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/stash_responder_wsh.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/python
-import json
-import urllib
-from pywebsocket3 import msgutil
-from wptserve import stash
-
-address, authkey = stash.load_env_config()
-stash = stash.Stash("/stash_responder", address=address, authkey=authkey)
-
-def web_socket_do_extra_handshake(request):
-    return
-
-def web_socket_transfer_data(request):
-    while True:
-        line = request.ws_stream.receive_message()
-        if line == "echo":
-            query = request.unparsed_uri.split('?')[1]
-            GET = dict(urllib.parse.parse_qsl(query))
-
-            # TODO(kristijanburnik): This code should be reused from
-            # /mixed-content/generic/expect.py or implemented more generally
-            # for other tests.
-            path = GET.get("path", request.unparsed_uri.split('?')[0])
-            key = GET["key"]
-            action = GET["action"]
-
-            if action == "put":
-              value = GET["value"]
-              stash.take(key=key, path=path)
-              stash.put(key=key, value=value, path=path)
-              response_data = json.dumps({"status": "success", "result": key})
-            elif action == "purge":
-             value = stash.take(key=key, path=path)
-             response_data = json.dumps({"status": "success", "result": value})
-            elif action == "take":
-              value = stash.take(key=key, path=path)
-              if value is None:
-                  status = "allowed"
-              else:
-                  status = "blocked"
-              response_data = json.dumps({"status": status, "result": value})
-
-            msgutil.send_message(request, response_data)
-
-            return
diff --git a/third_party/wpt_tools/wpt/websockets/handlers/wrong_accept_key_wsh.py b/third_party/wpt_tools/wpt/websockets/handlers/wrong_accept_key_wsh.py
deleted file mode 100755
index 43240e1a..0000000
--- a/third_party/wpt_tools/wpt/websockets/handlers/wrong_accept_key_wsh.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/python
-
-import sys, urllib, time
-
-
-def web_socket_do_extra_handshake(request):
-    msg = (b'HTTP/1.1 101 Switching Protocols:\x0D\x0A'
-           b'Connection: Upgrade\x0D\x0A'
-           b'Upgrade: WebSocket\x0D\x0A'
-           b'Sec-WebSocket-Origin: %s\x0D\x0A'
-           b'Sec-WebSocket-Accept: thisisawrongacceptkey\x0D\x0A\x0D\x0A') % request.ws_origin.encode('UTF-8')
-    request.connection.write(msg)
-    return
-
-
-def web_socket_transfer_data(request):
-    while True:
-        request.ws_stream.send_message('test', binary=False)
-        return
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py
index ec781b72..ad56a7a 100755
--- a/tools/clang/scripts/package.py
+++ b/tools/clang/scripts/package.py
@@ -700,6 +700,23 @@
   PackageInArchive(libclang_dir, libclang_dir)
   MaybeUpload(args.upload, args.bucket, libclang_dir + '.t*z', gcs_platform)
 
+  # Zip up Android x64 ASAN runtime support
+  if sys.platform.startswith('linux'):
+    x64_android_asan_dir = 'x64_android_asan' + stamp
+    shutil.rmtree(x64_android_asan_dir, ignore_errors=True)
+    subdir = os.path.join('lib', 'clang', RELEASE_VERSION, 'lib', 'linux')
+    dst_dir = os.path.join(x64_android_asan_dir, subdir)
+    os.makedirs(dst_dir)
+    shutil.copy(
+        os.path.join(LLVM_RELEASE_DIR, subdir,
+                     'libclang_rt.asan-x86_64-android.so'), dst_dir)
+    shutil.copy(
+        os.path.join(LLVM_RELEASE_DIR, subdir,
+                     'libclang_rt.asan_static-x86_64-android.a'), dst_dir)
+    PackageInArchive(x64_android_asan_dir, x64_android_asan_dir)
+    MaybeUpload(args.upload, args.bucket, x64_android_asan_dir + '.t*z',
+                gcs_platform)
+
   if sys.platform == 'win32' and args.upload:
     binaries = [f for f in want if f.endswith('.exe') or f.endswith('.dll')]
     assert 'bin/clang-cl.exe' in binaries
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index e559d5f..42d2ad5 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11511,6 +11511,9 @@
   <int value="4943" label="V8DeviceProperties_UniqueId_AttributeGetter"/>
   <int value="4944"
       label="SharedStorageAPI_SelectURLOverallPageloadBudgetInsufficient"/>
+  <int value="4945" label="V8LanguageTranslator_Translate_Method"/>
+  <int value="4946" label="V8Translation_CanTranslate_Method"/>
+  <int value="4947" label="V8Translation_CreateTranslator_Method"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -21303,7 +21306,6 @@
   <int value="59964519" label="OmniboxEnableClipboardProvider:disabled"/>
   <int value="59992411" label="ChangePasswordAffiliationInfo:enabled"/>
   <int value="60023885" label="AutofillNoLocalSaveOnUnmaskSuccess:disabled"/>
-  <int value="60442188" label="MultilingualTyping:enabled"/>
   <int value="60461879" label="AppListBubble:enabled"/>
   <int value="61130490" label="WebViewBrotliSupport:enabled"/>
   <int value="61141457" label="DecodeScriptSourceOffThread:enabled"/>
@@ -25522,7 +25524,6 @@
   <int value="1936308950" label="ExoConsumedByImeByFlag:disabled"/>
   <int value="1936774335" label="EcheSWASendStartSignaling:enabled"/>
   <int value="1936810062" label="WebVrVsyncAlign:enabled"/>
-  <int value="1937357350" label="MultilingualTyping:disabled"/>
   <int value="1937435913"
       label="CryptAuthV2DedupDeviceLastActivityTime:disabled"/>
   <int value="1937905990" label="AutofillCenterAlignedSuggestions:enabled"/>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index c4db198a..2486885 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -262,17 +262,27 @@
   <token key="AppType" variants="AppType"/>
 </histogram>
 
+<histogram name="Apps.AppDiscovery.MallUsageTime" units="ms"
+    expires_after="2025-03-26">
+  <owner>joelhockey@chromium.org</owner>
+  <owner>crosdev-commerce-eng@google.com</owner>
+  <summary>
+    Records the Mall running duration in Chrome OS for the last 2 hours. This is
+    logged every 2 hours, and on shutdown.
+  </summary>
+</histogram>
+
 <histogram name="Apps.AppDiscovery.Uninstall" enum="AppType"
     expires_after="2025-03-26">
   <owner>joelhockey@chromium.org</owner>
-  <owner>chromeos-apps-foundation-team@google.com</owner>
+  <owner>crosdev-commerce-eng@google.com</owner>
   <summary>Records when an app is uninstalled, grouped by app type.</summary>
 </histogram>
 
 <histogram name="Apps.AppDiscovery.{InstallReason}.Install" enum="AppType"
     expires_after="2025-03-26">
   <owner>joelhockey@chromium.org</owner>
-  <owner>chromeos-apps-foundation-team@google.com</owner>
+  <owner>crosdev-commerce-eng@google.com</owner>
   <summary>
     Records when an app is installed for InstallReason {InstallReason}, grouped
     by app type.
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index 2322bc26..a79ab84c 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -238,6 +238,13 @@
   <int value="4" label="kErrorAborted"/>
 </enum>
 
+<enum name="FedCmAccountChooserResult">
+  <int value="0" label="Account row clicked"/>
+  <int value="1" label="Cancel button clicked"/>
+  <int value="2" label="Use other account button clicked"/>
+  <int value="3" label="Tab or window is closed or refreshed"/>
+</enum>
+
 <enum name="FedCmAccountsResponseInvalidReason">
   <int value="0" label="Response is not JSON or dict"/>
   <int value="1" label="No accounts key"/>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index ce2044b9..4889735 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1336,6 +1336,19 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.FedCm.Button.AccountChooserResult"
+    enum="FedCmAccountChooserResult" expires_after="M130">
+  <owner>tanzachary@chromium.org</owner>
+  <owner>web-identity-eng@google.com</owner>
+  <summary>
+    Records the outcome of the account chooser in button flow. Recorded once per
+    user leaving the button flow account chooser. e.g. If the user selects an
+    account on the account chooser, one sample is recorded. If the user clicks
+    on the back button in the next dialog, an account chooser is shown again and
+    leaving records a second sample.
+  </summary>
+</histogram>
+
 <histogram name="Blink.FedCm.CancelReason" enum="FedCmCancelReason"
     expires_after="2024-08-04">
   <owner>yigu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index db6efef9a..878604dd 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -127,6 +127,7 @@
     <variant name="MonoAudio"/>
     <variant name="OnScreenKeyboard"/>
     <variant name="OOBEStartupSound"/>
+    <variant name="PdfOcr"/>
     <variant name="ReducedAnimations"/>
     <variant name="SelectToSpeak"/>
     <variant name="SpokenFeedback" summary="ChromeVox Spoken Feedback"/>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index ad4d5a4..6e4395a 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v44.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "0e7ce4cd3c50b2701c0d06407af74aff6c31e1b6",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f6656e9828f5a5a5358d0782bd4d5cdecdc652f5/trace_processor_shell.exe"
+            "hash": "9650ff6e27c1f4c454af0e3d91edd7258d9970d5",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/234fd02711c642ec5211da272283db8fd8d91af4/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "d8e27d961be1db97db098c6826017aec0397ecfd",
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc
index bc4b730..d3afa56 100644
--- a/ui/base/clipboard/clipboard_android.cc
+++ b/ui/base/clipboard/clipboard_android.cc
@@ -745,8 +745,9 @@
   // background sequence.
   scoped_refptr<base::RefCountedMemory> image_memory =
       gfx::Image::CreateFrom1xBitmap(sk_bitmap).As1xPNGBytes();
-  g_map.Get().Set(ClipboardFormatType::PngType(),
-                  std::string(base::as_string_view(*image_memory)));
+  std::string packed(image_memory->front_as<char>(), image_memory->size());
+
+  g_map.Get().Set(ClipboardFormatType::PngType(), packed);
 }
 
 void ClipboardAndroid::WriteData(const ClipboardFormatType& format,
diff --git a/ui/base/clipboard/clipboard_ozone.cc b/ui/base/clipboard/clipboard_ozone.cc
index 7c1682f..2db7579 100644
--- a/ui/base/clipboard/clipboard_ozone.cc
+++ b/ui/base/clipboard/clipboard_ozone.cc
@@ -217,11 +217,11 @@
       auto it = offered_data_[buffer].find(mime_type);
       if (it == offered_data_[buffer].end())
         return {};
-      return base::span(it->second->as_vector());
+      return base::make_span(it->second->front(), it->second->size());
     }
 
     if (auto data = Read(buffer, mime_type))
-      return base::span(data->as_vector());
+      return base::make_span(data->front(), data->size());
 
     return {};
   }
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 341abf4f..e023eda 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -687,7 +687,7 @@
 
   if (HasGzipHeader(data) || HasBrotliHeader(data)) {
     base::RefCountedString* bytes_string = new base::RefCountedString();
-    DecompressIfNeeded(data, &bytes_string->as_string());
+    DecompressIfNeeded(data, &(bytes_string->data()));
     return bytes_string;
   }
 
@@ -1102,15 +1102,14 @@
   if (!memory.get())
     return false;
 
-  if (DecodePNG(memory->data(), memory->size(), bitmap, fell_back_to_1x)) {
+  if (DecodePNG(memory->front(), memory->size(), bitmap, fell_back_to_1x))
     return true;
-  }
 
 #if !BUILDFLAG(IS_IOS)
   // iOS does not compile or use the JPEG codec.  On other platforms,
   // 99% of our assets are PNGs, however fallback to JPEG.
   std::unique_ptr<SkBitmap> jpeg_bitmap(
-      gfx::JPEGCodec::Decode(memory->data(), memory->size()));
+      gfx::JPEGCodec::Decode(memory->front(), memory->size()));
   if (jpeg_bitmap.get()) {
     bitmap->swap(*jpeg_bitmap.get());
     *fell_back_to_1x = false;
diff --git a/ui/base/resource/resource_bundle_unittest.cc b/ui/base/resource/resource_bundle_unittest.cc
index ec25fcd..3d741eff 100644
--- a/ui/base/resource/resource_bundle_unittest.cc
+++ b/ui/base/resource/resource_bundle_unittest.cc
@@ -432,17 +432,20 @@
   // Test normal uncompressed data.
   scoped_refptr<base::RefCountedMemory> resource =
       resource_bundle->LoadDataResourceBytes(4);
-  EXPECT_EQ("this is id 4", base::as_string_view(*resource));
+  EXPECT_EQ("this is id 4",
+            std::string(resource->front_as<char>(), resource->size()));
 
   // Test the brotli data.
   scoped_refptr<base::RefCountedMemory> brotli_resource =
       resource_bundle->LoadDataResourceBytes(6);
-  EXPECT_EQ("this is id 6", base::as_string_view(*brotli_resource));
+  EXPECT_EQ("this is id 6", std::string(brotli_resource->front_as<char>(),
+                                        brotli_resource->size()));
 
   // Test the gzipped data.
   scoped_refptr<base::RefCountedMemory> gzip_resource =
       resource_bundle->LoadDataResourceBytes(8);
-  EXPECT_EQ("this is id 8", base::as_string_view(*gzip_resource));
+  EXPECT_EQ("this is id 8", std::string(gzip_resource->front_as<char>(),
+                                        gzip_resource->size()));
 }
 
 // Verify that we don't crash when trying to load a resource that is not found.
diff --git a/ui/base/x/selection_owner.cc b/ui/base/x/selection_owner.cc
index df07e7c..a28adf70 100644
--- a/ui/base/x/selection_owner.cc
+++ b/ui/base/x/selection_owner.cc
@@ -268,7 +268,7 @@
 void SelectionOwner::ProcessIncrementalTransfer(IncrementalTransfer* transfer) {
   size_t remaining = transfer->data->size() - transfer->offset;
   size_t chunk_length = std::min(remaining, GetMaxIncrementalTransferSize());
-  const uint8_t* data = transfer->data->data() + transfer->offset;
+  const uint8_t* data = transfer->data->front() + transfer->offset;
   std::vector<uint8_t> buf(data, data + chunk_length);
   connection_->SetArrayProperty(transfer->window, transfer->property,
                                 transfer->target, buf);
diff --git a/ui/base/x/selection_utils.cc b/ui/base/x/selection_utils.cc
index 2a715df..09ddb2c 100644
--- a/ui/base/x/selection_utils.cc
+++ b/ui/base/x/selection_utils.cc
@@ -66,7 +66,12 @@
     return std::string();
   }
 
-  return std::string(base::as_string_view(*memory));
+  size_t size = memory->size();
+  if (!size)
+    return std::string();
+
+  const unsigned char* front = memory->front();
+  return std::string(reinterpret_cast<const char*>(front), size);
 }
 
 std::u16string RefCountedMemoryToString16(
@@ -76,11 +81,12 @@
     return std::u16string();
   }
 
-  auto in_bytes = base::span(*memory);
-  std::u16string out;
-  out.resize(memory->size() / 2u);
-  base::as_writable_byte_span(out).copy_from(in_bytes);
-  return out;
+  size_t size = memory->size();
+  if (!size)
+    return std::u16string();
+
+  const unsigned char* front = memory->front();
+  return std::u16string(reinterpret_cast<const char16_t*>(front), size / 2);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -158,7 +164,7 @@
 }
 
 const unsigned char* SelectionData::GetData() const {
-  return memory_.get() ? memory_->data() : nullptr;
+  return memory_.get() ? memory_->front() : nullptr;
 }
 
 size_t SelectionData::GetSize() const {
diff --git a/ui/base/x/x11_cursor_loader.cc b/ui/base/x/x11_cursor_loader.cc
index 8ee868fb..1360840 100644
--- a/ui/base/x/x11_cursor_loader.cc
+++ b/ui/base/x/x11_cursor_loader.cc
@@ -386,7 +386,7 @@
       .width = width,
       .height = height,
       .depth = 32,
-      .data = base::MakeRefCounted<base::RefCountedBytes>(std::move(vec)),
+      .data = base::RefCountedBytes::TakeVector(&vec),
   };
   connection->PutImage(put_image_request);
 
diff --git a/ui/base/x/x11_display_util.cc b/ui/base/x/x11_display_util.cc
index ffaea4fe..d44b518 100644
--- a/ui/base/x/x11_display_util.cc
+++ b/ui/base/x/x11_display_util.cc
@@ -71,7 +71,7 @@
   if (!response || response->format != 32 || response->value_len != 4) {
     return gfx::Rect();
   }
-  const uint32_t* value = response->value->cast_to<uint32_t>();
+  const uint32_t* value = response->value->front_as<uint32_t>();
   return gfx::Rect(value[0], value[1], value[2], value[3]);
 }
 
@@ -92,11 +92,11 @@
 
 gfx::ICCProfile GetIccProfileSync(x11::Future<x11::GetPropertyReply> future) {
   auto response = future.Sync();
-  if (!response || !response->value_len) {
+  if (!response || !response->value->size()) {
     return gfx::ICCProfile();
   }
-  return gfx::ICCProfile::FromData(response->value->bytes(),
-                                   response->value_len * response->format / 8u);
+  return gfx::ICCProfile::FromData(response->value->data(),
+                                   response->value->size());
 }
 
 x11::Future<x11::RandR::GetOutputPropertyReply> GetEdidFuture(
diff --git a/ui/base/x/x11_software_bitmap_presenter.cc b/ui/base/x/x11_software_bitmap_presenter.cc
index 0568940..7ad8d08 100644
--- a/ui/base/x/x11_software_bitmap_presenter.cc
+++ b/ui/base/x/x11_software_bitmap_presenter.cc
@@ -75,7 +75,7 @@
   constexpr auto kAllPlanes =
       std::numeric_limits<decltype(x11::GetImageRequest::plane_mask)>::max();
 
-  scoped_refptr<x11::UnsizedRefCountedMemory> bg;
+  scoped_refptr<base::RefCountedMemory> bg;
   auto req = connection->GetImage({x11::ImageFormat::ZPixmap, widget, x_i16,
                                    y_i16, w_u16, h_u16, kAllPlanes});
   if (auto reply = req.Sync()) {
@@ -103,8 +103,8 @@
 
   SkBitmap bg_bitmap;
   SkImageInfo image_info = SkImageInfo::Make(
-      w_u16, h_u16, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
-  if (!bg_bitmap.installPixels(image_info, bg->bytes(),
+      width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+  if (!bg_bitmap.installPixels(image_info, const_cast<uint8_t*>(bg->data()),
                                image_info.minRowBytes())) {
     return false;
   }
@@ -119,9 +119,8 @@
   }
   canvas.drawImage(fg_bitmap.asImage(), 0, 0);
 
-  connection->PutImage(
-      {x11::ImageFormat::ZPixmap, widget, gc, w_u16, h_u16, x_i16, y_i16, 0,
-       d_u8, x11::SizedRefCountedMemory::From(bg, size_t{w_u16} * h_u16)});
+  connection->PutImage({x11::ImageFormat::ZPixmap, widget, gc, w_u16, h_u16,
+                        x_i16, y_i16, 0, d_u8, bg});
 
   return true;
 }
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index b428665..5f17a92 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -294,11 +294,7 @@
   if (!response || !response->format) {
     return false;
   }
-  // SAFETY: The GetProperty response has a `format` which specified the number
-  // of bits per object in the `value` and `value_len` for the number of
-  // objects, so `value_len * format / 8` gives the number of bytes in `value`.
-  *out_data = UNSAFE_BUFFERS(x11::SizedRefCountedMemory::From(
-      response->value, response->value_len * response->format / 8u));
+  *out_data = response->value;
   if (out_type) {
     *out_type = response->type;
   }
diff --git a/ui/base/x/x11_workspace_handler.cc b/ui/base/x/x11_workspace_handler.cc
index ad59d0a..6916705b8 100644
--- a/ui/base/x/x11_workspace_handler.cc
+++ b/ui/base/x/x11_workspace_handler.cc
@@ -58,14 +58,14 @@
 
 void X11WorkspaceHandler::OnWorkspaceResponse(
     x11::GetPropertyResponse response) {
-  if (!response || response->format != 32 || response->value_len < 1) {
+  if (!response || response->format != 32 || response->value->size() < 4) {
     return;
   }
   DCHECK_EQ(response->bytes_after, 0U);
   DCHECK_EQ(response->type, static_cast<x11::Atom>(x11::Atom::CARDINAL));
 
   uint32_t workspace;
-  memcpy(&workspace, response->value->bytes(), 4);
+  memcpy(&workspace, response->value->data(), 4);
   workspace_ = base::NumberToString(workspace);
   delegate_->OnCurrentWorkspaceChanged(workspace_);
 }
diff --git a/ui/events/ash/BUILD.gn b/ui/events/ash/BUILD.gn
index f529a07..c23365ce 100644
--- a/ui/events/ash/BUILD.gn
+++ b/ui/events/ash/BUILD.gn
@@ -67,6 +67,7 @@
     "//base/test:test_support",
     "//device/udev_linux:test_support",
     "//testing/gtest",
+    "//ui/base",
     "//ui/events",
     "//ui/events/ash/mojom",
     "//ui/events/devices",
diff --git a/ui/events/ash/event_rewriter_ash.cc b/ui/events/ash/event_rewriter_ash.cc
index d64f646..6ab8958 100644
--- a/ui/events/ash/event_rewriter_ash.cc
+++ b/ui/events/ash/event_rewriter_ash.cc
@@ -6,6 +6,7 @@
 
 #include <fcntl.h>
 #include <stddef.h>
+
 #include <cstdint>
 
 #include "ash/constants/ash_features.h"
@@ -25,6 +26,7 @@
 #include "ui/base/ime/ash/ime_keyboard.h"
 #include "ui/base/ime/ash/input_method_manager.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/events/ash/event_property.h"
 #include "ui/events/ash/event_rewriter_metrics.h"
 #include "ui/events/ash/keyboard_capability.h"
 #include "ui/events/ash/keyboard_device_id_event_rewriter.h"
@@ -190,7 +192,11 @@
      ui::mojom::ModifierKey::kAssistant,
      prefs::kLanguageRemapAssistantKeyTo,
      {EF_NONE, DomCode::LAUNCH_ASSISTANT, DomKey::LAUNCH_ASSISTANT,
-      VKEY_ASSISTANT}}};
+      VKEY_ASSISTANT}},
+    {EF_FUNCTION_DOWN,
+     ui::mojom::ModifierKey::kFunction,
+     nullptr,
+     {EF_FUNCTION_DOWN, DomCode::FN, DomKey::FN, VKEY_FUNCTION}}};
 
 // Finds the remapping for Neo Mod3 in the list. Used only to set the value of
 // |kModifierRemappingIsoLevel5ShiftMod3|.
@@ -1288,6 +1294,11 @@
           GetRemappedKey(device_id, mojom::ModifierKey::kAssistant,
                          prefs::kLanguageRemapAssistantKeyTo, delegate_);
       break;
+    case DomCode::FN:
+      characteristic_flag = EF_FUNCTION_DOWN;
+      remapped_key = GetRemappedKey(device_id, mojom::ModifierKey::kFunction,
+                                    "", delegate_);
+      break;
     default:
       break;
   }
@@ -1412,10 +1423,15 @@
       default:
         break;
     }
-    if (!remapped_key && kModifierRemappings[i].pref_name) {
-      remapped_key =
-          GetRemappedKey(device_id, kModifierRemappings[i].remap_to,
-                         kModifierRemappings[i].pref_name, delegate_);
+    // ISO Level 5 Shift should already be handled, so do not try to remap it
+    // here.
+    if (!remapped_key &&
+        &kModifierRemappings[i] != kModifierRemappingIsoLevel5ShiftMod3) {
+      const std::string pref_name = kModifierRemappings[i].pref_name
+                                        ? kModifierRemappings[i].pref_name
+                                        : "";
+      remapped_key = GetRemappedKey(device_id, kModifierRemappings[i].remap_to,
+                                    pref_name, delegate_);
     }
     if (remapped_key) {
       unmodified_flags &= ~kModifierRemappings[i].flag;
diff --git a/ui/events/ash/keyboard_modifier_event_rewriter.cc b/ui/events/ash/keyboard_modifier_event_rewriter.cc
index 0bf1739..1d25aa47 100644
--- a/ui/events/ash/keyboard_modifier_event_rewriter.cc
+++ b/ui/events/ash/keyboard_modifier_event_rewriter.cc
@@ -4,6 +4,7 @@
 
 #include "ui/events/ash/keyboard_modifier_event_rewriter.h"
 
+#include "ash/constants/ash_features.h"
 #include "base/containers/fixed_flat_map.h"
 #include "base/notreached.h"
 #include "ui/base/ime/ash/extension_ime_util.h"
@@ -12,8 +13,10 @@
 #include "ui/events/ash/event_property.h"
 #include "ui/events/ash/event_rewriter_metrics.h"
 #include "ui/events/ash/keyboard_capability.h"
+#include "ui/events/ash/mojom/modifier_key.mojom-shared.h"
 #include "ui/events/ash/pref_names.h"
 #include "ui/events/event.h"
+#include "ui/events/event_constants.h"
 #include "ui/events/event_rewriter_continuation.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/events/keycodes/dom/dom_key.h"
@@ -237,9 +240,9 @@
 EventFlags KeyboardModifierEventRewriter::RewriteModifierFlags(
     EventFlags flags) const {
   // Bit mask of modifier flags to be rewritten.
-  constexpr EventFlags kTargetModifierFlags = EF_CONTROL_DOWN | EF_ALT_DOWN |
-                                              EF_COMMAND_DOWN | EF_ALTGR_DOWN |
-                                              EF_MOD3_DOWN | EF_CAPS_LOCK_ON;
+  constexpr EventFlags kTargetModifierFlags =
+      EF_CONTROL_DOWN | EF_ALT_DOWN | EF_COMMAND_DOWN | EF_ALTGR_DOWN |
+      EF_MOD3_DOWN | EF_CAPS_LOCK_ON | EF_FUNCTION_DOWN;
   flags &= ~kTargetModifierFlags;
 
   // Recalculate modifier flags from the currently pressed keys.
@@ -333,11 +336,16 @@
       pref_name = prefs::kLanguageRemapAssistantKeyTo;
       break;
 
+    case DomCode::FN:
+      modifier_key = mojom::ModifierKey::kFunction;
+      break;
+
     default:
       // No remapping.
       return std::nullopt;
   }
-  CHECK(!pref_name.empty());
+  CHECK(!pref_name.empty() ||
+        ash::features::IsInputDeviceSettingsSplitEnabled());
 
   auto modifier_value = delegate_->GetKeyboardRemappedModifierValue(
       device_id, modifier_key, std::string(pref_name));
@@ -362,8 +370,9 @@
     case mojom::ModifierKey::kIsoLevel5ShiftMod3:
       LOG(FATAL) << "Unexpected IsoLevel5ShiftMod3 config";
     case mojom::ModifierKey::kFunction:
+      return DomCode::FN;
     case mojom::ModifierKey::kRightAlt:
-      // TODO(dpad, b/328316040): Implement for function and right alt.
+      // TODO(dpad, b/328316040): Implement for right alt.
       NOTIMPLEMENTED();
       return std::nullopt;
   }
diff --git a/ui/events/event_utils.cc b/ui/events/event_utils.cc
index 4cebe195..91ce864 100644
--- a/ui/events/event_utils.cc
+++ b/ui/events/event_utils.cc
@@ -319,6 +319,8 @@
     names.push_back("ALTGR_DOWN");
   if (event_flags & EF_MOD3_DOWN)
     names.push_back("MOD3_DOWN");
+  if (event_flags & EF_FUNCTION_DOWN)
+    names.push_back("FUNCTION_DOWN");
   if (event_flags & EF_NUM_LOCK_ON)
     names.push_back("NUM_LOCK_ON");
   if (event_flags & EF_CAPS_LOCK_ON)
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 8c4b88a..dfd0fe9 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -10,7 +10,6 @@
 #include "base/memory/free_deleter.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/numerics/safe_conversions.h"
 #include "base/ranges/algorithm.h"
 #include "build/chromeos_buildflags.h"
 #include "ui/events/devices/x11/device_data_manager_x11.h"
@@ -204,14 +203,14 @@
   }
 
   // Make a no-op property change on |dummy_window_|.
-  std::vector<uint8_t> data({0});
+  std::vector<uint8_t> data{0};
   connection_->ChangeProperty(x11::ChangePropertyRequest{
       .window = static_cast<x11::Window>(dummy_window_),
       .property = dummy_atom_,
       .type = x11::Atom::STRING,
       .format = CHAR_BIT,
-      .data_len = base::checked_cast<uint32_t>(data.size()),
-      .data = base::MakeRefCounted<base::RefCountedBytes>(std::move(data)),
+      .data_len = 1,
+      .data = base::RefCountedBytes::TakeVector(&data),
   });
 
   // Observe the resulting PropertyNotify event to obtain the timestamp.
diff --git a/ui/file_manager/file_manager/common/js/api.ts b/ui/file_manager/file_manager/common/js/api.ts
index a15c97e..536b936d 100644
--- a/ui/file_manager/file_manager/common/js/api.ts
+++ b/ui/file_manager/file_manager/common/js/api.ts
@@ -7,8 +7,9 @@
  */
 
 import type {FilesAppDirEntry, FilesAppEntry} from '../../common/js/files_app_entry_types.js';
+import type {FileKey} from '../../state/state.js';
 
-import {unwrapEntry} from './entry_utils.js';
+import {unwrapEntry, urlToEntry} from './entry_utils.js';
 import {promisify} from './util.js';
 
 /**
@@ -304,3 +305,12 @@
     return [];
   }
 }
+
+export async function readMaterializedView(fileKey: FileKey): Promise<Entry[]> {
+  const url = new URL(fileKey);
+  const viewId = parseInt(url.pathname.replace('//', '').split('/')[0]!);
+  const entryData =
+      await chrome.fileManagerPrivate.readMaterializedView(viewId);
+  const entries = await Promise.all(entryData.map(e => urlToEntry(e.entryUrl)));
+  return entries;
+}
diff --git a/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts b/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts
index 2fe12c3..bbf622a1 100644
--- a/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts
+++ b/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts
@@ -38,6 +38,7 @@
     ],
     content: {
       keys: [],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [],
diff --git a/ui/file_manager/file_manager/foreground/js/fake_file_selection_handler.ts b/ui/file_manager/file_manager/foreground/js/fake_file_selection_handler.ts
index 4fe06f6..0a72501 100644
--- a/ui/file_manager/file_manager/foreground/js/fake_file_selection_handler.ts
+++ b/ui/file_manager/file_manager/foreground/js/fake_file_selection_handler.ts
@@ -8,6 +8,7 @@
 import type {FilesAppEntry} from '../../common/js/files_app_entry_types.js';
 import {AllowedPaths} from '../../common/js/volume_manager_types.js';
 import {updateDirectoryContent, updateSelection} from '../../state/ducks/current_directory.js';
+import {PropStatus} from '../../state/state.js';
 import type {Store} from '../../state/store.js';
 
 import {type FileSelection, FileSelectionHandler} from './file_selection.js';
@@ -49,7 +50,8 @@
 
     if (store) {
       // Make sure that the entry is in the directory content.
-      store.dispatch(updateDirectoryContent({entries}));
+      store.dispatch(
+          updateDirectoryContent({entries, status: PropStatus.SUCCESS}));
       // Mark the entry as selected.
       store.dispatch(updateSelection({
         selectedKeys: entries.map(e => e.toURL()),
diff --git a/ui/file_manager/file_manager/foreground/js/scan_controller.ts b/ui/file_manager/file_manager/foreground/js/scan_controller.ts
index dd30a3e..081ed77b 100644
--- a/ui/file_manager/file_manager/foreground/js/scan_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/scan_controller.ts
@@ -6,6 +6,7 @@
 import {recordDirectoryListLoadWithTolerance, startInterval} from '../../common/js/metrics.js';
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
 import {updateDirectoryContent} from '../../state/ducks/current_directory.js';
+import {PropStatus} from '../../state/state.js';
 import {getStore, type Store} from '../../state/store.js';
 
 import type {DirectoryModel} from './directory_model.js';
@@ -126,7 +127,8 @@
   private updateStore_() {
     const entries: Array<Entry|FilesAppEntry> =
         this.directoryModel_.getFileList().slice();
-    this.store_.dispatch(updateDirectoryContent({entries}));
+    this.store_.dispatch(
+        updateDirectoryContent({entries, status: PropStatus.SUCCESS}));
   }
 
   /**
diff --git a/ui/file_manager/file_manager/lib/base_store.ts b/ui/file_manager/file_manager/lib/base_store.ts
index 96411565..bdabd902 100644
--- a/ui/file_manager/file_manager/lib/base_store.ts
+++ b/ui/file_manager/file_manager/lib/base_store.ts
@@ -386,7 +386,7 @@
 }
 
 /** Returns true when the error is a ConcurrentActionInvalidatedError. */
-function isInvalidationError(error: unknown): boolean {
+export function isInvalidationError(error: unknown): boolean {
   if (!error) {
     return false;
   }
diff --git a/ui/file_manager/file_manager/state/ducks/current_directory.ts b/ui/file_manager/file_manager/state/ducks/current_directory.ts
index fb41fd3..3c4d41ee 100644
--- a/ui/file_manager/file_manager/state/ducks/current_directory.ts
+++ b/ui/file_manager/file_manager/state/ducks/current_directory.ts
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {getFileTasks} from '../../common/js/api.js';
+import {getFileTasks, readMaterializedView} from '../../common/js/api.js';
 import {getNativeEntry} from '../../common/js/entry_utils.js';
-import {annotateTasks, getDefaultTask, INSTALL_LINUX_PACKAGE_TASK_DESCRIPTOR} from '../../common/js/file_tasks.js';
+import {INSTALL_LINUX_PACKAGE_TASK_DESCRIPTOR, annotateTasks, getDefaultTask} from '../../common/js/file_tasks.js';
 import type {FakeEntry, FilesAppDirEntry, FilesAppEntry} from '../../common/js/files_app_entry_types.js';
 import {descriptorEqual} from '../../common/js/util.js';
 import {RootType} from '../../common/js/volume_manager_types.js';
 import {DEFAULT_CROSTINI_VM} from '../../foreground/js/constants.js';
 import {PathComponent} from '../../foreground/js/path_component.js';
 import type {ActionsProducerGen} from '../../lib/actions_producer.js';
-import {Slice} from '../../lib/base_store.js';
+import {Slice, isInvalidationError} from '../../lib/base_store.js';
 import {keyedKeepFirst} from '../../lib/concurrency_models.js';
-import {type CurrentDirectory, DialogType, type DirectoryContent, type FileData, type FileKey, type FileTask, type FileTasks, PropStatus, type Selection, type State} from '../../state/state.js';
-import {getStore} from '../store.js';
+import {combine1Selector} from '../../lib/selector.js';
+import {DialogType, EntryType, PropStatus, type CurrentDirectory, type DirectoryContent, type FileData, type FileKey, type FileTask, type FileTasks, type Selection, type State} from '../../state/state.js';
+import {getFileData, getStore} from '../store.js';
 
 import {cacheEntries} from './all_entries.js';
 
@@ -110,6 +111,7 @@
   if (!content || currentState.currentDirectory?.key !== key) {
     content = {
       keys: [],
+      status: PropStatus.SUCCESS,
     };
     hasDlpDisabledFiles = false;
   }
@@ -129,23 +131,31 @@
   // At the end of the change directory, DirectoryContents will send an Action
   // with the Entry to be cached.
   if (fileData) {
-    const {volumeManager} = window.fileManager;
-    if (!volumeManager) {
-      console.debug(`VolumeManager not available yet.`);
-      currentDirectory = currentState.currentDirectory || currentDirectory;
+    if (fileData.type === EntryType.MATERIALIZED_VIEW) {
+      currentDirectory.pathComponents = [{
+        name: fileData.label,
+        label: fileData.label,
+        key: fileData.key,
+      }];
     } else {
-      const components = PathComponent.computeComponentsFromEntry(
-          fileData.entry!, volumeManager);
-      currentDirectory.pathComponents = components.map(c => {
-        return {
-          name: c.name,
-          label: c.name,
-          key: c.getKey(),
-        };
-      });
+      const {volumeManager} = window.fileManager;
+      if (!volumeManager) {
+        console.debug(`VolumeManager not available yet.`);
+        currentDirectory = currentState.currentDirectory || currentDirectory;
+      } else {
+        const components = PathComponent.computeComponentsFromEntry(
+            fileData.entry!, volumeManager);
+        currentDirectory.pathComponents = components.map(c => {
+          return {
+            name: c.name,
+            label: c.name,
+            key: c.getKey(),
+          };
+        });
 
-      const locationInfo = volumeManager.getLocationInfo(fileData.entry!);
-      currentDirectory.rootType = locationInfo?.rootType;
+        const locationInfo = volumeManager.getLocationInfo(fileData.entry!);
+        currentDirectory.rootType = locationInfo?.rootType;
+      }
     }
   }
 
@@ -279,10 +289,12 @@
     slice.addReducer('update-content', updateDirectoryContentReducer);
 
 function updateDirectoryContentReducer(currentState: State, payload: {
-  entries: Array<Entry|FilesAppEntry>,
+  entries?: Array<Entry|FilesAppEntry>, status: PropStatus,
 }): State {
   // Cache entries, so the reducers can use any entry from `allEntries`.
-  cacheEntries(currentState, payload.entries);
+  if (payload.entries) {
+    cacheEntries(currentState, payload.entries);
+  }
 
   if (!currentState.currentDirectory) {
     console.warn('Missing `currentDirectory`');
@@ -291,10 +303,12 @@
 
   const initialContent: DirectoryContent =
       currentState.currentDirectory?.content ?? {keys: []};
-  const keys = payload.entries.map(e => e.toURL());
+  const status = payload.status;
+  const keys = (payload.entries ?? []).map(e => e.toURL());
   const content: DirectoryContent = {
     ...initialContent,
     keys,
+    status,
   };
 
   let currentDirectory: CurrentDirectory = {
@@ -408,3 +422,44 @@
 
 export const fetchFileTasks =
     keyedKeepFirst(fetchFileTasksInternal, getSelectionKey);
+
+
+export const directoryContentSelector = combine1Selector(
+    (currentDir?: CurrentDirectory) => currentDir?.content, slice.selector);
+
+// TODO(lucmult): Add concurrency model, the latest should prevail.
+export async function*
+    fetchDirectoryContents(fileKey: FileKey): ActionsProducerGen {
+  // Mark as started.
+  yield updateDirectoryContent({status: PropStatus.STARTED});
+
+  try {
+    const store = getStore();
+    const state = store.getState();
+    const fileData = getFileData(state, fileKey);
+    if (!fileData) {
+      throw new Error(`FileData not found for key ${fileKey}`);
+    }
+
+    // TODO(lucmult): Add this to concurrency model.
+    if (store.getState().currentDirectory?.key !== fileKey) {
+      // User navigated to another directory.
+      return;
+    }
+
+    // NOTE: Only implemented for Materialized view for now.
+    if (fileData.type !== EntryType.MATERIALIZED_VIEW) {
+      throw new Error(`Fetch not supported for entry type: ${fileData.type}`);
+    }
+
+    const entries = await readMaterializedView(fileKey);
+    yield updateDirectoryContent({entries, status: PropStatus.SUCCESS});
+  } catch (error: any) {
+    if (isInvalidationError(error)) {
+      // Not an actual error, just stopping the actions producer.
+      throw error;
+    }
+    console.warn(error);
+    yield updateDirectoryContent({status: PropStatus.ERROR});
+  }
+}
diff --git a/ui/file_manager/file_manager/state/ducks/current_directory_unittest.ts b/ui/file_manager/file_manager/state/ducks/current_directory_unittest.ts
index f4f10fc..fb8acb7d 100644
--- a/ui/file_manager/file_manager/state/ducks/current_directory_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/current_directory_unittest.ts
@@ -63,6 +63,7 @@
     pathComponents: [],
     content: {
       keys: [],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [],
@@ -114,6 +115,7 @@
     ],
     content: {
       keys: [],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [],
@@ -153,6 +155,7 @@
     ],
     content: {
       keys: [subDir.toURL(), file.toURL()],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [subDir.toURL()],
@@ -204,6 +207,7 @@
     ],
     content: {
       keys: [],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [],
@@ -279,6 +283,7 @@
     ],
     content: {
       keys: [subDir.toURL(), file.toURL()],
+      status: PropStatus.SUCCESS,
     },
     selection: {
       keys: [],
diff --git a/ui/file_manager/file_manager/state/for_tests.ts b/ui/file_manager/file_manager/state/for_tests.ts
index ddcd24d..bed4606b 100644
--- a/ui/file_manager/file_manager/state/for_tests.ts
+++ b/ui/file_manager/file_manager/state/for_tests.ts
@@ -72,7 +72,7 @@
 
 /** Updates the directory content in the store. */
 export function updateContent(store: Store, entries: Entry[]) {
-  store.dispatch(updateDirectoryContent({entries}));
+  store.dispatch(updateDirectoryContent({entries, status: PropStatus.SUCCESS}));
 }
 
 /**
diff --git a/ui/file_manager/file_manager/state/state.ts b/ui/file_manager/file_manager/state/state.ts
index 95b8455..4f386c5c 100644
--- a/ui/file_manager/file_manager/state/state.ts
+++ b/ui/file_manager/file_manager/state/state.ts
@@ -198,6 +198,7 @@
  * Represents the entries displayed in the file list/grid.
  */
 export interface DirectoryContent {
+  status: PropStatus;
   keys: FileKey[];
 }
 
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 5ad5e831..f3b0ff3 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -725,7 +725,6 @@
     "test/scoped_default_font_description.h",
     "test/sk_color_eq.cc",
     "test/sk_color_eq.h",
-    "test/sk_gmock_support.h",
   ]
   if (is_apple) {
     sources += [ "image/image_unittest_util_apple.mm" ]
diff --git a/ui/gfx/DEPS b/ui/gfx/DEPS
index a7eb37a..0ddd58a 100644
--- a/ui/gfx/DEPS
+++ b/ui/gfx/DEPS
@@ -13,6 +13,8 @@
   "+ui/base/ui_base_features.h",
   "+ui/ios",
   "+ui/linux",
+
+  "-testing/gmock",
 ]
 
 specific_include_rules = {
diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc
index 42c079d1..51ff8d6f 100644
--- a/ui/gfx/image/image.cc
+++ b/ui/gfx/image/image.cc
@@ -219,7 +219,7 @@
     return Image();
 
   scoped_refptr<base::RefCountedBytes> raw_data(new base::RefCountedBytes());
-  raw_data->as_vector().assign(input, input + input_size);
+  raw_data->data().assign(input, input + input_size);
 
   return CreateFrom1xPNGBytes(raw_data);
 }
diff --git a/ui/gfx/image/image_generic.cc b/ui/gfx/image/image_generic.cc
index 3222846..5d4940e 100644
--- a/ui/gfx/image/image_generic.cc
+++ b/ui/gfx/image/image_generic.cc
@@ -74,7 +74,7 @@
     scoped_refptr<base::RefCountedMemory> raw_data = png_rep.raw_data;
     CHECK(raw_data.get());
     SkBitmap bitmap;
-    if (!PNGCodec::Decode(raw_data->data(), raw_data->size(), &bitmap)) {
+    if (!PNGCodec::Decode(raw_data->front(), raw_data->size(), &bitmap)) {
       LOG(ERROR) << "Unable to decode PNG for " << png_rep.scale << ".";
       return ImageSkiaRep();
     }
@@ -118,7 +118,7 @@
   scoped_refptr<base::RefCountedBytes> png_bytes(new base::RefCountedBytes());
   if (image_skia_rep.scale() != 1.0f ||
       !PNGCodec::EncodeBGRASkBitmap(image_skia_rep.GetBitmap(), false,
-                                    &png_bytes->as_vector())) {
+                                    &png_bytes->data())) {
     return nullptr;
   }
   return png_bytes;
diff --git a/ui/gfx/image/image_ios.mm b/ui/gfx/image/image_ios.mm
index b717aee..9fdd132 100644
--- a/ui/gfx/image/image_ios.mm
+++ b/ui/gfx/image/image_ios.mm
@@ -109,8 +109,8 @@
 
   scoped_refptr<base::RefCountedBytes> png_bytes(
       new base::RefCountedBytes());
-  png_bytes->as_vector().resize(data.length);
-  [data getBytes:&png_bytes->as_vector().at(0) length:data.length];
+  png_bytes->data().resize(data.length);
+  [data getBytes:&png_bytes->data().at(0) length:data.length];
   return png_bytes;
 }
 
diff --git a/ui/gfx/image/image_mac.mm b/ui/gfx/image/image_mac.mm
index a05b0d51..1b0f60f 100644
--- a/ui/gfx/image/image_mac.mm
+++ b/ui/gfx/image/image_mac.mm
@@ -90,10 +90,10 @@
       [[NSBitmapImageRep alloc] initWithCGImage:cg_image];
   NSData* ns_data = [ns_bitmap representationUsingType:NSBitmapImageFileTypePNG
                                             properties:@{}];
-  auto* bytes = static_cast<const uint8_t*>(ns_data.bytes);
+  const unsigned char* bytes = static_cast<const unsigned char*>(ns_data.bytes);
   scoped_refptr<base::RefCountedBytes> refcounted_bytes(
       new base::RefCountedBytes());
-  refcounted_bytes->as_vector().assign(bytes, bytes + ns_data.length);
+  refcounted_bytes->data().assign(bytes, bytes + ns_data.length);
   return refcounted_bytes;
 }
 
diff --git a/ui/gfx/image/image_png_rep.cc b/ui/gfx/image/image_png_rep.cc
index 9ea4bcd..332d35ed 100644
--- a/ui/gfx/image/image_png_rep.cc
+++ b/ui/gfx/image/image_png_rep.cc
@@ -29,7 +29,8 @@
   // using the gfx::PNGCodec API, is to decode the whole thing.
   CHECK(raw_data.get());
   SkBitmap bitmap;
-  if (!gfx::PNGCodec::Decode(raw_data->data(), raw_data->size(), &bitmap)) {
+  if (!gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(),
+                             &bitmap)) {
     LOG(ERROR) << "Unable to decode PNG.";
     return gfx::Size(0, 0);
   }
diff --git a/ui/gfx/image/image_unittest.cc b/ui/gfx/image/image_unittest.cc
index 8921398ac..d833500 100644
--- a/ui/gfx/image/image_unittest.cc
+++ b/ui/gfx/image/image_unittest.cc
@@ -402,7 +402,7 @@
 TEST_F(ImageTest, PNGDecodeToSkiaFailure) {
   scoped_refptr<base::RefCountedBytes> invalid_bytes(
       new base::RefCountedBytes());
-  invalid_bytes->as_vector().push_back('0');
+  invalid_bytes->data().push_back('0');
   std::vector<gfx::ImagePNGRep> image_png_reps;
   image_png_reps.push_back(gfx::ImagePNGRep(
       invalid_bytes, 1.0f));
@@ -413,7 +413,7 @@
 TEST_F(ImageTest, PNGDecodeToPlatformFailure) {
   scoped_refptr<base::RefCountedBytes> invalid_bytes(
       new base::RefCountedBytes());
-  invalid_bytes->as_vector().push_back('0');
+  invalid_bytes->data().push_back('0');
   std::vector<gfx::ImagePNGRep> image_png_reps;
   image_png_reps.push_back(gfx::ImagePNGRep(
       invalid_bytes, 1.0f));
diff --git a/ui/gfx/image/image_unittest_util.cc b/ui/gfx/image/image_unittest_util.cc
index a5051e85..1cc4665 100644
--- a/ui/gfx/image/image_unittest_util.cc
+++ b/ui/gfx/image/image_unittest_util.cc
@@ -66,7 +66,7 @@
                                                      SkColor color) {
   SkBitmap bitmap = CreateBitmap(edge_size, edge_size, color);
   scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes());
-  PNGCodec::EncodeBGRASkBitmap(bitmap, false, &bytes->as_vector());
+  PNGCodec::EncodeBGRASkBitmap(bitmap, false, &bytes->data());
   return bytes;
 }
 
diff --git a/ui/gfx/test/sk_gmock_support.h b/ui/gfx/test/sk_gmock_support.h
deleted file mode 100644
index 0c91f35..0000000
--- a/ui/gfx/test/sk_gmock_support.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_TEST_SK_GMOCK_SUPPORT_H_
-#define UI_GFX_TEST_SK_GMOCK_SUPPORT_H_
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/color_utils.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/test/sk_color_eq.h"
-
-namespace gfx::test {
-
-MATCHER_P2(IsCloseToBitmap, expected_bmp, max_per_channel_deviation, "") {
-  // Number of pixels with an error
-  int error_pixels_count = 0;
-
-  gfx::Rect error_bounding_rect = gfx::Rect();
-
-  // Check that bitmaps have identical dimensions.
-  if (arg.width() != expected_bmp.width()) {
-    *result_listener << "where widths do not match, actual: " << arg.width()
-                     << ", expected: " << expected_bmp.width();
-    return false;
-  }
-  if (arg.height() != expected_bmp.height()) {
-    *result_listener << "where heights do not match, actual: " << arg.height()
-                     << ", expected: " << expected_bmp.height();
-    return false;
-  }
-
-  for (int x = 0; x < arg.width(); ++x) {
-    for (int y = 0; y < arg.height(); ++y) {
-      SkColor actual_color = arg.getColor(x, y);
-      SkColor expected_color = expected_bmp.getColor(x, y);
-      if (!ColorsClose(actual_color, expected_color,
-                       max_per_channel_deviation)) {
-        ++error_pixels_count;
-        error_bounding_rect.Union(gfx::Rect(x, y, 1, 1));
-      }
-    }
-  }
-
-  if (error_pixels_count != 0) {
-    *result_listener
-        << "Number of pixel with an error, given max_per_channel_deviation of "
-        << max_per_channel_deviation << ": " << error_pixels_count
-        << "\nError Bounding Box : " << error_bounding_rect.ToString() << "\n";
-    int sample_x = error_bounding_rect.x();
-    int sample_y = error_bounding_rect.y();
-    std::string expected_color = color_utils::SkColorToRgbaString(
-        expected_bmp.getColor(sample_x, sample_y));
-    std::string actual_color =
-        color_utils::SkColorToRgbaString(arg.getColor(sample_x, sample_y));
-    *result_listener << "Sample pixel comparison at " << sample_x << "x"
-                     << sample_y << ": Expected " << expected_color
-                     << ", actual " << actual_color;
-    return false;
-  }
-
-  return true;
-}
-
-MATCHER_P(EqualsBitmap, expected_bmp, "") {
-  return testing::ExplainMatchResult(
-      IsCloseToBitmap(expected_bmp,
-                      /*max_per_channel_deviation=*/0),
-      arg, result_listener);
-}
-
-}  // namespace gfx::test
-
-#endif  // UI_GFX_TEST_SK_GMOCK_SUPPORT_H_
diff --git a/ui/gfx/x/connection.cc b/ui/gfx/x/connection.cc
index 62b8cc6..2c32f6a 100644
--- a/ui/gfx/x/connection.cc
+++ b/ui/gfx/x/connection.cc
@@ -73,7 +73,7 @@
     // Errors are always a fixed 32 bytes.
     for (size_t i = 0; i < 32; i++) {
       char buf[3];
-      sprintf(buf, "%02x", error_bytes_->bytes()[i]);
+      sprintf(buf, "%02x", error_bytes_->data()[i]);
       ss << "0x" << buf;
       if (i != 31) {
         ss << ", ";
@@ -131,12 +131,9 @@
       window_event_manager_(this) {
   CHECK(connection_);
   if (Ready()) {
-    auto buf = ReadBuffer(
-        base::MakeRefCounted<UnretainedRefCountedMemory>(
-            // ReadBuffer doesn't use write access but we don't have a const
-            // UnsizedRefCountedMemory type for ReadBuffer to use.
-            const_cast<xcb_setup_t*>(xcb_get_setup(XcbConnection()))),
-        true);
+    auto buf = ReadBuffer(base::MakeRefCounted<UnretainedRefCountedMemory>(
+                              xcb_get_setup(XcbConnection())),
+                          true);
     setup_ = Read<Setup>(&buf);
     default_screen_ = &setup_.roots[DefaultScreenId()];
     InitRootDepthAndVisual();
@@ -661,21 +658,6 @@
   }
 }
 
-Future<void> Connection::SetArrayPropertyImpl(
-    Window window,
-    Atom name,
-    Atom type,
-    uint8_t format,
-    base::span<const uint8_t> values) {
-  return ChangeProperty(ChangePropertyRequest{
-      .window = static_cast<Window>(window),
-      .property = name,
-      .type = type,
-      .format = format,
-      .data_len = static_cast<uint32_t>(values.size()) / (format / 8u),
-      .data = base::MakeRefCounted<base::RefCountedBytes>(values)});
-}
-
 std::unique_ptr<FutureImpl> Connection::SendRequestImpl(
     WriteBuffer* buf,
     const char* request_name_for_tracing,
@@ -700,9 +682,10 @@
   };
   static_assert(sizeof(ExtendedRequestHeader) == 8, "");
 
-  base::span<uint8_t> first_buffer = buf->GetBuffers()[0];
-  CHECK_GE(first_buffer.size(), sizeof(RequestHeader));
-  auto* old_header = reinterpret_cast<RequestHeader*>(first_buffer.data());
+  auto& first_buffer = buf->GetBuffers()[0];
+  CHECK_GE(first_buffer->size(), sizeof(RequestHeader));
+  auto* old_header = reinterpret_cast<RequestHeader*>(
+      const_cast<uint8_t*>(first_buffer->data()));
   ExtendedRequestHeader new_header{*old_header, 0};
 
   // Requests are always a multiple of 4 bytes on the wire.  Because of this,
@@ -721,14 +704,16 @@
     new_header.long_length = size32 + 1;
 
     io.push_back({&new_header, sizeof(ExtendedRequestHeader)});
-    buf->OffsetFirstBuffer(sizeof(RequestHeader));
+    first_buffer = base::MakeRefCounted<OffsetRefCountedMemory>(
+        first_buffer, sizeof(RequestHeader),
+        first_buffer->size() - sizeof(RequestHeader));
   } else {
     LOG(ERROR) << "Cannot send request of length " << buf->offset();
     return nullptr;
   }
 
-  for (base::span<uint8_t> buffer : buf->GetBuffers()) {
-    io.push_back({buffer.data(), buffer.size()});
+  for (auto& buffer : buf->GetBuffers()) {
+    io.push_back({const_cast<uint8_t*>(buffer->data()), buffer->size()});
   }
   xpr.count = io.size() - 2;
 
@@ -913,7 +898,7 @@
     uint8_t error_code;
     uint16_t sequence;
   };
-  auto error_code = error_bytes->cast_to<ErrorHeader>()->error_code;
+  auto error_code = error_bytes->front_as<ErrorHeader>()->error_code;
   if (auto parser = error_parsers_[error_code]) {
     return parser(error_bytes);
   }
diff --git a/ui/gfx/x/connection.h b/ui/gfx/x/connection.h
index 77601c8..1866edfe 100644
--- a/ui/gfx/x/connection.h
+++ b/ui/gfx/x/connection.h
@@ -337,14 +337,12 @@
     static_assert(T::type_id > 0, "T must be an *Event type");
     auto write_buffer = Write(event);
     CHECK_EQ(write_buffer.GetBuffers().size(), 1ul);
-    base::span<uint8_t> first_buffer = write_buffer.GetBuffers()[0];
-    char event_bytes[32] = {};
-    base::span(event_bytes)
-        .first(first_buffer.size_bytes())
-        .copy_from(base::as_chars(first_buffer));
+    auto& first_buffer = write_buffer.GetBuffers()[0];
+    CHECK_LE(first_buffer->size(), 32ul);
+    std::vector<uint8_t> event_bytes(32);
+    memcpy(event_bytes.data(), first_buffer->data(), first_buffer->size());
 
     SendEventRequest send_event{false, target, mask};
-    base::span(send_event.event).copy_from(event_bytes);
     base::ranges::copy(event_bytes, send_event.event.begin());
     return XProto::SendEvent(send_event);
   }
@@ -371,14 +369,15 @@
                 .long_length = static_cast<uint32_t>(
                     amount ? length : std::numeric_limits<lentype>::max())})
             .Sync();
-    if (!response || response->format / 8u != sizeof(T)) {
+    if (!response || response->format != CHAR_BIT * sizeof(T)) {
       return false;
     }
 
-    size_t byte_len = response->value_len * response->format / 8u;
+    CHECK_EQ(response->format / CHAR_BIT * response->value_len,
+             response->value->size());
     value->resize(response->value_len);
-    if (byte_len > 0u) {
-      memcpy(value->data(), response->value->bytes(), byte_len);
+    if (response->value_len > 0) {
+      memcpy(value->data(), response->value->data(), response->value->size());
     }
     if (out_type) {
       *out_type = response->type;
@@ -403,8 +402,17 @@
                                 Atom type,
                                 const std::vector<T>& values) {
     static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "");
-    return SetArrayPropertyImpl(window, name, type, 8u * sizeof(T),
-                                base::as_byte_span(values));
+    std::vector<uint8_t> data(sizeof(T) * values.size());
+    if (values.size() > 0) {
+      memcpy(data.data(), values.data(), sizeof(T) * values.size());
+    }
+    return ChangeProperty(ChangePropertyRequest{
+        .window = static_cast<Window>(window),
+        .property = name,
+        .type = type,
+        .format = CHAR_BIT * sizeof(T),
+        .data_len = static_cast<uint32_t>(values.size()),
+        .data = base::RefCountedBytes::TakeVector(&data)});
   }
 
   template <typename T>
@@ -498,12 +506,6 @@
 
   bool HasNextEvent();
 
-  Future<void> SetArrayPropertyImpl(Window window,
-                                    Atom name,
-                                    Atom type,
-                                    uint8_t format,
-                                    base::span<const uint8_t> values);
-
   // Creates a new Request and adds it to the end of the queue.
   // |request_name_for_tracing| must be valid until the response is
   // dispatched; currently the string values are only stored in .rodata, so
diff --git a/ui/gfx/x/connection_unittest.cc b/ui/gfx/x/connection_unittest.cc
index a2ca929..a600cbc 100644
--- a/ui/gfx/x/connection_unittest.cc
+++ b/ui/gfx/x/connection_unittest.cc
@@ -5,7 +5,6 @@
 #include "ui/gfx/x/connection.h"
 
 #include "base/memory/ref_counted_memory.h"
-#include "base/numerics/safe_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/x/event.h"
 #include "ui/gfx/x/future.h"
@@ -75,8 +74,8 @@
       .property = Atom::WM_NAME,
       .type = Atom::STRING,
       .format = CHAR_BIT,
-      .data_len = base::checked_cast<uint32_t>(data.size()),
-      .data = base::MakeRefCounted<base::RefCountedBytes>(std::move(data)),
+      .data_len = 1,
+      .data = base::RefCountedBytes::TakeVector(&data),
   });
   EXPECT_FALSE(prop_future.Sync().error);
 
diff --git a/ui/gfx/x/event.cc b/ui/gfx/x/event.cc
index f350825..afe8e8d 100644
--- a/ui/gfx/x/event.cc
+++ b/ui/gfx/x/event.cc
@@ -19,10 +19,10 @@
 
 Event::Event() = default;
 
-Event::Event(scoped_refptr<UnsizedRefCountedMemory> event_bytes,
+Event::Event(scoped_refptr<base::RefCountedMemory> event_bytes,
              Connection* connection) {
-  auto* xcb_event =
-      reinterpret_cast<xcb_generic_event_t*>(event_bytes->bytes());
+  auto* xcb_event = reinterpret_cast<xcb_generic_event_t*>(
+      const_cast<uint8_t*>(event_bytes->data()));
   uint8_t response_type = xcb_event->response_type & ~kSendEventMask;
   if (xcb_event->response_type & kSendEventMask) {
     send_event_ = true;
@@ -38,7 +38,7 @@
     const size_t extended_length = ge->length * 4;
     memmove(&ge->full_sequence, &ge[1], extended_length);
   }
-  connection->GetEventTypeAndOp(event_bytes->bytes(), &type_id_, &opcode_);
+  connection->GetEventTypeAndOp(event_bytes->data(), &type_id_, &opcode_);
   if (type_id_) {
     raw_event_ = event_bytes;
   }
diff --git a/ui/gfx/x/event.h b/ui/gfx/x/event.h
index 8667ab5..5b5ff4dd 100644
--- a/ui/gfx/x/event.h
+++ b/ui/gfx/x/event.h
@@ -45,7 +45,7 @@
 
   // |event_bytes| is modified and will not be valid after this call.
   // A copy is necessary if the original data is still needed.
-  Event(scoped_refptr<UnsizedRefCountedMemory> event_bytes,
+  Event(scoped_refptr<base::RefCountedMemory> event_bytes,
         Connection* connection);
 
   Event(const Event&) = delete;
@@ -110,7 +110,7 @@
   uint32_t sequence_ = 0;
 
   // The unparsed event, or nullptr if it's already parsed.
-  scoped_refptr<UnsizedRefCountedMemory> raw_event_;
+  scoped_refptr<base::RefCountedMemory> raw_event_;
 
   // The type-erased parsed event, or nullptr if it hasn't been parsed yet.
   std::unique_ptr<void, Deleter> event_ = {nullptr, nullptr};
diff --git a/ui/gfx/x/gen_xproto.py b/ui/gfx/x/gen_xproto.py
index 8c17455..87c4e92 100644
--- a/ui/gfx/x/gen_xproto.py
+++ b/ui/gfx/x/gen_xproto.py
@@ -379,7 +379,7 @@
         else:
             self.write('auto& %s = %s.%s;' % (field_name, obj, field_name))
 
-        if field.type.is_list and field.type.is_sized:
+        if field.type.is_list:
             len_name = field_name + '_len'
             if not self.field_from_scope(len_name):
                 len_expr = list_size(field_name, field.type)
@@ -573,7 +573,7 @@
                     self.copy_field(case_field)
 
     def declare_switch(self, field):
-        return [('std::optional<%s>' % field_type, field_name)
+        return [('absl::optional<%s>' % field_type, field_name)
                 for case in field.type.bitcases
                 for field_type, field_name in self.declare_case(case)]
 
@@ -592,10 +592,7 @@
 
         assert (t.nmemb not in (0, 1))
         if t.is_ref_counted_memory:
-            if t.is_sized:
-                type_name = 'scoped_refptr<base::RefCountedMemory>'
-            else:
-                type_name = 'scoped_refptr<UnsizedRefCountedMemory>'
+            type_name = 'scoped_refptr<base::RefCountedMemory>'
         elif t.nmemb:
             type_name = 'std::array<%s, %d>' % (type_name, t.nmemb)
         elif type_name == 'char':
@@ -612,8 +609,6 @@
         if t.is_ref_counted_memory:
             if self.is_read:
                 self.write('%s = buffer->ReadAndAdvance(%s);' % (name, size))
-            elif t.is_sized:
-                self.write('buf.AppendSizedBuffer(%s);' % (name))
             else:
                 self.write('buf.AppendBuffer(%s, %s);' % (name, size))
             return
@@ -855,7 +850,7 @@
             return []
 
         if field.type.is_switch:
-            return ['std::nullopt'] * len(self.declare_switch(field))
+            return ['absl::nullopt'] * len(self.declare_switch(field))
         if field.type.is_list or not field.type.is_container:
             return ['{}']
 
@@ -1105,7 +1100,6 @@
                 # xcb uses void* in some places to represent arbitrary data.
                 field.type.is_ref_counted_memory = (
                     not field.type.nmemb and field.field_type[0] == 'void')
-                field.type.is_sized = isinstance(t, self.xcbgen.xtypes.Request)
 
             # |for_list| and |for_switch| may have already been set when
             # processing other fields in this structure.
@@ -1231,15 +1225,15 @@
         self.write('#include <cstddef>')
         self.write('#include <cstdint>')
         self.write('#include <cstring>')
-        self.write('#include <optional>')
         self.write('#include <vector>')
         self.write()
         self.write('#include "base/component_export.h"')
+        self.write('#include "base/memory/ref_counted_memory.h"')
         self.write('#include "base/memory/scoped_refptr.h"')
+        self.write('#include "third_party/abseil-cpp/absl/types/optional.h"')
         self.write('#include "base/files/scoped_file.h"')
         self.write('#include "ui/gfx/x/ref_counted_fd.h"')
         self.write('#include "ui/gfx/x/error.h"')
-        self.write('#include "ui/gfx/x/xproto_types.h"')
         imports = set(self.module.direct_imports)
         if self.module.namespace.is_ext:
             imports.add(('xproto', 'xproto'))
diff --git a/ui/gfx/x/generated_protos/bigreq.h b/ui/gfx/x/generated_protos/bigreq.h
index 4199ab1..21632b48 100644
--- a/ui/gfx/x/generated_protos/bigreq.h
+++ b/ui/gfx/x/generated_protos/bigreq.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/dri3.cc b/ui/gfx/x/generated_protos/dri3.cc
index b882cc5e..43ad6a1 100644
--- a/ui/gfx/x/generated_protos/dri3.cc
+++ b/ui/gfx/x/generated_protos/dri3.cc
@@ -546,7 +546,9 @@
   uint32_t num_window_modifiers{};
   uint32_t num_screen_modifiers{};
   auto& window_modifiers = (*reply).window_modifiers;
+  size_t window_modifiers_len = window_modifiers.size();
   auto& screen_modifiers = (*reply).screen_modifiers;
+  size_t screen_modifiers_len = screen_modifiers.size();
 
   // response_type
   uint8_t response_type;
@@ -767,8 +769,11 @@
   auto& depth = (*reply).depth;
   auto& bpp = (*reply).bpp;
   auto& strides = (*reply).strides;
+  size_t strides_len = strides.size();
   auto& offsets = (*reply).offsets;
+  size_t offsets_len = offsets.size();
   auto& buffers = (*reply).buffers;
+  size_t buffers_len = buffers.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/dri3.h b/ui/gfx/x/generated_protos/dri3.h
index 17a1927..c15ada6 100644
--- a/ui/gfx/x/generated_protos/dri3.h
+++ b/ui/gfx/x/generated_protos/dri3.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/glx.cc b/ui/gfx/x/generated_protos/glx.cc
index 6c324c22..c2f618e 100644
--- a/ui/gfx/x/generated_protos/glx.cc
+++ b/ui/gfx/x/generated_protos/glx.cc
@@ -1576,6 +1576,7 @@
   auto& num_visuals = (*reply).num_visuals;
   auto& num_properties = (*reply).num_properties;
   auto& property_list = (*reply).property_list;
+  size_t property_list_len = property_list.size();
 
   // response_type
   uint8_t response_type;
@@ -1755,7 +1756,9 @@
   auto& sequence = (*reply).sequence;
   auto& retval = (*reply).retval;
   auto& data1 = (*reply).data1;
+  size_t data1_len = data1.size();
   auto& data2 = (*reply).data2;
+  size_t data2_len = data2.size();
 
   // response_type
   uint8_t response_type;
@@ -1917,6 +1920,7 @@
   auto& sequence = (*reply).sequence;
   uint32_t str_len{};
   auto& string = (*reply).string;
+  size_t string_len = string.size();
 
   // response_type
   uint8_t response_type;
@@ -2052,6 +2056,7 @@
   auto& num_FB_configs = (*reply).num_FB_configs;
   auto& num_properties = (*reply).num_properties;
   auto& property_list = (*reply).property_list;
+  size_t property_list_len = property_list.size();
 
   // response_type
   uint8_t response_type;
@@ -2290,6 +2295,7 @@
   auto& sequence = (*reply).sequence;
   auto& num_attribs = (*reply).num_attribs;
   auto& attribs = (*reply).attribs;
+  size_t attribs_len = attribs.size();
 
   // response_type
   uint8_t response_type;
@@ -2547,6 +2553,7 @@
   auto& sequence = (*reply).sequence;
   auto& num_attribs = (*reply).num_attribs;
   auto& attribs = (*reply).attribs;
+  size_t attribs_len = attribs.size();
 
   // response_type
   uint8_t response_type;
@@ -3295,6 +3302,7 @@
   uint32_t n{};
   auto& new_mode = (*reply).new_mode;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -3564,6 +3572,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -3645,6 +3654,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -3733,6 +3743,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -3814,6 +3825,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -3970,6 +3982,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4060,6 +4073,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4155,6 +4169,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4250,6 +4265,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4344,6 +4360,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4438,6 +4455,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4532,6 +4550,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4629,6 +4648,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4726,6 +4746,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4817,6 +4838,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4908,6 +4930,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -4999,6 +5022,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5089,6 +5113,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5169,6 +5194,7 @@
   auto& sequence = (*reply).sequence;
   uint32_t n{};
   auto& string = (*reply).string;
+  size_t string_len = string.size();
 
   // response_type
   uint8_t response_type;
@@ -5261,6 +5287,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5356,6 +5383,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5451,6 +5479,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5546,6 +5575,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5641,6 +5671,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5753,6 +5784,7 @@
   auto& height = (*reply).height;
   auto& depth = (*reply).depth;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5853,6 +5885,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -5950,6 +5983,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6052,6 +6086,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6154,6 +6189,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6429,6 +6465,7 @@
   auto& sequence = (*reply).sequence;
   auto& ret_val = (*reply).ret_val;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6558,6 +6595,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6727,6 +6765,7 @@
   auto& sequence = (*reply).sequence;
   auto& width = (*reply).width;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6821,6 +6860,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -6918,6 +6958,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7025,6 +7066,7 @@
   auto& width = (*reply).width;
   auto& height = (*reply).height;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7122,6 +7164,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7219,6 +7262,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7326,6 +7370,7 @@
   auto& row_w = (*reply).row_w;
   auto& col_h = (*reply).col_h;
   auto& rows_and_cols = (*reply).rows_and_cols;
+  size_t rows_and_cols_len = rows_and_cols.size();
 
   // response_type
   uint8_t response_type;
@@ -7436,6 +7481,7 @@
   auto& sequence = (*reply).sequence;
   auto& width = (*reply).width;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7530,6 +7576,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7627,6 +7674,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7736,6 +7784,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7824,6 +7873,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -7921,6 +7971,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -8017,6 +8068,7 @@
   auto& sequence = (*reply).sequence;
   auto& size = (*reply).size;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -8151,6 +8203,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -8311,6 +8364,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -8408,6 +8462,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -8505,6 +8560,7 @@
   uint32_t n{};
   auto& datum = (*reply).datum;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/glx.h b/ui/gfx/x/generated_protos/glx.h
index c490293..22abc481 100644
--- a/ui/gfx/x/generated_protos/glx.h
+++ b/ui/gfx/x/generated_protos/glx.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/randr.cc b/ui/gfx/x/generated_protos/randr.cc
index 9cf8763..ca85af11 100644
--- a/ui/gfx/x/generated_protos/randr.cc
+++ b/ui/gfx/x/generated_protos/randr.cc
@@ -799,7 +799,9 @@
   auto& rate = (*reply).rate;
   auto& nInfo = (*reply).nInfo;
   auto& sizes = (*reply).sizes;
+  size_t sizes_len = sizes.size();
   auto& rates = (*reply).rates;
+  size_t rates_len = rates.size();
 
   // response_type
   uint8_t response_type;
@@ -877,6 +879,7 @@
     {
       uint16_t nRates{};
       auto& rates = rates_elem.rates;
+      size_t rates_len = rates.size();
 
       // nRates
       Read(&nRates, &buf);
@@ -1082,8 +1085,11 @@
   uint16_t num_modes{};
   uint16_t names_len{};
   auto& crtcs = (*reply).crtcs;
+  size_t crtcs_len = crtcs.size();
   auto& outputs = (*reply).outputs;
+  size_t outputs_len = outputs.size();
   auto& modes = (*reply).modes;
+  size_t modes_len = modes.size();
   auto& names = (*reply).names;
 
   // response_type
@@ -1272,8 +1278,11 @@
   uint16_t num_clones{};
   uint16_t name_len{};
   auto& crtcs = (*reply).crtcs;
+  size_t crtcs_len = crtcs.size();
   auto& modes = (*reply).modes;
+  size_t modes_len = modes.size();
   auto& clones = (*reply).clones;
+  size_t clones_len = clones.size();
   auto& name = (*reply).name;
 
   // response_type
@@ -1409,6 +1418,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_atoms{};
   auto& atoms = (*reply).atoms;
+  size_t atoms_len = atoms.size();
 
   // response_type
   uint8_t response_type;
@@ -1496,6 +1506,7 @@
   auto& range = (*reply).range;
   auto& immutable = (*reply).immutable;
   auto& validValues = (*reply).validValues;
+  size_t validValues_len = validValues.size();
 
   // response_type
   uint8_t response_type;
@@ -1652,7 +1663,7 @@
   buf.Write(&num_units);
 
   // data
-  buf.AppendSizedBuffer(data);
+  buf.AppendBuffer(data, ((num_units) * (format)) / (8));
 
   Align(&buf, 4);
 
@@ -1794,6 +1805,7 @@
   auto& bytes_after = (*reply).bytes_after;
   auto& num_items = (*reply).num_items;
   auto& data = (*reply).data;
+  size_t data_len = data.size();
 
   // response_type
   uint8_t response_type;
@@ -2139,7 +2151,9 @@
   uint16_t num_outputs{};
   uint16_t num_possible_outputs{};
   auto& outputs = (*reply).outputs;
+  size_t outputs_len = outputs.size();
   auto& possible = (*reply).possible;
+  size_t possible_len = possible.size();
 
   // response_type
   uint8_t response_type;
@@ -2445,8 +2459,11 @@
   auto& sequence = (*reply).sequence;
   uint16_t size{};
   auto& red = (*reply).red;
+  size_t red_len = red.size();
   auto& green = (*reply).green;
+  size_t green_len = green.size();
   auto& blue = (*reply).blue;
+  size_t blue_len = blue.size();
 
   // response_type
   uint8_t response_type;
@@ -2617,8 +2634,11 @@
   uint16_t num_modes{};
   uint16_t names_len{};
   auto& crtcs = (*reply).crtcs;
+  size_t crtcs_len = crtcs.size();
   auto& outputs = (*reply).outputs;
+  size_t outputs_len = outputs.size();
   auto& modes = (*reply).modes;
+  size_t modes_len = modes.size();
   auto& names = (*reply).names;
 
   // response_type
@@ -2903,9 +2923,13 @@
   uint16_t current_len{};
   uint16_t current_nparams{};
   auto& pending_filter_name = (*reply).pending_filter_name;
+  size_t pending_filter_name_len = pending_filter_name.size();
   auto& pending_params = (*reply).pending_params;
+  size_t pending_params_len = pending_params.size();
   auto& current_filter_name = (*reply).current_filter_name;
+  size_t current_filter_name_len = current_filter_name.size();
   auto& current_params = (*reply).current_params;
+  size_t current_params_len = current_params.size();
 
   // response_type
   uint8_t response_type;
@@ -3470,6 +3494,7 @@
   auto& timestamp = (*reply).timestamp;
   uint16_t num_providers{};
   auto& providers = (*reply).providers;
+  size_t providers_len = providers.size();
 
   // response_type
   uint8_t response_type;
@@ -3564,9 +3589,13 @@
   uint16_t num_associated_providers{};
   uint16_t name_len{};
   auto& crtcs = (*reply).crtcs;
+  size_t crtcs_len = crtcs.size();
   auto& outputs = (*reply).outputs;
+  size_t outputs_len = outputs.size();
   auto& associated_providers = (*reply).associated_providers;
+  size_t associated_providers_len = associated_providers.size();
   auto& associated_capability = (*reply).associated_capability;
+  size_t associated_capability_len = associated_capability.size();
   auto& name = (*reply).name;
 
   // response_type
@@ -3783,6 +3812,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_atoms{};
   auto& atoms = (*reply).atoms;
+  size_t atoms_len = atoms.size();
 
   // response_type
   uint8_t response_type;
@@ -3870,6 +3900,7 @@
   auto& range = (*reply).range;
   auto& immutable = (*reply).immutable;
   auto& valid_values = (*reply).valid_values;
+  size_t valid_values_len = valid_values.size();
 
   // response_type
   uint8_t response_type;
@@ -4025,7 +4056,7 @@
   buf.Write(&num_items);
 
   // data
-  buf.AppendSizedBuffer(data);
+  buf.AppendBuffer(data, (num_items) * ((format) / (8)));
 
   Align(&buf, 4);
 
@@ -4167,6 +4198,7 @@
   auto& bytes_after = (*reply).bytes_after;
   auto& num_items = (*reply).num_items;
   auto& data = (*reply).data;
+  size_t data_len = data ? data->size() : 0;
 
   // response_type
   uint8_t response_type;
@@ -4254,6 +4286,7 @@
   uint32_t nMonitors{};
   auto& nOutputs = (*reply).nOutputs;
   auto& monitors = (*reply).monitors;
+  size_t monitors_len = monitors.size();
 
   // response_type
   uint8_t response_type;
@@ -4297,6 +4330,7 @@
       auto& width_in_millimeters = monitors_elem.width_in_millimeters;
       auto& height_in_millimeters = monitors_elem.height_in_millimeters;
       auto& outputs = monitors_elem.outputs;
+      size_t outputs_len = outputs.size();
 
       // name
       Read(&name, &buf);
@@ -4380,6 +4414,7 @@
     auto& width_in_millimeters = monitorinfo.width_in_millimeters;
     auto& height_in_millimeters = monitorinfo.height_in_millimeters;
     auto& outputs = monitorinfo.outputs;
+    size_t outputs_len = outputs.size();
 
     // name
     buf.Write(&name);
diff --git a/ui/gfx/x/generated_protos/randr.h b/ui/gfx/x/generated_protos/randr.h
index 5e4cf5d..e58dac1e 100644
--- a/ui/gfx/x/generated_protos/randr.h
+++ b/ui/gfx/x/generated_protos/randr.h
@@ -33,11 +33,11 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "render.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
@@ -1134,7 +1134,7 @@
     Atom type{};
     uint32_t bytes_after{};
     uint32_t num_items{};
-    scoped_refptr<UnsizedRefCountedMemory> data{};
+    scoped_refptr<base::RefCountedMemory> data{};
   };
 
   using GetProviderPropertyResponse = Response<GetProviderPropertyReply>;
diff --git a/ui/gfx/x/generated_protos/render.cc b/ui/gfx/x/generated_protos/render.cc
index 8cc6e9e5..63623426 100644
--- a/ui/gfx/x/generated_protos/render.cc
+++ b/ui/gfx/x/generated_protos/render.cc
@@ -381,8 +381,11 @@
   auto& num_visuals = (*reply).num_visuals;
   uint32_t num_subpixel{};
   auto& formats = (*reply).formats;
+  size_t formats_len = formats.size();
   auto& screens = (*reply).screens;
+  size_t screens_len = screens.size();
   auto& subpixels = (*reply).subpixels;
+  size_t subpixels_len = subpixels.size();
 
   // response_type
   uint8_t response_type;
@@ -490,6 +493,7 @@
       uint32_t num_depths{};
       auto& fallback = screens_elem.fallback;
       auto& depths = screens_elem.depths;
+      size_t depths_len = depths.size();
 
       // num_depths
       Read(&num_depths, &buf);
@@ -505,6 +509,7 @@
           auto& depth = depths_elem.depth;
           uint16_t num_visuals{};
           auto& visuals = depths_elem.visuals;
+          size_t visuals_len = visuals.size();
 
           // depth
           Read(&depth, &buf);
@@ -599,6 +604,7 @@
   auto& sequence = (*reply).sequence;
   uint32_t num_values{};
   auto& values = (*reply).values;
+  size_t values_len = values.size();
 
   // response_type
   uint8_t response_type;
@@ -2376,7 +2382,9 @@
   uint32_t num_aliases{};
   uint32_t num_filters{};
   auto& aliases = (*reply).aliases;
+  size_t aliases_len = aliases.size();
   auto& filters = (*reply).filters;
+  size_t filters_len = filters.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/render.h b/ui/gfx/x/generated_protos/render.h
index d7c69d207..511993f 100644
--- a/ui/gfx/x/generated_protos/render.h
+++ b/ui/gfx/x/generated_protos/render.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/screensaver.h b/ui/gfx/x/generated_protos/screensaver.h
index 9778c5c..335de93 100644
--- a/ui/gfx/x/generated_protos/screensaver.h
+++ b/ui/gfx/x/generated_protos/screensaver.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/shape.h b/ui/gfx/x/generated_protos/shape.h
index 2a816501..deaca14 100644
--- a/ui/gfx/x/generated_protos/shape.h
+++ b/ui/gfx/x/generated_protos/shape.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/shm.h b/ui/gfx/x/generated_protos/shm.h
index 7eb1cc2..bed2915 100644
--- a/ui/gfx/x/generated_protos/shm.h
+++ b/ui/gfx/x/generated_protos/shm.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/sync.h b/ui/gfx/x/generated_protos/sync.h
index c630fda..d9de1c89 100644
--- a/ui/gfx/x/generated_protos/sync.h
+++ b/ui/gfx/x/generated_protos/sync.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/xfixes.cc b/ui/gfx/x/generated_protos/xfixes.cc
index 71cfb37..80bf8f37 100644
--- a/ui/gfx/x/generated_protos/xfixes.cc
+++ b/ui/gfx/x/generated_protos/xfixes.cc
@@ -446,6 +446,7 @@
   auto& yhot = (*reply).yhot;
   auto& cursor_serial = (*reply).cursor_serial;
   auto& cursor_image = (*reply).cursor_image;
+  size_t cursor_image_len = cursor_image.size();
 
   // response_type
   uint8_t response_type;
@@ -1174,6 +1175,7 @@
   auto& sequence = (*reply).sequence;
   auto& extents = (*reply).extents;
   auto& rectangles = (*reply).rectangles;
+  size_t rectangles_len = rectangles.size();
 
   // response_type
   uint8_t response_type;
@@ -1497,6 +1499,7 @@
   auto& atom = (*reply).atom;
   uint16_t nbytes{};
   auto& name = (*reply).name;
+  size_t name_len = name.size();
 
   // response_type
   uint8_t response_type;
@@ -1581,7 +1584,9 @@
   auto& cursor_atom = (*reply).cursor_atom;
   uint16_t nbytes{};
   auto& cursor_image = (*reply).cursor_image;
+  size_t cursor_image_len = cursor_image.size();
   auto& name = (*reply).name;
+  size_t name_len = name.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/xfixes.h b/ui/gfx/x/generated_protos/xfixes.h
index 00476d8..83dcef19 100644
--- a/ui/gfx/x/generated_protos/xfixes.h
+++ b/ui/gfx/x/generated_protos/xfixes.h
@@ -33,12 +33,12 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "render.h"
 #include "shape.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/generated_protos/xinput.cc b/ui/gfx/x/generated_protos/xinput.cc
index 3f63d1e..b7e566bc 100644
--- a/ui/gfx/x/generated_protos/xinput.cc
+++ b/ui/gfx/x/generated_protos/xinput.cc
@@ -49,6 +49,7 @@
   auto& num_valuators = (*event_).num_valuators;
   auto& first_valuator = (*event_).first_valuator;
   auto& valuators = (*event_).valuators;
+  size_t valuators_len = valuators.size();
 
   // response_type
   uint8_t response_type;
@@ -206,8 +207,11 @@
   auto& num_valuators = (*event_).num_valuators;
   auto& classes_reported = (*event_).classes_reported;
   auto& buttons = (*event_).buttons;
+  size_t buttons_len = buttons.size();
   auto& keys = (*event_).keys;
+  size_t keys_len = keys.size();
   auto& valuators = (*event_).valuators;
+  size_t valuators_len = valuators.size();
 
   // response_type
   uint8_t response_type;
@@ -350,6 +354,7 @@
   auto& device_id = (*event_).device_id;
   auto& sequence = (*event_).sequence;
   auto& keys = (*event_).keys;
+  size_t keys_len = keys.size();
 
   // response_type
   uint8_t response_type;
@@ -380,6 +385,7 @@
   auto& device_id = (*event_).device_id;
   auto& sequence = (*event_).sequence;
   auto& buttons = (*event_).buttons;
+  size_t buttons_len = buttons.size();
 
   // response_type
   uint8_t response_type;
@@ -496,6 +502,7 @@
   auto& sourceid = (*event_).sourceid;
   auto& reason = (*event_).reason;
   auto& classes = (*event_).classes;
+  size_t classes_len = classes.size();
 
   // response_type
   uint8_t response_type;
@@ -563,6 +570,7 @@
         data.key.emplace();
         uint16_t num_keys{};
         auto& keys = (*data.key).keys;
+        size_t keys_len = keys.size();
 
         // num_keys
         Read(&num_keys, &buf);
@@ -578,7 +586,9 @@
         data.button.emplace();
         uint16_t num_buttons{};
         auto& state = (*data.button).state;
+        size_t state_len = state.size();
         auto& labels = (*data.button).labels;
+        size_t labels_len = labels.size();
 
         // num_buttons
         Read(&num_buttons, &buf);
@@ -749,8 +759,11 @@
   auto& mods = (*event_).mods;
   auto& group = (*event_).group;
   auto& button_mask = (*event_).button_mask;
+  size_t button_mask_len = button_mask.size();
   auto& valuator_mask = (*event_).valuator_mask;
+  size_t valuator_mask_len = valuator_mask.size();
   auto& axisvalues = (*event_).axisvalues;
+  size_t axisvalues_len = axisvalues.size();
 
   // response_type
   uint8_t response_type;
@@ -1051,6 +1064,7 @@
   auto& flags = (*event_).flags;
   uint16_t num_infos{};
   auto& infos = (*event_).infos;
+  size_t infos_len = infos.size();
 
   // response_type
   uint8_t response_type;
@@ -1193,8 +1207,11 @@
   uint16_t valuators_len{};
   auto& flags = (*event_).flags;
   auto& valuator_mask = (*event_).valuator_mask;
+  size_t valuator_mask_len = valuator_mask.size();
   auto& axisvalues = (*event_).axisvalues;
+  size_t axisvalues_len = axisvalues.size();
   auto& axisvalues_raw = (*event_).axisvalues_raw;
+  size_t axisvalues_raw_len = axisvalues_raw.size();
 
   // response_type
   uint8_t response_type;
@@ -2106,7 +2123,9 @@
   uint8_t devices_len{};
   auto& devices = (*reply).devices;
   auto& infos = (*reply).infos;
+  size_t infos_len = infos.size();
   auto& names = (*reply).names;
+  size_t names_len = names.size();
 
   // response_type
   uint8_t response_type;
@@ -2329,6 +2348,7 @@
   auto& sequence = (*reply).sequence;
   uint8_t num_classes{};
   auto& class_info = (*reply).class_info;
+  size_t class_info_len = class_info.size();
 
   // response_type
   uint8_t response_type;
@@ -2599,7 +2619,9 @@
   uint16_t num_this_classes{};
   uint16_t num_all_classes{};
   auto& this_classes = (*reply).this_classes;
+  size_t this_classes_len = this_classes.size();
   auto& all_classes = (*reply).all_classes;
+  size_t all_classes_len = all_classes.size();
 
   // response_type
   uint8_t response_type;
@@ -2753,6 +2775,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_classes{};
   auto& classes = (*reply).classes;
+  size_t classes_len = classes.size();
 
   // response_type
   uint8_t response_type;
@@ -2849,6 +2872,7 @@
   auto& num_axes = (*reply).num_axes;
   auto& device_mode = (*reply).device_mode;
   auto& events = (*reply).events;
+  size_t events_len = events.size();
 
   // response_type
   uint8_t response_type;
@@ -2885,6 +2909,7 @@
     {
       auto& time = events_elem.time;
       auto& axisvalues = events_elem.axisvalues;
+      size_t axisvalues_len = axisvalues.size();
 
       // time
       Read(&time, &buf);
@@ -3773,6 +3798,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_feedbacks{};
   auto& feedbacks = (*reply).feedbacks;
+  size_t feedbacks_len = feedbacks.size();
 
   // response_type
   uint8_t response_type;
@@ -3827,6 +3853,7 @@
         auto& click = (*data.keyboard).click;
         auto& percent = (*data.keyboard).percent;
         auto& auto_repeats = (*data.keyboard).auto_repeats;
+        size_t auto_repeats_len = auto_repeats.size();
 
         // pitch
         Read(&pitch, &buf);
@@ -3881,6 +3908,7 @@
         auto& max_symbols = (*data.string).max_symbols;
         uint16_t num_keysyms{};
         auto& keysyms = (*data.string).keysyms;
+        size_t keysyms_len = keysyms.size();
 
         // max_symbols
         Read(&max_symbols, &buf);
@@ -4069,6 +4097,7 @@
     if (CaseEq(data_expr, FeedbackClass::String)) {
       uint16_t num_keysyms{};
       auto& keysyms = (*data.string).keysyms;
+      size_t keysyms_len = keysyms.size();
 
       // pad1
       Pad(&buf, 2);
@@ -4193,6 +4222,7 @@
   auto& sequence = (*reply).sequence;
   auto& keysyms_per_keycode = (*reply).keysyms_per_keycode;
   auto& keysyms = (*reply).keysyms;
+  size_t keysyms_len = keysyms.size();
 
   // response_type
   uint8_t response_type;
@@ -4338,6 +4368,7 @@
   auto& sequence = (*reply).sequence;
   auto& keycodes_per_modifier = (*reply).keycodes_per_modifier;
   auto& keymaps = (*reply).keymaps;
+  size_t keymaps_len = keymaps.size();
 
   // response_type
   uint8_t response_type;
@@ -4515,6 +4546,7 @@
   auto& sequence = (*reply).sequence;
   uint8_t map_size{};
   auto& map = (*reply).map;
+  size_t map_len = map.size();
 
   // response_type
   uint8_t response_type;
@@ -4694,6 +4726,7 @@
   auto& sequence = (*reply).sequence;
   uint8_t num_classes{};
   auto& classes = (*reply).classes;
+  size_t classes_len = classes.size();
 
   // response_type
   uint8_t response_type;
@@ -4738,6 +4771,7 @@
         data.key.emplace();
         auto& num_keys = (*data.key).num_keys;
         auto& keys = (*data.key).keys;
+        size_t keys_len = keys.size();
 
         // num_keys
         Read(&num_keys, &buf);
@@ -4755,6 +4789,7 @@
         data.button.emplace();
         auto& num_buttons = (*data.button).num_buttons;
         auto& buttons = (*data.button).buttons;
+        size_t buttons_len = buttons.size();
 
         // num_buttons
         Read(&num_buttons, &buf);
@@ -4773,6 +4808,7 @@
         uint8_t num_valuators{};
         auto& mode = (*data.valuator).mode;
         auto& valuators = (*data.valuator).valuators;
+        size_t valuators_len = valuators.size();
 
         // num_valuators
         Read(&num_valuators, &buf);
@@ -5042,8 +5078,11 @@
       data.resolution.emplace();
       uint32_t num_valuators{};
       auto& resolution_values = (*data.resolution).resolution_values;
+      size_t resolution_values_len = resolution_values.size();
       auto& resolution_min = (*data.resolution).resolution_min;
+      size_t resolution_min_len = resolution_min.size();
       auto& resolution_max = (*data.resolution).resolution_max;
+      size_t resolution_max_len = resolution_max.size();
 
       // num_valuators
       Read(&num_valuators, &buf);
@@ -5226,6 +5265,7 @@
       auto& first_valuator = (*data.resolution).first_valuator;
       uint8_t num_valuators{};
       auto& resolution_values = (*data.resolution).resolution_values;
+      size_t resolution_values_len = resolution_values.size();
 
       // first_valuator
       buf.Write(&first_valuator);
@@ -5425,6 +5465,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_atoms{};
   auto& atoms = (*reply).atoms;
+  size_t atoms_len = atoms.size();
 
   // response_type
   uint8_t response_type;
@@ -5518,6 +5559,7 @@
   auto items_expr = format;
   if (CaseEq(items_expr, PropertyFormat::c_8Bits)) {
     auto& data8 = *items.data8;
+    size_t data8_len = data8.size();
 
     // data8
     CHECK_EQ(static_cast<size_t>(num_items), data8.size());
@@ -5531,6 +5573,7 @@
   }
   if (CaseEq(items_expr, PropertyFormat::c_16Bits)) {
     auto& data16 = *items.data16;
+    size_t data16_len = data16.size();
 
     // data16
     CHECK_EQ(static_cast<size_t>(num_items), data16.size());
@@ -5544,6 +5587,7 @@
   }
   if (CaseEq(items_expr, PropertyFormat::c_32Bits)) {
     auto& data32 = *items.data32;
+    size_t data32_len = data32.size();
 
     // data32
     CHECK_EQ(static_cast<size_t>(num_items), data32.size());
@@ -5734,6 +5778,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_8Bits)) {
     items.data8.emplace();
     auto& data8 = *items.data8;
+    size_t data8_len = data8.size();
 
     // data8
     data8.resize(num_items);
@@ -5748,6 +5793,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_16Bits)) {
     items.data16.emplace();
     auto& data16 = *items.data16;
+    size_t data16_len = data16.size();
 
     // data16
     data16.resize(num_items);
@@ -5762,6 +5808,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_32Bits)) {
     items.data32.emplace();
     auto& data32 = *items.data32;
+    size_t data32_len = data32.size();
 
     // data32
     data32.resize(num_items);
@@ -6518,6 +6565,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_infos{};
   auto& infos = (*reply).infos;
+  size_t infos_len = infos.size();
 
   // response_type
   uint8_t response_type;
@@ -6552,6 +6600,7 @@
       auto& enabled = infos_elem.enabled;
       auto& name = infos_elem.name;
       auto& classes = infos_elem.classes;
+      size_t classes_len = classes.size();
 
       // deviceid
       Read(&deviceid, &buf);
@@ -6613,6 +6662,7 @@
             data.key.emplace();
             uint16_t num_keys{};
             auto& keys = (*data.key).keys;
+            size_t keys_len = keys.size();
 
             // num_keys
             Read(&num_keys, &buf);
@@ -6628,7 +6678,9 @@
             data.button.emplace();
             uint16_t num_buttons{};
             auto& state = (*data.button).state;
+            size_t state_len = state.size();
             auto& labels = (*data.button).labels;
+            size_t labels_len = labels.size();
 
             // num_buttons
             Read(&num_buttons, &buf);
@@ -7250,6 +7302,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_modifiers{};
   auto& modifiers = (*reply).modifiers;
+  size_t modifiers_len = modifiers.size();
 
   // response_type
   uint8_t response_type;
@@ -7417,6 +7470,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_properties{};
   auto& properties = (*reply).properties;
+  size_t properties_len = properties.size();
 
   // response_type
   uint8_t response_type;
@@ -7507,6 +7561,7 @@
   auto items_expr = format;
   if (CaseEq(items_expr, PropertyFormat::c_8Bits)) {
     auto& data8 = *items.data8;
+    size_t data8_len = data8.size();
 
     // data8
     CHECK_EQ(static_cast<size_t>(num_items), data8.size());
@@ -7520,6 +7575,7 @@
   }
   if (CaseEq(items_expr, PropertyFormat::c_16Bits)) {
     auto& data16 = *items.data16;
+    size_t data16_len = data16.size();
 
     // data16
     CHECK_EQ(static_cast<size_t>(num_items), data16.size());
@@ -7533,6 +7589,7 @@
   }
   if (CaseEq(items_expr, PropertyFormat::c_32Bits)) {
     auto& data32 = *items.data32;
+    size_t data32_len = data32.size();
 
     // data32
     CHECK_EQ(static_cast<size_t>(num_items), data32.size());
@@ -7715,6 +7772,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_8Bits)) {
     items.data8.emplace();
     auto& data8 = *items.data8;
+    size_t data8_len = data8.size();
 
     // data8
     data8.resize(num_items);
@@ -7729,6 +7787,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_16Bits)) {
     items.data16.emplace();
     auto& data16 = *items.data16;
+    size_t data16_len = data16.size();
 
     // data16
     data16.resize(num_items);
@@ -7743,6 +7802,7 @@
   if (CaseEq(items_expr, Input::PropertyFormat::c_32Bits)) {
     items.data32.emplace();
     auto& data32 = *items.data32;
+    size_t data32_len = data32.size();
 
     // data32
     data32.resize(num_items);
@@ -7803,6 +7863,7 @@
   auto& sequence = (*reply).sequence;
   uint16_t num_masks{};
   auto& masks = (*reply).masks;
+  size_t masks_len = masks.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/xinput.h b/ui/gfx/x/generated_protos/xinput.h
index eb8c7822..0a32b76e 100644
--- a/ui/gfx/x/generated_protos/xinput.h
+++ b/ui/gfx/x/generated_protos/xinput.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xfixes.h"
 #include "xproto.h"
 
diff --git a/ui/gfx/x/generated_protos/xkb.cc b/ui/gfx/x/generated_protos/xkb.cc
index 0fd5c93..04c2d9c 100644
--- a/ui/gfx/x/generated_protos/xkb.cc
+++ b/ui/gfx/x/generated_protos/xkb.cc
@@ -787,6 +787,7 @@
   auto& mods = (*event_).mods;
   auto& group = (*event_).group;
   auto& message = (*event_).message;
+  size_t message_len = message.size();
 
   // response_type
   uint8_t response_type;
@@ -1699,6 +1700,7 @@
   auto& accessXTimeoutValues = (*reply).accessXTimeoutValues;
   auto& enabledControls = (*reply).enabledControls;
   auto& perKeyRepeat = (*reply).perKeyRepeat;
+  size_t perKeyRepeat_len = perKeyRepeat.size();
 
   // response_type
   uint8_t response_type;
@@ -2346,6 +2348,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::KeyTypes)) {
     map.types_rtrn.emplace();
     auto& types_rtrn = *map.types_rtrn;
+    size_t types_rtrn_len = types_rtrn.size();
 
     // types_rtrn
     types_rtrn.resize(nTypes);
@@ -2359,7 +2362,9 @@
         uint8_t nMapEntries{};
         auto& hasPreserve = types_rtrn_elem.hasPreserve;
         auto& map = types_rtrn_elem.map;
+        size_t map_len = map.size();
         auto& preserve = types_rtrn_elem.preserve;
+        size_t preserve_len = preserve.size();
 
         // mods_mask
         uint8_t tmp99;
@@ -2456,6 +2461,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::KeySyms)) {
     map.syms_rtrn.emplace();
     auto& syms_rtrn = *map.syms_rtrn;
+    size_t syms_rtrn_len = syms_rtrn.size();
 
     // syms_rtrn
     syms_rtrn.resize(nKeySyms);
@@ -2463,10 +2469,12 @@
       // syms_rtrn_elem
       {
         auto& kt_index = syms_rtrn_elem.kt_index;
+        size_t kt_index_len = kt_index.size();
         auto& groupInfo = syms_rtrn_elem.groupInfo;
         auto& width = syms_rtrn_elem.width;
         uint16_t nSyms{};
         auto& syms = syms_rtrn_elem.syms;
+        size_t syms_len = syms.size();
 
         // kt_index
         for (auto& kt_index_elem : kt_index) {
@@ -2496,7 +2504,9 @@
     map.acts_rtrn_count.emplace();
     map.acts_rtrn_acts.emplace();
     auto& acts_rtrn_count = *map.acts_rtrn_count;
+    size_t acts_rtrn_count_len = acts_rtrn_count.size();
     auto& acts_rtrn_acts = *map.acts_rtrn_acts;
+    size_t acts_rtrn_acts_len = acts_rtrn_acts.size();
 
     // acts_rtrn_count
     acts_rtrn_count.resize(nKeyActions);
@@ -2518,6 +2528,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::KeyBehaviors)) {
     map.behaviors_rtrn.emplace();
     auto& behaviors_rtrn = *map.behaviors_rtrn;
+    size_t behaviors_rtrn_len = behaviors_rtrn.size();
 
     // behaviors_rtrn
     behaviors_rtrn.resize(totalKeyBehaviors);
@@ -2541,6 +2552,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::VirtualMods)) {
     map.vmods_rtrn.emplace();
     auto& vmods_rtrn = *map.vmods_rtrn;
+    size_t vmods_rtrn_len = vmods_rtrn.size();
 
     // vmods_rtrn
     vmods_rtrn.resize(PopCount(virtualMods));
@@ -2557,6 +2569,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::ExplicitComponents)) {
     map.explicit_rtrn.emplace();
     auto& explicit_rtrn = *map.explicit_rtrn;
+    size_t explicit_rtrn_len = explicit_rtrn.size();
 
     // explicit_rtrn
     explicit_rtrn.resize(totalKeyExplicit);
@@ -2582,6 +2595,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::ModifierMap)) {
     map.modmap_rtrn.emplace();
     auto& modmap_rtrn = *map.modmap_rtrn;
+    size_t modmap_rtrn_len = modmap_rtrn.size();
 
     // modmap_rtrn
     modmap_rtrn.resize(totalModMapKeys);
@@ -2607,6 +2621,7 @@
   if (CaseAnd(map_expr, Xkb::MapPart::VirtualModMap)) {
     map.vmodmap_rtrn.emplace();
     auto& vmodmap_rtrn = *map.vmodmap_rtrn;
+    size_t vmodmap_rtrn_len = vmodmap_rtrn.size();
 
     // vmodmap_rtrn
     vmodmap_rtrn.resize(totalVModMapKeys);
@@ -2781,6 +2796,7 @@
   auto values_expr = present;
   if (CaseAnd(values_expr, MapPart::KeyTypes)) {
     auto& types = *values.types;
+    size_t types_len = types.size();
 
     // types
     CHECK_EQ(static_cast<size_t>(nTypes), types.size());
@@ -2794,7 +2810,9 @@
         uint8_t nMapEntries{};
         auto& preserve = types_elem.preserve;
         auto& entries = types_elem.entries;
+        size_t entries_len = entries.size();
         auto& preserve_entries = types_elem.preserve_entries;
+        size_t preserve_entries_len = preserve_entries.size();
 
         // mask
         uint8_t tmp115;
@@ -2877,6 +2895,7 @@
   }
   if (CaseAnd(values_expr, MapPart::KeySyms)) {
     auto& syms = *values.syms;
+    size_t syms_len = syms.size();
 
     // syms
     CHECK_EQ(static_cast<size_t>(nKeySyms), syms.size());
@@ -2884,10 +2903,12 @@
       // syms_elem
       {
         auto& kt_index = syms_elem.kt_index;
+        size_t kt_index_len = kt_index.size();
         auto& groupInfo = syms_elem.groupInfo;
         auto& width = syms_elem.width;
         uint16_t nSyms{};
         auto& syms = syms_elem.syms;
+        size_t syms_len = syms.size();
 
         // kt_index
         for (auto& kt_index_elem : kt_index) {
@@ -2916,7 +2937,9 @@
   }
   if (CaseAnd(values_expr, MapPart::KeyActions)) {
     auto& actionsCount = *values.actionsCount;
+    size_t actionsCount_len = actionsCount.size();
     auto& actions = *values.actions;
+    size_t actions_len = actions.size();
 
     // actionsCount
     CHECK_EQ(static_cast<size_t>(nKeyActions), actionsCount.size());
@@ -2937,6 +2960,7 @@
   }
   if (CaseAnd(values_expr, MapPart::KeyBehaviors)) {
     auto& behaviors = *values.behaviors;
+    size_t behaviors_len = behaviors.size();
 
     // behaviors
     CHECK_EQ(static_cast<size_t>(totalKeyBehaviors), behaviors.size());
@@ -2959,6 +2983,7 @@
   }
   if (CaseAnd(values_expr, MapPart::VirtualMods)) {
     auto& vmods = *values.vmods;
+    size_t vmods_len = vmods.size();
 
     // vmods
     CHECK_EQ(static_cast<size_t>(PopCount(virtualMods)), vmods.size());
@@ -2972,6 +2997,7 @@
   }
   if (CaseAnd(values_expr, MapPart::ExplicitComponents)) {
     auto& c_explicit = *values.c_explicit;
+    size_t c_explicit_len = c_explicit.size();
 
     // c_explicit
     CHECK_EQ(static_cast<size_t>(totalKeyExplicit), c_explicit.size());
@@ -2993,6 +3019,7 @@
   }
   if (CaseAnd(values_expr, MapPart::ModifierMap)) {
     auto& modmap = *values.modmap;
+    size_t modmap_len = modmap.size();
 
     // modmap
     CHECK_EQ(static_cast<size_t>(totalModMapKeys), modmap.size());
@@ -3014,6 +3041,7 @@
   }
   if (CaseAnd(values_expr, MapPart::VirtualModMap)) {
     auto& vmodmap = *values.vmodmap;
+    size_t vmodmap_len = vmodmap.size();
 
     // vmodmap
     CHECK_EQ(static_cast<size_t>(totalVModMapKeys), vmodmap.size());
@@ -3184,7 +3212,9 @@
   uint16_t nSIRtrn{};
   auto& nTotalSI = (*reply).nTotalSI;
   auto& si_rtrn = (*reply).si_rtrn;
+  size_t si_rtrn_len = si_rtrn.size();
   auto& group_rtrn = (*reply).group_rtrn;
+  size_t group_rtrn_len = group_rtrn.size();
 
   // response_type
   uint8_t response_type;
@@ -3255,6 +3285,7 @@
       {
         auto& type = action.type;
         auto& data = action.data;
+        size_t data_len = data.size();
 
         // type
         uint8_t tmp129;
@@ -3393,6 +3424,7 @@
       {
         auto& type = action.type;
         auto& data = action.data;
+        size_t data_len = data.size();
 
         // type
         uint8_t tmp136;
@@ -3582,6 +3614,7 @@
   auto& realIndicators = (*reply).realIndicators;
   auto& nIndicators = (*reply).nIndicators;
   auto& maps = (*reply).maps;
+  size_t maps_len = maps.size();
 
   // response_type
   uint8_t response_type;
@@ -4232,6 +4265,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyTypeNames)) {
     valueList.typeNames.emplace();
     auto& typeNames = *valueList.typeNames;
+    size_t typeNames_len = typeNames.size();
 
     // typeNames
     typeNames.resize(nTypes);
@@ -4244,7 +4278,9 @@
     valueList.nLevelsPerType.emplace();
     valueList.ktLevelNames.emplace();
     auto& nLevelsPerType = *valueList.nLevelsPerType;
+    size_t nLevelsPerType_len = nLevelsPerType.size();
     auto& ktLevelNames = *valueList.ktLevelNames;
+    size_t ktLevelNames_len = ktLevelNames.size();
 
     // nLevelsPerType
     nLevelsPerType.resize(nTypes);
@@ -4268,6 +4304,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::IndicatorNames)) {
     valueList.indicatorNames.emplace();
     auto& indicatorNames = *valueList.indicatorNames;
+    size_t indicatorNames_len = indicatorNames.size();
 
     // indicatorNames
     indicatorNames.resize(PopCount(indicators));
@@ -4279,6 +4316,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::VirtualModNames)) {
     valueList.virtualModNames.emplace();
     auto& virtualModNames = *valueList.virtualModNames;
+    size_t virtualModNames_len = virtualModNames.size();
 
     // virtualModNames
     virtualModNames.resize(PopCount(virtualMods));
@@ -4290,6 +4328,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::GroupNames)) {
     valueList.groups.emplace();
     auto& groups = *valueList.groups;
+    size_t groups_len = groups.size();
 
     // groups
     groups.resize(PopCount(groupNames));
@@ -4301,6 +4340,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyNames)) {
     valueList.keyNames.emplace();
     auto& keyNames = *valueList.keyNames;
+    size_t keyNames_len = keyNames.size();
 
     // keyNames
     keyNames.resize(nKeys);
@@ -4308,6 +4348,7 @@
       // keyNames_elem
       {
         auto& name = keyNames_elem.name;
+        size_t name_len = name.size();
 
         // name
         for (auto& name_elem : name) {
@@ -4320,6 +4361,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyAliases)) {
     valueList.keyAliases.emplace();
     auto& keyAliases = *valueList.keyAliases;
+    size_t keyAliases_len = keyAliases.size();
 
     // keyAliases
     keyAliases.resize(nKeyAliases);
@@ -4327,7 +4369,9 @@
       // keyAliases_elem
       {
         auto& real = keyAliases_elem.real;
+        size_t real_len = real.size();
         auto& alias = keyAliases_elem.alias;
+        size_t alias_len = alias.size();
 
         // real
         for (auto& real_elem : real) {
@@ -4346,6 +4390,7 @@
   if (CaseAnd(valueList_expr, Xkb::NameDetail::RGNames)) {
     valueList.radioGroupNames.emplace();
     auto& radioGroupNames = *valueList.radioGroupNames;
+    size_t radioGroupNames_len = radioGroupNames.size();
 
     // radioGroupNames
     radioGroupNames.resize(nRadioGroups);
@@ -4509,6 +4554,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::KeyTypeNames)) {
     auto& typeNames = *values.typeNames;
+    size_t typeNames_len = typeNames.size();
 
     // typeNames
     CHECK_EQ(static_cast<size_t>(nTypes), typeNames.size());
@@ -4519,7 +4565,9 @@
   }
   if (CaseAnd(values_expr, NameDetail::KTLevelNames)) {
     auto& nLevelsPerType = *values.nLevelsPerType;
+    size_t nLevelsPerType_len = nLevelsPerType.size();
     auto& ktLevelNames = *values.ktLevelNames;
+    size_t ktLevelNames_len = ktLevelNames.size();
 
     // nLevelsPerType
     CHECK_EQ(static_cast<size_t>(nTypes), nLevelsPerType.size());
@@ -4542,6 +4590,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::IndicatorNames)) {
     auto& indicatorNames = *values.indicatorNames;
+    size_t indicatorNames_len = indicatorNames.size();
 
     // indicatorNames
     CHECK_EQ(static_cast<size_t>(PopCount(indicators)), indicatorNames.size());
@@ -4552,6 +4601,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::VirtualModNames)) {
     auto& virtualModNames = *values.virtualModNames;
+    size_t virtualModNames_len = virtualModNames.size();
 
     // virtualModNames
     CHECK_EQ(static_cast<size_t>(PopCount(virtualMods)),
@@ -4563,6 +4613,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::GroupNames)) {
     auto& groups = *values.groups;
+    size_t groups_len = groups.size();
 
     // groups
     CHECK_EQ(static_cast<size_t>(PopCount(groupNames)), groups.size());
@@ -4573,6 +4624,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::KeyNames)) {
     auto& keyNames = *values.keyNames;
+    size_t keyNames_len = keyNames.size();
 
     // keyNames
     CHECK_EQ(static_cast<size_t>(nKeys), keyNames.size());
@@ -4580,6 +4632,7 @@
       // keyNames_elem
       {
         auto& name = keyNames_elem.name;
+        size_t name_len = name.size();
 
         // name
         for (auto& name_elem : name) {
@@ -4591,6 +4644,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::KeyAliases)) {
     auto& keyAliases = *values.keyAliases;
+    size_t keyAliases_len = keyAliases.size();
 
     // keyAliases
     CHECK_EQ(static_cast<size_t>(nKeyAliases), keyAliases.size());
@@ -4598,7 +4652,9 @@
       // keyAliases_elem
       {
         auto& real = keyAliases_elem.real;
+        size_t real_len = real.size();
         auto& alias = keyAliases_elem.alias;
+        size_t alias_len = alias.size();
 
         // real
         for (auto& real_elem : real) {
@@ -4616,6 +4672,7 @@
   }
   if (CaseAnd(values_expr, NameDetail::RGNames)) {
     auto& radioGroupNames = *values.radioGroupNames;
+    size_t radioGroupNames_len = radioGroupNames.size();
 
     // radioGroupNames
     CHECK_EQ(static_cast<size_t>(nRadioGroups), radioGroupNames.size());
@@ -4877,11 +4934,17 @@
   uint16_t nGeometries{};
   auto& extra = (*reply).extra;
   auto& keymaps = (*reply).keymaps;
+  size_t keymaps_len = keymaps.size();
   auto& keycodes = (*reply).keycodes;
+  size_t keycodes_len = keycodes.size();
   auto& types = (*reply).types;
+  size_t types_len = types.size();
   auto& compatMaps = (*reply).compatMaps;
+  size_t compatMaps_len = compatMaps.size();
   auto& symbols = (*reply).symbols;
+  size_t symbols_len = symbols.size();
   auto& geometries = (*reply).geometries;
+  size_t geometries_len = geometries.size();
 
   // response_type
   uint8_t response_type;
@@ -4929,6 +4992,7 @@
       auto& flags = keymaps_elem.flags;
       uint16_t length{};
       auto& string = keymaps_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -4956,6 +5020,7 @@
       auto& flags = keycodes_elem.flags;
       uint16_t length{};
       auto& string = keycodes_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -4983,6 +5048,7 @@
       auto& flags = types_elem.flags;
       uint16_t length{};
       auto& string = types_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -5010,6 +5076,7 @@
       auto& flags = compatMaps_elem.flags;
       uint16_t length{};
       auto& string = compatMaps_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -5037,6 +5104,7 @@
       auto& flags = symbols_elem.flags;
       uint16_t length{};
       auto& string = symbols_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -5064,6 +5132,7 @@
       auto& flags = geometries_elem.flags;
       uint16_t length{};
       auto& string = geometries_elem.string;
+      size_t string_len = string.size();
 
       // flags
       Read(&flags, &buf);
@@ -5341,6 +5410,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::KeyTypes)) {
       map.types_rtrn.emplace();
       auto& types_rtrn = *map.types_rtrn;
+      size_t types_rtrn_len = types_rtrn.size();
 
       // types_rtrn
       types_rtrn.resize(nTypes);
@@ -5354,7 +5424,9 @@
           uint8_t nMapEntries{};
           auto& hasPreserve = types_rtrn_elem.hasPreserve;
           auto& map = types_rtrn_elem.map;
+          size_t map_len = map.size();
           auto& preserve = types_rtrn_elem.preserve;
+          size_t preserve_len = preserve.size();
 
           // mods_mask
           uint8_t tmp197;
@@ -5451,6 +5523,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::KeySyms)) {
       map.syms_rtrn.emplace();
       auto& syms_rtrn = *map.syms_rtrn;
+      size_t syms_rtrn_len = syms_rtrn.size();
 
       // syms_rtrn
       syms_rtrn.resize(nKeySyms);
@@ -5458,10 +5531,12 @@
         // syms_rtrn_elem
         {
           auto& kt_index = syms_rtrn_elem.kt_index;
+          size_t kt_index_len = kt_index.size();
           auto& groupInfo = syms_rtrn_elem.groupInfo;
           auto& width = syms_rtrn_elem.width;
           uint16_t nSyms{};
           auto& syms = syms_rtrn_elem.syms;
+          size_t syms_len = syms.size();
 
           // kt_index
           for (auto& kt_index_elem : kt_index) {
@@ -5491,7 +5566,9 @@
       map.acts_rtrn_count.emplace();
       map.acts_rtrn_acts.emplace();
       auto& acts_rtrn_count = *map.acts_rtrn_count;
+      size_t acts_rtrn_count_len = acts_rtrn_count.size();
       auto& acts_rtrn_acts = *map.acts_rtrn_acts;
+      size_t acts_rtrn_acts_len = acts_rtrn_acts.size();
 
       // acts_rtrn_count
       acts_rtrn_count.resize(nKeyActions);
@@ -5513,6 +5590,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::KeyBehaviors)) {
       map.behaviors_rtrn.emplace();
       auto& behaviors_rtrn = *map.behaviors_rtrn;
+      size_t behaviors_rtrn_len = behaviors_rtrn.size();
 
       // behaviors_rtrn
       behaviors_rtrn.resize(totalKeyBehaviors);
@@ -5536,6 +5614,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::VirtualMods)) {
       map.vmods_rtrn.emplace();
       auto& vmods_rtrn = *map.vmods_rtrn;
+      size_t vmods_rtrn_len = vmods_rtrn.size();
 
       // vmods_rtrn
       vmods_rtrn.resize(PopCount(virtualMods));
@@ -5552,6 +5631,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::ExplicitComponents)) {
       map.explicit_rtrn.emplace();
       auto& explicit_rtrn = *map.explicit_rtrn;
+      size_t explicit_rtrn_len = explicit_rtrn.size();
 
       // explicit_rtrn
       explicit_rtrn.resize(totalKeyExplicit);
@@ -5577,6 +5657,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::ModifierMap)) {
       map.modmap_rtrn.emplace();
       auto& modmap_rtrn = *map.modmap_rtrn;
+      size_t modmap_rtrn_len = modmap_rtrn.size();
 
       // modmap_rtrn
       modmap_rtrn.resize(totalModMapKeys);
@@ -5602,6 +5683,7 @@
     if (CaseAnd(map_expr, Xkb::MapPart::VirtualModMap)) {
       map.vmodmap_rtrn.emplace();
       auto& vmodmap_rtrn = *map.vmodmap_rtrn;
+      size_t vmodmap_rtrn_len = vmodmap_rtrn.size();
 
       // vmodmap_rtrn
       vmodmap_rtrn.resize(totalVModMapKeys);
@@ -5636,7 +5718,9 @@
     uint16_t nSIRtrn{};
     auto& nTotalSI = (*replies.compat_map).nTotalSI;
     auto& si_rtrn = (*replies.compat_map).si_rtrn;
+    size_t si_rtrn_len = si_rtrn.size();
     auto& group_rtrn = (*replies.compat_map).group_rtrn;
+    size_t group_rtrn_len = group_rtrn.size();
 
     // compatmap_type
     Read(&compatmap_type, &buf);
@@ -5705,6 +5789,7 @@
         {
           auto& type = action.type;
           auto& data = action.data;
+          size_t data_len = data.size();
 
           // type
           uint8_t tmp213;
@@ -5757,6 +5842,7 @@
     auto& realIndicators = (*replies.indicator_maps).realIndicators;
     uint8_t nIndicators{};
     auto& maps = (*replies.indicator_maps).maps;
+    size_t maps_len = maps.size();
 
     // indicatormap_type
     Read(&indicatormap_type, &buf);
@@ -5963,6 +6049,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyTypeNames)) {
       valueList.typeNames.emplace();
       auto& typeNames = *valueList.typeNames;
+      size_t typeNames_len = typeNames.size();
 
       // typeNames
       typeNames.resize(nTypes);
@@ -5975,7 +6062,9 @@
       valueList.nLevelsPerType.emplace();
       valueList.ktLevelNames.emplace();
       auto& nLevelsPerType = *valueList.nLevelsPerType;
+      size_t nLevelsPerType_len = nLevelsPerType.size();
       auto& ktLevelNames = *valueList.ktLevelNames;
+      size_t ktLevelNames_len = ktLevelNames.size();
 
       // nLevelsPerType
       nLevelsPerType.resize(nTypes);
@@ -5999,6 +6088,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::IndicatorNames)) {
       valueList.indicatorNames.emplace();
       auto& indicatorNames = *valueList.indicatorNames;
+      size_t indicatorNames_len = indicatorNames.size();
 
       // indicatorNames
       indicatorNames.resize(PopCount(indicators));
@@ -6010,6 +6100,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::VirtualModNames)) {
       valueList.virtualModNames.emplace();
       auto& virtualModNames = *valueList.virtualModNames;
+      size_t virtualModNames_len = virtualModNames.size();
 
       // virtualModNames
       virtualModNames.resize(PopCount(virtualMods));
@@ -6021,6 +6112,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::GroupNames)) {
       valueList.groups.emplace();
       auto& groups = *valueList.groups;
+      size_t groups_len = groups.size();
 
       // groups
       groups.resize(PopCount(groupNames));
@@ -6032,6 +6124,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyNames)) {
       valueList.keyNames.emplace();
       auto& keyNames = *valueList.keyNames;
+      size_t keyNames_len = keyNames.size();
 
       // keyNames
       keyNames.resize(nKeys);
@@ -6039,6 +6132,7 @@
         // keyNames_elem
         {
           auto& name = keyNames_elem.name;
+          size_t name_len = name.size();
 
           // name
           for (auto& name_elem : name) {
@@ -6051,6 +6145,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::KeyAliases)) {
       valueList.keyAliases.emplace();
       auto& keyAliases = *valueList.keyAliases;
+      size_t keyAliases_len = keyAliases.size();
 
       // keyAliases
       keyAliases.resize(nKeyAliases);
@@ -6058,7 +6153,9 @@
         // keyAliases_elem
         {
           auto& real = keyAliases_elem.real;
+          size_t real_len = real.size();
           auto& alias = keyAliases_elem.alias;
+          size_t alias_len = alias.size();
 
           // real
           for (auto& real_elem : real) {
@@ -6077,6 +6174,7 @@
     if (CaseAnd(valueList_expr, Xkb::NameDetail::RGNames)) {
       valueList.radioGroupNames.emplace();
       auto& radioGroupNames = *valueList.radioGroupNames;
+      size_t radioGroupNames_len = radioGroupNames.size();
 
       // radioGroupNames
       radioGroupNames.resize(nRadioGroups);
@@ -6161,7 +6259,9 @@
     {
       uint16_t length{};
       auto& string = labelFont.string;
+      size_t string_len = string.size();
       auto& alignment_pad = labelFont.alignment_pad;
+      size_t alignment_pad_len = alignment_pad ? alignment_pad->size() : 0;
 
       // length
       Read(&length, &buf);
@@ -6281,8 +6381,11 @@
   auto& devType = (*reply).devType;
   uint16_t nameLen{};
   auto& name = (*reply).name;
+  size_t name_len = name.size();
   auto& btnActions = (*reply).btnActions;
+  size_t btnActions_len = btnActions.size();
   auto& leds = (*reply).leds;
+  size_t leds_len = leds.size();
 
   // response_type
   uint8_t response_type;
@@ -6378,7 +6481,9 @@
       auto& physIndicators = leds_elem.physIndicators;
       auto& state = leds_elem.state;
       auto& names = leds_elem.names;
+      size_t names_len = names.size();
       auto& maps = leds_elem.maps;
+      size_t maps_len = maps.size();
 
       // ledClass
       uint16_t tmp234;
@@ -6537,7 +6642,9 @@
       auto& physIndicators = leds_elem.physIndicators;
       auto& state = leds_elem.state;
       auto& names = leds_elem.names;
+      size_t names_len = names.size();
       auto& maps = leds_elem.maps;
+      size_t maps_len = maps.size();
 
       // ledClass
       uint16_t tmp244;
diff --git a/ui/gfx/x/generated_protos/xkb.h b/ui/gfx/x/generated_protos/xkb.h
index c18d756..b1bb8a5 100644
--- a/ui/gfx/x/generated_protos/xkb.h
+++ b/ui/gfx/x/generated_protos/xkb.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
@@ -557,7 +557,7 @@
     }
 
     std::string string{};
-    scoped_refptr<UnsizedRefCountedMemory> alignment_pad{};
+    scoped_refptr<base::RefCountedMemory> alignment_pad{};
   };
 
   struct KTMapEntry {
diff --git a/ui/gfx/x/generated_protos/xproto.cc b/ui/gfx/x/generated_protos/xproto.cc
index c3866c8..08f573da 100644
--- a/ui/gfx/x/generated_protos/xproto.cc
+++ b/ui/gfx/x/generated_protos/xproto.cc
@@ -820,6 +820,7 @@
   auto& buf = *buffer;
 
   auto& keys = (*event_).keys;
+  size_t keys_len = keys.size();
 
   // response_type
   uint8_t response_type;
@@ -4125,7 +4126,7 @@
   buf.Write(&data_len);
 
   // data
-  buf.AppendSizedBuffer(data);
+  buf.AppendBuffer(data, ((data_len) * (format)) / (8));
 
   Align(&buf, 4);
 
@@ -5694,6 +5695,7 @@
 
   auto& sequence = (*reply).sequence;
   auto& keys = (*reply).keys;
+  size_t keys_len = keys.size();
 
   // response_type
   uint8_t response_type;
@@ -8242,7 +8244,7 @@
   Pad(&buf, 2);
 
   // data
-  buf.AppendSizedBuffer(data);
+  buf.AppendBuffer(data, data_len);
 
   Align(&buf, 4);
 
@@ -8336,6 +8338,7 @@
   auto& sequence = (*reply).sequence;
   auto& visual = (*reply).visual;
   auto& data = (*reply).data;
+  size_t data_len = data ? data->size() : 0;
 
   // response_type
   uint8_t response_type;
@@ -10276,6 +10279,7 @@
   auto& keysyms_per_keycode = (*reply).keysyms_per_keycode;
   auto& sequence = (*reply).sequence;
   auto& keysyms = (*reply).keysyms;
+  size_t keysyms_len = keysyms.size();
 
   // response_type
   uint8_t response_type;
@@ -10464,6 +10468,7 @@
   auto& bell_pitch = (*reply).bell_pitch;
   auto& bell_duration = (*reply).bell_duration;
   auto& auto_repeats = (*reply).auto_repeats;
+  size_t auto_repeats_len = auto_repeats.size();
 
   // response_type
   uint8_t response_type;
@@ -11374,6 +11379,7 @@
   auto& keycodes_per_modifier = (*reply).keycodes_per_modifier;
   auto& sequence = (*reply).sequence;
   auto& keycodes = (*reply).keycodes;
+  size_t keycodes_len = keycodes.size();
 
   // response_type
   uint8_t response_type;
diff --git a/ui/gfx/x/generated_protos/xproto.h b/ui/gfx/x/generated_protos/xproto.h
index f820adbd3..7722813 100644
--- a/ui/gfx/x/generated_protos/xproto.h
+++ b/ui/gfx/x/generated_protos/xproto.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 
 namespace x11 {
 
@@ -1696,7 +1696,7 @@
   Atom type{};
   uint32_t bytes_after{};
   uint32_t value_len{};
-  scoped_refptr<UnsizedRefCountedMemory> value{};
+  scoped_refptr<base::RefCountedMemory> value{};
 };
 
 using GetPropertyResponse = Response<GetPropertyReply>;
@@ -2298,7 +2298,7 @@
   uint8_t depth{};
   uint16_t sequence{};
   VisualId visual{};
-  scoped_refptr<UnsizedRefCountedMemory> data{};
+  scoped_refptr<base::RefCountedMemory> data{};
 };
 
 using GetImageResponse = Response<GetImageReply>;
diff --git a/ui/gfx/x/generated_protos/xtest.h b/ui/gfx/x/generated_protos/xtest.h
index 178e9655..da67d78c 100644
--- a/ui/gfx/x/generated_protos/xtest.h
+++ b/ui/gfx/x/generated_protos/xtest.h
@@ -33,10 +33,10 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "ui/gfx/x/error.h"
 #include "ui/gfx/x/ref_counted_fd.h"
-#include "ui/gfx/x/xproto_types.h"
 #include "xproto.h"
 
 namespace x11 {
diff --git a/ui/gfx/x/property_cache.h b/ui/gfx/x/property_cache.h
index bcaa468..d9ec464 100644
--- a/ui/gfx/x/property_cache.h
+++ b/ui/gfx/x/property_cache.h
@@ -53,7 +53,7 @@
     if (size) {
       *size = response->value_len;
     }
-    return response->value->cast_to<T>();
+    return response->value->front_as<T>();
   }
 
   template <typename T>
diff --git a/ui/gfx/x/property_cache_unittest.cc b/ui/gfx/x/property_cache_unittest.cc
index fefe1bc..bdd53893 100644
--- a/ui/gfx/x/property_cache_unittest.cc
+++ b/ui/gfx/x/property_cache_unittest.cc
@@ -135,7 +135,7 @@
   EXPECT_EQ(response->bytes_after, 0u);
   EXPECT_EQ(response->format, 32);
   EXPECT_EQ(response->type, Atom::CARDINAL);
-  EXPECT_EQ(*response->value->cast_to<uint32_t>(), 1234u);
+  EXPECT_EQ(*response->value->front_as<uint32_t>(), 1234u);
   EXPECT_EQ(response->value_len, 1u);
 
   // GetAs() should do the same thing as Get().
diff --git a/ui/gfx/x/window_cache.cc b/ui/gfx/x/window_cache.cc
index 74f5d22..b374f6f 100644
--- a/ui/gfx/x/window_cache.cc
+++ b/ui/gfx/x/window_cache.cc
@@ -384,7 +384,7 @@
     } else if (atom == gtk_frame_extents_) {
       if (response->format == CHAR_BIT * sizeof(int32_t) &&
           response->value_len == 4) {
-        const int32_t* frame_extents = response->value->cast_to<int32_t>();
+        const int32_t* frame_extents = response->value->front_as<int32_t>();
         info->gtk_frame_extents_px =
             gfx::Insets::TLBR(frame_extents[2], frame_extents[0],
                               frame_extents[3], frame_extents[1]);
diff --git a/ui/gfx/x/xproto_internal.cc b/ui/gfx/x/xproto_internal.cc
index c9eac9a62..b4668cba 100644
--- a/ui/gfx/x/xproto_internal.cc
+++ b/ui/gfx/x/xproto_internal.cc
@@ -11,45 +11,49 @@
 namespace x11 {
 
 MallocedRefCountedMemory::MallocedRefCountedMemory(void* data)
-    : data_(static_cast<uint8_t*>(data)) {}
+    : data_(reinterpret_cast<uint8_t*>(data)) {}
+
+const uint8_t* MallocedRefCountedMemory::front() const {
+  return data_.get();
+}
+
+size_t MallocedRefCountedMemory::size() const {
+  // There's no easy way to tell how large malloc'ed data is.
+  NOTREACHED();
+  return 0;
+}
 
 MallocedRefCountedMemory::~MallocedRefCountedMemory() = default;
 
-void* MallocedRefCountedMemory::data() {
-  return data_.get();
-}
-
-const void* MallocedRefCountedMemory::data() const {
-  return data_.get();
-}
-
 OffsetRefCountedMemory::OffsetRefCountedMemory(
-    scoped_refptr<UnsizedRefCountedMemory> memory,
+    scoped_refptr<base::RefCountedMemory> memory,
     size_t offset,
     size_t size)
-    : memory_(memory), offset_(offset) {}
+    : memory_(memory), offset_(offset), size_(size) {}
+
+const uint8_t* OffsetRefCountedMemory::front() const {
+  return memory_->front() + offset_;
+}
+
+size_t OffsetRefCountedMemory::size() const {
+  return size_;
+}
 
 OffsetRefCountedMemory::~OffsetRefCountedMemory() = default;
 
-void* OffsetRefCountedMemory::data() {
-  return memory_->bytes() + offset_;
+UnretainedRefCountedMemory::UnretainedRefCountedMemory(const void* data)
+    : data_(reinterpret_cast<const uint8_t*>(data)) {}
+
+const uint8_t* UnretainedRefCountedMemory::front() const {
+  return data_;
 }
 
-const void* OffsetRefCountedMemory::data() const {
-  return memory_->bytes() + offset_;
+size_t UnretainedRefCountedMemory::size() const {
+  // There's no easy way to tell how large malloc'ed data is.
+  NOTREACHED();
+  return 0;
 }
 
-UnretainedRefCountedMemory::UnretainedRefCountedMemory(void* data)
-    : data_(data) {}
-
 UnretainedRefCountedMemory::~UnretainedRefCountedMemory() = default;
 
-void* UnretainedRefCountedMemory::data() {
-  return data_;
-}
-
-const void* UnretainedRefCountedMemory::data() const {
-  return data_;
-}
-
 }  // namespace x11
diff --git a/ui/gfx/x/xproto_internal.h b/ui/gfx/x/xproto_internal.h
index 56a7d695..8ee3813 100644
--- a/ui/gfx/x/xproto_internal.h
+++ b/ui/gfx/x/xproto_internal.h
@@ -43,15 +43,19 @@
 
 // Calls free() on the underlying data when the count drops to 0.
 class COMPONENT_EXPORT(X11) MallocedRefCountedMemory
-    : public UnsizedRefCountedMemory {
+    : public base::RefCountedMemory {
  public:
   explicit MallocedRefCountedMemory(void* data);
 
   MallocedRefCountedMemory(const MallocedRefCountedMemory&) = delete;
   MallocedRefCountedMemory& operator=(const MallocedRefCountedMemory&) = delete;
 
+  const uint8_t* front() const override;
+
+  size_t size() const override;
+
  private:
-  struct Deleter {
+  struct deleter {
     void operator()(uint8_t* data) {
       if (data) {
         free(data);
@@ -60,64 +64,61 @@
   };
   ~MallocedRefCountedMemory() override;
 
-  // UnsizedRefCountedMemory:
-  void* data() LIFETIME_BOUND override;
-  const void* data() const LIFETIME_BOUND override;
-
-  std::unique_ptr<uint8_t[], Deleter> data_;
+  std::unique_ptr<uint8_t, deleter> data_;
 };
 
 // Wraps another RefCountedMemory, giving a view into it.  Similar to
 // base::StringPiece, the data is some contiguous subarray, but unlike
 // StringPiece, a counted reference is kept on the underlying memory.
 class COMPONENT_EXPORT(X11) OffsetRefCountedMemory
-    : public UnsizedRefCountedMemory {
+    : public base::RefCountedMemory {
  public:
-  OffsetRefCountedMemory(scoped_refptr<UnsizedRefCountedMemory> memory,
+  OffsetRefCountedMemory(scoped_refptr<base::RefCountedMemory> memory,
                          size_t offset,
                          size_t size);
 
   OffsetRefCountedMemory(const OffsetRefCountedMemory&) = delete;
   OffsetRefCountedMemory& operator=(const OffsetRefCountedMemory&) = delete;
 
+  const uint8_t* front() const override;
+
+  size_t size() const override;
+
  private:
   ~OffsetRefCountedMemory() override;
 
-  // UnsizedRefCountedMemory:
-  void* data() LIFETIME_BOUND override;
-  const void* data() const LIFETIME_BOUND override;
-
-  scoped_refptr<UnsizedRefCountedMemory> memory_;
+  scoped_refptr<base::RefCountedMemory> memory_;
   size_t offset_;
+  size_t size_;
 };
 
 // Wraps a bare pointer and does not take any action when the reference count
 // reaches 0.  This is used to wrap stack-alloctaed or persistent data so we can
 // pass those to Read/ReadEvent/ReadReply which expect RefCountedMemory.
 class COMPONENT_EXPORT(X11) UnretainedRefCountedMemory
-    : public UnsizedRefCountedMemory {
+    : public base::RefCountedMemory {
  public:
-  explicit UnretainedRefCountedMemory(void* data);
+  explicit UnretainedRefCountedMemory(const void* data);
 
   UnretainedRefCountedMemory(const UnretainedRefCountedMemory&) = delete;
   UnretainedRefCountedMemory& operator=(const UnretainedRefCountedMemory&) =
       delete;
 
+  const uint8_t* front() const override;
+
+  size_t size() const override;
+
  private:
   ~UnretainedRefCountedMemory() override;
 
-  // UnsizedRefCountedMemory:
-  void* data() LIFETIME_BOUND override;
-  const void* data() const LIFETIME_BOUND override;
-
-  raw_ptr<void> data_;
+  const uint8_t* const data_;
 };
 
 template <typename T>
 void Read(T* t, ReadBuffer* buf) {
   static_assert(std::is_trivially_copyable<T>::value, "");
   detail::VerifyAlignment(t, buf->offset);
-  memcpy(t, buf->data->bytes() + buf->offset, sizeof(*t));
+  memcpy(t, buf->data->data() + buf->offset, sizeof(*t));
   buf->offset += sizeof(*t);
 }
 
diff --git a/ui/gfx/x/xproto_types.cc b/ui/gfx/x/xproto_types.cc
index 3f4a1b3..5cdc104f 100644
--- a/ui/gfx/x/xproto_types.cc
+++ b/ui/gfx/x/xproto_types.cc
@@ -25,34 +25,7 @@
 
 }  // namespace
 
-ThrowAwaySizeRefCountedMemory::ThrowAwaySizeRefCountedMemory(
-    std::vector<uint8_t> data)
-    : data_(std::move(data)) {}
-
-ThrowAwaySizeRefCountedMemory::~ThrowAwaySizeRefCountedMemory() = default;
-
-void* ThrowAwaySizeRefCountedMemory::data() {
-  return data_.data();
-}
-
-const void* ThrowAwaySizeRefCountedMemory::data() const {
-  return data_.data();
-}
-
-SizedRefCountedMemory::SizedRefCountedMemory(
-    scoped_refptr<UnsizedRefCountedMemory> mem,
-    size_t size)
-    : mem_(std::move(mem)), size_(size) {}
-
-SizedRefCountedMemory::~SizedRefCountedMemory() = default;
-
-base::span<const uint8_t> SizedRefCountedMemory::AsSpan() const {
-  // SAFETY: This relies on the constructor being called with a valid buffer
-  // and size pair.
-  return UNSAFE_BUFFERS(base::span(mem_->bytes(), size_));
-}
-
-ReadBuffer::ReadBuffer(scoped_refptr<UnsizedRefCountedMemory> data,
+ReadBuffer::ReadBuffer(scoped_refptr<base::RefCountedMemory> data,
                        bool setup_message)
     : data(data) {
   // X connection setup uses a special reply without the standard header, see:
@@ -61,7 +34,7 @@
   if (setup_message)
     return;
 
-  const ReplyHeader* reply_header = data->cast_to<const ReplyHeader>();
+  const auto* reply_header = reinterpret_cast<const ReplyHeader*>(data->data());
 
   // Only replies can have FDs, not events or errors.
   if (reply_header->response_type == kResponseTypeReply) {
@@ -70,7 +43,7 @@
     size_t reply_length = 32 + 4 * reply_header->length;
 
     // libxcb stores the fds after the reply data.
-    fds = reinterpret_cast<const int*>(data->bytes() + reply_length);
+    fds = reinterpret_cast<const int*>(data->data() + reply_length);
   }
 }
 
@@ -78,7 +51,7 @@
 
 ReadBuffer::~ReadBuffer() = default;
 
-scoped_refptr<UnsizedRefCountedMemory> ReadBuffer::ReadAndAdvance(
+scoped_refptr<base::RefCountedMemory> ReadBuffer::ReadAndAdvance(
     size_t length) {
   auto buf = base::MakeRefCounted<OffsetRefCountedMemory>(data, offset, length);
   offset += length;
@@ -95,41 +68,21 @@
 
 WriteBuffer::~WriteBuffer() = default;
 
-void WriteBuffer::AppendBuffer(scoped_refptr<UnsizedRefCountedMemory> buffer,
+void WriteBuffer::AppendBuffer(scoped_refptr<base::RefCountedMemory> buffer,
                                size_t size) {
   AppendCurrentBuffer();
-  sized_buffers_.push_back(
-      // SAFETY: This relies on the caller to pass a correct size.
-      UNSAFE_BUFFERS(base::span(buffer->bytes(), size)));
-  owned_buffers_.push_back(buffer);
+  buffers_.push_back(buffer);
   offset_ += size;
 }
 
-void WriteBuffer::AppendSizedBuffer(
-    scoped_refptr<base::RefCountedMemory> buffer) {
-  AppendCurrentBuffer();
-  std::vector<uint8_t> v(buffer->size());
-  base::span(v).copy_from(*buffer);
-  sized_buffers_.push_back(v);
-  owned_buffers_.push_back(ThrowAwaySizeRefCountedMemory::From(std::move(v)));
-  offset_ += buffer->size();
-}
-
-base::span<base::span<uint8_t>> WriteBuffer::GetBuffers() {
+std::vector<scoped_refptr<base::RefCountedMemory>>& WriteBuffer::GetBuffers() {
   if (!current_buffer_.empty())
     AppendCurrentBuffer();
-  return sized_buffers_;
-}
-
-void WriteBuffer::OffsetFirstBuffer(size_t offset) {
-  sized_buffers_[0u] = sized_buffers_[0u].subspan(offset);
+  return buffers_;
 }
 
 void WriteBuffer::AppendCurrentBuffer() {
-  sized_buffers_.push_back(base::span(current_buffer_));
-  owned_buffers_.push_back(
-      ThrowAwaySizeRefCountedMemory::From(std::move(current_buffer_)));
-  current_buffer_.clear();
+  buffers_.push_back(base::RefCountedBytes::TakeVector(&current_buffer_));
 }
 
 }  // namespace x11
diff --git a/ui/gfx/x/xproto_types.h b/ui/gfx/x/xproto_types.h
index 53597865..0a6256b0 100644
--- a/ui/gfx/x/xproto_types.h
+++ b/ui/gfx/x/xproto_types.h
@@ -20,92 +20,8 @@
 
 class Error;
 
-// A memory buffer where the size of the memory buffer is unknown because its
-// given as `void*` from a C api which expects us to dynamically cast it to
-// another type later. Use of this type is not sound as a mistake will cause
-// Undefined Behaviour.
-class COMPONENT_EXPORT(X11) UnsizedRefCountedMemory
-    : public base::RefCountedThreadSafe<UnsizedRefCountedMemory> {
- public:
-  uint8_t* bytes() { return cast_to<uint8_t>(); }
-  const uint8_t* bytes() const { return cast_to<const uint8_t>(); }
-
-  // Converts the inner pointer to a `T*`. If the type is incorrect, this
-  // results in Undefined Behaviour.
-  template <class T>
-  T* cast_to() {
-    return reinterpret_cast<T*>(data());
-  }
-  template <class T>
-    requires(std::is_const_v<T>)
-  T* cast_to() const {
-    return reinterpret_cast<T*>(data());
-  }
-
- protected:
-  friend class base::RefCountedThreadSafe<UnsizedRefCountedMemory>;
-  virtual ~UnsizedRefCountedMemory() = default;
-
-  virtual void* data() LIFETIME_BOUND = 0;
-  virtual const void* data() const LIFETIME_BOUND = 0;
-};
-
-// Convert from a sized memory buffer to an unsized one, in order to use the
-// buffer in void* APIs that pass the size separately.
-class COMPONENT_EXPORT(X11) ThrowAwaySizeRefCountedMemory final
-    : public UnsizedRefCountedMemory {
- public:
-  static scoped_refptr<ThrowAwaySizeRefCountedMemory> From(
-      std::vector<uint8_t> data) {
-    return new ThrowAwaySizeRefCountedMemory(std::move(data));
-  }
-
-  ThrowAwaySizeRefCountedMemory(const ThrowAwaySizeRefCountedMemory&) = delete;
-  ThrowAwaySizeRefCountedMemory& operator=(
-      const ThrowAwaySizeRefCountedMemory&) = delete;
-
- private:
-  explicit ThrowAwaySizeRefCountedMemory(std::vector<uint8_t> data);
-
-  // UnsizedRefCountedMemory:
-  void* data() LIFETIME_BOUND override;
-  const void* data() const LIFETIME_BOUND override;
-
-  ~ThrowAwaySizeRefCountedMemory() override;
-
-  std::vector<uint8_t> data_;
-};
-
-// Convert from an unsized memory buffer to a sized one, by specifying the size.
-class COMPONENT_EXPORT(X11) SizedRefCountedMemory final
-    : public base::RefCountedMemory {
- public:
-  // Safety: The caller must ensure that the `mem` buffer points to at least
-  // `size` many bytes or Undefined Behaviour can result.
-  UNSAFE_BUFFER_USAGE static scoped_refptr<SizedRefCountedMemory> From(
-      scoped_refptr<UnsizedRefCountedMemory> mem,
-      size_t size) {
-    return new SizedRefCountedMemory(std::move(mem), size);
-  }
-
-  SizedRefCountedMemory(const SizedRefCountedMemory&) = delete;
-  SizedRefCountedMemory& operator=(const SizedRefCountedMemory&) = delete;
-
- private:
-  SizedRefCountedMemory(scoped_refptr<UnsizedRefCountedMemory> mem,
-                        size_t size);
-
-  // RefCountedMemory:
-  base::span<const uint8_t> AsSpan() const LIFETIME_BOUND override;
-
-  ~SizedRefCountedMemory() override;
-
-  scoped_refptr<UnsizedRefCountedMemory> mem_;
-  size_t size_;
-};
-
-using RawReply = scoped_refptr<UnsizedRefCountedMemory>;
-using RawError = scoped_refptr<UnsizedRefCountedMemory>;
+using RawReply = scoped_refptr<base::RefCountedMemory>;
+using RawError = scoped_refptr<base::RefCountedMemory>;
 using ResponseCallback =
     base::OnceCallback<void(RawReply reply, std::unique_ptr<Error> error)>;
 
@@ -130,7 +46,7 @@
 
 // Wraps data read from the connection.
 struct COMPONENT_EXPORT(X11) ReadBuffer {
-  explicit ReadBuffer(scoped_refptr<UnsizedRefCountedMemory> data,
+  explicit ReadBuffer(scoped_refptr<base::RefCountedMemory> data,
                       bool setup_message = false);
 
   ReadBuffer(const ReadBuffer&) = delete;
@@ -138,11 +54,11 @@
 
   ~ReadBuffer();
 
-  scoped_refptr<UnsizedRefCountedMemory> ReadAndAdvance(size_t length);
+  scoped_refptr<base::RefCountedMemory> ReadAndAdvance(size_t length);
 
   int TakeFd();
 
-  scoped_refptr<UnsizedRefCountedMemory> data;
+  scoped_refptr<base::RefCountedMemory> data;
   size_t offset = 0;
   raw_ptr<const int, AllowPtrArithmetic> fds = nullptr;
 };
@@ -157,17 +73,9 @@
 
   ~WriteBuffer();
 
-  // Safety: The `buffer` must point to at least `size` many bytes.
-  UNSAFE_BUFFER_USAGE void AppendBuffer(
-      scoped_refptr<UnsizedRefCountedMemory> buffer,
-      size_t size);
+  void AppendBuffer(scoped_refptr<base::RefCountedMemory> buffer, size_t size);
 
-  void AppendSizedBuffer(scoped_refptr<base::RefCountedMemory> buffer);
-
-  base::span<base::span<uint8_t>> GetBuffers();
-
-  // Advance the pointer in the first buffer by `offset`.
-  void OffsetFirstBuffer(size_t offset);
+  std::vector<scoped_refptr<base::RefCountedMemory>>& GetBuffers();
 
   size_t offset() const { return offset_; }
 
@@ -185,8 +93,7 @@
  private:
   void AppendCurrentBuffer();
 
-  std::vector<scoped_refptr<UnsizedRefCountedMemory>> owned_buffers_;
-  std::vector<base::span<uint8_t>> sized_buffers_;
+  std::vector<scoped_refptr<base::RefCountedMemory>> buffers_;
   std::vector<uint8_t> current_buffer_;
   size_t offset_ = 0;
   std::vector<int> fds_;
diff --git a/ui/ozone/platform/wayland/host/wayland_clipboard.cc b/ui/ozone/platform/wayland/host/wayland_clipboard.cc
index f25c794..5f56dab4 100644
--- a/ui/ozone/platform/wayland/host/wayland_clipboard.cc
+++ b/ui/ozone/platform/wayland/host/wayland_clipboard.cc
@@ -189,9 +189,8 @@
     auto it = offered_data_.find(mime_type);
     if (it == offered_data_.end() && mime_type == ui::kMimeTypeTextUtf8)
       it = offered_data_.find(ui::kMimeTypeText);
-    if (it != offered_data_.end()) {
-      *contents = base::as_string_view(*it->second);
-    }
+    if (it != offered_data_.end())
+      contents->assign(it->second->data().begin(), it->second->data().end());
   }
 
   // The device manager used to access data device and create data sources.
diff --git a/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc b/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
index fd5153c..38664a8 100644
--- a/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
@@ -366,7 +366,7 @@
   base::MockCallback<PlatformClipboard::RequestDataClosure> callback;
   EXPECT_CALL(callback, Run(_)).WillOnce([&text](PlatformClipboard::Data data) {
     ASSERT_TRUE(data);
-    text = std::string(base::as_string_view(*data));
+    text = std::string(data->front_as<const char>(), data->size());
   });
 
   clipboard_->RequestClipboardData(WhichBufferToUse(), kMimeTypeTextUtf8,
@@ -391,7 +391,7 @@
   base::MockCallback<PlatformClipboard::RequestDataClosure> callback;
   EXPECT_CALL(callback, Run(_)).WillOnce([&text](PlatformClipboard::Data data) {
     ASSERT_TRUE(data);
-    text = std::string(base::as_string_view(*data));
+    text = std::string(data->front_as<const char>(), data->size());
   });
 
   clipboard_->RequestClipboardData(WhichBufferToUse(), kMimeTypeTextUtf8,
@@ -466,7 +466,7 @@
   base::MockCallback<PlatformClipboard::RequestDataClosure> got_text;
   EXPECT_CALL(got_text, Run(_)).WillOnce([&](PlatformClipboard::Data data) {
     ASSERT_NE(nullptr, data);
-    text = std::string(base::as_string_view(*data));
+    text = std::string(data->front_as<const char>(), data->size());
   });
   clipboard_->RequestClipboardData(WhichBufferToUse(), kMimeTypeTextUtf8,
                                    got_text.Get());
@@ -543,7 +543,7 @@
   std::string html;
   base::MockCallback<PlatformClipboard::RequestDataClosure> got_html;
   EXPECT_CALL(got_html, Run(_)).WillOnce([&](PlatformClipboard::Data data) {
-    html = std::string(base::as_string_view(*data));
+    html = std::string(data->front_as<const char>(), data->size());
   });
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE,
@@ -555,7 +555,7 @@
   std::string text;
   base::MockCallback<PlatformClipboard::RequestDataClosure> got_text;
   EXPECT_CALL(got_text, Run(_)).WillOnce([&](PlatformClipboard::Data data) {
-    text = std::string(base::as_string_view(*data));
+    text = std::string(data->front_as<const char>(), data->size());
   });
   clipboard_->RequestClipboardData(ClipboardBuffer::kCopyPaste, kMimeTypeText,
                                    got_text.Get());
diff --git a/ui/ozone/platform/wayland/host/wayland_exchange_data_provider.cc b/ui/ozone/platform/wayland/host/wayland_exchange_data_provider.cc
index d1f4e89..1ca2005 100644
--- a/ui/ozone/platform/wayland/host/wayland_exchange_data_provider.cc
+++ b/ui/ozone/platform/wayland/host/wayland_exchange_data_provider.cc
@@ -83,28 +83,22 @@
 template <typename StringType>
 StringType BytesTo(PlatformClipboard::Data bytes) {
   using ValueType = typename StringType::value_type;
-  const size_t bytes_size = bytes->size();
-  const size_t rounded_bytes_size =
-      bytes_size - (bytes_size % sizeof(ValueType));
-  if (bytes_size != rounded_bytes_size) {
+  if (bytes->size() % sizeof(ValueType) != 0U) {
     // This is suspicious.
     LOG(WARNING)
         << "Data is possibly truncated, or a wrong conversion is requested.";
   }
 
-  StringType result;
-  result.resize(rounded_bytes_size / sizeof(ValueType));
-  base::as_writable_byte_span(result).copy_from(
-      base::span(*bytes).first(rounded_bytes_size));
+  StringType result(bytes->front_as<ValueType>(),
+                    bytes->size() / sizeof(ValueType));
   return result;
 }
 
 void AddString(PlatformClipboard::Data data, OSExchangeDataProvider* provider) {
   DCHECK(provider);
 
-  if (data->as_vector().empty()) {
+  if (data->data().empty())
     return;
-  }
 
   provider->SetString(base::UTF8ToUTF16(BytesTo<std::string>(data)));
 }
@@ -112,9 +106,8 @@
 void AddHtml(PlatformClipboard::Data data, OSExchangeDataProvider* provider) {
   DCHECK(provider);
 
-  if (data->as_vector().empty()) {
+  if (data->data().empty())
     return;
-  }
 
   provider->SetHtml(base::UTF8ToUTF16(BytesTo<std::string>(data)), GURL());
 }
@@ -174,9 +167,8 @@
 void AddUrl(PlatformClipboard::Data data, OSExchangeDataProvider* provider) {
   DCHECK(provider);
 
-  if (data->as_vector().empty()) {
+  if (data->data().empty())
     return;
-  }
 
   std::u16string data_as_string16 = BytesTo<std::u16string>(data);
 
@@ -204,9 +196,8 @@
 void AddSource(PlatformClipboard::Data data, OSExchangeDataProvider* provider) {
   DCHECK(provider);
 
-  if (data->as_vector().empty()) {
+  if (data->data().empty())
     return;
-  }
 
   std::string source_dte = BytesTo<std::string>(data);
   provider->SetSource(ConvertJsonToDataTransferEndpoint(source_dte));
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
index 1f95e69..bcf9cf7 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
@@ -46,7 +46,7 @@
 
 void WriteDataOnWorkerThread(base::ScopedFD fd,
                              ui::PlatformClipboard::Data data) {
-  if (!base::WriteFileDescriptor(fd.get(), data->as_vector())) {
+  if (!base::WriteFileDescriptor(fd.get(), data->data())) {
     LOG(ERROR) << "Failed to write selection data to clipboard.";
   }
 }
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc
index 1af778e..f5d99be 100644
--- a/ui/views/controls/button/md_text_button.cc
+++ b/ui/views/controls/button/md_text_button.cc
@@ -105,7 +105,22 @@
   return style_;
 }
 
-void MdTextButton::SetBgColorOverride(const std::optional<SkColor>& color) {
+void MdTextButton::SetBgColorIdOverride(
+    const std::optional<ui::ColorId> color_id) {
+  CHECK(!bg_color_override_.has_value());
+
+  if (color_id == bg_color_id_override_) {
+    return;
+  }
+  bg_color_id_override_ = color_id;
+  UpdateColors();
+  OnPropertyChanged(&bg_color_id_override_, kPropertyEffectsNone);
+}
+
+void MdTextButton::SetBgColorOverrideDeprecated(
+    const std::optional<SkColor>& color) {
+  CHECK(!bg_color_id_override_.has_value());
+
   if (color == bg_color_override_)
     return;
   bg_color_override_ = color;
@@ -113,10 +128,14 @@
   OnPropertyChanged(&bg_color_override_, kPropertyEffectsNone);
 }
 
-std::optional<SkColor> MdTextButton::GetBgColorOverride() const {
+std::optional<SkColor> MdTextButton::GetBgColorOverrideDeprecated() const {
   return bg_color_override_;
 }
 
+std::optional<ui::ColorId> MdTextButton::GetBgColorIdOverride() const {
+  return bg_color_id_override_;
+}
+
 void MdTextButton::SetCornerRadius(std::optional<float> radius) {
   if (corner_radius_ == radius)
     return;
@@ -267,7 +286,9 @@
   const ui::ColorProvider* color_provider = GetColorProvider();
   SkColor bg_color = color_provider->GetColor(ui::kColorButtonBackground);
 
-  if (bg_color_override_) {
+  if (bg_color_id_override_) {
+    bg_color = color_provider->GetColor(bg_color_id_override_.value());
+  } else if (bg_color_override_) {
     bg_color = *bg_color_override_;
   } else if (style_ == ui::ButtonStyle::kProminent) {
     bg_color = color_provider->GetColor(
@@ -364,7 +385,8 @@
 
 BEGIN_METADATA(MdTextButton)
 ADD_PROPERTY_METADATA(std::optional<float>, CornerRadius)
-ADD_PROPERTY_METADATA(std::optional<SkColor>, BgColorOverride)
+ADD_PROPERTY_METADATA(std::optional<SkColor>, BgColorOverrideDeprecated)
+ADD_PROPERTY_METADATA(std::optional<ui::ColorId>, BgColorIdOverride)
 ADD_PROPERTY_METADATA(std::optional<gfx::Insets>, CustomPadding)
 ADD_PROPERTY_METADATA(ui::ButtonStyle, Style)
 END_METADATA
diff --git a/ui/views/controls/button/md_text_button.h b/ui/views/controls/button/md_text_button.h
index 339c9ffa..4f29fa6 100644
--- a/ui/views/controls/button/md_text_button.h
+++ b/ui/views/controls/button/md_text_button.h
@@ -11,6 +11,7 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/color/color_id.h"
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/button/label_button_image_container.h"
 #include "ui/views/controls/focus_ring.h"
@@ -43,9 +44,17 @@
   void SetStyle(ui::ButtonStyle button_style);
   ui::ButtonStyle GetStyle() const;
 
-  // See |bg_color_override_|.
-  void SetBgColorOverride(const std::optional<SkColor>& color);
-  std::optional<SkColor> GetBgColorOverride() const;
+  // Sets the background color id to use. Cannot be called if
+  // `bg_color_override_` has already been set.
+  void SetBgColorIdOverride(const std::optional<ui::ColorId> color_id);
+  std::optional<ui::ColorId> GetBgColorIdOverride() const;
+
+  // Sets the background color to use. Cannot be called if
+  // `bg_color_id_override_` has already been set.
+  // TODO(crbug.com/1421316): Get rid of SkColor versions of these functions in
+  // favor of the ColorId versions.
+  void SetBgColorOverrideDeprecated(const std::optional<SkColor>& color);
+  std::optional<SkColor> GetBgColorOverrideDeprecated() const;
 
   // Override the default corner radius of the round rect used for the
   // background and ink drop effects.
@@ -87,8 +96,10 @@
 
   ui::ButtonStyle style_ = ui::ButtonStyle::kDefault;
 
-  // When set, this provides the background color.
+  // When set, this provides the background color. At most one of
+  // `bg_color_override_` or `bg_color_id_override_` can be set.
   std::optional<SkColor> bg_color_override_;
+  std::optional<ui::ColorId> bg_color_id_override_;
 
   // Used to set the corner radius of the button.
   std::optional<float> corner_radius_;
@@ -115,7 +126,8 @@
 
 BEGIN_VIEW_BUILDER(VIEWS_EXPORT, MdTextButton, LabelButton)
 VIEW_BUILDER_PROPERTY(std::optional<float>, CornerRadius)
-VIEW_BUILDER_PROPERTY(std::optional<SkColor>, BgColorOverride)
+VIEW_BUILDER_PROPERTY(std::optional<SkColor>, BgColorOverrideDeprecated)
+VIEW_BUILDER_PROPERTY(std::optional<ui::ColorId>, BgColorIdOverride)
 VIEW_BUILDER_PROPERTY(std::optional<gfx::Insets>, CustomPadding)
 VIEW_BUILDER_PROPERTY(ui::ButtonStyle, Style)
 END_VIEW_BUILDER
diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc
index d3f21972..e60f1ff 100644
--- a/ui/views/controls/scroll_view.cc
+++ b/ui/views/controls/scroll_view.cc
@@ -11,6 +11,7 @@
 #include "base/functional/bind.h"
 #include "base/i18n/rtl.h"
 #include "base/memory/raw_ptr.h"
+#include "base/notreached.h"
 #include "base/ranges/algorithm.h"
 #include "build/build_config.h"
 #include "ui/accessibility/ax_action_data.h"
@@ -619,7 +620,13 @@
 }
 
 gfx::Size ScrollView::CalculatePreferredSize() const {
-  gfx::Size size = contents_ ? contents_->GetPreferredSize({}) : gfx::Size();
+  NOTREACHED_NORETURN();
+}
+
+gfx::Size ScrollView::CalculatePreferredSize(
+    const views::SizeBounds& available_size) const {
+  gfx::Size size =
+      contents_ ? contents_->GetPreferredSize(available_size) : gfx::Size();
   if (is_bounded()) {
     size.SetToMax(gfx::Size(size.width(), min_height_));
     size.SetToMin(gfx::Size(size.width(), max_height_));
diff --git a/ui/views/controls/scroll_view.h b/ui/views/controls/scroll_view.h
index 0f13816..b4bbac4 100644
--- a/ui/views/controls/scroll_view.h
+++ b/ui/views/controls/scroll_view.h
@@ -226,7 +226,10 @@
       ScrollViewCallback callback);
 
   // View overrides:
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize() const final;
+  gfx::Size CalculatePreferredSize(
+      const views::SizeBounds& available_size) const override;
+
   int GetHeightForWidth(int width) const override;
   void Layout(PassKey) override;
   bool OnKeyPressed(const ui::KeyEvent& event) override;
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index bc62bc2d..e15e955 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -10,7 +10,6 @@
 
 #include "base/check_op.h"
 #include "base/i18n/rtl.h"
-#include "base/notreached.h"
 #include "build/build_config.h"
 #include "cc/paint/paint_flags.h"
 #include "third_party/skia/include/core/SkPath.h"
@@ -132,19 +131,21 @@
 }
 
 gfx::Size TabbedPaneTab::CalculatePreferredSize() const {
-  NOTREACHED_NORETURN() << "Use CalculatePreferredSize(SizeBounds)";
-}
-
-gfx::Size TabbedPaneTab::CalculatePreferredSize(
-    const SizeBounds& available_size) const {
   int width = preferred_title_width_ + GetInsets().width();
   if (tabbed_pane_->GetStyle() == TabbedPane::TabStripStyle::kHighlight &&
-      tabbed_pane_->GetOrientation() == TabbedPane::Orientation::kVertical) {
+      tabbed_pane_->GetOrientation() == TabbedPane::Orientation::kVertical)
     width = std::max(width, 192);
-  }
   return gfx::Size(width, 32);
 }
 
+int TabbedPaneTab::GetHeightForWidth(int w) const {
+  // Because we set the LayoutManager, it will use
+  // LayoutManager::GetPreferredHeightForWidth by default, but this is not
+  // consistent with the fixed height desired by CalculatePreferredSize, so we
+  // override it and call it manually.
+  return CalculatePreferredSize().height();
+}
+
 void TabbedPaneTab::GetAccessibleNodeData(ui::AXNodeData* data) {
   data->role = ax::mojom::Role::kTab;
   data->SetName(title_->GetText());
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.h b/ui/views/controls/tabbed_pane/tabbed_pane.h
index 3e3337a0..48f164c 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.h
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.h
@@ -176,9 +176,8 @@
   void OnMouseEntered(const ui::MouseEvent& event) override;
   void OnMouseExited(const ui::MouseEvent& event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
-  gfx::Size CalculatePreferredSize() const final;
-  gfx::Size CalculatePreferredSize(
-      const SizeBounds& available_size) const override;
+  gfx::Size CalculatePreferredSize() const override;
+  int GetHeightForWidth(int w) const override;
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
   bool HandleAccessibleAction(const ui::AXActionData& action_data) override;
   void OnFocus() override;
diff --git a/ui/views/examples/multiline_example.cc b/ui/views/examples/multiline_example.cc
index c0c3b890..af9f8a9 100644
--- a/ui/views/examples/multiline_example.cc
+++ b/ui/views/examples/multiline_example.cc
@@ -86,27 +86,28 @@
     render_text_->Draw(canvas);
   }
 
-  gfx::Size CalculatePreferredSize(
-      const SizeBounds& available_size) const override {
-    int w = available_size.width().value_or(0);
-    if (w == 0) {
-      // Turn off multiline mode to get the single-line text size, which is the
-      // preferred size for this view.
-      render_text_->SetMultiline(false);
-      gfx::Size size(render_text_->GetContentWidth(),
-                     render_text_->GetStringSize().height());
-      size.Enlarge(GetInsets().width(), GetInsets().height());
-      render_text_->SetMultiline(true);
-      return size;
-    }
+  gfx::Size CalculatePreferredSize() const override {
+    // Turn off multiline mode to get the single-line text size, which is the
+    // preferred size for this view.
+    render_text_->SetMultiline(false);
+    gfx::Size size(render_text_->GetContentWidth(),
+                   render_text_->GetStringSize().height());
+    size.Enlarge(GetInsets().width(), GetInsets().height());
+    render_text_->SetMultiline(true);
+    return size;
+  }
 
+  int GetHeightForWidth(int w) const override {
+    // TODO(ckocagil): Why does this happen?
+    if (w == 0)
+      return View::GetHeightForWidth(w);
     const gfx::Rect old_rect = render_text_->display_rect();
     gfx::Rect rect = old_rect;
     rect.set_width(w - GetInsets().width());
     render_text_->SetDisplayRect(rect);
     int height = render_text_->GetStringSize().height() + GetInsets().height();
     render_text_->SetDisplayRect(old_rect);
-    return gfx::Size(w, height);
+    return height;
   }
 
   void OnThemeChanged() override {
diff --git a/ui/views/layout/layout_types.h b/ui/views/layout/layout_types.h
index 152dc37..14e05150 100644
--- a/ui/views/layout/layout_types.h
+++ b/ui/views/layout/layout_types.h
@@ -62,10 +62,6 @@
     return is_bounded() ? std::min(this->value(), value) : value;
   }
 
-  constexpr int value_or(int defaule_value) const {
-    return is_bounded() ? value() : defaule_value;
-  }
-
   void operator+=(const SizeBound& rhs);
   void operator-=(const SizeBound& rhs);
 
diff --git a/ui/views/test/test_views.cc b/ui/views/test/test_views.cc
index 69ac753..c5dd24a8 100644
--- a/ui/views/test/test_views.cc
+++ b/ui/views/test/test_views.cc
@@ -44,16 +44,14 @@
   PreferredSizeChanged();
 }
 
-gfx::Size ProportionallySizedView::CalculatePreferredSize(
-    const SizeBounds& available_size) const {
-  if (available_size.width().is_bounded()) {
-    int w = available_size.width().value();
-    return gfx::Size(w, w * factor_);
-  } else if (preferred_width_ >= 0) {
-    return gfx::Size(preferred_width_, preferred_width_ * factor_);
-  } else {
-    return View::CalculatePreferredSize(available_size);
-  }
+int ProportionallySizedView::GetHeightForWidth(int w) const {
+  return w * factor_;
+}
+
+gfx::Size ProportionallySizedView::CalculatePreferredSize() const {
+  if (preferred_width_ >= 0)
+    return gfx::Size(preferred_width_, GetHeightForWidth(preferred_width_));
+  return View::CalculatePreferredSize();
 }
 
 BEGIN_METADATA(ProportionallySizedView)
diff --git a/ui/views/test/test_views.h b/ui/views/test/test_views.h
index 5f65e72..dfed1df 100644
--- a/ui/views/test/test_views.h
+++ b/ui/views/test/test_views.h
@@ -61,8 +61,8 @@
 
   void SetPreferredWidth(int width);
 
-  gfx::Size CalculatePreferredSize(
-      const SizeBounds& available_size) const override;
+  int GetHeightForWidth(int w) const override;
+  gfx::Size CalculatePreferredSize() const override;
 
  private:
   // The multiplicative factor between width and height, i.e.
diff --git a/ui/views/view.h b/ui/views/view.h
index c9d463c..8272680 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -1680,6 +1680,8 @@
   // when the parent is performing layout.
   // `preferred_size_` will take precedence over CalculatePreferredSize() if
   // it exists.
+  // TODO(crbug.com/1346889): Don't use this. Use the size-constrained
+  //                          CalculatePreferredSize(const SizeBounds&) instead.
   virtual gfx::Size CalculatePreferredSize() const;
 
   // Calculates the preferred size for the View given `available_size`.
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index 95a91f2..07c58c7 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -25,6 +25,7 @@
 
     icons_html_files = [
       "icons.html",
+      "icons_lit.html",
       "mwb_shared_icons.html",
     ]
 
diff --git a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts
index be977b9..b725b761 100644
--- a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts
+++ b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts
@@ -8,7 +8,7 @@
  * between an opened (expanded) and closed state.
  */
 import '../cr_icon_button/cr_icon_button.js';
-import '../icons.html.js';
+import '../icons_lit.html.js';
 
 import {focusWithoutInk} from '//resources/js/focus_without_ink.js';
 import type {PropertyValues} from '//resources/lit/v3_0/lit.rollup.js';
diff --git a/ui/webui/resources/cr_elements/icons_lit.html b/ui/webui/resources/cr_elements/icons_lit.html
new file mode 100644
index 0000000..2446651
--- /dev/null
+++ b/ui/webui/resources/cr_elements/icons_lit.html
@@ -0,0 +1,4 @@
+<!--
+Purposefully empty since this file is generated at buildtime from the
+Polymer version.
+-->