diff --git a/DEPS b/DEPS
index 1ca7e86..50b1848 100644
--- a/DEPS
+++ b/DEPS
@@ -245,15 +245,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '0ada61c87ec32c4278e8c8761da1921b5294a9b0',
+  'skia_revision': '65aae8a51ad1d6e9409c510d70e95dee8458f4d8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '28885fc56027014f3159688cd5682088e7825a98',
+  'v8_revision': '6612df902618dac79057136669578422191889fa',
   # 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': '6f1c39b52b4f6565d5353111cf7250e67feb8da1',
+  'angle_revision': 'b7d2f4478cb219d2f3dda3adbb98a7f86d8a4971',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -320,7 +320,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': 'f22f4f4bb5a7411f299fbc91992b3eb8e5319b34',
+  'devtools_frontend_revision': '9f7cf70b8a3197acd7360f67ebc8ba06e7255906',
   # 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.
@@ -356,11 +356,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '657c5ed2ba1714c0430895a274a94d6f2aeeab85',
+  'shaderc_revision': '4864297864494780c4424c625e1d987e9321ba00',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '3c3929abb191c220520e72d01e19ca65c4845a57',
+  'dawn_revision': '71ccaf9ab3aae3ac404d06dd035a92f2e84e65f7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -388,7 +388,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '8c2dd35eac5092fb74d5a673a564689aee790546',
+  'nearby_revision': '9ce7be981221037a9abfb625e9e51262c5be58c2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -641,7 +641,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'cad8e0b589df8eb430348ec8c3381a120e40112a',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'd15375511075f548d78b4070c59fac29a8ddd359',
       'condition': 'checkout_ios',
   },
 
@@ -722,7 +722,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'YYkQtTi07WSJOvBzEhcFSwODKyG4vj5btPK7cZYO-E4C',
+          'version': 'Xr1jzyMeByiYNeUOuxcecPV6Sxi2hkwNOi7Lm06OCfcC',
         },
       ],
       'dep_type': 'cipd',
@@ -733,7 +733,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'vv0rvPjomx-2SAWJ57dlqMDS07Spfn6ZNnkQs0IBujIC',
+          'version': 'U1qi64Ty0xv6z7qhT-lrQIM320BaQOpV3gzDVvo1gZgC',
         },
       ],
       'dep_type': 'cipd',
@@ -744,7 +744,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'aAODgQeSxvAljXqdRSUUy4om8Lp18cryIrtvYNsb9UwC',
+          'version': '-8eDnAUVgi-j4nXRbgrxiFQcFLryJRBGLLqplhatOMkC',
         },
       ],
       'dep_type': 'cipd',
@@ -805,7 +805,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'VTVM0sp0g6V3r0Xu657xR828R_Xr0j8TOoc3P4u8rjcC',
+          'version': 'EmIQ1bAqg5rA-0qT_leHtTk32OCMbAH8xupxqm2ZGoQC',
       },
     ],
     'condition': 'checkout_android',
@@ -1427,7 +1427,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '78be2dc30c38c08ca3eeddb83b0738efc39e4528',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e780c370b9272c36eab718bacaa100537fd8d215',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1609,7 +1609,7 @@
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb',
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@c32df39c11ce4103e175d16d6dee11ca8f74612a',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@09edcd7c680b2c0690587be7b47a30c8a575fd67',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '5e49f57a6e71a026a54eb42e366de09a4142d24e',
@@ -1648,7 +1648,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'fca7b339442bd70c5dc49bb33ee7f9466b560a97',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '6850e5bb83569e4da4cceb828b0a562036913476',
+    Var('webrtc_git') + '/src.git' + '@' + 'e59fee87fb68e590a88ba2039399ee699a2e8fef',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1730,7 +1730,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2c54b25c8fbb507c4509653d94a23e65c744ff9f',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9ab206e580df76139998be617a84e57b7703e347',
     'condition': 'checkout_src_internal',
   },
 
@@ -1760,7 +1760,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'AoGHAtTAAs7p57uFelMbgo3ZiGMWkRSXotVX89WqVtEC',
+        'version': 'MCqGg1CPAljaTtnh3YU-iPsq1_2PLfd1OgKTveC59XoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1771,7 +1771,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'qTUZ-njmx6uNJN7uSi8ZDBlfjQvaTfsKZ1UH_gEof5sC',
+        'version': 'DZEPGkpFfUmPuodH7_-D03nwKFvzE1T8-WDeo4YhsKAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
index c410e9f..a505cf38 100644
--- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc
+++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -836,10 +836,7 @@
   EXPECT_HAS_FOCUS(input_text_field());
 }
 
-// TODO(crbug.com/1229797): Switch to TEST_P and AssistantPageClamshellTest.
-// It fails with kProductivityLauncher enabled because the vertical position of
-// the suggestion chip doesn't match.
-TEST_F(AssistantPageViewTest,
+TEST_P(AssistantPageClamshellTest,
        ShouldNotScrollSuggestionChipsWhenSubmittingQuery) {
   ShowAssistantUiInTextMode();
   MockTextInteraction()
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 86ee1593..c96194c5 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1169,14 +1169,6 @@
 const base::Feature kSyncSettingsCategorization{
     "SyncSettingsCategorization", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Updates the OOBE sync consent screen
-//
-// NOTE: The feature will be rolled out via a client-side Finch trial, so the
-// actual state will vary. TODO(https://crbug.com/1227417): Migrate config in
-// chrome/browser/ash/sync/sync_consent_optional_field_trial.cc
-const base::Feature kSyncConsentOptional{"SyncConsentOptional",
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enables battery indicator for styluses in the palette tray
 const base::Feature kStylusBatteryStatus{"StylusBatteryStatus",
                                          base::FEATURE_ENABLED_BY_DEFAULT};
@@ -1849,10 +1841,6 @@
   return base::FeatureList::IsEnabled(kSyncSettingsCategorization);
 }
 
-bool IsSyncConsentOptionalEnabled() {
-  return base::FeatureList::IsEnabled(kSyncConsentOptional);
-}
-
 bool IsStylusBatteryStatusEnabled() {
   return base::FeatureList::IsEnabled(kStylusBatteryStatus);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 44e65e34..de66c7f 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -443,7 +443,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kSnoopingProtection;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kStylusBatteryStatus;
-COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSyncConsentOptional;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kSyncSettingsCategorization;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -639,7 +638,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShimlessRMAFlowEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSnoopingProtectionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSyncSettingsCategorizationEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSyncConsentOptionalEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsStylusBatteryStatusEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemChinesePhysicalTypingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemJapanesePhysicalTypingEnabled();
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc
index efb77b4..cfc25905 100644
--- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc
+++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc
@@ -59,6 +59,16 @@
     "Bluetooth.ChromeOS.FastPair.AccountKeyFailure.RetroactivePairingProtocol";
 const char kKeyGenerationResultMetric[] =
     "Bluetooth.ChromeOS.FastPair.KeyGenerationResult";
+const char kDataEncryptorCreateResultMetric[] =
+    "Bluetooth.ChromeOS.FastPair.FastPairDataEncryptor.CreateResult";
+const char kWriteKeyBasedCharacteristicResult[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.Result";
+const char kWriteKeyBasedCharacteristicPairFailure[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.PairFailure";
+const char kWriteKeyBasedCharacteristicGattError[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.GattErrorReason";
+const char kNotifyKeyBasedCharacteristicTime[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.NotifyTime";
 
 }  // namespace
 
@@ -151,16 +161,15 @@
 void RecordPairingFailureReason(const Device& device, PairFailure failure) {
   switch (device.protocol) {
     case Protocol::kFastPairInitial:
-      base::UmaHistogramSparse(kFastPairPairFailureInitialMetric,
-                               static_cast<int>(failure));
+      base::UmaHistogramEnumeration(kFastPairPairFailureInitialMetric, failure);
       break;
     case Protocol::kFastPairRetroactive:
-      base::UmaHistogramSparse(kFastPairPairFailureRetroactiveMetric,
-                               static_cast<int>(failure));
+      base::UmaHistogramEnumeration(kFastPairPairFailureRetroactiveMetric,
+                                    failure);
       break;
     case Protocol::kFastPairSubsequent:
-      base::UmaHistogramSparse(kFastPairPairFailureSubsequentMetric,
-                               static_cast<int>(failure));
+      base::UmaHistogramEnumeration(kFastPairPairFailureSubsequentMetric,
+                                    failure);
       break;
   }
 }
@@ -204,5 +213,27 @@
   base::UmaHistogramBoolean(kKeyGenerationResultMetric, success);
 }
 
+void RecordDataEncryptorCreateResult(bool success) {
+  base::UmaHistogramBoolean(kDataEncryptorCreateResultMetric, success);
+}
+
+void RecordWriteKeyBasedCharacteristicResult(bool success) {
+  base::UmaHistogramBoolean(kWriteKeyBasedCharacteristicResult, success);
+}
+
+void RecordWriteKeyBasedCharacteristicPairFailure(PairFailure failure) {
+  base::UmaHistogramEnumeration(kWriteKeyBasedCharacteristicPairFailure,
+                                failure);
+}
+
+void RecordWriteRequestGattError(
+    device::BluetoothGattService::GattErrorCode error) {
+  base::UmaHistogramEnumeration(kWriteKeyBasedCharacteristicGattError, error);
+}
+
+void RecordNotifyKeyBasedCharacteristicTime(base::TimeDelta total_notify_time) {
+  base::UmaHistogramTimes(kNotifyKeyBasedCharacteristicTime, total_notify_time);
+}
+
 }  // namespace quick_pair
 }  // namespace ash
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h
index 346a51c5..f4ccd69 100644
--- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h
+++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h
@@ -10,7 +10,6 @@
 #include "base/component_export.h"
 #include "base/time/time.h"
 #include "device/bluetooth/bluetooth_device.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace ash {
 namespace quick_pair {
@@ -105,6 +104,22 @@
 COMPONENT_EXPORT(QUICK_PAIR_COMMON)
 void RecordKeyPairGenerationResult(bool success);
 
+COMPONENT_EXPORT(QUICK_PAIR_COMMON)
+void RecordDataEncryptorCreateResult(bool success);
+
+COMPONENT_EXPORT(QUICK_PAIR_COMMON)
+void RecordWriteKeyBasedCharacteristicResult(bool success);
+
+COMPONENT_EXPORT(QUICK_PAIR_COMMON)
+void RecordWriteKeyBasedCharacteristicPairFailure(PairFailure failure);
+
+COMPONENT_EXPORT(QUICK_PAIR_COMMON)
+void RecordWriteRequestGattError(
+    device::BluetoothGattService::GattErrorCode error);
+
+COMPONENT_EXPORT(QUICK_PAIR_COMMON)
+void RecordNotifyKeyBasedCharacteristicTime(base::TimeDelta total_notify_time);
+
 }  // namespace quick_pair
 }  // namespace ash
 
diff --git a/ash/quick_pair/common/pair_failure.h b/ash/quick_pair/common/pair_failure.h
index b3882db..0c21204 100644
--- a/ash/quick_pair/common/pair_failure.h
+++ b/ash/quick_pair/common/pair_failure.h
@@ -64,6 +64,7 @@
   kPairingConnect = 21,
   // Failed to bond to device via public address.
   kAddressConnect = 22,
+  kMaxValue = kAddressConnect,
 };
 
 COMPONENT_EXPORT(QUICK_PAIR_COMMON)
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
index 402d792..fb5c9b6e 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
@@ -406,6 +406,7 @@
                              public_key_vec.end());
   }
 
+  notify_keybased_start_time_ = base::TimeTicks::Now();
   key_based_characteristic_->WriteRemoteCharacteristic(
       data_to_write_vec,
       device::BluetoothRemoteGattCharacteristic::WriteType::kWithResponse,
@@ -487,6 +488,8 @@
     key_based_write_request_timer_.Stop();
     std::move(key_based_write_response_callback_)
         .Run(value, /*failure=*/absl::nullopt);
+    RecordNotifyKeyBasedCharacteristicTime(base::TimeTicks::Now() -
+                                           notify_keybased_start_time_);
   } else if (characteristic == passkey_characteristic_ &&
              passkey_write_response_callback_) {
     passkey_write_request_timer_.Stop();
@@ -510,6 +513,7 @@
   QP_LOG(WARNING) << "WriteRemoteCharacteristic to key-based pairing "
                      "characteristic failed due to GATT error: "
                   << ToString(error);
+  RecordWriteRequestGattError(error);
   NotifyWriteRequestError(PairFailure::kKeyBasedPairingCharacteristicWrite);
 }
 
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h
index 52d32c7..366d93dc 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h
@@ -176,7 +176,9 @@
   std::string device_address_;
   bool is_initialized_ = false;
 
+  // Initial timestamps used to calculate duration to log to metrics.
   base::TimeTicks gatt_connection_start_time_;
+  base::TimeTicks notify_keybased_start_time_;
 
   device::BluetoothRemoteGattCharacteristic* key_based_characteristic_ =
       nullptr;
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc
index aa30578..f4e0aa5c 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc
@@ -44,6 +44,10 @@
     "Bluetooth.ChromeOS.FastPair.GattConnection.Result";
 const char kGattConnectionErrorMetric[] =
     "Bluetooth.ChromeOS.FastPair.GattConnection.ErrorReason";
+const char kWriteKeyBasedCharacteristicGattError[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.GattErrorReason";
+const char kNotifyKeyBasedCharacteristicTime[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.NotifyTime";
 
 constexpr base::TimeDelta kConnectingTestTimeout = base::Seconds(5);
 
@@ -542,6 +546,8 @@
 TEST_F(FastPairGattServiceClientTest, GattServiceDiscoveryTimeout) {
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 0);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SuccessfulGattConnectionSetUp();
   FastForwardTimeByConnetingTimeout();
   NotifyGattDiscoveryCompleteForService();
@@ -550,29 +556,40 @@
   EXPECT_FALSE(ServiceIsSet());
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 1);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, FailedGattConnection) {
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionErrorMetric, 0);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   FailedGattConnectionSetUp();
   EXPECT_EQ(GetInitializedCallbackResult(), PairFailure::kCreateGattConnection);
   EXPECT_FALSE(ServiceIsSet());
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 1);
   histogram_tester().ExpectTotalCount(kGattConnectionErrorMetric, 1);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, GattConnectionSuccess) {
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 0);
   histogram_tester().ExpectTotalCount(kGattConnectionErrorMetric, 0);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
   histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1);
   histogram_tester().ExpectTotalCount(kGattConnectionResult, 1);
   histogram_tester().ExpectTotalCount(kGattConnectionErrorMetric, 0);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, IgnoreNonFastPairServices) {
@@ -582,12 +599,14 @@
 }
 
 TEST_F(FastPairGattServiceClientTest, FailedKeyBasedCharacteristics) {
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SetKeybasedCharacteristicError(true);
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
   EXPECT_EQ(GetInitializedCallbackResult(),
             PairFailure::kKeyBasedPairingCharacteristicDiscovery);
   EXPECT_FALSE(ServiceIsSet());
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, FailedPasskeyCharacteristics) {
@@ -600,12 +619,14 @@
 }
 
 TEST_F(FastPairGattServiceClientTest, SuccessfulCharacteristicsStartNotify) {
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SetKeybasedCharacteristicError(false);
   SetPasskeyCharacteristicError(false);
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
   EXPECT_EQ(GetInitializedCallbackResult(), absl::nullopt);
   EXPECT_TRUE(ServiceIsSet());
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, StartNotifyPasskeyFailure) {
@@ -618,12 +639,14 @@
 }
 
 TEST_F(FastPairGattServiceClientTest, StartNotifyKeybasedFailure) {
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SuccessfulGattConnectionSetUp();
   SetKeybasedNotifySessionError(true);
   NotifyGattDiscoveryCompleteForService();
   EXPECT_EQ(GetInitializedCallbackResult(),
             PairFailure::kKeyBasedPairingCharacteristicNotifySession);
   EXPECT_FALSE(ServiceIsSet());
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, PasskeyStartNotifyTimeout) {
@@ -636,15 +659,19 @@
 }
 
 TEST_F(FastPairGattServiceClientTest, KeyBasedStartNotifyTimeout) {
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SetKeybasedNotifySessionTimeout(true);
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
   EXPECT_EQ(GetInitializedCallbackResult(),
             PairFailure::kKeyBasedPairingCharacteristicNotifySessionTimeout);
   EXPECT_FALSE(ServiceIsSet());
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
 }
 
 TEST_F(FastPairGattServiceClientTest, WriteKeyBasedRequest) {
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
   EXPECT_EQ(GetInitializedCallbackResult(), absl::nullopt);
@@ -652,9 +679,12 @@
   WriteRequestToKeyBased();
   TriggerKeyBasedGattChanged();
   EXPECT_EQ(GetWriteCallbackResult(), absl::nullopt);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
+  histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 1);
 }
 
 TEST_F(FastPairGattServiceClientTest, WriteKeyBasedRequestError) {
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0);
   SetKeyBasedWriteError();
   SuccessfulGattConnectionSetUp();
   NotifyGattDiscoveryCompleteForService();
@@ -664,6 +694,7 @@
   TriggerKeyBasedGattChanged();
   EXPECT_EQ(GetWriteCallbackResult(),
             PairFailure::kKeyBasedPairingCharacteristicWrite);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 1);
 }
 
 TEST_F(FastPairGattServiceClientTest, WriteKeyBasedRequestTimeout) {
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc
index 9961afc..492279b 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc
@@ -4,6 +4,7 @@
 
 #include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.h"
 
+#include "ash/quick_pair/common/fast_pair/fast_pair_metrics.h"
 #include "ash/quick_pair/common/logging.h"
 #include "ash/quick_pair/common/pair_failure.h"
 #include "ash/quick_pair/common/protocol.h"
@@ -58,6 +59,9 @@
 
 void FastPairHandshakeImpl::OnDataEncryptorCreateAsync(
     std::unique_ptr<FastPairDataEncryptor> fast_pair_data_encryptor) {
+  bool success = fast_pair_data_encryptor != nullptr;
+  RecordDataEncryptorCreateResult(/*success=*/success);
+
   if (!fast_pair_data_encryptor) {
     QP_LOG(WARNING) << __func__
                     << ": Fast Pair Data Encryptor failed to be created.";
@@ -85,9 +89,12 @@
 void FastPairHandshakeImpl::OnWriteResponse(
     std::vector<uint8_t> response_bytes,
     absl::optional<PairFailure> failure) {
+  RecordWriteKeyBasedCharacteristicResult(/*success=*/!failure.has_value());
+
   if (failure) {
     QP_LOG(WARNING) << __func__
                     << ": Failed to write request: " << failure.value();
+    RecordWriteKeyBasedCharacteristicPairFailure(failure.value());
     std::move(on_complete_callback_).Run(device_, failure.value());
     return;
   }
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc
index 9a1daaa4..5a31caa 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/callback_helpers.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
@@ -92,6 +93,13 @@
   bool successful_retrieval_ = true;
 };
 
+const char kDataEncryptorCreateResultMetric[] =
+    "Bluetooth.ChromeOS.FastPair.FastPairDataEncryptor.CreateResult";
+const char kWriteKeyBasedCharacteristicResultMetric[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.Result";
+const char kWriteKeyBasedCharacteristicPairFailureMetric[] =
+    "Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.PairFailure";
+
 }  // namespace
 
 namespace ash {
@@ -126,6 +134,8 @@
         }));
   }
 
+  base::HistogramTester& histogram_tester() { return histogram_tester_; }
+
  protected:
   FakeFastPairGattServiceClient* fake_fast_pair_gatt_service_client() {
     return gatt_service_client_factory_.fake_fast_pair_gatt_service_client();
@@ -136,6 +146,7 @@
   }
 
   scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> adapter_;
+  base::HistogramTester histogram_tester_;
   scoped_refptr<Device> device_;
   FakeFastPairGattServiceClientImplFactory gatt_service_client_factory_;
   FastPairFakeDataEncryptorImplFactory data_encryptor_factory_;
@@ -151,21 +162,43 @@
 }
 
 TEST_F(FastPairHandshakeImplTest, DataEncryptorCreateError) {
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicResultMetric,
+                                      0);
+  histogram_tester().ExpectTotalCount(kDataEncryptorCreateResultMetric, 0);
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 0);
   data_encryptor_factory_.SetFailedRetrieval();
   fake_fast_pair_gatt_service_client()->RunOnGattClientInitializedCallback();
   EXPECT_EQ(failure_.value(), PairFailure::kDataEncryptorRetrieval);
   EXPECT_FALSE(handshake_->completed_successfully());
+  histogram_tester().ExpectTotalCount(kDataEncryptorCreateResultMetric, 1);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicResultMetric,
+                                      0);
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 0);
 }
 
 TEST_F(FastPairHandshakeImplTest, WriteResponseError) {
+  histogram_tester().ExpectTotalCount(kDataEncryptorCreateResultMetric, 0);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicResultMetric,
+                                      0);
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 0);
   fake_fast_pair_gatt_service_client()->RunOnGattClientInitializedCallback();
   fake_fast_pair_gatt_service_client()->RunWriteResponseCallback(
       std::vector<uint8_t>(), PairFailure::kKeyBasedPairingCharacteristicWrite);
   EXPECT_EQ(failure_.value(), PairFailure::kKeyBasedPairingCharacteristicWrite);
   EXPECT_FALSE(handshake_->completed_successfully());
+  histogram_tester().ExpectTotalCount(kDataEncryptorCreateResultMetric, 1);
+  histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicResultMetric,
+                                      1);
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 1);
 }
 
 TEST_F(FastPairHandshakeImplTest, ParseResponseError) {
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 0);
   fake_fast_pair_gatt_service_client()->RunOnGattClientInitializedCallback();
   fake_fast_pair_gatt_service_client()->RunWriteResponseCallback(
       std::vector<uint8_t>());
@@ -173,6 +206,8 @@
   EXPECT_EQ(failure_.value(),
             PairFailure::kKeybasedPairingResponseDecryptFailure);
   EXPECT_FALSE(handshake_->completed_successfully());
+  histogram_tester().ExpectTotalCount(
+      kWriteKeyBasedCharacteristicPairFailureMetric, 0);
 }
 
 TEST_F(FastPairHandshakeImplTest, ParseResponseWrongType) {
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb
index a91c9f2..4653f0cf 100644
--- a/ash/strings/ash_strings_af.xtb
+++ b/ash/strings/ash_strings_af.xtb
@@ -587,6 +587,7 @@
 <translation id="4831034276697007977">Is jy seker jy wil outomatiese klikke afskakel?</translation>
 <translation id="4849058404725798627">Lig voorwerp met sleutelbordfokus uit</translation>
 <translation id="485592688953820832">Geen handeling nie (onderbreek)</translation>
+<translation id="485634149294284819">Voer sleutelbordkieslys in</translation>
 <translation id="4860284199500934869">Gaan jou netwerkverbinding na om <ph name="FILENAME" /> af te laai</translation>
 <translation id="486056901304535126">Sal later probeer aflaai. Spraak sal na Google toe gestuur word vir verwerking totdat aflaai voltooi is.</translation>
 <translation id="4868492592575313542">geaktiveer</translation>
@@ -1099,6 +1100,7 @@
 <translation id="8380784334203145311">Goeienag</translation>
 <translation id="8388750414311082622">Jongste lessenaar kan nie verwyder word nie.</translation>
 <translation id="8394567579869570560">Jou ouer het hierdie toestel gesluit</translation>
+<translation id="8401850874595457088">Voer taalkieslys in</translation>
 <translation id="8412677897383510995">Wys vertoonskerminstellings</translation>
 <translation id="8413272770729657668">Opname begin oor 3, 2, 1</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (houer)</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 1312552..2858190c 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -586,6 +586,7 @@
 <translation id="4831034276697007977">Наистина ли искате да изключите автоматичните кликвания?</translation>
 <translation id="4849058404725798627">Открояване на обекта, върху който е фокусът от клавиатурата</translation>
 <translation id="485592688953820832">Без действие (пауза)</translation>
+<translation id="485634149294284819">Отваряне на менюто с клавиатури</translation>
 <translation id="4860284199500934869">За да изтеглите <ph name="FILENAME" />, проверете връзката си с мрежата</translation>
 <translation id="486056901304535126">По-късно ще се направи опит за изтегляне. Говорът ще се изпраща до Google за обработка, докато изтеглянето завърши.</translation>
 <translation id="4868492592575313542">активирана</translation>
@@ -1098,6 +1099,7 @@
 <translation id="8380784334203145311">Добър вечер,</translation>
 <translation id="8388750414311082622">Последният работен кът не може да бъде премахнат.</translation>
 <translation id="8394567579869570560">Родителят ви заключи това устройство</translation>
+<translation id="8401850874595457088">Отваряне на менюто с езици</translation>
 <translation id="8412677897383510995">Показване на настройките за екрана</translation>
 <translation id="8413272770729657668">Записването започва след 3, 2, 1</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (калъф)</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 274147c..445a87c 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -586,6 +586,7 @@
 <translation id="4831034276697007977">مطمئنید می‌خواهید کلیک‌های خودکار را خاموش کنید؟</translation>
 <translation id="4849058404725798627">برجسته کردن شیء با فوکوس صفحه‌کلید</translation>
 <translation id="485592688953820832">بی‌حرکت (مکث)</translation>
+<translation id="485634149294284819">وارد شدن به منوی صفحه‌کلید</translation>
 <translation id="4860284199500934869">برای بارگیری <ph name="FILENAME" />، اتصال شبکه را بررسی کنید</translation>
 <translation id="486056901304535126">‏بارگیری بعداً انجام خواهد شد. تا وقتی بارگیری کامل شود، گفتار برای پردازش به Google ارسال خواهد شد.</translation>
 <translation id="4868492592575313542">فعال شد</translation>
@@ -1098,6 +1099,7 @@
 <translation id="8380784334203145311">شب‌به‌خیر،</translation>
 <translation id="8388750414311082622">میز آخر را نمی‌توان حذف کرد.</translation>
 <translation id="8394567579869570560">پدر یا مادرتان این دستگاه را قفل کرده است</translation>
+<translation id="8401850874595457088">وارد شدن به منوی زبان</translation>
 <translation id="8412677897383510995">نمایش تنظیمات نمایشگر</translation>
 <translation id="8413272770729657668">شروع ضبط با شمارش ۳، ۲، ۱</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />٪ (قاب)</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 5b8774c..1c7dbaf 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -586,6 +586,7 @@
 <translation id="4831034276697007977">자동 클릭을 사용 중지하시겠습니까?</translation>
 <translation id="4849058404725798627">키보드 포커스로 개체 강조표시</translation>
 <translation id="485592688953820832">작업 없음(일시중지)</translation>
+<translation id="485634149294284819">키보드 선택 메뉴</translation>
 <translation id="4860284199500934869"><ph name="FILENAME" /> 파일을 다운로드하려면 네트워크 연결 상태를 확인하세요.</translation>
 <translation id="486056901304535126">다운로드가 나중에 시도됩니다. 다운로드가 완료될 때까지는 음성이 Google로 전송되어 처리됩니다.</translation>
 <translation id="4868492592575313542">활성화됨</translation>
@@ -1098,6 +1099,7 @@
 <translation id="8380784334203145311">편안한 밤 보내세요</translation>
 <translation id="8388750414311082622">마지막 데스크는 삭제할 수 없습니다.</translation>
 <translation id="8394567579869570560">부모님이 이 기기를 잠갔습니다.</translation>
+<translation id="8401850874595457088">언어 선택 메뉴</translation>
 <translation id="8412677897383510995">디스플레이 설정 표시</translation>
 <translation id="8413272770729657668">녹화가 곧 시작됩니다. 3, 2, 1</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />%(케이스)</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 1a7e76d1..a5a9ce0 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -586,6 +586,7 @@
 <translation id="4831034276697007977">Je, una uhakika ungependa kuzima mibofyo ya kiotomatiki?</translation>
 <translation id="4849058404725798627">Angazia kipengee kilicholengwa kwa kibodi</translation>
 <translation id="485592688953820832">Hakuna kitendo (simamisha)</translation>
+<translation id="485634149294284819">Menyu ya kuweka kibodi</translation>
 <translation id="4860284199500934869">Kagua muunganisho wako wa mtandao ili upakue <ph name="FILENAME" /></translation>
 <translation id="486056901304535126">Itajaribu kupakua baadaye. Matamshi yatatumwa kwa Google ili yachakatwe hadi upakuaji utakapokamilika.</translation>
 <translation id="4868492592575313542">kimewashwa</translation>
@@ -1099,6 +1100,7 @@
 <translation id="8380784334203145311">Usiku mwema,</translation>
 <translation id="8388750414311082622">Huruhusiwi kuondoa kiolesura cha mwisho.</translation>
 <translation id="8394567579869570560">Kifaa hiki kimefungwa na mzazi wako</translation>
+<translation id="8401850874595457088">Menyu ya kuweka lugha</translation>
 <translation id="8412677897383510995">Onyesha mipangilio ya skrini</translation>
 <translation id="8413272770729657668">Inaanza kurekodi baada ya tatu, mbili, moja</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (Kifuniko)</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 3474229..6b6cbf1 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -586,6 +586,7 @@
 <translation id="4831034276697007977">Avtomatik kliklar bekor qilinsinmi?</translation>
 <translation id="4849058404725798627">Obyektlar klaviatura fokusi orqali ajratib ko‘rsatilsin</translation>
 <translation id="485592688953820832">Harakatsiz (pauza)</translation>
+<translation id="485634149294284819">Klaviatura menyusini ochish</translation>
 <translation id="4860284199500934869"><ph name="FILENAME" /> faylini yuklab olish uchun internetga ulanishni tekshiring</translation>
 <translation id="486056901304535126">Keyinroq yuklab olinadi. Yuklab olinguncha nutq qayta ishlanishi uchun Googlega yuboriladi.</translation>
 <translation id="4868492592575313542">faollashtirildi</translation>
@@ -1098,6 +1099,7 @@
 <translation id="8380784334203145311">Xayrli tun,</translation>
 <translation id="8388750414311082622">Oxirgi qolgan ish stolini olib tashlash mumkin emas.</translation>
 <translation id="8394567579869570560">Ota-onangiz bu qurilmani qulfladi</translation>
+<translation id="8401850874595457088">Til menyusini ochish</translation>
 <translation id="8412677897383510995">Displey sozlamalarini ochish</translation>
 <translation id="8413272770729657668">Yozib olish boshlanmoqda: 3, 2, 1</translation>
 <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (quti)</translation>
diff --git a/ash/webui/camera_app_ui/resources/js/gallerybutton.js b/ash/webui/camera_app_ui/resources/js/gallerybutton.js
deleted file mode 100644
index a04e71a..0000000
--- a/ash/webui/camera_app_ui/resources/js/gallerybutton.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2018 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.
-
-import {assert, assertInstanceof} from './assert.js';
-import * as dom from './dom.js';
-import {reportError} from './error.js';
-import {Filenamer} from './models/file_namer.js';
-import * as filesystem from './models/file_system.js';
-import {
-  DirectoryAccessEntry,  // eslint-disable-line no-unused-vars
-  FileAccessEntry,       // eslint-disable-line no-unused-vars
-} from './models/file_system_access_entry.js';
-// eslint-disable-next-line no-unused-vars
-import {ResultSaver} from './models/result_saver.js';
-import {VideoSaver} from './models/video_saver.js';
-import {ChromeHelper} from './mojo/chrome_helper.js';
-import {extractImageFromBlob} from './thumbnailer.js';
-import {
-  ErrorLevel,
-  ErrorType,
-  MimeType,
-  VideoType,
-} from './type.js';
-
-/**
- * Cover photo of gallery button.
- */
-class CoverPhoto {
-  /**
-   * @param {!FileAccessEntry} file File entry of cover photo.
-   * @param {?string} url Url to its cover photo. Might be null if the cover is
-   *     failed to load.
-   * @param {boolean} draggable If the file type support share by dragg/drop
-   *     cover photo.
-   */
-  constructor(file, url, draggable) {
-    /**
-     * @type {!FileAccessEntry}
-     * @const
-     */
-    this.file = file;
-
-    /**
-     * @type {?string}
-     * @const
-     */
-    this.url = url;
-
-    /**
-     * @const {boolean}
-     */
-    this.draggable = draggable;
-  }
-
-  /**
-   * File name of the cover photo.
-   * @return {string}
-   */
-  get name() {
-    return this.file.name;
-  }
-
-  /**
-   * Releases resources used by this cover photo.
-   */
-  release() {
-    if (this.url !== null) {
-      URL.revokeObjectURL(this.url);
-    }
-  }
-
-  /**
-   * Creates CoverPhoto objects from photo file.
-   * @param {!FileAccessEntry} file
-   * @return {!Promise<?CoverPhoto>}
-   */
-  static async create(file) {
-    const blob = await file.file();
-    if (blob.size === 0) {
-      reportError(
-          ErrorType.EMPTY_FILE,
-          ErrorLevel.ERROR,
-          new Error('The file to generate cover photo is empty'),
-      );
-      return null;
-    }
-
-    try {
-      const cover = await extractImageFromBlob(blob);
-      const draggable = blob.type !== MimeType.MP4;
-      return new CoverPhoto(file, URL.createObjectURL(cover), draggable);
-    } catch (e) {
-      reportError(
-          ErrorType.BROKEN_THUMBNAIL, ErrorLevel.ERROR,
-          assertInstanceof(e, Error));
-      return new CoverPhoto(file, null, false);
-    }
-  }
-}
-
-/**
- * Creates a controller for the gallery-button.
- * @implements {ResultSaver}
- */
-export class GalleryButton {
-  /**
-   * @public
-   */
-  constructor() {
-    /**
-     * Cover photo from latest saved picture.
-     * @type {?CoverPhoto}
-     * @private
-     */
-    this.cover_ = null;
-
-    /**
-     * @type {!HTMLButtonElement}
-     * @private
-     */
-    this.button_ = dom.get('#gallery-enter', HTMLButtonElement);
-
-    /**
-     * @type {!HTMLImageElement}
-     * @private
-     */
-    this.coverPhoto_ = dom.getFrom(this.button_, 'img', HTMLImageElement);
-
-    /**
-     * Directory holding saved pictures showing in gallery.
-     * @type {?DirectoryAccessEntry}
-     * @private
-     */
-    this.directory_ = null;
-
-    this.button_.addEventListener('click', async () => {
-      if (this.cover_ !== null) {
-        await ChromeHelper.getInstance().openFileInGallery(
-            this.cover_.file.name);
-      }
-    });
-  }
-
-  /**
-   * Initializes the gallery button.
-   * @param {!DirectoryAccessEntry} dir Directory holding saved pictures
-   *     showing in gallery.
-   */
-  async initialize(dir) {
-    this.directory_ = dir;
-    await this.checkCover_();
-  }
-
-  /**
-   * @param {?FileAccessEntry} file File to be set as cover photo.
-   * @return {!Promise}
-   * @private
-   */
-  async updateCover_(file) {
-    const cover = file === null ? null : await CoverPhoto.create(file);
-    if (this.cover_ === cover) {
-      return;
-    }
-    if (this.cover_ !== null) {
-      this.cover_.release();
-    }
-    this.cover_ = cover;
-
-    this.button_.hidden = cover === null;
-    this.coverPhoto_.classList.toggle('draggable', cover?.draggable ?? false);
-    this.coverPhoto_.src = cover?.url ?? '';
-
-    if (cover !== null) {
-      ChromeHelper.getInstance().monitorFileDeletion(file.name, () => {
-        this.checkCover_();
-      });
-    }
-  }
-
-  /**
-   * Checks validity of cover photo from camera directory.
-   * @private
-   */
-  async checkCover_() {
-    if (this.directory_ === null) {
-      return;
-    }
-    const dir = this.directory_;
-
-    // Checks existence of cached cover photo.
-    if (this.cover_ !== null) {
-      if (await dir.isExist(this.cover_.name)) {
-        return;
-      }
-    }
-
-    // Rescan file system.
-    const files = await filesystem.getEntries();
-    if (files.length === 0) {
-      await this.updateCover_(null);
-      return;
-    }
-    const filesWithTime = await Promise.all(
-        files.map(async (file) => ({
-                    file,
-                    time: (await file.getLastModificationTime()),
-                  })));
-    const lastFile =
-        filesWithTime.reduce((last, cur) => last.time > cur.time ? last : cur)
-            .file;
-    await this.updateCover_(lastFile);
-  }
-
-  /**
-   * @override
-   */
-  async savePhoto(blob, name, metadata) {
-    const file = await filesystem.saveBlob(blob, name);
-    if (metadata !== null) {
-      const metadataBlob =
-          new Blob([JSON.stringify(metadata, null, 2)], {type: MimeType.JSON});
-      await filesystem.saveBlob(metadataBlob, Filenamer.getMetadataName(name));
-    }
-
-    ChromeHelper.getInstance().sendNewCaptureBroadcast(
-        {isVideo: false, name: file.name});
-    await this.updateCover_(file);
-  }
-
-  /**
-   * @override
-   */
-  async saveGif(blob, name) {
-    const file = await filesystem.saveBlob(blob, name);
-    await this.updateCover_(file);
-  }
-
-  /**
-   * @override
-   */
-  async startSaveVideo(videoRotation) {
-    const file = await filesystem.createVideoFile(VideoType.MP4);
-    return VideoSaver.createForFile(file, videoRotation);
-  }
-
-  /**
-   * @override
-   */
-  async finishSaveVideo(video) {
-    const file = await video.endWrite();
-    assert(file !== null);
-
-    ChromeHelper.getInstance().sendNewCaptureBroadcast(
-        {isVideo: true, name: file.name});
-    await this.updateCover_(file);
-  }
-}
diff --git a/ash/webui/camera_app_ui/resources/js/gallerybutton.ts b/ash/webui/camera_app_ui/resources/js/gallerybutton.ts
new file mode 100644
index 0000000..f25f434
--- /dev/null
+++ b/ash/webui/camera_app_ui/resources/js/gallerybutton.ts
@@ -0,0 +1,211 @@
+// Copyright 2018 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.
+
+import {assert, assertInstanceof} from './assert.js';
+import * as dom from './dom.js';
+import {reportError} from './error.js';
+import {Filenamer} from './models/file_namer.js';
+import * as filesystem from './models/file_system.js';
+import {
+  DirectoryAccessEntry,
+  FileAccessEntry,
+} from './models/file_system_access_entry.js';
+import {ResultSaver} from './models/result_saver.js';
+import {VideoSaver} from './models/video_saver.js';
+import {ChromeHelper} from './mojo/chrome_helper.js';
+import {extractImageFromBlob} from './thumbnailer.js';
+import {
+  ErrorLevel,
+  ErrorType,
+  Metadata,
+  MimeType,
+  VideoType,
+} from './type.js';
+
+/**
+ * Cover photo of gallery button.
+ */
+class CoverPhoto {
+  /**
+   * @param file File entry of cover photo.
+   * @param url Url to its cover photo. Might be null if the cover is failed to
+   *     load.
+   * @param draggable If the file type support share by dragg/drop cover photo.
+   */
+  constructor(
+      readonly file: FileAccessEntry,
+      readonly url: string|null,
+      readonly draggable: boolean,
+  ) {}
+
+  /**
+   * File name of the cover photo.
+   */
+  get name(): string {
+    return this.file.name;
+  }
+
+  /**
+   * Releases resources used by this cover photo.
+   */
+  release() {
+    if (this.url !== null) {
+      URL.revokeObjectURL(this.url);
+    }
+  }
+
+  /**
+   * Creates CoverPhoto objects from photo file.
+   */
+  static async create(file: FileAccessEntry): Promise<CoverPhoto|null> {
+    const blob = await file.file();
+    if (blob.size === 0) {
+      reportError(
+          ErrorType.EMPTY_FILE,
+          ErrorLevel.ERROR,
+          new Error('The file to generate cover photo is empty'),
+      );
+      return null;
+    }
+
+    try {
+      const cover = await extractImageFromBlob(blob);
+      const draggable = blob.type !== MimeType.MP4;
+      return new CoverPhoto(file, URL.createObjectURL(cover), draggable);
+    } catch (e) {
+      reportError(
+          ErrorType.BROKEN_THUMBNAIL, ErrorLevel.ERROR,
+          assertInstanceof(e, Error));
+      return new CoverPhoto(file, null, false);
+    }
+  }
+}
+
+/**
+ * Creates a controller for the gallery-button.
+ */
+export class GalleryButton implements ResultSaver {
+  /**
+   * Cover photo from latest saved picture.
+   */
+  private cover: CoverPhoto|null = null;
+
+  private readonly button = dom.get('#gallery-enter', HTMLButtonElement);
+
+  /**
+   * Directory holding saved pictures showing in gallery.
+   */
+  private directory: DirectoryAccessEntry|null = null;
+
+  private readonly coverPhoto: HTMLImageElement;
+
+  constructor() {
+    this.coverPhoto = dom.getFrom(this.button, 'img', HTMLImageElement);
+
+    this.button.addEventListener('click', () => {
+      if (this.cover !== null) {
+        ChromeHelper.getInstance().openFileInGallery(this.cover.file.name);
+      }
+    });
+  }
+
+  /**
+   * Initializes the gallery button.
+   * @param dir Directory holding saved pictures showing in gallery.
+   */
+  async initialize(dir: DirectoryAccessEntry): Promise<void> {
+    this.directory = dir;
+    await this.checkCover();
+  }
+
+  /**
+   * @param file File to be set as cover photo.
+   */
+  private async updateCover(file: FileAccessEntry|null): Promise<void> {
+    const cover = file === null ? null : await CoverPhoto.create(file);
+    if (this.cover === cover) {
+      return;
+    }
+    if (this.cover !== null) {
+      this.cover.release();
+    }
+    this.cover = cover;
+
+    this.button.hidden = cover === null;
+    this.coverPhoto.classList.toggle('draggable', cover?.draggable ?? false);
+    this.coverPhoto.src = cover?.url ?? '';
+
+    if (cover !== null) {
+      ChromeHelper.getInstance().monitorFileDeletion(file.name, () => {
+        this.checkCover();
+      });
+    }
+  }
+
+  /**
+   * Checks validity of cover photo from camera directory.
+   */
+  private async checkCover(): Promise<void> {
+    if (this.directory === null) {
+      return;
+    }
+    const dir = this.directory;
+
+    // Checks existence of cached cover photo.
+    if (this.cover !== null) {
+      if (await dir.isExist(this.cover.name)) {
+        return;
+      }
+    }
+
+    // Rescan file system.
+    const files = await filesystem.getEntries();
+    if (files.length === 0) {
+      await this.updateCover(null);
+      return;
+    }
+    const filesWithTime = await Promise.all(
+        files.map(async (file) => ({
+                    file,
+                    time: (await file.getLastModificationTime()),
+                  })));
+    const lastFile =
+        filesWithTime.reduce((last, cur) => last.time > cur.time ? last : cur)
+            .file;
+    await this.updateCover(lastFile);
+  }
+
+  async savePhoto(blob: Blob, name: string, metadata: Metadata|null):
+      Promise<void> {
+    const file = await filesystem.saveBlob(blob, name);
+    if (metadata !== null) {
+      const metadataBlob =
+          new Blob([JSON.stringify(metadata, null, 2)], {type: MimeType.JSON});
+      await filesystem.saveBlob(metadataBlob, Filenamer.getMetadataName(name));
+    }
+
+    ChromeHelper.getInstance().sendNewCaptureBroadcast(
+        {isVideo: false, name: file.name});
+    await this.updateCover(file);
+  }
+
+  async saveGif(blob: Blob, name: string): Promise<void> {
+    const file = await filesystem.saveBlob(blob, name);
+    await this.updateCover(file);
+  }
+
+  async startSaveVideo(videoRotation: number): Promise<VideoSaver> {
+    const file = await filesystem.createVideoFile(VideoType.MP4);
+    return VideoSaver.createForFile(file, videoRotation);
+  }
+
+  async finishSaveVideo(video: VideoSaver): Promise<void> {
+    const file = await video.endWrite();
+    assert(file !== null);
+
+    ChromeHelper.getInstance().sendNewCaptureBroadcast(
+        {isVideo: true, name: file.name});
+    await this.updateCover(file);
+  }
+}
diff --git a/ash/webui/camera_app_ui/resources/js/js.gni b/ash/webui/camera_app_ui/resources/js/js.gni
index 4fc219c..4c05254 100644
--- a/ash/webui/camera_app_ui/resources/js/js.gni
+++ b/ash/webui/camera_app_ui/resources/js/js.gni
@@ -20,7 +20,7 @@
   "face.ts",
   "flag.ts",
   "focus_ring.ts",
-  "gallerybutton.js",
+  "gallerybutton.ts",
   "geometry.ts",
   "h264.js",
   "i18n_string.ts",
@@ -60,7 +60,7 @@
   "test_bridge.ts",
   "thumbnailer.js",
   "timer.ts",
-  "toast.js",
+  "toast.ts",
   "tooltip.js",
   "type.ts",
   "unload.ts",
diff --git a/ash/webui/camera_app_ui/resources/js/toast.js b/ash/webui/camera_app_ui/resources/js/toast.ts
similarity index 64%
rename from ash/webui/camera_app_ui/resources/js/toast.js
rename to ash/webui/camera_app_ui/resources/js/toast.ts
index d0ff0c9..a30d21f 100644
--- a/ash/webui/camera_app_ui/resources/js/toast.js
+++ b/ash/webui/camera_app_ui/resources/js/toast.ts
@@ -4,16 +4,15 @@
 
 import * as animate from './animation.js';
 import * as dom from './dom.js';
-// eslint-disable-next-line no-unused-vars
 import {I18nString} from './i18n_string.js';
 import * as loadTimeData from './models/load_time_data.js';
 
 /**
  * Updates the toast message.
- * @param {string} message Message to be updated.
- * @param {boolean} spoken Whether the toast is spoken only.
+ * @param message Message to be updated.
+ * @param spoken Whether the toast is spoken only.
  */
-function update(message, spoken) {
+function update(message: string, spoken: boolean) {
   // TTS speaks changes of on-screen aria-live elements. Force content changes
   // and clear content once inactive to avoid stale content being read out.
   const element = dom.get('#toast', HTMLElement);
@@ -31,28 +30,26 @@
 
 /**
  * Shows a toast with given message which doesn't need i18n.
- * @param {string} message Message to be shown.
+ * @param message Message to be shown.
  */
-export function showDebugMessage(message) {
+export function showDebugMessage(message: string): void {
   update(message, false);
 }
 
 /**
  * Shows a toast message.
- * @param {!I18nString} label The label of the message to show.
- * @param {...string} substitutions The substitutions needed for the given
- *     label.
+ * @param label The label of the message to show.
+ * @param substitutions The substitutions needed for the given label.
  */
-export function show(label, ...substitutions) {
+export function show(label: I18nString, ...substitutions: string[]): void {
   update(loadTimeData.getI18nMessage(label, ...substitutions), false);
 }
 
 /**
  * Speaks a toast message.
- * @param {!I18nString} label The label of the message to show.
- * @param {...string} substitutions The substitutions needed for the given
- *     label.
+ * @param label The label of the message to show.
+ * @param substitutions The substitutions needed for the given label.
  */
-export function speak(label, ...substitutions) {
+export function speak(label: I18nString, ...substitutions: string[]): void {
   update(loadTimeData.getI18nMessage(label, ...substitutions), true);
 }
diff --git a/ash/wm/window_cycle/window_cycle_controller_unittest.cc b/ash/wm/window_cycle/window_cycle_controller_unittest.cc
index ee1c373..03a56360 100644
--- a/ash/wm/window_cycle/window_cycle_controller_unittest.cc
+++ b/ash/wm/window_cycle/window_cycle_controller_unittest.cc
@@ -1615,6 +1615,7 @@
 // Tests that a vertical touch scroll doesn't crash. See crbug.com/1224969.
 TEST_F(WindowCycleControllerTest, VerticalTouchScroll) {
   const gfx::Rect bounds(0, 0, 200, 200);
+  std::unique_ptr<aura::Window> window4 = CreateTestWindow(bounds);
   std::unique_ptr<aura::Window> window3 = CreateTestWindow(bounds);
   std::unique_ptr<aura::Window> window2 = CreateTestWindow(bounds);
   std::unique_ptr<aura::Window> window1 = CreateTestWindow(bounds);
diff --git a/ash/wm/window_cycle/window_cycle_list.cc b/ash/wm/window_cycle/window_cycle_list.cc
index 3028aa4b..af20eb4a 100644
--- a/ash/wm/window_cycle/window_cycle_list.cc
+++ b/ash/wm/window_cycle/window_cycle_list.cc
@@ -420,8 +420,12 @@
   if (current_index_ > 1)
     InitWindowCycleView();
 
-  if (cycle_view_)
+  // The windows should not shift position when selecting when there's enough
+  // room to display all windows.
+  if (cycle_view_ && cycle_view_->CalculatePreferredSize().width() ==
+                         cycle_view_->CalculateMaxWidth()) {
     cycle_view_->ScrollToWindow(windows_[current_index_]);
+  }
 }
 
 int WindowCycleList::GetOffsettedWindowIndex(int offset) const {
diff --git a/ash/wm/window_cycle/window_cycle_view.cc b/ash/wm/window_cycle/window_cycle_view.cc
index cde5d31..4cbf941 100644
--- a/ash/wm/window_cycle/window_cycle_view.cc
+++ b/ash/wm/window_cycle/window_cycle_view.cc
@@ -432,8 +432,7 @@
   // screen, but the window cycle view with a bandshield, cropping the
   // overflow window list, should remain within the specified horizontal
   // insets of the screen width.
-  const int max_width = root_window_->GetBoundsInScreen().size().width() -
-                        2 * kBackgroundHorizontalInsetDp;
+  const int max_width = CalculateMaxWidth();
   size.set_width(std::min(size.width(), max_width));
   if (Shell::Get()
           ->window_cycle_controller()
@@ -599,6 +598,11 @@
          tab_slider_container_->GetBoundsInScreen().Contains(screen_point);
 }
 
+int WindowCycleView::CalculateMaxWidth() const {
+  return root_window_->GetBoundsInScreen().size().width() -
+         2 * kBackgroundHorizontalInsetDp;
+}
+
 gfx::Rect WindowCycleView::GetContentContainerBounds() const {
   const bool empty_mirror_container = mirror_container_->children().empty();
   if (empty_mirror_container && no_recent_items_label_)
diff --git a/ash/wm/window_cycle/window_cycle_view.h b/ash/wm/window_cycle/window_cycle_view.h
index 1157b72..f51e5aa 100644
--- a/ash/wm/window_cycle/window_cycle_view.h
+++ b/ash/wm/window_cycle/window_cycle_view.h
@@ -120,6 +120,9 @@
   // container.
   bool IsEventInTabSliderContainer(const gfx::Point& screen_point);
 
+  // Returns the maximum width of the cycle view.
+  int CalculateMaxWidth() const;
+
  private:
   friend class WindowCycleListTestApi;
 
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index ce6e4da..4d158942 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-7.20211228.3.1
+7.20211229.2.3
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index ce6e4da..4d158942 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-7.20211228.3.1
+7.20211229.2.3
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index 06d32f3..f575398a 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -16,7 +16,7 @@
 // for the instructions on writing suppressions.
 char kTSanDefaultSuppressions[] =
     // False positives in libdbus.so, libdconfsettings.so, libflashplayer.so,
-    // libgio.so, libglib.so and libgobject.so.
+    // libgio.so, libglib.so, libgobject.so, and libfontconfig.so.1.
     // Since we don't instrument them, we cannot reason about the
     // synchronization in them.
     "race:libdbus*.so\n"
@@ -25,6 +25,7 @@
     "race:libgio*.so\n"
     "race:libglib*.so\n"
     "race:libgobject*.so\n"
+    "race:libfontconfig.so.1\n"
 
     // Intentional race in ToolsSanityTest.DataRace in base_unittests.
     "race:base/tools_sanity_unittest.cc\n"
diff --git a/chrome/VERSION b/chrome/VERSION
index a17f585f..4072e1c 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=99
 MINOR=0
-BUILD=4795
+BUILD=4796
 PATCH=0
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/ManageTrustedWebActivityDataActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/ManageTrustedWebActivityDataActivityTest.java
index 9bbab5ec..c455da040 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/ManageTrustedWebActivityDataActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/ManageTrustedWebActivityDataActivityTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Matchers;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -41,6 +42,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "http://crbug.com/1283285")
     public void launchesWebApkSiteSettings() throws Exception {
         WebApkValidator.setDisableValidationForTesting(true);
         ManageTrustedWebActivityDataActivity.setCallingPackageForTesting(TEST_PACKAGE_NAME);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
index 18cfd0e1..5cc1270 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -22,6 +22,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -140,6 +141,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "http://crbug.com/1283240")
     public void testNavigationFromUserGesture() throws TimeoutException {
         sActivityTestRule.loadUrl(mTestServer.getURL(NAVIGATION_FROM_USER_GESTURE_PAGE));
         Assert.assertEquals(1, mNavParamHistory.size());
@@ -153,6 +155,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "http://crbug.com/1283240")
     public void testNavigationFromXHRCallback() throws TimeoutException {
         sActivityTestRule.loadUrl(mTestServer.getURL(NAVIGATION_FROM_XHR_CALLBACK_PAGE));
         Assert.assertEquals(1, mNavParamHistory.size());
@@ -166,6 +169,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "http://crbug.com/1283240")
     public void testNavigationFromXHRCallbackAndShortTimeout() throws TimeoutException {
         sActivityTestRule.loadUrl(
                 mTestServer.getURL(NAVIGATION_FROM_XHR_CALLBACK_AND_SHORT_TIMEOUT_PAGE));
@@ -180,6 +184,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "http://crbug.com/1283240")
     public void testNavigationFromXHRCallbackAndLongTimeout() throws TimeoutException {
         sActivityTestRule.loadUrl(
                 mTestServer.getURL(NAVIGATION_FROM_XHR_CALLBACK_AND_LONG_TIMEOUT_PAGE));
@@ -193,6 +198,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "http://crbug.com/1283240")
     public void testNavigationFromImageOnLoad() throws TimeoutException {
         sActivityTestRule.loadUrl(mTestServer.getURL(NAVIGATION_FROM_IMAGE_ONLOAD_PAGE));
         Assert.assertEquals(1, mNavParamHistory.size());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java
index 3a3abb95..671caab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.browser.browserservices.intents.WebappConstants;
 import org.chromium.chrome.browser.browserservices.ui.controller.CurrentPageVerifier.VerificationStatus;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -70,6 +71,7 @@
     @Test
     @LargeTest
     @Feature({"Webapps"})
+    @FlakyTest(message = "http://crbug.com/1283235")
     public void testInScope() {
         String page = "https://foo.com/chrome/test/data/android/customtabs/cct_header.html";
         String otherPageInScope = "https://foo.com/chrome/test/data/android/simple.html";
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index c65b8da..ad45c2f6 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-99.0.4792.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-99.0.4793.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/os_settings_search_tag_strings.grdp b/chrome/app/os_settings_search_tag_strings.grdp
index 6d3844a..95d544533 100644
--- a/chrome/app/os_settings_search_tag_strings.grdp
+++ b/chrome/app/os_settings_search_tag_strings.grdp
@@ -276,8 +276,11 @@
   <message name="IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DATA_USAGE" desc="Text for search result item which, when clicked, navigates the user to Nearby Share edit data usage button in settings.">
     Nearby Share data usage
   </message>
-  <message name="IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION" translateable="false" desc="Text for search result item which, when clicked, navigates the user to Nearby Device is trying to share notification toggle.">
-    Nearby Share devices nearby are sharing notification
+  <message name="IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_OFF" desc="Text for search result item which, when clicked, navigates the user to Nearby Device is trying to share notification toggle.">
+    Turn on notification when devices are nearby
+  </message>
+  <message name="IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_ON" desc="Text for search result item which, when clicked, navigates the user to Nearby Device is trying to share notification toggle.">
+    Turn off notification when devices are nearby
   </message>
   <message name="IDS_OS_SETTINGS_TAG_MULTIDEVICE_PHONE_HUB" desc="Text for search result item which, when clicked, navigates the user to Phone Hub settings, with a toggle to enable/disable the feature. Phone hub provides the user with information about their Android phone and allows the user to perform phone-side actions directly in the Chrome OS UI.">
     Phone Hub
diff --git a/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_OFF.png.sha1 b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_OFF.png.sha1
new file mode 100644
index 0000000..d61b8c1
--- /dev/null
+++ b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_OFF.png.sha1
@@ -0,0 +1 @@
+dc4ffb26e5daedc0c8aba817803ef1b175452d75
\ No newline at end of file
diff --git a/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_ON.png.sha1 b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_ON.png.sha1
new file mode 100644
index 0000000..6f605bb
--- /dev/null
+++ b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_ON.png.sha1
@@ -0,0 +1 @@
+1433e653136e197d0eb111e2a901ec16af8ff978
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index e5417087..f68f299 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1060,6 +1060,7 @@
 <translation id="204914487372604757">Skep kortpad</translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="2053312383184521053">Rustoestand-data</translation>
+<translation id="2054240652864153171">Vee werfdata uit vir <ph name="SITE_NAME" /> wat op <ph name="PARTITION_SITE_NAME" /> verdeel is?</translation>
 <translation id="2055585478631012616">Jy sal by hierdie werwe afgemeld word, insluitend in oop oortjies</translation>
 <translation id="205560151218727633">Google Assistent-logo</translation>
 <translation id="2058456167109518507">Toestel is bespeur</translation>
@@ -2405,6 +2406,7 @@
 <translation id="3433621910545056227">Oeps! Die stelsel kon nie die toestel se kenmerkeslot by installering vasmaak nie.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.</translation>
+<translation id="3434512374684753970">Oudio en video</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" versoek tans jou <ph name="CODE_TYPE" /></translation>
 <translation id="3435738964857648380">Sekuriteit</translation>
 <translation id="343578350365773421">Papier is op</translation>
@@ -2851,6 +2853,7 @@
 <translation id="3873423927483480833">Wys PIN-nommers</translation>
 <translation id="3873915545594852654">Iets was fout met ARC++.</translation>
 <translation id="3874164307099183178">Skakel Google Assistent aan</translation>
+<translation id="3875783148670536197">Wys my hoe</translation>
 <translation id="3875815154304214043"><ph name="APP_NAME" /> is gestel om in 'n nuwe blaaieroortjie oop te maak; gesteunde skakels sal ook in die blaaier oopmaak. <ph name="BEGIN_LINK_LEARN_MORE" />Kom meer te wete<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256">Nabydeling-instellings vir <ph name="USER_NAME" /> se toestel, wat deel onder die rekening <ph name="USER_EMAIL" />.</translation>
 <translation id="3879748587602334249">Aflaaibestuurder</translation>
@@ -4488,6 +4491,7 @@
 <translation id="562935524653278697">Jou administrateur het die sinkronisering van jou boekmerke, geskiedenis, wagwoorde en ander instellings gedeaktiveer.</translation>
 <translation id="5631017369956619646">CPU-gebruik</translation>
 <translation id="5632059346822207074">Toestemming is versoek; druk Ctrl + Forward om te antwoord</translation>
+<translation id="5632485077360054581">Wys my hoe</translation>
 <translation id="5632566673632479864">Jou rekening <ph name="EMAIL" /> word nie meer as die primêre rekening toegelaat nie. Omdat hierdie rekening deur <ph name="DOMAIN" /> bestuur word, sal jou boekmerke, geskiedenis, wagwoorde en ander instellings op hierdie toestel uitgevee word.</translation>
 <translation id="5632592977009207922">Laai tans af; <ph name="PERCENT_REMAINING" />% oor</translation>
 <translation id="563371367637259496">Mobiel</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index d41013e..fa393d6c 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1056,6 +1056,7 @@
 <translation id="204914487372604757">Създаване на пряк път</translation>
 <translation id="2050339315714019657">Вертикално</translation>
 <translation id="2053312383184521053">Данни за състоянието на неактивност</translation>
+<translation id="2054240652864153171">Да се изчистят ли данните за сайта <ph name="SITE_NAME" />, отделени в <ph name="PARTITION_SITE_NAME" />?</translation>
 <translation id="2055585478631012616">Ще излезете от профила си в тези сайтове, включително в отворените раздели</translation>
 <translation id="205560151218727633">Лого на Google Асистент</translation>
 <translation id="2058456167109518507">Открито е устройство</translation>
@@ -2401,6 +2402,7 @@
 <translation id="3433621910545056227">Ами сега!  Системата не успя да заключи атрибутите за времето за инсталиране за устройството.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. На адрес families.google.com можете да научите повече за тези настройки и как да ги коригирате.</translation>
+<translation id="3434512374684753970">Аудио и видео</translation>
 <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> изисква вашия <ph name="CODE_TYPE" /></translation>
 <translation id="3435738964857648380">Сигурност</translation>
 <translation id="343578350365773421">Няма хартия</translation>
@@ -2848,6 +2850,7 @@
 <translation id="3873423927483480833">Показване на ПИН кодовете</translation>
 <translation id="3873915545594852654">Възникна проблем със СИПС++.</translation>
 <translation id="3874164307099183178">Включване на Google Асистент</translation>
+<translation id="3875783148670536197">Покажете ми как</translation>
 <translation id="3875815154304214043"><ph name="APP_NAME" /> ще се отваря в нов раздел на браузъра. Поддържаните връзки също ще се отварят в браузъра. <ph name="BEGIN_LINK_LEARN_MORE" />Научете повече<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256">Настройки за функцията „Споделяне наблизо“ за устройството на <ph name="USER_NAME" />, което споделя чрез профила <ph name="USER_EMAIL" />.</translation>
 <translation id="3879748587602334249">Мениджър на изтеглянията</translation>
@@ -4485,6 +4488,7 @@
 <translation id="562935524653278697">Администраторът ви е деактивирал синхронизирането на вашите отметки, история, пароли и други настройки.</translation>
 <translation id="5631017369956619646">Използване на процесора</translation>
 <translation id="5632059346822207074">Изисква се разрешение. Натиснете Ctrl + бутона за преминаване напред, за да отговорите</translation>
+<translation id="5632485077360054581">Покажете ми как</translation>
 <translation id="5632566673632479864">Профилът ви <ph name="EMAIL" /> вече не може да се използва като основен. Тъй като този профил се управлява от <ph name="DOMAIN" />, вашите отметки, история, пароли и други настройки ще бъдат изчистени от устройството.</translation>
 <translation id="5632592977009207922">Изтегля се, още<ph name="PERCENT_REMAINING" />%</translation>
 <translation id="563371367637259496">Мобилна мрежа</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index caf7162..5787b984 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1057,6 +1057,7 @@
 <translation id="204914487372604757">ایجاد میان‌بر</translation>
 <translation id="2050339315714019657">عمودی</translation>
 <translation id="2053312383184521053">داده‌های حالت بیکار</translation>
+<translation id="2054240652864153171">داده‌های سایت <ph name="SITE_NAME" /> که در <ph name="PARTITION_SITE_NAME" /> بخش‌بندی شده پاک شود؟</translation>
 <translation id="2055585478631012616">از سیستم این سایت‌ها (ازجمله در برگه‌های باز) خارج خواهید شد</translation>
 <translation id="205560151218727633">‏نشان‌واره «دستیار Google»</translation>
 <translation id="2058456167109518507">دستگاه شناسایی شد</translation>
@@ -2402,6 +2403,7 @@
 <translation id="3433621910545056227">اوه! این سیستم نتوانست قفل ویژگی‌های زمان نصب دستگاه را ایجاد کند.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />٪</translation>
 <translation id="3434272557872943250">‏اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آن‌ها بیشتر بدانید.</translation>
+<translation id="3434512374684753970">صدا و ویدیو</translation>
 <translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» <ph name="CODE_TYPE" /> شما را درخواست می‌کند</translation>
 <translation id="3435738964857648380">امنیت</translation>
 <translation id="343578350365773421">کاغذ تمام شده است</translation>
@@ -2848,6 +2850,7 @@
 <translation id="3873423927483480833">نمایش پین‌ها</translation>
 <translation id="3873915545594852654">‏در رابطه با ++ARC مشکلی پیش آمد.</translation>
 <translation id="3874164307099183178">‏روشن کردن «دستیار Google»</translation>
+<translation id="3875783148670536197">نمایش روش انجام کار</translation>
 <translation id="3875815154304214043"><ph name="APP_NAME" /> طوری تنظیم شده که در برگه مرورگر جدید باز شود، پیوندهای پشتیبانی‌شده نیز در مرورگر باز خواهد شد. <ph name="BEGIN_LINK_LEARN_MORE" />بیشتر بدانید<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256">تنظیمات «هم‌رسانی با اطراف» برای دستگاه <ph name="USER_NAME" />، بااستفاده از حساب «<ph name="USER_EMAIL" />» هم‌رسانی می‌کند.</translation>
 <translation id="3879748587602334249">مدیریت بارگیری</translation>
@@ -4484,6 +4487,7 @@
 <translation id="562935524653278697">سرپرست شما همگام‌سازی نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیماتتان را غیرفعال کرده است.</translation>
 <translation id="5631017369956619646">‏میزان مصرف CPU</translation>
 <translation id="5632059346822207074">درخواست اجازه ارائه شده است؛ برای پاسخ دادن، کلید «مهار + جلو» را فشار دهید</translation>
+<translation id="5632485077360054581">نمایش روش انجام کار</translation>
 <translation id="5632566673632479864">حسابتان (<ph name="EMAIL" />) دیگر به‌عنوان حساب اصلی مجاز نیست. از آن‌جایی‌که این حساب توسط <ph name="DOMAIN" /> مدیریت می‌شود، نشانک‌ها، سابقه، گذرواژه‌ها و دیگر تنظیماتتان از این دستگاه پاک می‌شوند.</translation>
 <translation id="5632592977009207922">درحال بارگیری، <ph name="PERCENT_REMAINING" />% باقی‌مانده است</translation>
 <translation id="563371367637259496">دستگاه همراه</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 7d01438..e30522b 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1060,6 +1060,7 @@
 <translation id="204914487372604757">바로가기 만들기</translation>
 <translation id="2050339315714019657">세로 방향</translation>
 <translation id="2053312383184521053">유휴 상태 데이터</translation>
+<translation id="2054240652864153171"><ph name="PARTITION_SITE_NAME" />에 파티셔닝된 <ph name="SITE_NAME" /> 사이트 데이터를 삭제하시겠습니까?</translation>
 <translation id="2055585478631012616">열려 있는 탭을 포함하여 이러한 사이트에서 로그아웃됩니다.</translation>
 <translation id="205560151218727633">Google 어시스턴트 로고</translation>
 <translation id="2058456167109518507">기기가 검색됨</translation>
@@ -2405,6 +2406,7 @@
 <translation id="3433621910545056227">시스템이 기기 설치 시간 속성 잠금을 설정하는 데 실패했습니다.</translation>
 <translation id="3434107140712555581">배터리 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. families.google.com에서 이러한 설정 및 설정 조정 방법을 자세히 알아보세요.</translation>
+<translation id="3434512374684753970">오디오 및 비디오</translation>
 <translation id="3435688026795609344">'<ph name="EXTENSION_NAME" />'이(가) <ph name="CODE_TYPE" />을(를) 요청하고 있습니다.</translation>
 <translation id="3435738964857648380">보안</translation>
 <translation id="343578350365773421">용지 부족</translation>
@@ -2851,6 +2853,7 @@
 <translation id="3873423927483480833">PIN 표시</translation>
 <translation id="3873915545594852654">ARC++에 문제가 발생했습니다.</translation>
 <translation id="3874164307099183178">Google 어시스턴트 사용 설정</translation>
+<translation id="3875783148670536197">방법 보기</translation>
 <translation id="3875815154304214043"><ph name="APP_NAME" /> 앱이 새 브라우저 탭에서 열리도록 설정되어 있습니다. 지원되는 링크도 브라우저에서 열립니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256">공유에 <ph name="USER_EMAIL" /> 계정을 사용하는 <ph name="USER_NAME" />님의 기기에 관한 Nearby Share 설정입니다.</translation>
 <translation id="3879748587602334249">다운로드 관리자</translation>
@@ -4484,6 +4487,7 @@
 <translation id="562935524653278697">관리자가 북마크, 방문 기록, 비밀번호 및 기타 설정의 동기화를 사용 중지했습니다.</translation>
 <translation id="5631017369956619646">CPU 사용</translation>
 <translation id="5632059346822207074">권한 요청됨, Ctrl 키와 앞으로를 눌러 응답</translation>
+<translation id="5632485077360054581">방법 보기</translation>
 <translation id="5632566673632479864"><ph name="EMAIL" /> 계정이 더 이상 기본 계정으로 허용되지 않습니다. 이 계정은 <ph name="DOMAIN" />에 의해 관리되므로 북마크, 방문 기록, 비밀번호 및 기타 설정이 기기에서 삭제됩니다.</translation>
 <translation id="5632592977009207922">다운로드 중, <ph name="PERCENT_REMAINING" />% 남음</translation>
 <translation id="563371367637259496">모바일</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index d3be0969..e061239c 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1056,6 +1056,7 @@
 <translation id="204914487372604757">Unda njia mkato</translation>
 <translation id="2050339315714019657">Wima</translation>
 <translation id="2053312383184521053">Data ya Wakati wa Hali Tulivu</translation>
+<translation id="2054240652864153171">Ungependa kufuta data ya tovuti ya <ph name="SITE_NAME" /> iliyogawanywa kwenye <ph name="PARTITION_SITE_NAME" />?</translation>
 <translation id="2055585478631012616">Utaondolewa kwenye akaunti za tovuti hizi, ikiwemo vichupo ambavyo umefungua</translation>
 <translation id="205560151218727633">Nembo ya mratibu wa Google</translation>
 <translation id="2058456167109518507">Imetambua kifaa</translation>
@@ -2401,6 +2402,7 @@
 <translation id="3433621910545056227">Lo! Mfumo umeshindwa kuanzisha kufungwa kwa sifa za muda wa usakinishaji wa kifaa.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu ya mtoto wako, data hii inaweza kuhifadhiwa kwenye Akaunti yake ya Google. Pata maelezo zaidi kuhusu mipangilio hii na jinsi ya kuirekebisha katika families.google.com.</translation>
+<translation id="3434512374684753970">Sauti na Video</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" kinaomba <ph name="CODE_TYPE" /> yako</translation>
 <translation id="3435738964857648380">Usalama</translation>
 <translation id="343578350365773421">Karatasi zimeisha</translation>
@@ -2847,6 +2849,7 @@
 <translation id="3873423927483480833">Onyesha PIN</translation>
 <translation id="3873915545594852654">Hitilafu imetokea kwenye ARC++.</translation>
 <translation id="3874164307099183178">Washa programu ya Mratibu wa Google</translation>
+<translation id="3875783148670536197">Nionyeshe Jinsi ya Kufanya</translation>
 <translation id="3875815154304214043"><ph name="APP_NAME" /> imewekewa mipangilio ya kufunguka katika kichupo kipya cha kivinjari, viungo vinavyoweza kutumika pia vitafunguka katika kivinjari hicho. <ph name="BEGIN_LINK_LEARN_MORE" />Pata maelezo zaidi<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256">Mipangilio ya kipengele cha Uhamishaji wa Karibu ya kifaa cha <ph name="USER_NAME" />, anashiriki akitumia akaunti ya <ph name="USER_EMAIL" />.</translation>
 <translation id="3879748587602334249">Kidhibiti cha vipakuliwa</translation>
@@ -4481,6 +4484,7 @@
 <translation id="562935524653278697">Msimamizi wako amezima usawazishaji wa alamisho, historia, manenosiri, na mipangilio yako mingine.</translation>
 <translation id="5631017369956619646">Matumizi ya CPU</translation>
 <translation id="5632059346822207074">Umeombwa ruhusa, bonyeza vitufe vya Ctrl na Forward ili ujibu</translation>
+<translation id="5632485077360054581">Nionyeshe jinsi ya kufanya</translation>
 <translation id="5632566673632479864">Akaunti yako ya <ph name="EMAIL" /> hairuhusiwi tena kuwa akaunti ya msingi. Kwa sababu akaunti hii inadhibitiwa na <ph name="DOMAIN" />, alamisho, historia, manenosiri na mipangilio yako mingine itafutwa kwenye kifaa hiki.</translation>
 <translation id="5632592977009207922">Inapakua, imesalia <ph name="PERCENT_REMAINING" />%</translation>
 <translation id="563371367637259496">Kifaa cha mkononi</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 654e181..8d9b2e8 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1047,6 +1047,7 @@
 <translation id="204914487372604757">Yorliq yaratish</translation>
 <translation id="2050339315714019657">Bo‘yiga</translation>
 <translation id="2053312383184521053">Harakatsiz holat ma’lumotlari</translation>
+<translation id="2054240652864153171"><ph name="PARTITION_SITE_NAME" /> saytida boʻlingan <ph name="SITE_NAME" /> maʼlumotlari oʻchirilsinmi?</translation>
 <translation id="2055585478631012616">Bu saytlardagi hisobingizdan avtomatik chiqarilasiz (shuningdek, ochiq varaqlardan ham)</translation>
 <translation id="205560151218727633">Google assistent logosi</translation>
 <translation id="2058456167109518507">Qurilma topildi</translation>
@@ -2392,6 +2393,7 @@
 <translation id="3433621910545056227">Ana xolos! Tizim qurilma atributlarini o‘rnatish vaqtida qulflay olmadi.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">Agar farzandingiz uchun Veb va ilovalardagi kengaytirilgan faoliyat tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi. Bu parametr va uni sozlash haqidagi batafsil axborotni families.google.com sahifasidan olish mumkin.</translation>
+<translation id="3434512374684753970">Audio va video</translation>
 <translation id="3435688026795609344">“<ph name="EXTENSION_NAME" />” kengaytmasi <ph name="CODE_TYPE" /> kod turini so‘rayapti</translation>
 <translation id="3435738964857648380">Xavfsizlik</translation>
 <translation id="343578350365773421">Qogʻoz tugagan</translation>
@@ -2838,6 +2840,7 @@
 <translation id="3873423927483480833">PIN kodlar berkitilmasin</translation>
 <translation id="3873915545594852654">ARC++ ishga tushmadi.</translation>
 <translation id="3874164307099183178">Google Assistentni yoqish</translation>
+<translation id="3875783148670536197">Koʻrsatish</translation>
 <translation id="3875815154304214043">Brauzer yangi varaqlari <ph name="APP_NAME" /> ilovasida ochiladi, tegishli havolalar ham brauzerda ochiladi. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3877075909000773256"><ph name="USER_NAME" /> qurilmasi uchun Nearby Share sozlamalari <ph name="USER_EMAIL" /> hisobi ostida yuboriladi.</translation>
 <translation id="3879748587602334249">Yuklanmalar menejeri</translation>
@@ -4474,6 +4477,7 @@
 <translation id="562935524653278697">Adminstrator xatcho‘p, tarix, parol va boshqa sozlamalarni sinxronlashni o‘chirib qo‘ygan.</translation>
 <translation id="5631017369956619646">Protsessor (CPU) sarflanishi</translation>
 <translation id="5632059346822207074">Ruxsat talabi keldi, javob berish uchun Ctrl + Forward tugmalarini bosing</translation>
+<translation id="5632485077360054581">Koʻrsatish</translation>
 <translation id="5632566673632479864"><ph name="EMAIL" /> hisobingiz endi birlamchi emas. Chunki bu hisob <ph name="DOMAIN" /> domenida boshqariladi, bukmarklar, tarix, parollar va boshqa sozlamalar bu qurilmadan tozalanadi.</translation>
 <translation id="5632592977009207922">Yuklab olinmoqda, <ph name="PERCENT_REMAINING" />% qoldi</translation>
 <translation id="563371367637259496">Mobil</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bce5074..566a081 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -7750,6 +7750,12 @@
      FEATURE_VALUE_TYPE(features::kLinkCapturingUiUpdate)}
 #endif
 
+#if defined(OS_ANDROID)
+    {"drag-and-drop-android", flag_descriptions::kDragAndDropAndroidName,
+     flag_descriptions::kDragAndDropAndroidDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kDragAndDropAndroid)},
+#endif  // defined(OS_ANDROID)
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc
index c816d26..54525fb 100644
--- a/chrome/browser/android/bookmarks/bookmark_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -195,7 +195,7 @@
             Profile::FromBrowserContext(web_contents->GetBrowserContext())
                 ->IsOffTheRecord());
   GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl(
-      web_contents->GetURL());
+      web_contents->GetLastCommittedURL());
 
   // TODO(crbug.com/1150559): This is a hack to avoid a historical issue that
   // this function doesn't wait for any backend loaded.
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
index 61b983dbd..6123a43 100644
--- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
+++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -144,7 +144,7 @@
 
   // Decide if the URL should be sent with the context.
   if (context_->CanSendBasePageUrl())
-    context_->SetBasePageUrl(web_contents->GetURL());
+    context_->SetBasePageUrl(web_contents->GetLastCommittedURL());
 
   // Issue the resolve request.
   ResolveSearchTermFromContext();
diff --git a/chrome/browser/android/historical_tab_saver.cc b/chrome/browser/android/historical_tab_saver.cc
index 99b4bde..0285c9d9 100644
--- a/chrome/browser/android/historical_tab_saver.cc
+++ b/chrome/browser/android/historical_tab_saver.cc
@@ -26,7 +26,7 @@
     return;
 
   // Exclude internal pages from being marked as recent when they are closed.
-  const GURL& tab_url = web_contents->GetURL();
+  const GURL& tab_url = web_contents->GetLastCommittedURL();
   if (tab_url.SchemeIs(content::kChromeUIScheme) ||
       tab_url.SchemeIs(chrome::kChromeNativeScheme) ||
       tab_url.SchemeIs(url::kAboutScheme)) {
diff --git a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
index c17f964..f1de00d 100644
--- a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
+++ b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
@@ -111,7 +111,7 @@
     return;
   if (!user_navigated_away_from_launch_url_ &&
       !GURL(url_).EqualsIgnoringRef(
-          navigation_handle->GetWebContents()->GetURL())) {
+          navigation_handle->GetWebContents()->GetLastCommittedURL())) {
     user_navigated_away_from_launch_url_ =
         PageTransitionInitiatedByUser(navigation_handle);
   }
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
index e9c6f2d..2b15875c 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -1652,10 +1652,7 @@
         nullptr, ui::VKEY_ESCAPE, false, false, false, false));
   });
 
-  std::string button_title = features::IsSyncConsentOptionalEnabled()
-                                 ? "Got it"
-                                 : "Accept and continue";
-  sm_.ExpectSpeech(button_title);
+  sm_.ExpectSpeech("Accept and continue");
 
   // Check that profile switched to the active user.
   sm_.Call([]() {
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
index 8df0e467..93b2651 100644
--- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -173,9 +173,8 @@
   screen->SetProfileSyncEngineInitializedForTesting(true);
   screen->OnStateChanged(nullptr);
 
-  const std::string button_name = features::IsSyncConsentOptionalEnabled()
-                                      ? "acceptButton"
-                                      : "nonSplitSettingsAcceptButton";
+  // TODO(TBD): Rename the button to remove SplitSettings from its name.
+  const std::string button_name = "nonSplitSettingsAcceptButton";
   test::OobeJS().ExpectEnabledPath({"sync-consent", button_name});
   test::OobeJS().CreateFocusWaiter({"sync-consent", button_name})->Wait();
 
diff --git a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
index 21c6f41..8dca28c 100644
--- a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
@@ -63,16 +63,12 @@
 
 const test::UIPath kOverviewDialog = {kSyncConsent,
                                       "syncConsentOverviewDialog"};
-const test::UIPath kSplitSettingsDialog = {kSyncConsent,
-                                           "splitSettingsSyncConsentDialog"};
 const test::UIPath kReviewSettingsCheckBox = {kSyncConsent,
                                               "reviewSettingsBox"};
 const test::UIPath kNonSplitSettingsAcceptButton = {
     kSyncConsent, "nonSplitSettingsAcceptButton"};
 const test::UIPath kNonSplitSettingsDeclineButton = {
     kSyncConsent, "nonSplitSettingsDeclineButton"};
-const test::UIPath kAcceptButton = {kSyncConsent, "acceptButton"};
-const test::UIPath kDeclineButton = {kSyncConsent, "declineButton"};
 
 syncer::SyncUserSettings* GetSyncUserSettings() {
   Profile* profile = ProfileManager::GetPrimaryUserProfile();
@@ -147,41 +143,27 @@
     OobeBaseTest::SetUpOnMainThread();
     LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build =
         true;
-    if (features::IsSyncConsentOptionalEnabled()) {
+
+    if (features::IsMinorModeRestrictionEnabled() && is_minor_user_) {
       expected_consent_ids_ = {
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_DESCRIPTION,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_DESCRIPTION,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE_WITH_DEVICE,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_DESCRIPTION,
           IDS_LOGIN_SYNC_CONSENT_SCREEN_DECLINE2,
-          IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_TURN_ON_SYNC,
       };
     } else {
-      if (features::IsMinorModeRestrictionEnabled() && is_minor_user_) {
-        expected_consent_ids_ = {
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE_WITH_DEVICE,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_DESCRIPTION,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_DECLINE2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_TURN_ON_SYNC,
-        };
-      } else {
-        expected_consent_ids_ = {
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE_WITH_DEVICE,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME_2,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_DESCRIPTION,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_REVIEW_SYNC_OPTIONS_LATER,
-            IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE,
-        };
-      }
+      expected_consent_ids_ = {
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE_WITH_DEVICE,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME_2,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_DESCRIPTION,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_REVIEW_SYNC_OPTIONS_LATER,
+          IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE,
+      };
     }
 
     SyncConsentScreen::SetSyncConsentScreenExitTestDelegate(this);
@@ -362,14 +344,10 @@
   EXPECT_TRUE(settings->IsSyncEverythingEnabled());
 }
 
-// Tests of the consent recorder with SyncConsentOptional disabled. The
-// SyncConsentOptional suite below has its own consent recorder tests.
 class SyncConsentRecorderTest : public SyncConsentTest {
  public:
   SyncConsentRecorderTest() {
-    features_.InitWithFeatures(
-        /*enabled_features=*/{features::kSyncSettingsCategorization},
-        /*disabled_features=*/{features::kSyncConsentOptional});
+    features_.InitAndEnableFeature(features::kSyncSettingsCategorization);
   }
   ~SyncConsentRecorderTest() override = default;
 
@@ -485,262 +463,13 @@
                          SyncConsentPolicyDisabledTest,
                          testing::Bool());
 
-// Additional tests of the consent dialog that are only applicable when the
-// SyncConsentOptional flag enabled.
-class SyncConsentOptionalTest : public SyncConsentTest {
- public:
-  SyncConsentOptionalTest() {
-    sync_feature_list_.InitWithFeatures(
-        {
-            features::kSyncSettingsCategorization,
-            features::kSyncConsentOptional,
-        },
-        {});
-  }
-  ~SyncConsentOptionalTest() override = default;
-
- private:
-  base::test::ScopedFeatureList sync_feature_list_;
-};
-
-// Flaky failures on sanitizer builds. https://crbug.com/1054377
-#if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER)
-#define MAYBE_DefaultFlow DISABLED_DefaultFlow
-#else
-#define MAYBE_DefaultFlow DefaultFlow
-#endif
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, MAYBE_DefaultFlow) {
-  LoginToSyncConsentScreen();
-  WaitForScreenShown();
-
-  // OS sync is disabled by default.
-  Profile* profile = ProfileManager::GetPrimaryUserProfile();
-  PrefService* prefs = profile->GetPrefs();
-  EXPECT_FALSE(prefs->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled));
-
-  // Dialog not completed yet.
-  EXPECT_FALSE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
-
-  // Wait for content to load.
-  SyncConsentScreen* screen = GetSyncConsentScreen();
-  ConsentRecordedWaiter consent_recorded_waiter;
-  screen->SetDelegateForTesting(&consent_recorded_waiter);
-  screen->SetProfileSyncDisabledByPolicyForTesting(false);
-  screen->SetProfileSyncEngineInitializedForTesting(true);
-  screen->OnStateChanged(nullptr);
-  test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait();
-
-  // Dialog is visible.
-  test::OobeJS().ExpectVisiblePath(kSplitSettingsDialog);
-
-  // Click the accept button and wait for the JS to C++ callback.
-  test::OobeJS().ClickOnPath(kAcceptButton);
-  consent_recorded_waiter.Wait();
-  screen->SetDelegateForTesting(nullptr);
-
-  // Consent was recorded for the confirmation button.
-  EXPECT_EQ(SyncConsentScreen::CONSENT_GIVEN,
-            consent_recorded_waiter.consent_given_);
-  EXPECT_EQ("Got it", consent_recorded_waiter.consent_confirmation_string_);
-  EXPECT_EQ(IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2,
-            consent_recorded_waiter.consent_confirmation_id_);
-
-  // Consent was recorded for all descriptions, including the confirmation
-  // button label.
-  std::vector<int> expected_ids = {
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_DESCRIPTION,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_DESCRIPTION,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2,
-      IDS_LOGIN_SYNC_CONSENT_SCREEN_DECLINE2,
-  };
-  EXPECT_THAT(consent_recorded_waiter.consent_description_ids_,
-              testing::UnorderedElementsAreArray(expected_ids));
-
-  // OS sync should be on.
-  syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-
-  // Browser sync is on.
-  auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
-  EXPECT_TRUE(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  EXPECT_TRUE(settings->IsSyncRequested());
-  EXPECT_TRUE(settings->IsFirstSetupComplete());
-  EXPECT_TRUE(settings->IsSyncEverythingEnabled());
-
-  WaitForScreenExit();
-  EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NEXT);
-  histogram_tester_.ExpectTotalCount(
-      "OOBE.StepCompletionTimeByExitReason.Sync-consent.Next", 1);
-  histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Sync-consent", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.Behavior",
-      SyncConsentScreen::SyncScreenBehavior::kShow, 1);
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.UserChoice",
-      SyncConsentScreenHandler::UserChoice::kAccepted, 1);
-  histogram_tester_.ExpectUniqueSample("OOBE.SyncConsentScreen.SyncEnabled",
-                                       true, 1);
-
-  // Dialog is completed.
-  EXPECT_TRUE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
-}
-
-// Flaky failures on sanitizer builds. https://crbug.com/1054377
-#if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER)
-#define MAYBE_DisableSync DISABLED_DisableSync
-#else
-#define MAYBE_DisableSync DisableSync
-#endif
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, MAYBE_DisableSync) {
-  LoginToSyncConsentScreen();
-
-  // Wait for content to load.
-  SyncConsentScreen* screen = GetSyncConsentScreen();
-  ConsentRecordedWaiter consent_recorded_waiter;
-  screen->SetDelegateForTesting(&consent_recorded_waiter);
-  screen->SetProfileSyncDisabledByPolicyForTesting(false);
-  screen->SetProfileSyncEngineInitializedForTesting(true);
-  screen->OnStateChanged(nullptr);
-  test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait();
-
-  // Click the decline button and wait for the JS to C++ callback.
-  test::OobeJS().ClickOnPath(kDeclineButton);
-  consent_recorded_waiter.Wait();
-  screen->SetDelegateForTesting(nullptr);
-
-  // OS sync is off.
-  PrefService* prefs = ProfileManager::GetPrimaryUserProfile()->GetPrefs();
-  EXPECT_FALSE(prefs->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled));
-
-  // For historical reasons, browser sync is still on. However, all data types
-  // are disabled.
-  syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_TRUE(settings->IsSyncRequested());
-  EXPECT_TRUE(settings->IsFirstSetupComplete());
-  EXPECT_FALSE(settings->IsSyncEverythingEnabled());
-  EXPECT_TRUE(settings->GetSelectedTypes().Empty());
-
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.Behavior",
-      SyncConsentScreen::SyncScreenBehavior::kShow, 1);
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.UserChoice",
-      SyncConsentScreenHandler::UserChoice::kDeclined, 1);
-  histogram_tester_.ExpectUniqueSample("OOBE.SyncConsentScreen.SyncEnabled",
-                                       false, 1);
-
-  // Dialog is completed.
-  EXPECT_TRUE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
-}
-
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, LanguageSwitch) {
-  SwitchLanguage("es");
-  LoginToSyncConsentScreen();
-
-  SyncConsentScreen* screen = GetSyncConsentScreen();
-  ConsentRecordedWaiter consent_recorded_waiter;
-  screen->SetDelegateForTesting(&consent_recorded_waiter);
-
-  test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait();
-  test::OobeJS().TapOnPath(kAcceptButton);
-  consent_recorded_waiter.Wait();
-  screen->SetDelegateForTesting(nullptr);
-
-  EXPECT_THAT(consent_recorded_waiter.consent_description_strings_,
-              UnorderedElementsAreArray(GetLocalizedExpectedConsentStrings()));
-  EXPECT_THAT(
-      consent_recorded_waiter.consent_confirmation_string_,
-      Eq(GetLocalizedConsentString(IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2)));
-}
-
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, LanguageVariant) {
-  SwitchLanguage("en-GB");
-  LoginToSyncConsentScreen();
-
-  SyncConsentScreen* screen = GetSyncConsentScreen();
-  ConsentRecordedWaiter consent_recorded_waiter;
-  screen->SetDelegateForTesting(&consent_recorded_waiter);
-
-  test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait();
-  test::OobeJS().TapOnPath(kAcceptButton);
-  consent_recorded_waiter.Wait();
-  screen->SetDelegateForTesting(nullptr);
-
-  EXPECT_THAT(consent_recorded_waiter.consent_description_strings_,
-              UnorderedElementsAreArray(GetLocalizedExpectedConsentStrings()));
-  EXPECT_THAT(
-      consent_recorded_waiter.consent_confirmation_string_,
-      Eq(GetLocalizedConsentString(IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2)));
-}
-
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, SkippedNotBrandedBuild) {
-  LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build =
-      false;
-  LoginToSyncConsentScreen();
-  WaitForScreenExit();
-  EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NOT_APPLICABLE);
-
-  // OS sync should be on.
-  syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-
-  // Browser sync is on.
-  EXPECT_TRUE(settings->IsSyncRequested());
-  EXPECT_TRUE(settings->IsFirstSetupComplete());
-
-  // Dialog is completed.
-  PrefService* prefs = ProfileManager::GetPrimaryUserProfile()->GetPrefs();
-  EXPECT_TRUE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
-
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.Behavior",
-      SyncConsentScreen::SyncScreenBehavior::kSkipAndEnableNonBrandedBuild, 1);
-  histogram_tester_.ExpectUniqueSample("OOBE.SyncConsentScreen.SyncEnabled",
-                                       true, 1);
-}
-
-IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, SkippedSyncDisabledByPolicy) {
-  SyncConsentScreen::SetProfileSyncDisabledByPolicyForTesting(true);
-  LoginToSyncConsentScreen();
-  WaitForScreenExit();
-  EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NOT_APPLICABLE);
-
-  // OS sync should be off.
-  syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-
-  // Browser sync is off.
-  EXPECT_FALSE(settings->IsSyncRequested());
-  EXPECT_FALSE(settings->IsFirstSetupComplete());
-
-  // Dialog is completed.
-  PrefService* prefs = ProfileManager::GetPrimaryUserProfile()->GetPrefs();
-  EXPECT_TRUE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
-
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.SyncConsentScreen.Behavior",
-      SyncConsentScreen::SyncScreenBehavior::kSkipPermissionsPolicy, 1);
-  // We don't test SyncEnabled because this test fakes the policy disable and
-  // the sync engine is still enabled.
-}
-
 // Tests for Active Directory accounts, which skip the dialog because they do
 // not use sync.
 class SyncConsentActiveDirectoryTest : public OobeBaseTest {
  public:
   SyncConsentActiveDirectoryTest() {
-    sync_feature_list_.InitWithFeatures(
-        {
-            features::kSyncSettingsCategorization,
-            features::kSyncConsentOptional,
-        },
-        {});
+    sync_feature_list_.InitWithFeatures({features::kSyncSettingsCategorization},
+                                        {});
   }
   ~SyncConsentActiveDirectoryTest() override = default;
 
@@ -760,11 +489,8 @@
       "test-user@locally-managed.localhost", "password");
   test::WaitForPrimaryUserSessionStart();
 
-  // OS sync is off.
-  syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-
   // Browser sync is off.
+  syncer::SyncUserSettings* settings = GetSyncUserSettings();
   EXPECT_FALSE(settings->IsSyncRequested());
   EXPECT_FALSE(settings->IsFirstSetupComplete());
 
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc
index e222284..e32ceb3 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -215,8 +215,7 @@
   UpdateScreen(*context());
 }
 
-// TODO(https://crbug.com/1229582) Break SplitSettings names into
-// SyncConsentOptional and SyncSettingsCategorization in the whole file.
+// TODO(https://crbug.com/1229582) Remove SplitSettings from names in this file.
 void SyncConsentScreen::OnNonSplitSettingsContinue(
     const bool opted_in,
     const bool review_sync,
@@ -237,64 +236,6 @@
   Finish(Result::NEXT);
 }
 
-void SyncConsentScreen::OnContinue(
-    const std::vector<int>& consent_description,
-    int consent_confirmation,
-    SyncConsentScreenHandler::UserChoice choice) {
-  DCHECK(features::IsSyncConsentOptionalEnabled());
-  if (is_hidden())
-    return;
-  base::UmaHistogramEnumeration("OOBE.SyncConsentScreen.UserChoice", choice);
-  // Record that the user saw the consent text, regardless of which features
-  // they chose to enable.
-  RecordConsent(CONSENT_GIVEN, consent_description, consent_confirmation);
-  bool enable_sync = choice == SyncConsentScreenHandler::UserChoice::kAccepted;
-  UpdateSyncSettings(enable_sync);
-  Finish(Result::NEXT);
-}
-
-void SyncConsentScreen::UpdateSyncSettings(bool enable_sync) {
-  DCHECK(features::IsSyncConsentOptionalEnabled());
-  DCHECK(features::IsSyncSettingsCategorizationEnabled());
-  // For historical reasons, Chrome OS always has a "sync-consented" primary
-  // account in IdentityManager and always has browser sync "enabled". If the
-  // user disables the browser sync toggle we disable all browser data types,
-  // as if the user had opened browser sync settings and turned off all the
-  // toggles.
-  // TODO(crbug.com/1046746, crbug.com/1050677): Once all Chrome OS code is
-  // converted to the "consent aware" IdentityManager API, and the browser sync
-  // settings WebUI is converted to allow browser sync to be turned on/off, then
-  // this workaround can be removed.
-  syncer::SyncService* sync_service = GetSyncService(profile_);
-  if (sync_service) {
-    syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings();
-    sync_settings->SetOsSyncFeatureEnabled(enable_sync);
-    if (!enable_sync) {
-      syncer::UserSelectableTypeSet empty_set;
-      sync_settings->SetSelectedTypes(/*sync_everything=*/false, empty_set);
-    }
-    // TODO(crbug.com/1229582) Revisit the logic in case !enable_sync.
-    sync_settings->SetSyncRequested(true);
-    sync_settings->SetFirstSetupComplete(
-        syncer::SyncFirstSetupCompleteSource::BASIC_FLOW);
-  }
-  // Set a "sync-consented" primary account. See comment above.
-  auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
-  CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
-  DCHECK(!account_id.empty());
-  identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
-      account_id, signin::ConsentLevel::kSync);
-
-  // Only enable URL-keyed metrics if the user turned on browser sync.
-  if (enable_sync) {
-    unified_consent::UnifiedConsentService* consent_service =
-        UnifiedConsentServiceFactory::GetForProfile(profile_);
-    if (consent_service)
-      consent_service->SetUrlKeyedAnonymizedDataCollectionEnabled(true);
-  }
-}
-
 void SyncConsentScreen::MaybeEnableSyncForSkip() {
   // "sync everything" toggle is disabled during SyncService creation. We need
   // to turn it on if sync service needs to be enabled.
@@ -311,15 +252,9 @@
     case SyncScreenBehavior::kSkipAndEnableNonBrandedBuild:
     case SyncScreenBehavior::kSkipAndEnableEmphemeralUser:
     case SyncScreenBehavior::kSkipAndEnableScreenPolicy:
-      // Prior to SyncConsentOptional, sync is autostarted during SyncService
+      // Sync is autostarted during SyncService
       // creation with "sync everything" toggle off. We need to turn it on here.
-      // For SyncConsentOptional, we also need to update other sync-related
-      // flags.
-      if (features::IsSyncConsentOptionalEnabled()) {
-        UpdateSyncSettings(/*enable_sync=*/true);
-      } else {
-        SetSyncEverythingEnabled(/*enabled=*/true);
-      }
+      SetSyncEverythingEnabled(/*enabled=*/true);
       return;
   }
 }
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.h b/chrome/browser/ash/login/screens/sync_consent_screen.h
index 2fb49521..ce0ee1db 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.h
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.h
@@ -107,14 +107,6 @@
                                   const std::vector<int>& consent_description,
                                   const int consent_confirmation);
 
-  // Reacts to "Yes, I'm in" and "No, thanks".
-  void OnContinue(const std::vector<int>& consent_description,
-                  int consent_confirmation,
-                  SyncConsentScreenHandler::UserChoice choice);
-
-  // Configures OS sync and browser sync.
-  void UpdateSyncSettings(bool enable_sync);
-
   // Enables sync if required when skipping the dialog.
   void MaybeEnableSyncForSkip();
 
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index 2459977..e92c5e4d 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -1420,33 +1420,12 @@
         accounts_mutator->SeedAccountInfo(gaia_id, user->GetDisplayEmail());
 
     // 3. Set it as the Primary Account.
-    if (features::IsSyncConsentOptionalEnabled()) {
-      // In theory this should only be done for new profiles. However, if user
-      // profile prefs failed to save or the prefs are corrupted by a crash then
-      // the IdentityManager will start up without a primary account. See test
-      // CrashRestoreComplexTest.RestoreSessionForThreeUsers.
-      if (!identity_manager->HasPrimaryAccount(ConsentLevel::kSignin)) {
-        // Set the account without recording browser sync consent.
-        identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
-            account_id, ConsentLevel::kSignin);
-      }
+    identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
+        account_id, ConsentLevel::kSync);
 
-      CHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
-      CHECK_EQ(
-          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin).gaia,
-          gaia_id);
-    } else {
-      // Set a primary account here because the profile might have been
-      // created with the feature SyncConsentOptional enabled. Then the
-      // profile might only have an unconsented primary account.
-      identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
-          account_id, ConsentLevel::kSync);
-
-      CHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
-      CHECK_EQ(
-          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSync).gaia,
-          gaia_id);
-    }
+    CHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
+    CHECK_EQ(identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSync).gaia,
+             gaia_id);
 
     DCHECK_EQ(account_id,
               identity_manager->GetPrimaryAccountId(ConsentLevel::kSignin));
@@ -1505,10 +1484,7 @@
     return;
   user_profile_initialized_called_.insert(profile);
 
-  // OOBE doesn't set kOsSyncFeatureEnabled yet, call MigrateOsSyncPreferences
-  // to make sure it is correctly set.
-  // TODO(https://crbug.com/1229582): Revise when SyncConsentOptional changes
-  //                                  for OOBE are implemented.
+  // MigrateOsSyncPreferences migrates prefs for SyncSettingsCategorization.
   os_sync_util::MigrateOsSyncPreferences(profile->GetPrefs());
 
   BootTimesRecorder* btl = BootTimesRecorder::Get();
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
index 58d04e9..931570e 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
@@ -10,10 +10,13 @@
 
 #include "ash/public/cpp/privacy_screen_dlp_helper.h"
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/callback_helpers.h"
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/containers/cxx20_erase.h"
+#include "base/memory/weak_ptr.h"
+#include "base/notreached.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_restriction_set.h"
@@ -23,6 +26,7 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_warn_notifier.h"
 #include "chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
@@ -215,12 +219,22 @@
     const std::string& label,
     std::vector<content::DesktopMediaID> screen_capture_ids,
     const std::u16string& application_title,
+    base::OnceClosure stop_callback,
     content::MediaStreamUI::StateChangeCallback state_change_callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
   for (const content::DesktopMediaID& id : screen_capture_ids) {
-    ScreenShareInfo screen_share_info(label, id, application_title,
-                                      state_change_callback);
-    DCHECK(!base::Contains(running_screen_shares_, screen_share_info));
-    running_screen_shares_.push_back(screen_share_info);
+    ScreenShareInfo* screen_share_info =
+        new ScreenShareInfo(label, id, application_title,
+                            std::move(stop_callback), state_change_callback);
+    DCHECK(std::find_if(
+               running_screen_shares_.begin(), running_screen_shares_.end(),
+               [=](base::WeakPtr<ScreenShareInfo> screen_share_info) -> bool {
+                 return screen_share_info->GetLabel() == label &&
+                        screen_share_info->GetMediaId() == id;
+               }) == running_screen_shares_.end());
+
+    running_screen_shares_.push_back(screen_share_info->GetWeakPtr());
   }
   CheckRunningScreenShares();
 }
@@ -228,14 +242,7 @@
 void DlpContentManagerAsh::OnScreenCaptureStopped(
     const std::string& label,
     const content::DesktopMediaID& media_id) {
-  base::EraseIf(
-      running_screen_shares_, [=](ScreenShareInfo& screen_share_info) -> bool {
-        const bool erased = screen_share_info.GetLabel() == label &&
-                            screen_share_info.GetMediaId() == media_id;
-        // Hide notifications if necessary.
-        screen_share_info.HideNotifications();
-        return erased;
-      });
+  RemoveScreenShare(label, media_id);
 }
 
 void DlpContentManagerAsh::OnWindowRestrictionChanged(
@@ -259,21 +266,17 @@
   g_dlp_content_manager = nullptr;
 }
 
-DlpContentManagerAsh::ScreenShareInfo::ScreenShareInfo() = default;
 DlpContentManagerAsh::ScreenShareInfo::ScreenShareInfo(
     const std::string& label,
     const content::DesktopMediaID& media_id,
     const std::u16string& application_title,
+    base::OnceClosure stop_callback,
     content::MediaStreamUI::StateChangeCallback state_change_callback)
     : label_(label),
       media_id_(media_id),
       application_title_(application_title),
+      stop_callback_(std::move(stop_callback)),
       state_change_callback_(state_change_callback) {}
-DlpContentManagerAsh::ScreenShareInfo::ScreenShareInfo(
-    const DlpContentManagerAsh::ScreenShareInfo& other) = default;
-DlpContentManagerAsh::ScreenShareInfo&
-DlpContentManagerAsh::ScreenShareInfo::operator=(
-    const DlpContentManagerAsh::ScreenShareInfo& other) = default;
 DlpContentManagerAsh::ScreenShareInfo::~ScreenShareInfo() = default;
 
 bool DlpContentManagerAsh::ScreenShareInfo::operator==(
@@ -303,26 +306,36 @@
 }
 
 bool DlpContentManagerAsh::ScreenShareInfo::IsRunning() const {
-  return is_running_;
+  return state_ == State::kRunning;
 }
 
 void DlpContentManagerAsh::ScreenShareInfo::Pause() {
-  DCHECK(is_running_);
+  DCHECK(state_ == State::kRunning);
   state_change_callback_.Run(media_id_,
                              blink::mojom::MediaStreamStateChange::PAUSE);
-  is_running_ = false;
+  state_ = State::kPaused;
 }
 
 void DlpContentManagerAsh::ScreenShareInfo::Resume() {
-  DCHECK(!is_running_);
+  DCHECK(state_ == State::kPaused);
   state_change_callback_.Run(media_id_,
                              blink::mojom::MediaStreamStateChange::PLAY);
-  is_running_ = true;
+  state_ = State::kRunning;
+}
+
+void DlpContentManagerAsh::ScreenShareInfo::Stop() {
+  DCHECK(state_ != State::kStopped);
+  if (stop_callback_) {
+    std::move(stop_callback_).Run();
+    state_ = State::kStopped;
+  } else {
+    NOTREACHED();
+  }
 }
 
 void DlpContentManagerAsh::ScreenShareInfo::MaybeUpdateNotifications() {
-  UpdatePausedNotification(/*show=*/!is_running_);
-  UpdateResumedNotification(/*show=*/is_running_);
+  UpdatePausedNotification(/*show=*/state_ == State::kPaused);
+  UpdateResumedNotification(/*show=*/state_ == State::kRunning);
 }
 
 void DlpContentManagerAsh::ScreenShareInfo::HideNotifications() {
@@ -330,12 +343,18 @@
   UpdateResumedNotification(/*show=*/false);
 }
 
+base::WeakPtr<DlpContentManagerAsh::ScreenShareInfo>
+DlpContentManagerAsh::ScreenShareInfo::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
 void DlpContentManagerAsh::ScreenShareInfo::UpdatePausedNotification(
     bool show) {
   if ((notification_state_ == NotificationState::kShowingPausedNotification) ==
       show)
     return;
   if (show) {
+    DCHECK(state_ == State::kPaused);
     ShowDlpScreenSharePausedNotification(label_, application_title_);
     notification_state_ = NotificationState::kShowingPausedNotification;
   } else {
@@ -350,6 +369,7 @@
       show)
     return;
   if (show) {
+    DCHECK(state_ == State::kRunning);
     ShowDlpScreenShareResumedNotification(label_, application_title_);
     notification_state_ = NotificationState::kShowingResumedNotification;
   } else {
@@ -696,19 +716,35 @@
   }
 }
 
+void DlpContentManagerAsh::RemoveScreenShare(
+    const std::string& label,
+    const content::DesktopMediaID& media_id) {
+  base::EraseIf(running_screen_shares_,
+                [=](base::WeakPtr<ScreenShareInfo> screen_share_info) -> bool {
+                  const bool erased =
+                      screen_share_info->GetLabel() == label &&
+                      screen_share_info->GetMediaId() == media_id;
+                  // Hide notifications if necessary.
+                  screen_share_info->HideNotifications();
+                  return erased;
+                });
+}
+
 void DlpContentManagerAsh::CheckRunningScreenShares() {
-  for (auto& screen_share : running_screen_shares_) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  for (base::WeakPtr<ScreenShareInfo> screen_share : running_screen_shares_) {
     ConfidentialContentsInfo info =
-        GetScreenShareConfidentialContentsInfo(screen_share.GetMediaId());
+        GetScreenShareConfidentialContentsInfo(screen_share->GetMediaId());
     if (IsBlocked(info.restriction_info)) {
-      if (screen_share.IsRunning()) {
-        screen_share.Pause();
+      if (screen_share->IsRunning()) {
+        screen_share->Pause();
         MaybeReportEvent(info.restriction_info,
                          DlpRulesManager::Restriction::kScreenShare);
         DlpBooleanHistogram(dlp::kScreenSharePausedOrResumedUMA, true);
-        screen_share.MaybeUpdateNotifications();
+        screen_share->MaybeUpdateNotifications();
       }
-      return;
+      continue;
     }
     if (is_screen_share_warning_mode_enabled_ &&
         IsWarn(info.restriction_info)) {
@@ -718,15 +754,15 @@
                             DlpRulesManager::Restriction::kScreenShare);
       if (info.confidential_contents.IsEmpty()) {
         // The user already allowed all the visible content.
-        if (!screen_share.IsRunning()) {
-          screen_share.Resume();
-          screen_share.MaybeUpdateNotifications();
+        if (!screen_share->IsRunning()) {
+          screen_share->Resume();
+          screen_share->MaybeUpdateNotifications();
         }
-        return;
+        continue;
       }
-      if (screen_share.IsRunning()) {
-        screen_share.Pause();
-        screen_share.HideNotifications();
+      if (screen_share->IsRunning()) {
+        screen_share->Pause();
+        screen_share->HideNotifications();
       }
       // base::Unretained(this) is safe here because DlpContentManagerAsh is
       // initialized as a singleton that's always available in the system.
@@ -734,14 +770,14 @@
           base::BindOnce(&DlpContentManagerAsh::OnDlpScreenShareWarnDialogReply,
                          base::Unretained(this), info.confidential_contents,
                          screen_share),
-          info.confidential_contents, screen_share.GetApplicationTitle());
-      return;
+          info.confidential_contents, screen_share->GetApplicationTitle());
+      continue;
     }
     // No restrictions apply, only resume if necessary.
-    if (!screen_share.IsRunning()) {
-      screen_share.Resume();
+    if (!screen_share->IsRunning()) {
+      screen_share->Resume();
       DlpBooleanHistogram(dlp::kScreenSharePausedOrResumedUMA, false);
-      screen_share.MaybeUpdateNotifications();
+      screen_share->MaybeUpdateNotifications();
     }
   }
 }
@@ -810,19 +846,26 @@
 
 void DlpContentManagerAsh::OnDlpScreenShareWarnDialogReply(
     const DlpConfidentialContents& confidential_contents,
-    ScreenShareInfo screen_share,
+    base::WeakPtr<ScreenShareInfo> screen_share,
     bool should_proceed) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (!screen_share)
+    // The screen share was stopped before the dialog was addressed, so no need
+    // to do anything.
+    return;
+
   if (should_proceed) {
-    screen_share.Resume();
+    screen_share->Resume();
     for (const auto& content : confidential_contents.GetContents()) {
       user_allowed_contents_cache_.Cache(
           content, DlpRulesManager::Restriction::kScreenShare);
     }
   } else {
-    // TODO(crbug.com/1259605): stop instead of pause.
-    screen_share.Pause();
+    screen_share->Stop();
+    RemoveScreenShare(screen_share->GetLabel(), screen_share->GetMediaId());
   }
-  screen_share.MaybeUpdateNotifications();
+  screen_share->MaybeUpdateNotifications();
 }
 
 // ScopedDlpContentManagerAshForTesting
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
index 85e462da..60bb211 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/capture_mode/capture_mode_delegate.h"
 #include "base/callback.h"
 #include "base/containers/flat_map.h"
+#include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/policy/dlp/dlp_window_observer.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.h"
@@ -122,6 +123,7 @@
       const std::string& label,
       std::vector<content::DesktopMediaID> screen_capture_ids,
       const std::u16string& application_title,
+      base::OnceClosure stop_callback,
       content::MediaStreamUI::StateChangeCallback state_change_callback);
 
   // Called when screen capture is stopped.
@@ -155,14 +157,14 @@
   // Used to keep track of running screen shares.
   class ScreenShareInfo {
    public:
-    ScreenShareInfo();
     ScreenShareInfo(
         const std::string& label,
         const content::DesktopMediaID& media_id,
         const std::u16string& application_title,
+        base::OnceClosure stop_callback,
         content::MediaStreamUI::StateChangeCallback state_change_callback);
-    ScreenShareInfo(const ScreenShareInfo& other);
-    ScreenShareInfo& operator=(const ScreenShareInfo& other);
+    ScreenShareInfo(const ScreenShareInfo& other) = delete;
+    ScreenShareInfo& operator=(const ScreenShareInfo& other) = delete;
     ~ScreenShareInfo();
 
     bool operator==(const ScreenShareInfo& other) const;
@@ -179,6 +181,8 @@
     // Resumes a paused screen share.
     // No-op if the screen share is already running.
     void Resume();
+    // Stops the screen share. Can only be called once.
+    void Stop();
 
     // If necessary, hides or shows the paused/resumed notification for this
     // screen share. The notification should be updated after changing the state
@@ -189,12 +193,15 @@
     // share.
     void HideNotifications();
 
+    base::WeakPtr<ScreenShareInfo> GetWeakPtr();
+
    private:
     enum class NotificationState {
       kNotShowingNotification,
       kShowingPausedNotification,
       kShowingResumedNotification
     };
+    enum class State { kRunning, kPaused, kStopped };
     // Shows (if |show| is true) or hides (if |show| is false) paused
     // notification for this screen share. Does nothing if the notification is
     // already in the required state.
@@ -208,10 +215,13 @@
     content::DesktopMediaID media_id_;
     // TODO(crbug.com/1264793): Don't cache the application name.
     std::u16string application_title_;
+    base::OnceClosure stop_callback_;
     content::MediaStreamUI::StateChangeCallback state_change_callback_;
-    bool is_running_ = true;
+    State state_ = State::kRunning;
     NotificationState notification_state_ =
         NotificationState::kNotShowingNotification;
+
+    base::WeakPtrFactory<ScreenShareInfo> weak_factory_{this};
   };
 
   // Structure to keep track of a running video capture.
@@ -265,6 +275,10 @@
   // in the corresponding areas.
   void CheckRunningVideoCapture();
 
+  // Removes screen share from |running_screen_shares_|.
+  void RemoveScreenShare(const std::string& label,
+                         const content::DesktopMediaID& media_id);
+
   // Checks and stops the running screen shares if restricted content appeared
   // in the corresponding areas.
   void CheckRunningScreenShares();
@@ -286,7 +300,7 @@
   // the user to avoid future warnings.
   void OnDlpScreenShareWarnDialogReply(
       const DlpConfidentialContents& confidential_contents,
-      ScreenShareInfo screen_share,
+      base::WeakPtr<ScreenShareInfo> screen_share,
       bool should_proceed);
 
   // Map of window observers for the current confidential WebContents.
@@ -307,7 +321,7 @@
   absl::optional<VideoCaptureInfo> running_video_capture_info_;
 
   // List of the currently running screen shares.
-  std::vector<ScreenShareInfo> running_screen_shares_;
+  std::vector<base::WeakPtr<ScreenShareInfo>> running_screen_shares_;
 };
 
 // Helper class to call SetDlpContentManagerAshForTesting and
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
index f6c1f5a..adbeab1 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
@@ -41,9 +41,11 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/desktop_media_id.h"
 #include "content/public/browser/desktop_streams_registry.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
 #include "ui/aura/window.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -141,6 +143,50 @@
     }
   }
 
+  void StartDesktopScreenShare(
+      content::WebContents* web_contents,
+      blink::mojom::MediaStreamRequestResult expected_result) {
+    const GURL origin(kExampleUrl);
+    const std::string id =
+        content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
+            web_contents->GetMainFrame()->GetProcess()->GetID(),
+            web_contents->GetMainFrame()->GetRoutingID(),
+            url::Origin::Create(origin),
+            content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
+                                    content::DesktopMediaID::kFakeId),
+            /*extension_name=*/"",
+            content::DesktopStreamRegistryType::kRegistryStreamTypeDesktop);
+    content::MediaStreamRequest request(
+        web_contents->GetMainFrame()->GetProcess()->GetID(),
+        web_contents->GetMainFrame()->GetRoutingID(), /*page_request_id=*/0,
+        origin, /*user_gesture=*/false, blink::MEDIA_GENERATE_STREAM,
+        /*requested_audio_device_id=*/std::string(), id,
+        blink::mojom::MediaStreamType::NO_SERVICE,
+        blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE,
+        /*disable_local_echo=*/false,
+        /*request_pan_tilt_zoom_permission=*/false,
+        /*region_capture_capable=*/false);
+    DesktopCaptureAccessHandler access_handler{
+        std::make_unique<FakeDesktopMediaPickerFactory>()};
+
+    base::test::TestFuture<
+        std::reference_wrapper<const blink::MediaStreamDevices>,
+        blink::mojom::MediaStreamRequestResult,
+        std::unique_ptr<content::MediaStreamUI>>
+        test_future;
+
+    access_handler.HandleRequest(
+        web_contents, request,
+        test_future.GetCallback<const blink::MediaStreamDevices&,
+                                blink::mojom::MediaStreamRequestResult,
+                                std::unique_ptr<content::MediaStreamUI>>(),
+        /*extension=*/nullptr);
+
+    ASSERT_TRUE(test_future.Wait()) << "MediaResponseCallback timed out.";
+
+    EXPECT_EQ(test_future.Get<1>(), expected_result);
+  }
+
  protected:
   std::unique_ptr<DlpContentManagerAshTestHelper> helper_;
   base::HistogramTester histogram_tester_;
@@ -567,8 +613,10 @@
       browser()->window()->GetNativeWindow()->GetRootWindow();
   const auto media_id = content::DesktopMediaID::RegisterNativeWindow(
       content::DesktopMediaID::TYPE_SCREEN, root_window);
-  manager->OnScreenCaptureStarted("label", {media_id}, u"example.com",
-                                  base::DoNothing());
+  manager->OnScreenCaptureStarted(
+      "label", {media_id}, u"example.com",
+      base::BindOnce([]() { FAIL() << "Stop callback should not be called."; }),
+      base::DoNothing());
 
   EXPECT_FALSE(
       display_service_tester.GetNotification(kScreenSharePausedNotificationId));
@@ -651,6 +699,29 @@
   helper_->ChangeConfidentiality(web_contents, kEmptyRestrictionSet);
 }
 
+IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, ScreenShareRestricted) {
+  SetupReporting();
+  const GURL origin(kExampleUrl);
+  NotificationDisplayServiceTester display_service_tester(browser()->profile());
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), origin));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  helper_->ChangeConfidentiality(web_contents, kScreenShareRestricted);
+
+  StartDesktopScreenShare(
+      web_contents, blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
+  CheckEvents(DlpRulesManager::Restriction::kScreenShare,
+              DlpRulesManager::Level::kBlock, 1u);
+  // TODO(https://crbug.com/1246386): change below to TRUE after switching to
+  // CheckScreenShareRestriction which will also show the DLP notification.
+  EXPECT_FALSE(display_service_tester.GetNotification(
+      kScreenShareBlockedNotificationId));
+  histogram_tester_.ExpectBucketCount(
+      GetDlpHistogramPrefix() + dlp::kScreenShareBlockedUMA, true, 1);
+  histogram_tester_.ExpectBucketCount(
+      GetDlpHistogramPrefix() + dlp::kScreenShareBlockedUMA, false, 0);
+}
+
 // Starting screen sharing and navigating other tabs should create exactly one
 // reporting event.
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, ScreenShareReporting) {
@@ -660,50 +731,10 @@
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), origin));
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
-
-  // Setup screen sharing (media stream)
-  auto picker_factory = std::make_unique<FakeDesktopMediaPickerFactory>();
-  DesktopCaptureAccessHandler access_handler{std::move(picker_factory)};
-
-  const std::string id =
-      content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
-          web_contents->GetMainFrame()->GetProcess()->GetID(),
-          web_contents->GetMainFrame()->GetRoutingID(),
-          url::Origin::Create(origin),
-          content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
-                                  content::DesktopMediaID::kFakeId),
-          /*extension_name=*/"",
-          content::DesktopStreamRegistryType::kRegistryStreamTypeDesktop);
-  content::MediaStreamRequest request(
-      web_contents->GetMainFrame()->GetProcess()->GetID(),
-      web_contents->GetMainFrame()->GetRoutingID(), /*page_request_id=*/0,
-      origin, /*user_gesture=*/false, blink::MEDIA_GENERATE_STREAM,
-      /*requested_audio_device_id=*/std::string(), id,
-      blink::mojom::MediaStreamType::NO_SERVICE,
-      blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE,
-      /*disable_local_echo=*/false,
-      /*request_pan_tilt_zoom_permission=*/false,
-      /*region_capture_capable=*/false);
-
-  base::test::TestFuture<
-      std::reference_wrapper<const blink::MediaStreamDevices>,
-      blink::mojom::MediaStreamRequestResult,
-      std::unique_ptr<content::MediaStreamUI>>
-      test_future;
-
   helper_->ChangeConfidentiality(web_contents, kScreenShareReported);
 
-  access_handler.HandleRequest(
-      web_contents, request,
-      test_future.GetCallback<const blink::MediaStreamDevices&,
-                              blink::mojom::MediaStreamRequestResult,
-                              std::unique_ptr<content::MediaStreamUI>>(),
-      /*extension=*/nullptr);
-
-  ASSERT_TRUE(test_future.Wait()) << "Callback timed out.";
-
-  EXPECT_EQ(test_future.Get<1>(), blink::mojom::MediaStreamRequestResult::OK);
-
+  StartDesktopScreenShare(web_contents,
+                          blink::mojom::MediaStreamRequestResult::OK);
   CheckEvents(DlpRulesManager::Restriction::kScreenShare,
               DlpRulesManager::Level::kReport, 1u);
   EXPECT_FALSE(display_service_tester.GetNotification(
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.cc
index 7e6b417..ec93f2f 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.cc
@@ -68,6 +68,11 @@
   return manager_->user_allowed_contents_cache_.GetSizeForTesting() != 0;
 }
 
+void DlpContentManagerAshTestHelper::EnableScreenShareWarningMode() {
+  DCHECK(manager_);
+  manager_->SetIsScreenShareWarningModeEnabledForTesting(/*is_enabled=*/true);
+}
+
 base::TimeDelta DlpContentManagerAshTestHelper::GetPrivacyScreenOffDelay()
     const {
   DCHECK(manager_);
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.h b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.h
index 03b3e657..677f0e9 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.h
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_test_helper.h
@@ -44,6 +44,8 @@
 
   bool HasAnyContentCached() const;
 
+  void EnableScreenShareWarningMode();
+
   base::TimeDelta GetPrivacyScreenOffDelay() const;
 
   DlpContentManagerAsh* GetContentManager() const;
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc
index 0772461..e8a00f0c 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc
@@ -255,85 +255,6 @@
   }
 }
 
-void HandleNetworkResult(MetricCallback callback,
-                         CrosHealthdMetricSampler::MetricType metric_type,
-                         MetricData metric_data,
-                         cros_healthd::TelemetryInfoPtr result) {
-  const auto& network_result = result->network_interface_result;
-  if (network_result.is_null()) {
-    std::move(callback).Run(metric_data);
-    return;
-  }
-
-  switch (network_result->which()) {
-    case cros_healthd::NetworkInterfaceResult::Tag::ERROR: {
-      DVLOG(1) << "cros_healthd: Error getting network result: "
-               << network_result->get_error()->msg;
-      break;
-    }
-
-    case cros_healthd::NetworkInterfaceResult::Tag::NETWORK_INTERFACE_INFO: {
-      for (const auto& network_info :
-           network_result->get_network_interface_info()) {
-        // Handle wireless interface telemetry
-        if (network_info->is_wireless_interface_info() &&
-            metric_type == CrosHealthdMetricSampler::MetricType::kTelemetry) {
-          auto* network_telemetry_list = metric_data.mutable_telemetry_data()
-                                             ->mutable_networks_telemetry();
-          ::reporting::NetworkTelemetry* network_telemetry_out;
-
-          // Find if wireless telemetry already exists in metric data.
-          for (int i = 0; i < network_telemetry_list->network_telemetry_size();
-               i++) {
-            if (network_telemetry_list->network_telemetry(i).type() ==
-                ::reporting::NetworkType::WIFI) {
-              network_telemetry_out =
-                  network_telemetry_list->mutable_network_telemetry(i);
-            }
-          }
-          if (!network_telemetry_out) {
-            network_telemetry_out =
-                network_telemetry_list->add_network_telemetry();
-          }
-
-          // Set data.
-          auto* const interface_telemetry_out =
-              network_telemetry_out->add_network_interface_telemetry();
-          auto* const wireless_telemetry_out =
-              interface_telemetry_out->mutable_wireless_interface();
-          const auto& wireless_info =
-              network_info->get_wireless_interface_info();
-
-          interface_telemetry_out->set_interface_name(
-              wireless_info->interface_name);
-          wireless_telemetry_out->set_power_management_enabled(
-              wireless_info->power_management_on);
-
-          if (wireless_info->wireless_link_info) {
-            const auto& wireless_link_info = wireless_info->wireless_link_info;
-            wireless_telemetry_out->set_access_point_address(
-                wireless_link_info->access_point_address_str);
-            wireless_telemetry_out->set_tx_bit_rate_mbps(
-                wireless_link_info->tx_bit_rate_mbps);
-            wireless_telemetry_out->set_rx_bit_rate_mbps(
-                wireless_link_info->rx_bit_rate_mbps);
-            wireless_telemetry_out->set_tx_power_dbm(
-                wireless_link_info->tx_power_dBm);
-            wireless_telemetry_out->set_encryption_on(
-                wireless_link_info->encyption_on);
-            wireless_telemetry_out->set_link_quality(
-                wireless_link_info->link_quality);
-            wireless_telemetry_out->set_signal_level_dbm(
-                wireless_link_info->signal_level_dBm);
-          }
-        }
-      }
-    }
-  }
-
-  std::move(callback).Run(std::move(metric_data));
-}
-
 void OnHealthdInfoReceived(MetricCallback callback,
                            cros_healthd::ProbeCategoryEnum probe_category,
                            CrosHealthdMetricSampler::MetricType metric_type,
@@ -362,11 +283,6 @@
                          std::move(metric_data), std::move(result));
       break;
     }
-    case cros_healthd::ProbeCategoryEnum::kNetworkInterface: {
-      HandleNetworkResult(std::move(callback), metric_type,
-                          std::move(metric_data), std::move(result));
-      break;
-    }
     default: {
       NOTREACHED();
       return;
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc
index 67049ee..4232883 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc
@@ -39,17 +39,6 @@
 constexpr int64_t kTmeMaxKeys = 2;
 constexpr int64_t kTmeKeysLength = 4;
 
-// Wifi constants.
-constexpr char kInterfaceName[] = "interface_name";
-constexpr char kAccessPointAddress[] = "access_point";
-constexpr bool kPowerManagementEnabled = true;
-constexpr bool kEncryptionOn = true;
-constexpr int64_t kTxBitRateMbps = 8;
-constexpr int64_t kRxBitRateMbps = 4;
-constexpr int64_t kTxPowerDbm = 2;
-constexpr int64_t kLinkQuality = 1;
-constexpr int kSignalLevelDbm = 10;
-
 cros_healthd::KeylockerInfoPtr CreateKeylockerInfo(bool configured) {
   return cros_healthd::KeylockerInfo::New(configured);
 }
@@ -87,36 +76,6 @@
   return telemetry_info;
 }
 
-cros_healthd::TelemetryInfoPtr CreateWifiResult(
-    const std::string& interface_name,
-    bool power_management_enabled,
-    const std::string& access_point_address,
-    int64_t tx_bit_rate_mbps,
-    int64_t rx_bit_rate_mbps,
-    int64_t tx_power_dbm,
-    bool encryption_on,
-    int64_t link_quality,
-    int signal_level_dbm) {
-  auto telemetry_info = cros_healthd::TelemetryInfo::New();
-  std::vector<cros_healthd::NetworkInterfaceInfoPtr> network_interfaces;
-
-  auto wireless_link_info = cros_healthd::WirelessLinkInfo::New(
-      access_point_address, tx_bit_rate_mbps, rx_bit_rate_mbps, tx_power_dbm,
-      encryption_on, link_quality, signal_level_dbm);
-  auto wireless_interface_info = cros_healthd::WirelessInterfaceInfo::New(
-      interface_name, power_management_enabled, std::move(wireless_link_info));
-  network_interfaces.push_back(
-      cros_healthd::NetworkInterfaceInfo::NewWirelessInterfaceInfo(
-          std::move(wireless_interface_info)));
-  auto network_interface_result =
-      cros_healthd::NetworkInterfaceResult::NewNetworkInterfaceInfo(
-          std::move(network_interfaces));
-
-  telemetry_info->network_interface_result =
-      std::move(network_interface_result);
-  return telemetry_info;
-}
-
 cros_healthd::AudioInfoPtr CreateAudioInfo(
     bool output_mute,
     bool input_mute,
@@ -271,51 +230,6 @@
             ::reporting::MEMORY_ENCRYPTION_STATE_DISABLED);
 }
 
-TEST_F(CrosHealthdMetricSamplerTest, TestWirelessTelemetry) {
-  // Provide some partially set network telemetry to verify the sampler
-  // properly builds upon it.
-  MetricData metric_data;
-  auto* const network_telemetry_out = metric_data.mutable_telemetry_data()
-                                          ->mutable_networks_telemetry()
-                                          ->add_network_telemetry();
-  network_telemetry_out->set_type(::reporting::NetworkType::WIFI);
-  network_telemetry_out->set_signal_strength(1);
-  MetricData result = CollectData(
-      CreateWifiResult(kInterfaceName, kPowerManagementEnabled,
-                       kAccessPointAddress, kTxBitRateMbps, kRxBitRateMbps,
-                       kTxPowerDbm, kEncryptionOn, kLinkQuality,
-                       kSignalLevelDbm),
-      cros_healthd::ProbeCategoryEnum::kNetworkInterface,
-      CrosHealthdMetricSampler::MetricType::kTelemetry, std::move(metric_data));
-
-  ASSERT_TRUE(result.has_telemetry_data());
-  ASSERT_TRUE(result.telemetry_data().has_networks_telemetry());
-  ASSERT_EQ(
-      result.telemetry_data().networks_telemetry().network_telemetry_size(), 1);
-
-  const auto& network_telemetry =
-      result.telemetry_data().networks_telemetry().network_telemetry(0);
-  EXPECT_EQ(network_telemetry.type(), ::reporting::NetworkType::WIFI);
-  EXPECT_EQ(network_telemetry.signal_strength(), 1);
-  ASSERT_EQ(network_telemetry.network_interface_telemetry_size(), 1);
-
-  const auto& network_interface =
-      network_telemetry.network_interface_telemetry(0);
-  EXPECT_EQ(network_interface.interface_name(), kInterfaceName);
-  ASSERT_TRUE(network_interface.has_wireless_interface());
-
-  const auto& wireless_interface = network_interface.wireless_interface();
-  EXPECT_EQ(wireless_interface.power_management_enabled(),
-            kPowerManagementEnabled);
-  EXPECT_EQ(wireless_interface.access_point_address(), kAccessPointAddress);
-  EXPECT_EQ(wireless_interface.tx_bit_rate_mbps(), kTxBitRateMbps);
-  EXPECT_EQ(wireless_interface.rx_bit_rate_mbps(), kRxBitRateMbps);
-  EXPECT_EQ(wireless_interface.tx_power_dbm(), kTxPowerDbm);
-  EXPECT_EQ(wireless_interface.encryption_on(), kEncryptionOn);
-  EXPECT_EQ(wireless_interface.link_quality(), kLinkQuality);
-  EXPECT_EQ(wireless_interface.signal_level_dbm(), kSignalLevelDbm);
-}
-
 TEST_F(CrosHealthdMetricSamplerTest, TestKeylockerConfigured) {
   MetricData result =
       CollectData(CreateCpuResult(CreateKeylockerInfo(true)),
@@ -382,17 +296,6 @@
       std::move(telemetry_info), cros_healthd::ProbeCategoryEnum::kAudio,
       CrosHealthdMetricSampler::MetricType::kTelemetry);
   ASSERT_FALSE(audio_data.has_telemetry_data());
-
-  telemetry_info = cros_healthd::TelemetryInfo::New();
-  telemetry_info->network_interface_result =
-      cros_healthd::NetworkInterfaceResult::NewError(
-          cros_healthd::ProbeError::New(cros_healthd::ErrorType::kFileReadError,
-                                        ""));
-  const auto& network_data =
-      CollectError(std::move(telemetry_info),
-                   cros_healthd::ProbeCategoryEnum::kNetworkInterface,
-                   CrosHealthdMetricSampler::MetricType::kTelemetry);
-  ASSERT_FALSE(network_data.has_telemetry_data());
 }
 
 TEST_F(CrosHealthdMetricSamplerTest, TestAudioNormalTest) {
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
index 0adaba621..a00aea45 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
@@ -11,6 +11,7 @@
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_type_pattern.h"
+#include "chromeos/services/cros_healthd/public/cpp/service_connection.h"
 #include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h"
 #include "components/reporting/proto/synced/metric_data.pb.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
@@ -18,6 +19,87 @@
 namespace reporting {
 namespace {
 
+void HandleNetworkResult(
+    MetricCallback callback,
+    MetricData metric_data,
+    chromeos::cros_healthd::mojom::TelemetryInfoPtr result) {
+  const auto& network_result = result->network_interface_result;
+  if (network_result.is_null()) {
+    std::move(callback).Run(metric_data);
+    return;
+  }
+
+  switch (network_result->which()) {
+    case chromeos::cros_healthd::mojom::NetworkInterfaceResult::Tag::ERROR: {
+      DVLOG(1) << "cros_healthd: Error getting network result: "
+               << network_result->get_error()->msg;
+      break;
+    }
+
+    case chromeos::cros_healthd::mojom::NetworkInterfaceResult::Tag::
+        NETWORK_INTERFACE_INFO: {
+      for (const auto& network_info :
+           network_result->get_network_interface_info()) {
+        // Handle wireless interface telemetry
+        if (network_info->is_wireless_interface_info()) {
+          auto* network_telemetry_list = metric_data.mutable_telemetry_data()
+                                             ->mutable_networks_telemetry();
+          ::reporting::NetworkTelemetry* network_telemetry_out = nullptr;
+
+          const auto& wireless_info =
+              network_info->get_wireless_interface_info();
+          for (int i = 0; i < network_telemetry_list->network_telemetry_size();
+               ++i) {
+            const auto& network = network_telemetry_list->network_telemetry(i);
+
+            // Find a matching network from network health probe.
+            if (!network.has_device_path()) {
+              continue;
+            }
+            int name_idx = network.device_path().rfind("/");
+            if (name_idx == std::string::npos ||
+                name_idx >= network.device_path().length() - 1) {
+              continue;
+            }
+
+            // Matching network found.
+            if (wireless_info->interface_name ==
+                network.device_path().substr(name_idx + 1)) {
+              network_telemetry_out =
+                  network_telemetry_list->mutable_network_telemetry(i);
+              // Power management can be set even if the device is not connected
+              // to an access point.
+              network_telemetry_out->set_power_management_enabled(
+                  wireless_info->power_management_on);
+
+              // wireless link info is only avialble when the device is
+              // connected to the access point.
+              if (wireless_info->wireless_link_info) {
+                const auto& wireless_link_info =
+                    wireless_info->wireless_link_info;
+                network_telemetry_out->set_tx_bit_rate_mbps(
+                    wireless_link_info->tx_bit_rate_mbps);
+                network_telemetry_out->set_rx_bit_rate_mbps(
+                    wireless_link_info->rx_bit_rate_mbps);
+                network_telemetry_out->set_tx_power_dbm(
+                    wireless_link_info->tx_power_dBm);
+                network_telemetry_out->set_encryption_on(
+                    wireless_link_info->encyption_on);
+                network_telemetry_out->set_link_quality(
+                    wireless_link_info->link_quality);
+                network_telemetry_out->set_access_point_address(
+                    wireless_link_info->access_point_address_str);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  std::move(callback).Run(std::move(metric_data));
+}
+
 NetworkConnectionState GetNetworkConnectionState(
     const chromeos::NetworkState* network) {
   if (network->IsConnectedState() && network->IsCaptivePortal()) {
@@ -100,11 +182,11 @@
     }
   }
 
-  CrosHealthdMetricSampler sampler(
-      chromeos::cros_healthd::mojom::ProbeCategoryEnum::kNetworkInterface,
-      ::reporting::CrosHealthdMetricSampler::MetricType::kTelemetry);
-  sampler.SetMetricData(std::move(metric_data));
-  sampler.Collect(std::move(callback));
+  chromeos::cros_healthd::ServiceConnection::GetInstance()->ProbeTelemetryInfo(
+      std::vector<chromeos::cros_healthd::mojom::ProbeCategoryEnum>{
+          chromeos::cros_healthd::mojom::ProbeCategoryEnum::kNetworkInterface},
+      base::BindOnce(HandleNetworkResult, std::move(callback),
+                     std::move(metric_data)));
 }
 }  // namespace
 
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
index ee9eafae..0b1de57 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
@@ -32,15 +32,13 @@
 namespace {
 
 // Wifi constants.
-constexpr char kInterfaceName[] = "interface_name";
 constexpr char kAccessPointAddress[] = "access_point";
-constexpr bool kPowerManagementEnabled = true;
 constexpr bool kEncryptionOn = true;
+constexpr bool kPowerManagementOn = true;
 constexpr int64_t kTxBitRateMbps = 8;
 constexpr int64_t kRxBitRateMbps = 4;
 constexpr int64_t kTxPowerDbm = 2;
 constexpr int64_t kLinkQuality = 1;
-constexpr int kSignalLevelDbm = 10;
 
 struct FakeNetworkData {
   std::string guid;
@@ -277,9 +275,9 @@
        false /* is_portal */, true /* is_visible */, true /* is_configured */}};
 
   auto telemetry_info = CreateWifiResult(
-      kInterfaceName, kPowerManagementEnabled, kAccessPointAddress,
-      kTxBitRateMbps, kRxBitRateMbps, kTxPowerDbm, kEncryptionOn, kLinkQuality,
-      kSignalLevelDbm);
+      "path3", kPowerManagementOn, kAccessPointAddress, kTxBitRateMbps,
+      kRxBitRateMbps, kTxPowerDbm, kEncryptionOn, kLinkQuality,
+      /*signal_level=*/0);
   chromeos::cros_healthd::FakeCrosHealthdClient::Get()
       ->SetProbeTelemetryInfoResponseForTesting(telemetry_info);
   TelemetryData result = NetworkTelemetrySamplerTestHelper(networks_data);
@@ -303,24 +301,23 @@
             networks_data[1].gateway);
   EXPECT_EQ(result.networks_telemetry().network_telemetry(0).type(),
             NetworkType::WIFI);
-
-  ASSERT_TRUE(result.networks_telemetry()
-                  .network_telemetry(0)
-                  .network_interface_telemetry(0)
-                  .has_wireless_interface());
-  const auto& wireless_interface = result.networks_telemetry()
-                                       .network_telemetry(0)
-                                       .network_interface_telemetry(0)
-                                       .wireless_interface();
-  EXPECT_EQ(wireless_interface.power_management_enabled(),
-            kPowerManagementEnabled);
-  EXPECT_EQ(wireless_interface.access_point_address(), kAccessPointAddress);
-  EXPECT_EQ(wireless_interface.tx_bit_rate_mbps(), kTxBitRateMbps);
-  EXPECT_EQ(wireless_interface.rx_bit_rate_mbps(), kRxBitRateMbps);
-  EXPECT_EQ(wireless_interface.tx_power_dbm(), kTxPowerDbm);
-  EXPECT_EQ(wireless_interface.encryption_on(), kEncryptionOn);
-  EXPECT_EQ(wireless_interface.link_quality(), kLinkQuality);
-  EXPECT_EQ(wireless_interface.signal_level_dbm(), kSignalLevelDbm);
+  EXPECT_EQ(
+      result.networks_telemetry().network_telemetry(0).access_point_address(),
+      kAccessPointAddress);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).tx_bit_rate_mbps(),
+            kTxBitRateMbps);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).rx_bit_rate_mbps(),
+            kRxBitRateMbps);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).tx_power_dbm(),
+            kTxPowerDbm);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).encryption_on(),
+            kEncryptionOn);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).link_quality(),
+            kLinkQuality);
+  EXPECT_EQ(result.networks_telemetry()
+                .network_telemetry(0)
+                .power_management_enabled(),
+            kPowerManagementOn);
 
   // TETHER
   EXPECT_EQ(result.networks_telemetry().network_telemetry(1).guid(),
@@ -337,6 +334,23 @@
             networks_data[2].gateway);
   EXPECT_EQ(result.networks_telemetry().network_telemetry(1).type(),
             NetworkType::TETHER);
+  // Make sure wireless info wasn't added to tether.
+  EXPECT_FALSE(result.networks_telemetry()
+                   .network_telemetry(1)
+                   .has_access_point_address());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(1).has_tx_bit_rate_mbps());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(1).has_rx_bit_rate_mbps());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(1).has_tx_power_dbm());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(1).has_encryption_on());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(1).has_link_quality());
+  EXPECT_FALSE(result.networks_telemetry()
+                   .network_telemetry(1)
+                   .power_management_enabled());
 }
 }  // namespace
 }  // namespace reporting
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector.cc b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
index c4601482..ed4bb32 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
@@ -2740,7 +2740,6 @@
       status->set_boot_mode(*boot_mode);
       anything_reported = true;
     }
-    anything_reported |= GetWriteProtectSwitch(status);
   }
 
   if (report_network_configuration_)
@@ -2770,6 +2769,10 @@
     state->FetchTpmStatus(tpm_status_fetcher_);
   }
 
+  if (report_system_info_) {
+    anything_reported |= GetWriteProtectSwitch(status);
+  }
+
   // Mark if any of the above functions reported data so that the response is
   // sent.
   if (anything_reported)
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index 6412b0c7..478fa51 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -1769,6 +1769,8 @@
 }
 
 TEST_F(DeviceStatusCollectorTest, WriteProtectSwitch) {
+  scoped_testing_cros_settings_.device_settings()->SetBoolean(
+      ash::kReportDeviceSystemInfo, true);
   fake_statistics_provider_.SetMachineStatistic(
       chromeos::system::kFirmwareWriteProtectCurrentKey,
       chromeos::system::kFirmwareWriteProtectCurrentValueOn);
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc
index 458a374..30a8387 100644
--- a/chrome/browser/ash/preferences.cc
+++ b/chrome/browser/ash/preferences.cc
@@ -37,7 +37,6 @@
 #include "chrome/browser/ash/login/session/user_session_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/ash/sync/sync_consent_optional_field_trial.h"
 #include "chrome/browser/ash/system/input_device_settings.h"
 #include "chrome/browser/ash/system/timezone_resolver_manager.h"
 #include "chrome/browser/ash/system/timezone_util.h"
@@ -145,7 +144,6 @@
   registry->RegisterBooleanPref(prefs::kLoginScreenWebUILazyLoading, false);
 
   RegisterLocalStatePrefs(registry);
-  sync_consent_optional_field_trial::RegisterLocalStatePrefs(registry);
 }
 
 // static
diff --git a/chrome/browser/ash/sync/app_settings_model_type_controller.cc b/chrome/browser/ash/sync/app_settings_model_type_controller.cc
index 90c59cf5..b6e692f 100644
--- a/chrome/browser/ash/sync/app_settings_model_type_controller.cc
+++ b/chrome/browser/ash/sync/app_settings_model_type_controller.cc
@@ -33,11 +33,6 @@
   DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
   DCHECK(profile_);
   DCHECK(sync_service_);
-  pref_registrar_.Init(profile_->GetPrefs());
-  pref_registrar_.Add(
-      syncer::prefs::kOsSyncFeatureEnabled,
-      base::BindRepeating(&AppSettingsModelTypeController::OnUserPrefChanged,
-                          base::Unretained(this)));
 }
 
 AppSettingsModelTypeController::~AppSettingsModelTypeController() = default;
@@ -51,16 +46,3 @@
   NonUiSyncableServiceBasedModelTypeController::LoadModels(configure_context,
                                                            model_load_callback);
 }
-
-syncer::DataTypeController::PreconditionState
-AppSettingsModelTypeController::GetPreconditionState() const {
-  DCHECK(CalledOnValidThread());
-  return profile_->GetPrefs()->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled)
-             ? PreconditionState::kPreconditionsMet
-             : PreconditionState::kMustStopAndClearData;
-}
-
-void AppSettingsModelTypeController::OnUserPrefChanged() {
-  DCHECK(CalledOnValidThread());
-  sync_service_->DataTypePreconditionChanged(type());
-}
diff --git a/chrome/browser/ash/sync/app_settings_model_type_controller.h b/chrome/browser/ash/sync/app_settings_model_type_controller.h
index 9df24a0..652be105 100644
--- a/chrome/browser/ash/sync/app_settings_model_type_controller.h
+++ b/chrome/browser/ash/sync/app_settings_model_type_controller.h
@@ -39,15 +39,10 @@
   // DataTypeController:
   void LoadModels(const syncer::ConfigureContext& configure_context,
                   const ModelLoadCallback& model_load_callback) override;
-  PreconditionState GetPreconditionState() const override;
 
  private:
-  // Callback for changes to the OS sync feature enabled pref.
-  void OnUserPrefChanged();
-
   Profile* const profile_;
   syncer::SyncService* const sync_service_;
-  PrefChangeRegistrar pref_registrar_;
 };
 
 #endif  // CHROME_BROWSER_ASH_SYNC_APP_SETTINGS_MODEL_TYPE_CONTROLLER_H_
diff --git a/chrome/browser/ash/sync/os_sync_model_type_controller.cc b/chrome/browser/ash/sync/os_sync_model_type_controller.cc
index 9564c29e..fc1b79ff 100644
--- a/chrome/browser/ash/sync/os_sync_model_type_controller.cc
+++ b/chrome/browser/ash/sync/os_sync_model_type_controller.cc
@@ -32,24 +32,6 @@
   DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
   DCHECK(pref_service_);
   DCHECK(sync_service_);
-  pref_registrar_.Init(pref_service_);
-  pref_registrar_.Add(
-      syncer::prefs::kOsSyncFeatureEnabled,
-      base::BindRepeating(&OsSyncModelTypeController::OnUserPrefChanged,
-                          base::Unretained(this)));
 }
 
 OsSyncModelTypeController::~OsSyncModelTypeController() = default;
-
-syncer::DataTypeController::PreconditionState
-OsSyncModelTypeController::GetPreconditionState() const {
-  DCHECK(CalledOnValidThread());
-  return pref_service_->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled)
-             ? PreconditionState::kPreconditionsMet
-             : PreconditionState::kMustStopAndClearData;
-}
-
-void OsSyncModelTypeController::OnUserPrefChanged() {
-  DCHECK(CalledOnValidThread());
-  sync_service_->DataTypePreconditionChanged(type());
-}
diff --git a/chrome/browser/ash/sync/os_sync_model_type_controller.h b/chrome/browser/ash/sync/os_sync_model_type_controller.h
index 3307acc..7dfdf605 100644
--- a/chrome/browser/ash/sync/os_sync_model_type_controller.h
+++ b/chrome/browser/ash/sync/os_sync_model_type_controller.h
@@ -17,8 +17,8 @@
 class SyncService;
 }  // namespace syncer
 
-// Controls sync of Chrome OS ModelTypes that can run in transport-mode and
-// depend on the system-wide kOsSyncFeatureEnabled preference.
+// Controls sync of Chrome OS ModelTypes that can run in transport-mode.
+// TODO(https://crbug.com/1274802): Remove this.
 class OsSyncModelTypeController : public syncer::ModelTypeController {
  public:
   OsSyncModelTypeController(syncer::ModelType type,
@@ -34,17 +34,12 @@
   OsSyncModelTypeController& operator=(const OsSyncModelTypeController&) =
       delete;
 
-  // DataTypeController:
-  PreconditionState GetPreconditionState() const override;
-
  private:
   // Callback for changes to the OS sync feature enabled pref.
   void OnUserPrefChanged();
 
   PrefService* const pref_service_;
   syncer::SyncService* const sync_service_;
-
-  PrefChangeRegistrar pref_registrar_;
 };
 
 #endif  // CHROME_BROWSER_ASH_SYNC_OS_SYNC_MODEL_TYPE_CONTROLLER_H_
diff --git a/chrome/browser/ash/sync/os_sync_util.cc b/chrome/browser/ash/sync/os_sync_util.cc
index 97cc2b09..ccc5942 100644
--- a/chrome/browser/ash/sync/os_sync_util.cc
+++ b/chrome/browser/ash/sync/os_sync_util.cc
@@ -13,36 +13,14 @@
 namespace os_sync_util {
 namespace {
 
-void MaybeMigratePreferencesForSyncConsentOptional(PrefService* prefs) {
-  DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
-
-  if (!ash::features::IsSyncConsentOptionalEnabled()) {
-    // Always enable the OS sync if SyncConsentOptional is disabled. Before the
-    // SyncConsentOptional launch it's impossible to disable/enable the OS sync
-    // from the UI.
-    prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, true);
-    return;
-  }
-
-  // TODO(https://crbug.com/1246357) Add a migration code here. To handle switch
-  // between SyncConsentOptional being disabled and enabled
-  prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, false);
-}
-
 // Returns true if the prefs were migrated.
 bool MaybeMigratePreferencesForSyncSettingsCategorization(PrefService* prefs) {
   // Migration code can be removed when SyncSettingsCategorization has been
   // fully deployed to stable channel for a couple milestones.
   if (!chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    // SyncSettingsCategorization should be launched before SyncConsentOptional.
-    DCHECK(!chromeos::features::IsSyncConsentOptionalEnabled());
-
     // Reset the migration flag because this might be a rollback of the feature.
     // We want migration to happen again when the feature is enabled.
     prefs->SetBoolean(syncer::prefs::kOsSyncPrefsMigrated, false);
-    // Reset the OS sync pref to its default state, such that we get the same
-    // migration behavior next time SyncSettingsCategorization is enabled.
-    prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, false);
 
     prefs->ClearPref(syncer::prefs::kSyncAllOsTypes);
     prefs->ClearPref(syncer::prefs::kSyncOsApps);
@@ -78,8 +56,6 @@
     migrated_this_time = true;
   }
 
-  MaybeMigratePreferencesForSyncConsentOptional(prefs);
-
   return migrated_this_time;
 }
 
diff --git a/chrome/browser/ash/sync/os_sync_util_unittest.cc b/chrome/browser/ash/sync/os_sync_util_unittest.cc
index 329fddd..cf14765 100644
--- a/chrome/browser/ash/sync/os_sync_util_unittest.cc
+++ b/chrome/browser/ash/sync/os_sync_util_unittest.cc
@@ -33,7 +33,6 @@
 TEST_F(OsSyncUtilTest, SimpleMigration) {
   os_sync_util::MigrateOsSyncPreferences(&prefs_);
   EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncPrefsMigrated));
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
   EXPECT_TRUE(prefs_.GetBoolean(sp::kSyncAllOsTypes));
 }
 
@@ -61,36 +60,6 @@
   EXPECT_FALSE(prefs_.GetBoolean(csp::kSyncOsWallpaper));
 }
 
-TEST_F(OsSyncUtilTest, SyncAppsEnablesOsSyncFeature) {
-  prefs_.SetBoolean(sp::kSyncKeepEverythingSynced, false);
-  prefs_.SetBoolean(sp::kSyncApps, true);
-  os_sync_util::MigrateOsSyncPreferences(&prefs_);
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
-}
-
-TEST_F(OsSyncUtilTest, SyncPreferencesEnablesOsSyncFeature) {
-  prefs_.SetBoolean(sp::kSyncKeepEverythingSynced, false);
-  prefs_.SetBoolean(sp::kSyncPreferences, true);
-  os_sync_util::MigrateOsSyncPreferences(&prefs_);
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
-}
-
-TEST_F(OsSyncUtilTest, SyncWallpaperEnablesOsSyncFeature) {
-  prefs_.SetBoolean(sp::kSyncKeepEverythingSynced, false);
-  prefs_.SetBoolean(sp::kSyncApps, true);
-  prefs_.SetBoolean(sp::kSyncThemes, true);
-  os_sync_util::MigrateOsSyncPreferences(&prefs_);
-  ASSERT_TRUE(prefs_.GetBoolean(csp::kSyncOsWallpaper));
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
-}
-
-TEST_F(OsSyncUtilTest, SyncWifiEnablesOsSyncFeature) {
-  prefs_.SetBoolean(sp::kSyncKeepEverythingSynced, false);
-  prefs_.SetBoolean(sp::kSyncWifiConfigurations, true);
-  os_sync_util::MigrateOsSyncPreferences(&prefs_);
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
-}
-
 TEST_F(OsSyncUtilTest, MigrationOnlyHappensOnce) {
   // Do initial migration.
   os_sync_util::MigrateOsSyncPreferences(&prefs_);
@@ -118,7 +87,6 @@
   // Do initial migration.
   os_sync_util::MigrateOsSyncPreferences(&prefs_);
   EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncPrefsMigrated));
-  EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
 
   {
     // Simulate disabling the feature (e.g. disabling via Finch).
@@ -129,7 +97,6 @@
 
     // OS sync is marked as not migrated.
     EXPECT_FALSE(prefs_.GetBoolean(sp::kOsSyncPrefsMigrated));
-    EXPECT_FALSE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
   }
 
   // Simulate re-enabling the feature.
@@ -141,7 +108,6 @@
 
     // OS sync is marked as migrated.
     EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncPrefsMigrated));
-    EXPECT_TRUE(prefs_.GetBoolean(sp::kOsSyncFeatureEnabled));
   }
 }
 
diff --git a/chrome/browser/ash/sync/os_syncable_service_model_type_controller.cc b/chrome/browser/ash/sync/os_syncable_service_model_type_controller.cc
index 2a2d1dc..30e3a2a 100644
--- a/chrome/browser/ash/sync/os_syncable_service_model_type_controller.cc
+++ b/chrome/browser/ash/sync/os_syncable_service_model_type_controller.cc
@@ -39,27 +39,7 @@
          type == syncer::OS_PRIORITY_PREFERENCES);
   DCHECK(pref_service_);
   DCHECK(sync_service_);
-
-  pref_registrar_.Init(pref_service_);
-  pref_registrar_.Add(
-      syncer::prefs::kOsSyncFeatureEnabled,
-      base::BindRepeating(
-          &OsSyncableServiceModelTypeController::OnUserPrefChanged,
-          base::Unretained(this)));
 }
 
 OsSyncableServiceModelTypeController::~OsSyncableServiceModelTypeController() =
     default;
-
-syncer::DataTypeController::PreconditionState
-OsSyncableServiceModelTypeController::GetPreconditionState() const {
-  DCHECK(CalledOnValidThread());
-  return pref_service_->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled)
-             ? PreconditionState::kPreconditionsMet
-             : PreconditionState::kMustStopAndClearData;
-}
-
-void OsSyncableServiceModelTypeController::OnUserPrefChanged() {
-  DCHECK(CalledOnValidThread());
-  sync_service_->DataTypePreconditionChanged(type());
-}
diff --git a/chrome/browser/ash/sync/os_syncable_service_model_type_controller.h b/chrome/browser/ash/sync/os_syncable_service_model_type_controller.h
index 9eb77bd4..efac896 100644
--- a/chrome/browser/ash/sync/os_syncable_service_model_type_controller.h
+++ b/chrome/browser/ash/sync/os_syncable_service_model_type_controller.h
@@ -21,6 +21,7 @@
 // Controls syncing of Chrome OS ModelTypes that run in sync transport-only
 // mode and are tied to the OS sync feature consent (APP_LIST, OS_PREFERENCES,
 // and OS_PRIORITY_PREFERENCES).
+// TODO(https://crbug.com/1274802): Remove this.
 class OsSyncableServiceModelTypeController
     : public syncer::SyncableServiceBasedModelTypeController {
  public:
@@ -39,17 +40,9 @@
   OsSyncableServiceModelTypeController& operator=(
       const OsSyncableServiceModelTypeController&) = delete;
 
-  // DataTypeController:
-  PreconditionState GetPreconditionState() const override;
-
  private:
-  // Callback for changes to the OS sync feature enabled pref.
-  void OnUserPrefChanged();
-
   PrefService* const pref_service_;
   syncer::SyncService* const sync_service_;
-
-  PrefChangeRegistrar pref_registrar_;
 };
 
 #endif  // CHROME_BROWSER_ASH_SYNC_OS_SYNCABLE_SERVICE_MODEL_TYPE_CONTROLLER_H_
diff --git a/chrome/browser/ash/sync/sync_consent_optional_field_trial.cc b/chrome/browser/ash/sync/sync_consent_optional_field_trial.cc
deleted file mode 100644
index 7aff1815..0000000
--- a/chrome/browser/ash/sync/sync_consent_optional_field_trial.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ash/sync/sync_consent_optional_field_trial.h"
-
-#include "ash/constants/ash_features.h"
-#include "base/feature_list.h"
-#include "base/metrics/field_trial.h"
-#include "base/strings/string_number_conversions.h"
-#include "chrome/common/channel_info.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/pref_service.h"
-#include "components/variations/variations_associated_data.h"
-#include "components/version_info/version_info.h"
-
-namespace sync_consent_optional_field_trial {
-namespace {
-
-// String local state preference with the name of the assigned trial group.
-// Empty if no group has been assigned yet.
-const char kTrialGroupPrefName[] = "sync_consent_optional.trial_group";
-
-// The field trial name.
-const char kTrialName[] = "SyncConsentOptional";
-
-// Group names for the trial.
-const char kEnabledGroup[] = "Enabled";
-const char kDisabledGroup[] = "Disabled";
-const char kDefaultGroup[] = "Default";
-
-// Probabilities for all field trial groups add up to kTotalProbability.
-const base::FieldTrial::Probability kTotalProbability = 100;
-
-// Creates the field trial.
-scoped_refptr<base::FieldTrial> CreateFieldTrial() {
-  return base::FieldTrialList::FactoryGetFieldTrial(
-      kTrialName, kTotalProbability, kDefaultGroup,
-      base::FieldTrial::ONE_TIME_RANDOMIZED,
-      /*default_group_number=*/nullptr);
-}
-
-// Sets the feature state based on the trial group. Defaults to disabled.
-void SetFeatureState(base::FeatureList* feature_list,
-                     base::FieldTrial* trial,
-                     const std::string& group_name) {
-  base::FeatureList::OverrideState feature_state =
-      group_name == kEnabledGroup ? base::FeatureList::OVERRIDE_ENABLE_FEATURE
-                                  : base::FeatureList::OVERRIDE_DISABLE_FEATURE;
-  feature_list->RegisterFieldTrialOverride(
-      chromeos::features::kSyncConsentOptional.name, feature_state, trial);
-}
-
-// Creates a trial for the first run (when there is no variations seed) and
-// enables the feature based on the randomly selected trial group. Returns the
-// group name.
-std::string CreateFirstRunTrial(base::FeatureList* feature_list) {
-  int enabled_percent;
-  int disabled_percent;
-  int default_percent;
-  switch (chrome::GetChannel()) {
-    case version_info::Channel::UNKNOWN:
-    case version_info::Channel::CANARY:
-    case version_info::Channel::DEV:
-    case version_info::Channel::BETA:
-      // Field trial is disabled due to b/171471530.
-      // TODO(khorimoto): Re-enable the trial once the underlying issue is
-      // fixed.
-      enabled_percent = 0;
-      disabled_percent = 0;
-      default_percent = 100;
-      break;
-    case version_info::Channel::STABLE:
-      // Disabled on Stable pending approval (see https://crbug.com/1020731).
-      // Note that this code is not currently accessed on Stable channel due to
-      // the early return in Create() below.
-      enabled_percent = 0;
-      disabled_percent = 0;
-      default_percent = 100;
-      break;
-  }
-  DCHECK_EQ(kTotalProbability,
-            enabled_percent + disabled_percent + default_percent);
-
-  // Set up the trial and groups.
-  scoped_refptr<base::FieldTrial> trial = CreateFieldTrial();
-  trial->AppendGroup(kEnabledGroup, enabled_percent);
-  trial->AppendGroup(kDisabledGroup, disabled_percent);
-  trial->AppendGroup(kDefaultGroup, default_percent);
-
-  // Finalize the group choice and set the feature state.
-  const std::string& group_name = trial->GetGroupNameWithoutActivation();
-  SetFeatureState(feature_list, trial.get(), group_name);
-  return group_name;
-}
-
-// Creates a trial with a single group and sets the feature flag to the state
-// for that group.
-void CreateSubsequentRunTrial(base::FeatureList* feature_list,
-                              const std::string& group_name) {
-  scoped_refptr<base::FieldTrial> trial = CreateFieldTrial();
-  trial->AppendGroup(group_name, kTotalProbability);
-  SetFeatureState(feature_list, trial.get(), group_name);
-}
-
-}  // namespace
-
-void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
-  registry->RegisterStringPref(kTrialGroupPrefName, std::string());
-}
-
-void Create(base::FeatureList* feature_list, PrefService* local_state) {
-  // TODO(https://crbug.com/1246357): Uncomment the function body for the
-  // SyncConsentOptional launch.
-  /*
-  // This field trial is only intended to be run on Canary/Dev/Beta channels.
-  // If the user is on Stable channel, return early so that they are not opted
-  // into this experiment. Without this return, users who were opted into the
-  // experiment on Canary/Dev/Beta, then changed to Stable, could still be in
-  // the experiment. See https://crbug.com/1147325.
-  if (chrome::GetChannel() == version_info::Channel::STABLE)
-    return;
-
-  std::string trial_group = local_state->GetString(kTrialGroupPrefName);
-  if (trial_group.empty()) {
-    // No group assigned, this is the first run.
-    trial_group = CreateFirstRunTrial(feature_list);
-    // Persist the assigned group for subsequent runs.
-    local_state->SetString(kTrialGroupPrefName, trial_group);
-  } else {
-    // Group already assigned.
-
-    // Field trial is disabled due to b/171471530. Override the existing trial
-    // and use kDefaultGroup instead.
-    // TODO(khorimoto): Remove the line below once the underlying issue from
-    // b/171471530 is fixed.
-    trial_group = kDefaultGroup;
-
-    CreateSubsequentRunTrial(feature_list, trial_group);
-  }
-  */
-}
-
-}  // namespace sync_consent_optional_field_trial
diff --git a/chrome/browser/ash/sync/sync_consent_optional_field_trial.h b/chrome/browser/ash/sync/sync_consent_optional_field_trial.h
deleted file mode 100644
index af242e47..0000000
--- a/chrome/browser/ash/sync/sync_consent_optional_field_trial.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2020 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.
-
-#ifndef CHROME_BROWSER_ASH_SYNC_SYNC_CONSENT_OPTIONAL_FIELD_TRIAL_H_
-#define CHROME_BROWSER_ASH_SYNC_SYNC_CONSENT_OPTIONAL_FIELD_TRIAL_H_
-
-class PrefRegistrySimple;
-class PrefService;
-
-namespace base {
-class FeatureList;
-}  // namespace base
-
-namespace sync_consent_optional_field_trial {
-
-// Registers preferences.
-void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
-
-// Creates a field trial to control the SyncConsentOptional feature. The trial
-// is client controlled because SyncConsentOptional controls the out-of-box
-// experience (OOBE) sync consent dialog, which shows up before a variations
-// seed is available.
-//
-// The trial group chosen on first run is persisted to local state prefs and
-// reused on subsequent runs. This keeps the in-session sync settings UI stable
-// between runs. Local state prefs can be reset via powerwash, which will result
-// in re-randomization, but this also sends the user through the first-run flow
-// again and they will see the appropriate consent flow.
-//
-// Persisting the group also avoids a subtle corner case: A user could be
-// randomized to SyncConsentOptional, opt-in to sync during OOBE, then turn off
-// OS sync in OS settings but leave "Sync everything" enabled in browser
-// settings. If they were re-randomized to non-SyncConsentOptional on a future
-// login, then the OS sync data types would go back to being controlled by
-// browser sync settings, and those OS types would be re-enabled even though the
-// user had them disabled.
-//
-// Launch bug for the SyncConsentOptional feature: https://crbug.com/1020731
-void Create(base::FeatureList* feature_list, PrefService* local_state);
-
-}  // namespace sync_consent_optional_field_trial
-
-#endif  // CHROME_BROWSER_ASH_SYNC_SYNC_CONSENT_OPTIONAL_FIELD_TRIAL_H_
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc
index a06e7467..7ba99d5 100644
--- a/chrome/browser/chrome_browser_field_trials.cc
+++ b/chrome/browser/chrome_browser_field_trials.cc
@@ -38,7 +38,6 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/sync/sync_consent_optional_field_trial.h"
 #include "chromeos/services/multidevice_setup/public/cpp/first_run_field_trial.h"
 #endif
 
@@ -95,11 +94,6 @@
     chromeos::multidevice_setup::CreateFirstRunFieldTrial(feature_list);
 #endif
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // This trial is fully client controlled and must be configured whether or
-  // not a seed is available.
-  sync_consent_optional_field_trial::Create(feature_list, local_state_);
-#endif
 }
 
 void ChromeBrowserFieldTrials::RegisterSyntheticTrials() {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 57dbb86..11450a8 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -3057,8 +3057,6 @@
     "../ash/sync/os_sync_util.h",
     "../ash/sync/os_syncable_service_model_type_controller.cc",
     "../ash/sync/os_syncable_service_model_type_controller.h",
-    "../ash/sync/sync_consent_optional_field_trial.cc",
-    "../ash/sync/sync_consent_optional_field_trial.h",
     "../ash/system/automatic_reboot_manager.cc",
     "../ash/system/automatic_reboot_manager.h",
     "../ash/system/automatic_reboot_manager_observer.h",
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
index d650f81f..607e63d 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
@@ -124,9 +124,9 @@
   void CreateExtension() {
     extension_ =
         extensions::ExtensionBuilder("Test ChromeOS System Extension")
+            .SetManifestVersion(3)
             .SetManifestKey("chromeos_system_extension",
                             extensions::DictionaryBuilder().Build())
-            .SetManifestKey("manifest_version", 3)
             .SetManifestKey("externally_connectable",
                             extensions::DictionaryBuilder()
                                 .Set("matches", extensions::ListBuilder()
diff --git a/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc b/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
index 0534ec3..ce024723 100644
--- a/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
@@ -61,12 +61,12 @@
       std::unique_ptr<base::ListValue> required_permissions,
       std::unique_ptr<base::ListValue> optional_permissions) {
     app_ = extensions::ExtensionBuilder("Test ChromeOS System Extension")
+               .SetManifestVersion(3)
                .SetManifestKey("chromeos_system_extension",
                                extensions::DictionaryBuilder().Build())
                .SetManifestKey("permissions", std::move(required_permissions))
                .SetManifestKey("optional_permissions",
                                std::move(optional_permissions))
-               .SetManifestKey("manifest_version", 3)
                .SetManifestKey(
                    "externally_connectable",
                    extensions::DictionaryBuilder()
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
index 22f99e3..98401f0f 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
@@ -265,12 +265,8 @@
     // When the sync settings categorization is on, the wallpaper sync status is
     // stored in the kSyncOsWallpaper pref. The pref value essentially means
     // "themes sync is on" && "apps sync is on".
-    // TODO(https://crbug.com/1243218): Figure out if we need to check
-    // IsOsSyncFeatureEnabled here.
-    bool os_wallpaper_sync_enabled =
-        sync_service->GetUserSettings()->IsOsSyncFeatureEnabled() &&
-        profile->GetPrefs()->GetBoolean(
-            chromeos::settings::prefs::kSyncOsWallpaper);
+    bool os_wallpaper_sync_enabled = profile->GetPrefs()->GetBoolean(
+        chromeos::settings::prefs::kSyncOsWallpaper);
     dict->SetBoolean(kSyncThemes, os_wallpaper_sync_enabled);
     Respond(OneArgument(base::Value::FromUniquePtrValue(std::move(dict))));
     return;
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
index 8086d85..8240762 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
@@ -122,6 +122,11 @@
   std::move(callback).Run(true);
 }
 
+void DlpContentManager::SetIsScreenShareWarningModeEnabledForTesting(
+    bool is_enabled) {
+  is_screen_share_warning_mode_enabled_ = is_enabled;
+}
+
 DlpContentManager::DlpContentManager() = default;
 DlpContentManager::~DlpContentManager() = default;
 
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
index 2921239..42422430 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
@@ -64,6 +64,8 @@
       OnDlpRestrictionCheckedCallback callback) = 0;
 
  protected:
+  void SetIsScreenShareWarningModeEnabledForTesting(bool is_enabled);
+
   // Structure that relates a list of confidential contents to the
   // corresponding restriction level.
   struct ConfidentialContentsInfo {
@@ -151,12 +153,12 @@
   // TODO(crbug.com/1264803): Change to DlpConfidentialContentsCache
   DlpConfidentialContentsCache user_allowed_contents_cache_;
 
-  DlpReportingManager* reporting_manager_;
+  raw_ptr<DlpReportingManager> reporting_manager_{nullptr};
 
   std::unique_ptr<DlpWarnNotifier> warn_notifier_;
 
   // TODO(https://crbug.com/1278733): Remove this flag
-  const bool is_screen_share_warning_mode_enabled_ = false;
+  bool is_screen_share_warning_mode_enabled_ = false;
 };
 
 }  // namespace policy
diff --git a/chrome/browser/content_index/content_index_browsertest.cc b/chrome/browser/content_index/content_index_browsertest.cc
index be9a44e2..bed0a15 100644
--- a/chrome/browser/content_index/content_index_browsertest.cc
+++ b/chrome/browser/content_index/content_index_browsertest.cc
@@ -249,16 +249,13 @@
   EXPECT_FALSE(icon.isNull());
 }
 
-// TODO(crbug.com/1282979): Test is flaky on various platforms.
-IN_PROC_BROWSER_TEST_F(ContentIndexTest, DISABLED_LaunchUrl) {
+IN_PROC_BROWSER_TEST_F(ContentIndexTest, LaunchUrl) {
   RunScript("AddContent('my-id')");
   base::RunLoop().RunUntilIdle();  // Wait for the provider to get the content.
 
   EXPECT_EQ(browser()->tab_strip_model()->count(), 1);
-  GURL current_url = browser()
-                         ->tab_strip_model()
-                         ->GetActiveWebContents()
-                         ->GetLastCommittedURL();
+  GURL current_url =
+      browser()->tab_strip_model()->GetActiveWebContents()->GetVisibleURL();
   EXPECT_TRUE(base::EndsWith(current_url.spec(),
                              "/content_index/content_index.html",
                              base::CompareCase::SENSITIVE));
@@ -275,10 +272,8 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(browser()->tab_strip_model()->count(), 2);
-  current_url = browser()
-                    ->tab_strip_model()
-                    ->GetActiveWebContents()
-                    ->GetLastCommittedURL();
+  current_url =
+      browser()->tab_strip_model()->GetActiveWebContents()->GetVisibleURL();
   EXPECT_TRUE(base::EndsWith(current_url.spec(),
                              "/content_index/content_index.html?launch",
                              base::CompareCase::SENSITIVE));
diff --git a/chrome/browser/enterprise/reporting/extension_info_unittest.cc b/chrome/browser/enterprise/reporting/extension_info_unittest.cc
index e149081..8669276 100644
--- a/chrome/browser/enterprise/reporting/extension_info_unittest.cc
+++ b/chrome/browser/enterprise/reporting/extension_info_unittest.cc
@@ -52,10 +52,9 @@
                        : extensions::ExtensionBuilder::Type::EXTENSION));
     extensionBuilder.SetID(id)
         .SetVersion(kVersion)
+        .SetManifestVersion(kManifestVersion)
         .SetManifestKey(extensions::manifest_keys::kDescription, kDescription)
         .SetManifestKey(extensions::manifest_keys::kHomepageURL, kHomepage)
-        .SetManifestKey(extensions::manifest_keys::kManifestVersion,
-                        kManifestVersion)
         .SetLocation(location)
         .AddPermission(kPermission1)
         .AddPermission(kPermission2)
diff --git a/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc b/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc
index b570517..18008bb 100644
--- a/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc
+++ b/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc
@@ -112,7 +112,7 @@
   std::string expected_url =
       std::string(kChromeWebstoreUrl) + std::string(kFakeExtensionId);
   EXPECT_EQ(GURL(expected_url),
-            browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL());
+            browser()->tab_strip_model()->GetWebContentsAt(0)->GetVisibleURL());
 }
 
 TEST_P(ExtensionRequestNotificationTest, HasExtensionAndClosedByBrowser) {
diff --git a/chrome/browser/extensions/blocklist_states_interaction_unittest.cc b/chrome/browser/extensions/blocklist_states_interaction_unittest.cc
index 962cd7e8..1823f61 100644
--- a/chrome/browser/extensions/blocklist_states_interaction_unittest.cc
+++ b/chrome/browser/extensions/blocklist_states_interaction_unittest.cc
@@ -9,7 +9,6 @@
 #include "components/safe_browsing/buildflags.h"
 #include "extensions/browser/blocklist_extension_prefs.h"
 #include "extensions/browser/blocklist_state.h"
-#include "extensions/common/extension_features.h"
 #include "extensions/test/extension_state_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -31,8 +30,6 @@
 class BlocklistStatesInteractionUnitTest : public ExtensionServiceTestBase {
  public:
   BlocklistStatesInteractionUnitTest() {
-    feature_list_.InitAndEnableFeature(
-        extensions_features::kDisablePolicyViolationExtensionsRemotely);
     // Set this flag to true so the acknowledged bit is not automatically set
     // by the extension error controller on the first run.
     ExtensionPrefs::SetRunAlertsInFirstRunForTest();
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc
index b092ae9..21af3e7 100644
--- a/chrome/browser/extensions/content_script_apitest.cc
+++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -1331,7 +1331,7 @@
   constexpr char kContentScriptManifest[] =
       R"({
            "name": "Content Script injection in related frames",
-           "manifest_version": 2,
+           "manifest_version": 3,
            "version": "0.1",
            "content_scripts": [{
              "matches": ["http://example.com/*"],
diff --git a/chrome/browser/extensions/content_script_tracker_browsertest.cc b/chrome/browser/extensions/content_script_tracker_browsertest.cc
index fd39af9..711c0ad 100644
--- a/chrome/browser/extensions/content_script_tracker_browsertest.cc
+++ b/chrome/browser/extensions/content_script_tracker_browsertest.cc
@@ -435,8 +435,7 @@
       {
         "name": "ContentScriptTrackerBrowserTest - Declarative",
         "version": "1.0",
-        "manifest_version": 2,
-        "permissions": [ "tabs", "<all_urls>" ],
+        "manifest_version": 3,
         "content_scripts": [{
           "all_frames": true,
           "match_about_blank": true,
diff --git a/chrome/browser/extensions/cross_origin_isolation_browsertest.cc b/chrome/browser/extensions/cross_origin_isolation_browsertest.cc
index 2dd94eb..5e8a248 100644
--- a/chrome/browser/extensions/cross_origin_isolation_browsertest.cc
+++ b/chrome/browser/extensions/cross_origin_isolation_browsertest.cc
@@ -414,7 +414,7 @@
   )";
 
   ExtensionTestMessageListener ready_listener("notCrossOriginIsolated",
-                                              true /* will_reply */);
+                                              false /* will_reply */);
   TestExtensionDir coi_test_dir;
   const Extension* coi_extension =
       LoadExtension(coi_test_dir, {.coep_value = "require-corp",
@@ -459,10 +459,6 @@
   EXPECT_EQ(Feature::BLESSED_EXTENSION_CONTEXT,
             process_map->GetMostLikelyContextType(
                 coi_extension, service_worker_process->GetID(), url));
-
-  // Reply to the service worker. This is not useful for the test but is
-  // required by ExtensionTestMessageListener.
-  ready_listener.Reply("");
 }
 
 // Tests certain extension APIs which retrieve in-process extension windows.
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
index ef43a02..d5f9b39ff 100644
--- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc
+++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -112,8 +112,7 @@
       break;
   }
 
-  builder.SetManifestKey("manifest_version",
-                         GetManifestVersionForActionType(type));
+  builder.SetManifestVersion(GetManifestVersionForActionType(type));
 
   return builder.Build();
 }
diff --git a/chrome/browser/extensions/external_pref_loader.cc b/chrome/browser/extensions/external_pref_loader.cc
index 1f90565e6..7623d81 100644
--- a/chrome/browser/extensions/external_pref_loader.cc
+++ b/chrome/browser/extensions/external_pref_loader.cc
@@ -136,40 +136,10 @@
     }
     DCHECK(!done_closure_);
     done_closure_ = std::move(done_closure);
-    if (chromeos::features::IsSyncConsentOptionalEnabled()) {
-      // SyncConsentOptional lets users opt-out of sync during OOBE.
-      PrefService* prefs = profile_->GetPrefs();
-      if (!prefs->GetBoolean(chromeos::prefs::kSyncOobeCompleted)) {
-        // Need to wait for OOBE completion before checking if sync is enabled.
-        pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
-        pref_change_registrar_->Init(prefs);
-        // base::Unretained is safe because we own |pref_changed_registrar_|.
-        pref_change_registrar_->Add(
-            chromeos::prefs::kSyncOobeCompleted,
-            base::BindRepeating(&PrioritySyncReadyWaiter::OnSyncOobeCompleted,
-                                base::Unretained(this)));
-        return;
-      }
-    }
     MaybeObserveSyncStart();
   }
 
  private:
-  void OnSyncOobeCompleted() {
-    DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
-    DCHECK(
-        profile_->GetPrefs()->GetBoolean(chromeos::prefs::kSyncOobeCompleted));
-    pref_change_registrar_.reset();
-    syncer::SyncService* service = SyncServiceFactory::GetForProfile(profile_);
-    if (!service->GetUserSettings()->IsOsSyncFeatureEnabled()) {
-      // User opted-out of OS sync, OS sync will never start, we're done here.
-      Finish();
-      // Note: |this| is deleted.
-      return;
-    }
-    MaybeObserveSyncStart();
-  }
-
   void MaybeObserveSyncStart() {
     syncer::SyncService* service = SyncServiceFactory::GetForProfile(profile_);
     DCHECK(service);
@@ -229,9 +199,6 @@
 
   base::OnceClosure done_closure_;
 
-  // Used with SyncConsentOptional to wait for OOBE sync dialog completion.
-  std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
-
   // Used for registering observer for sync_preferences::PrefServiceSyncable.
   base::ScopedObservation<sync_preferences::PrefServiceSyncable,
                           sync_preferences::PrefServiceSyncableObserver>
diff --git a/chrome/browser/extensions/external_pref_loader_unittest.cc b/chrome/browser/extensions/external_pref_loader_unittest.cc
index 6eede1aa..c9e57dcc 100644
--- a/chrome/browser/extensions/external_pref_loader_unittest.cc
+++ b/chrome/browser/extensions/external_pref_loader_unittest.cc
@@ -131,16 +131,11 @@
  public:
   ExternalPrefLoaderTest() {
     if (ShouldEnableSyncSettingsCategorization()) {
-      feature_list_.InitWithFeatures(
-          /*enabled_features=*/{chromeos::features::
-                                    kSyncSettingsCategorization},
-          /*disabled_features=*/{chromeos::features::kSyncConsentOptional});
+      feature_list_.InitAndEnableFeature(
+          chromeos::features::kSyncSettingsCategorization);
     } else {
-      feature_list_.InitWithFeatures(
-          /*enabled_features=*/{},
-          /*disabled_features=*/{
-              chromeos::features::kSyncSettingsCategorization,
-              chromeos::features::kSyncConsentOptional});
+      feature_list_.InitAndDisableFeature(
+          chromeos::features::kSyncSettingsCategorization);
     }
   }
   ~ExternalPrefLoaderTest() override = default;
@@ -156,7 +151,7 @@
 
 // Tests that we fire pref reading correctly after priority sync state
 // is resolved by ExternalPrefLoader. This test checks that the flow works
-// without SyncSettingsCategorization and SyncConsentOptional.
+// regardless of the state of SyncSettingsCategorization.
 TEST_P(ExternalPrefLoaderTest, PrefReadInitiatesCorrectly) {
   base::RunLoop run_loop;
   scoped_refptr<ExternalPrefLoader> loader(
@@ -179,97 +174,4 @@
                          ExternalPrefLoaderTest,
                          ::testing::Bool());
 
-class ExternalPrefLoaderSyncConsentOptionalTest
-    : public ExternalPrefLoaderTestBase {
- public:
-  ExternalPrefLoaderSyncConsentOptionalTest() {
-    feature_list_.InitWithFeatures(
-        /*enabled_features=*/{chromeos::features::kSyncSettingsCategorization,
-                              chromeos::features::kSyncConsentOptional},
-        /*disabled_features=*/{});
-  }
-  ~ExternalPrefLoaderSyncConsentOptionalTest() override = default;
-  ExternalPrefLoaderSyncConsentOptionalTest(
-      ExternalPrefLoaderSyncConsentOptionalTest&) = delete;
-  ExternalPrefLoaderSyncConsentOptionalTest& operator=(
-      ExternalPrefLoaderSyncConsentOptionalTest&) = delete;
-};
-
-TEST_F(ExternalPrefLoaderSyncConsentOptionalTest, OsSyncEnabled) {
-  base::RunLoop run_loop;
-  scoped_refptr<ExternalPrefLoader> loader =
-      base::MakeRefCounted<TestExternalPrefLoader>(
-          profile(), run_loop.QuitWhenIdleClosure());
-  ExternalProviderImpl provider(
-      /*service=*/nullptr, loader, profile(),
-      ManifestLocation::kInvalidLocation, ManifestLocation::kInvalidLocation,
-      Extension::NO_FLAGS);
-  provider.VisitRegisteredExtension();
-
-  PrefService* prefs = profile()->GetPrefs();
-  ASSERT_FALSE(prefs->GetBoolean(chromeos::prefs::kSyncOobeCompleted));
-
-  // Simulate OOBE screen completion with OS sync enabled.
-  sync_service()->GetUserSettings()->SetOsSyncFeatureEnabled(true);
-  prefs->SetBoolean(chromeos::prefs::kSyncOobeCompleted, true);
-
-  // Simulate OS prefs starting to sync.
-  sync_preferences::PrefServiceSyncable* pref_sync =
-      profile()->GetTestingPrefService();
-  // This is an ugly cast, but it's how other tests do it.
-  sync_preferences::PrefModelAssociator* pref_sync_service =
-      static_cast<sync_preferences::PrefModelAssociator*>(
-          pref_sync->GetSyncableService(syncer::OS_PRIORITY_PREFERENCES));
-  pref_sync_service->MergeDataAndStartSyncing(
-      syncer::OS_PRIORITY_PREFERENCES, syncer::SyncDataList(),
-      std::make_unique<syncer::FakeSyncChangeProcessor>(),
-      std::make_unique<syncer::SyncErrorFactoryMock>());
-
-  run_loop.Run();
-  // |loader| completed loading.
-}
-
-TEST_F(ExternalPrefLoaderSyncConsentOptionalTest, OsSyncDisable) {
-  base::RunLoop run_loop;
-  scoped_refptr<ExternalPrefLoader> loader =
-      base::MakeRefCounted<TestExternalPrefLoader>(
-          profile(), run_loop.QuitWhenIdleClosure());
-  ExternalProviderImpl provider(
-      /*service=*/nullptr, loader, profile(),
-      ManifestLocation::kInvalidLocation, ManifestLocation::kInvalidLocation,
-      Extension::NO_FLAGS);
-  provider.VisitRegisteredExtension();
-
-  PrefService* prefs = profile()->GetPrefs();
-  ASSERT_FALSE(prefs->GetBoolean(chromeos::prefs::kSyncOobeCompleted));
-
-  // Simulate OOBE screen completion with OS sync disabled.
-  sync_service()->GetUserSettings()->SetOsSyncFeatureEnabled(false);
-  prefs->SetBoolean(chromeos::prefs::kSyncOobeCompleted, true);
-
-  // Loader doesn't need to wait, since OS pref sync is disabled.
-  run_loop.Run();
-  // |loader| completed loading.
-}
-
-TEST_F(ExternalPrefLoaderSyncConsentOptionalTest, SyncDisabledByPolicy) {
-  sync_service()->SetDisableReasons(
-      syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
-  ASSERT_FALSE(sync_service()->CanSyncFeatureStart());
-
-  base::RunLoop run_loop;
-  scoped_refptr<ExternalPrefLoader> loader =
-      base::MakeRefCounted<TestExternalPrefLoader>(
-          profile(), run_loop.QuitWhenIdleClosure());
-  ExternalProviderImpl provider(
-      /*service=*/nullptr, loader, profile(),
-      ManifestLocation::kInvalidLocation, ManifestLocation::kInvalidLocation,
-      Extension::NO_FLAGS);
-  provider.VisitRegisteredExtension();
-
-  // Loader doesn't need to wait, because sync will never enable.
-  run_loop.Run();
-  // |loader| completed loading.
-}
-
 }  // namespace extensions
diff --git a/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc b/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
index 54615df..c863af8 100644
--- a/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
+++ b/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
@@ -287,7 +287,6 @@
 
   // OOBE screen completed with OS sync enabled.
   PrefService* prefs = profile()->GetPrefs();
-  prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, true);
   prefs->SetBoolean(chromeos::prefs::kSyncOobeCompleted, true);
 
   // App sync will wait for priority sync to complete.
diff --git a/chrome/browser/extensions/omaha_attributes_handler.cc b/chrome/browser/extensions/omaha_attributes_handler.cc
index 19ce2a1..02739d4 100644
--- a/chrome/browser/extensions/omaha_attributes_handler.cc
+++ b/chrome/browser/extensions/omaha_attributes_handler.cc
@@ -10,7 +10,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/blocklist_extension_prefs.h"
 #include "extensions/browser/blocklist_state.h"
-#include "extensions/common/extension_features.h"
 
 namespace extensions {
 
@@ -93,12 +92,10 @@
   HandleMalwareOmahaAttribute(extension_id, attributes);
   HandleGreylistOmahaAttribute(
       extension_id, attributes,
-      extensions_features::kDisablePolicyViolationExtensionsRemotely,
       BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
       ExtensionUpdateCheckDataKey::kPolicyViolation);
   HandleGreylistOmahaAttribute(
       extension_id, attributes,
-      extensions_features::kDisablePotentiallyUwsExtensionsRemotely,
       BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
       ExtensionUpdateCheckDataKey::kPotentiallyUWS);
 }
@@ -145,14 +142,13 @@
 void OmahaAttributesHandler::HandleGreylistOmahaAttribute(
     const ExtensionId& extension_id,
     const base::Value& attributes,
-    const base::Feature& feature_flag,
     BitMapBlocklistState greylist_state,
     ExtensionUpdateCheckDataKey reason) {
   bool has_attribute_value =
       HasOmahaBlocklistStateInAttributes(attributes, greylist_state);
   bool has_omaha_blocklist_state = blocklist_prefs::HasOmahaBlocklistState(
       extension_id, greylist_state, extension_prefs_);
-  if (!base::FeatureList::IsEnabled(feature_flag) || !has_attribute_value) {
+  if (!has_attribute_value) {
     if (has_omaha_blocklist_state) {
       blocklist_prefs::RemoveOmahaBlocklistState(extension_id, greylist_state,
                                                  extension_prefs_);
diff --git a/chrome/browser/extensions/omaha_attributes_handler.h b/chrome/browser/extensions/omaha_attributes_handler.h
index 64c8895..2da9d7b 100644
--- a/chrome/browser/extensions/omaha_attributes_handler.h
+++ b/chrome/browser/extensions/omaha_attributes_handler.h
@@ -57,13 +57,12 @@
   void HandleMalwareOmahaAttribute(const ExtensionId& extension_id,
                                    const base::Value& attributes);
   // Performs action based on `attributes` for the `extension_id`. If the
-  // extension is not in the `greylist_state` or the `feature_flag` is disabled,
-  // remove it from the Omaha blocklist state and maybe re-enable it. Otherwise,
-  // add it to the Omaha blocklist state and maybe disable it. `reason` is used
-  // for logging UMA metrics.
+  // extension is not in the `greylist_state`, remove it from the Omaha
+  // blocklist state and maybe re-enable it. Otherwise, add it to the Omaha
+  // blocklist state and maybe disable it. `reason` is used for logging UMA
+  // metrics.
   void HandleGreylistOmahaAttribute(const ExtensionId& extension_id,
                                     const base::Value& attributes,
-                                    const base::Feature& feature_flag,
                                     BitMapBlocklistState greylist_state,
                                     ExtensionUpdateCheckDataKey reason);
 
diff --git a/chrome/browser/extensions/omaha_attributes_handler_unittest.cc b/chrome/browser/extensions/omaha_attributes_handler_unittest.cc
index a874f59e..851873cc 100644
--- a/chrome/browser/extensions/omaha_attributes_handler_unittest.cc
+++ b/chrome/browser/extensions/omaha_attributes_handler_unittest.cc
@@ -5,14 +5,12 @@
 #include "chrome/browser/extensions/omaha_attributes_handler.h"
 
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
 #include "extensions/browser/blocklist_extension_prefs.h"
 #include "extensions/browser/disable_reason.h"
 #include "extensions/browser/extension_prefs.h"
-#include "extensions/common/extension_features.h"
 #include "extensions/test/extension_state_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -26,16 +24,7 @@
 }  // namespace
 
 // Test suite to test Omaha attribute handler.
-class OmahaAttributesHandlerUnitTest : public ExtensionServiceTestBase {
- public:
-  OmahaAttributesHandlerUnitTest() {
-    feature_list_.InitWithFeatures(
-        /*enabled_features=*/
-        {extensions_features::kDisablePolicyViolationExtensionsRemotely,
-         extensions_features::kDisablePotentiallyUwsExtensionsRemotely},
-        /*disabled_features=*/{});
-  }
-};
+using OmahaAttributesHandlerUnitTest = ExtensionServiceTestBase;
 
 TEST_F(OmahaAttributesHandlerUnitTest, LogPolicyViolationUWSMetrics) {
   base::HistogramTester histograms;
@@ -262,43 +251,4 @@
       kTestExtensionId, disable_reason::DISABLE_GREYLIST));
 }
 
-// Test suite to test Omaha attribute handler when features are disabled.
-class OmahaAttributesHandlerWithFeatureDisabledUnitTest
-    : public ExtensionServiceTestBase {
- public:
-  OmahaAttributesHandlerWithFeatureDisabledUnitTest() {
-    feature_list_.InitWithFeatures(
-        /*enabled_features=*/
-        {},
-        /*disabled_features=*/{
-            extensions_features::kDisablePolicyViolationExtensionsRemotely,
-            extensions_features::kDisablePotentiallyUwsExtensionsRemotely});
-  }
-};
-
-TEST_F(OmahaAttributesHandlerWithFeatureDisabledUnitTest,
-       DoNotDisableRemotelyWhenFlagsDisabled) {
-  base::HistogramTester histograms;
-  InitializeGoodInstalledExtensionService();
-  service()->Init();
-
-  base::Value attributes(base::Value::Type::DICTIONARY);
-  attributes.SetBoolKey("_policy_violation", true);
-  attributes.SetBoolKey("_potentially_uws", true);
-  service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
-
-  // Since the flag is disabled, we don't expect the extension to be affected.
-  ExtensionStateTester state_tester(profile());
-  EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
-  EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
-      kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
-      ExtensionPrefs::Get(profile())));
-  EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
-      kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
-      ExtensionPrefs::Get(profile())));
-  // Histograms should not be logged when the flag is disabled.
-  histograms.ExpectTotalCount("Extensions.ExtensionAddDisabledRemotelyReason2",
-                              /*expected_count=*/0);
-}
-
 }  // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index b03df792..7595a97 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1365,6 +1365,11 @@
     "expiry_milestone": 100
   },
   {
+    "name": "drag-and-drop-android",
+    "owners": [ "wenyufu", "clank-app-team@google.com" ],
+    "expiry_milestone": 104
+  },
+  {
     "name": "draw-predicted-ink-point",
     "owners": [ "joalmei@microsoft.com" ],
     "expiry_milestone": 98
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 47bb4b7b..5a493194 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3083,6 +3083,10 @@
     "Restricts Chrome threads to LITTLE cores on devices with big.LITTLE or "
     "similar CPU architectures.";
 
+const char kDragAndDropAndroidName[] = "Drag and drop on Android";
+const char kDragAndDropAndroidDescription[] =
+    "Enable drag and drop images and links from web contents on Android.";
+
 const char kDynamicColorAndroidName[] = "Dynamic colors on Android";
 const char kDynamicColorAndroidDescription[] =
     "Enabled dynamic colors on supported devices, such as Pixel devices "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 799ebd1..45af6090 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1762,6 +1762,9 @@
 extern const char kCpuAffinityRestrictToLittleCoresName[];
 extern const char kCpuAffinityRestrictToLittleCoresDescription[];
 
+extern const char kDragAndDropAndroidName[];
+extern const char kDragAndDropAndroidDescription[];
+
 extern const char kDynamicColorAndroidName[];
 extern const char kDynamicColorAndroidDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 4163aa2b..f7b75e4 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -218,6 +218,7 @@
     &kDownloadProgressInfoBar,
     &kDownloadProgressMessage,
     &kDownloadRename,
+    &kDragAndDropAndroid,
     &kDuetTabStripIntegrationAndroid,
     &kDynamicColorAndroid,
     &kEnableDangerousDownloadDialog,
@@ -595,6 +596,9 @@
 const base::Feature kDownloadRename{"DownloadRename",
                                     base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kDragAndDropAndroid{"DragAndDropAndroid",
+                                        base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kDuetTabStripIntegrationAndroid{
     "DuetTabStripIntegrationAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 99d66cd..83ad0a9 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -86,6 +86,7 @@
 extern const base::Feature kDownloadProgressInfoBar;
 extern const base::Feature kDownloadProgressMessage;
 extern const base::Feature kDownloadRename;
+extern const base::Feature kDragAndDropAndroid;
 extern const base::Feature kDuetTabStripIntegrationAndroid;
 extern const base::Feature kDynamicColorAndroid;
 extern const base::Feature kEnableDangerousDownloadDialog;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index b7dccbed..bb26fde 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -315,6 +315,7 @@
     public static final String DOWNLOAD_OFFLINE_CONTENT_PROVIDER =
             "UseDownloadOfflineContentProvider";
     public static final String DOWNLOAD_LATER = "DownloadLater";
+    public static final String DRAG_AND_DROP_ANDROID = "DragAndDropAndroid";
     public static final String DYNAMIC_COLOR_ANDROID = "DynamicColorAndroid";
     public static final String EDIT_PASSWORDS_IN_SETTINGS = "EditPasswordsInSettings";
     public static final String EARLY_LIBRARY_LOAD = "EarlyLibraryLoad";
diff --git a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
index 9eea99c48..90e658df 100644
--- a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
+++ b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include "base/callback_helpers.h"
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/notreached.h"
@@ -240,8 +241,11 @@
     }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+    // TODO(crbug.com/1259605): pass the stop callback instead of
+    // base::DoNothing().
     policy::DlpContentManagerAsh::Get()->OnScreenCaptureStarted(
-        label, screen_capture_ids, application_title_, state_change_callback);
+        label, screen_capture_ids, application_title_, base::DoNothing(),
+        state_change_callback);
 #endif
 
     // If a custom |ui_| is specified, notify it that the stream started and let
diff --git a/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc b/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
index a825f806..cca5e7c 100644
--- a/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
@@ -305,8 +305,8 @@
   RunP2PScreenshareWhileSharing(base::BindOnce(GetDesktopMediaIDForScreen));
 }
 
-// TODO(crbug.com/1282292): Test is flaky on Linux.
-#if defined(OS_LINUX)
+// TODO(crbug.com/1282292): Test is flaky on Linux and ChromeOS.
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
 #define MAYBE_RunP2PScreenshareWhileSharingTab \
   DISABLED_RunP2PScreenshareWhileSharingTab
 #else
diff --git a/chrome/browser/metrics/perf/metric_provider.cc b/chrome/browser/metrics/perf/metric_provider.cc
index 0b6f52e..bc6b264 100644
--- a/chrome/browser/metrics/perf/metric_provider.cc
+++ b/chrome/browser/metrics/perf/metric_provider.cc
@@ -200,8 +200,6 @@
   // the OS settings. Otherwise, we read from Chrome settings. We then check if
   // the sync feature is enabled and the App Sync toggle is on.
   if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    if (!sync_settings->IsOsSyncFeatureEnabled())
-      return RecordAttemptStatus::kOSSyncFeatureDisabled;
     if (!sync_settings->GetSelectedOsTypes().Has(
             syncer::UserSelectableOsType::kOsApps))
       return RecordAttemptStatus::kOSAppSyncDisabled;
diff --git a/chrome/browser/metrics/perf/metric_provider.h b/chrome/browser/metrics/perf/metric_provider.h
index 0143d99..0b239d91 100644
--- a/chrome/browser/metrics/perf/metric_provider.h
+++ b/chrome/browser/metrics/perf/metric_provider.h
@@ -81,7 +81,7 @@
     kSyncServiceUnavailable = 5,
     kChromeSyncFeatureDisabled = 6,
     kChromeAppSyncDisabled = 7,
-    kOSSyncFeatureDisabled = 8,
+    // Deprecated: kOSSyncFeatureDisabled = 8,
     kOSAppSyncDisabled = 9,
     kMaxValue = kOSAppSyncDisabled,
   };
diff --git a/chrome/browser/metrics/perf/metric_provider_unittest.cc b/chrome/browser/metrics/perf/metric_provider_unittest.cc
index 7743376947..1e12b51 100644
--- a/chrome/browser/metrics/perf/metric_provider_unittest.cc
+++ b/chrome/browser/metrics/perf/metric_provider_unittest.cc
@@ -351,13 +351,11 @@
   }
 
   void EnableOSAppSync(TestSyncService* sync_service) {
-    sync_service->GetUserSettings()->SetOsSyncFeatureEnabled(true);
     sync_service->GetUserSettings()->SetSelectedOsTypes(
         /*sync_all_os_types=*/false, {syncer::UserSelectableOsType::kOsApps});
   }
 
   void DisableOSAppSync(TestSyncService* sync_service) {
-    sync_service->GetUserSettings()->SetOsSyncFeatureEnabled(true);
     sync_service->GetUserSettings()->SetSelectedOsTypes(
         /*sync_all_os_types=*/false, {});
   }
diff --git a/chrome/browser/nearby_sharing/nearby_share_settings.h b/chrome/browser/nearby_sharing/nearby_share_settings.h
index 1a85f5d..003f5a3 100644
--- a/chrome/browser/nearby_sharing/nearby_share_settings.h
+++ b/chrome/browser/nearby_sharing/nearby_share_settings.h
@@ -54,6 +54,9 @@
   bool GetEnabled() const;
   nearby_share::mojom::FastInitiationNotificationState
   GetFastInitiationNotificationState() const;
+  bool is_fast_initiation_hardware_supported() {
+    return is_fast_initiation_hardware_supported_;
+  }
   void SetIsFastInitiationHardwareSupported(bool is_supported);
   std::string GetDeviceName() const;
   nearby_share::mojom::DataUsage GetDataUsage() const;
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index 40d22d7..b9a8143 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -1600,8 +1600,16 @@
       content::ExecuteScriptAsync(
           guest_contents,
           R"(viewer.shadowRoot.querySelector('#scroller').onscroll = () => {
+            if (viewer.viewport.scrollContent_.unackedScrollsToRemote_ === 0) {
+              window.domAutomationController.send('dispatchedScrollEvent');
+            }
+          };
+          if (viewer.viewport.scrollContent_.unackedScrollsToRemote_ === 0) {
             window.domAutomationController.send('dispatchedScrollEvent');
           })");
+
+      // Wait for pending scroll-to-remotes to complete.
+      Wait();
     }
 
     void Reset() { message_queue_.ClearQueue(); }
@@ -1651,13 +1659,7 @@
 // static
 constexpr int PDFExtensionKeyEventTest::kScrollIncrement;
 
-// crbug.com/1281749
-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
-#define MAYBE_ScrollWithSpace DISABLED_ScrollWithSpace
-#else
-#define MAYBE_ScrollWithSpace ScrollWithSpace
-#endif
-IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest, MAYBE_ScrollWithSpace) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest, ScrollWithSpace) {
   WebContents* guest_contents = LoadPdfGetGuestContents(
       embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   SetInputFocusOnPlugin(guest_contents);
@@ -1695,13 +1697,7 @@
   EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
 }
 
-// crbug.com/1281749
-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
-#define MAYBE_ScrollWithPageDownUp DISABLED_ScrollWithPageDownUp
-#else
-#define MAYBE_ScrollWithPageDownUp ScrollWithPageDownUp
-#endif
-IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest, MAYBE_ScrollWithPageDownUp) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest, ScrollWithPageDownUp) {
   WebContents* guest_contents = LoadPdfGetGuestContents(
       embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   SetInputFocusOnPlugin(guest_contents);
@@ -1741,14 +1737,7 @@
   EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
 }
 
-// crbug.com/1281749
-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
-#define MAYBE_ScrollWithArrowLeftRight DISABLED_ScrollWithArrowLeftRight
-#else
-#define MAYBE_ScrollWithArrowLeftRight ScrollWithArrowLeftRight
-#endif
-IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest,
-                       MAYBE_ScrollWithArrowLeftRight) {
+IN_PROC_BROWSER_TEST_P(PDFExtensionKeyEventTest, ScrollWithArrowLeftRight) {
   WebContents* guest_contents = LoadPdfGetGuestContents(
       embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf#zoom=200"));
   SetInputFocusOnPlugin(guest_contents);
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 6d2ec81..048b846 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -696,6 +696,9 @@
 
 // Deprecated 12/2021.
 const char kArcAppReinstallState[] = "arc_app_reinstall_state";
+
+// Deprecated 12/2021.
+const char kOsSyncFeatureEnabled[] = "sync.os_sync_feature_enabled";
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Deprecated 12/2021.
@@ -918,6 +921,8 @@
   registry->RegisterBooleanPref(kSyncFirstRunCompleted, false);
 
   registry->RegisterDictionaryPref(kArcAppReinstallState);
+
+  registry->RegisterBooleanPref(kOsSyncFeatureEnabled, false);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if defined(OS_ANDROID)
@@ -1801,6 +1806,8 @@
 
   // Added 12/2021.
   profile_prefs->ClearPref(kArcAppReinstallState);
+
+  profile_prefs->ClearPref(kOsSyncFeatureEnabled);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Added 12/2021.
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index ed31c67..d0327f30 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -198,6 +198,7 @@
     "components/oobe_types.html",
     "components/security_token_pin.html",
     "components/security_token_pin.js",
+    "components/test_util.js",
     "components/throbber_notice.html",
     "components/throbber_notice.js",
     "components/web_view_helper.html",
@@ -365,6 +366,7 @@
     "components/oobe_select.m.js",
     "components/oobe_types.m.js",
     "components/security_token_pin.m.js",
+    "components/test_util.m.js",
     "components/throbber_notice.m.js",
     "components/web_view_helper.m.js",
     "components/web_view_loader.m.js",
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn
index cb4ac4c..a0bec8d2 100644
--- a/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -61,6 +61,7 @@
     ":oobe_select.m",
     ":oobe_types.m",
     ":security_token_pin.m",
+    ":test_util.m",
     ":throbber_notice.m",
     ":web_view_helper.m",
     ":web_view_loader.m",
@@ -283,16 +284,22 @@
   extra_deps = [ ":modulize" ]
 }
 
+js_library("security_token_pin.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/security_token_pin.m.js" ]
+  deps = [ "./behaviors:oobe_i18n_behavior" ]
+  extra_deps = [ ":security_token_pin_module" ]
+}
+
 js_library("throbber_notice.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/throbber_notice.m.js" ]
   deps = [ "./behaviors:oobe_i18n_behavior" ]
   extra_deps = [ ":throbber_notice_module" ]
 }
 
-js_library("security_token_pin.m") {
-  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/security_token_pin.m.js" ]
-  deps = [ "./behaviors:oobe_i18n_behavior" ]
-  extra_deps = [ ":security_token_pin_module" ]
+js_library("test_util.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/test_util.m.js" ]
+  deps = []
+  extra_deps = [ ":modulize" ]
 }
 
 js_library("web_view_helper.m") {
@@ -432,6 +439,7 @@
     "oobe_types.js",
     "web_view_helper.js",
     "web_view_loader.js",
+    "test_util.js",
   ]
   namespace_rewrites = []
 }
diff --git a/chrome/browser/resources/chromeos/login/components/test_util.js b/chrome/browser/resources/chromeos/login/components/test_util.js
new file mode 100644
index 0000000..b8c4349
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/components/test_util.js
@@ -0,0 +1,25 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// #import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+
+class ErrorStore {
+  constructor() {
+    this.store_ = [];
+    window.addEventListener('error', (e) => {
+      this.store_.push(e);
+    });
+  }
+
+  get length() {
+    return this.store_.length;
+  }
+}
+
+cr.addSingletonGetter(ErrorStore);
+if (window.cr == undefined) {
+  window.cr = {};
+}
+window.cr.ErrorStore = ErrorStore;
+cr.ErrorStore.getInstance();
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.js b/chrome/browser/resources/chromeos/login/debug/debug.js
index 62a1e8d..00e91fa5 100644
--- a/chrome/browser/resources/chromeos/login/debug/debug.js
+++ b/chrome/browser/resources/chromeos/login/debug/debug.js
@@ -907,7 +907,6 @@
       states: [{
         id: 'minor-mode',
         data: {
-          syncConsentOptionalEnabled: false,
           isMinorMode: true,
         },
       }]
diff --git a/chrome/browser/resources/chromeos/login/md_login.html b/chrome/browser/resources/chromeos/login/md_login.html
index 1602c5f5..e9777d6 100644
--- a/chrome/browser/resources/chromeos/login/md_login.html
+++ b/chrome/browser/resources/chromeos/login/md_login.html
@@ -56,6 +56,7 @@
 
 <link rel="import" href="/components/behaviors/i18n_setup.html">
 <link rel="import" href="chrome://oobe/custom_elements.html">
+<script src="chrome://oobe/components/test_util.js"></script>
 <script src="chrome://oobe/login.js"></script>
 </head>
 <body i18n-values=".style.fontFamily:fontfamily;" class="chromeos">
diff --git a/chrome/browser/resources/chromeos/login/oobe.html b/chrome/browser/resources/chromeos/login/oobe.html
index e95dad0..2da9ece 100644
--- a/chrome/browser/resources/chromeos/login/oobe.html
+++ b/chrome/browser/resources/chromeos/login/oobe.html
@@ -60,6 +60,7 @@
 
 <link rel="import" href="/components/behaviors/i18n_setup.html">
 <link rel="import" href="chrome://oobe/custom_elements.html">
+<script src="chrome://oobe/components/test_util.js"></script>
 <script src="chrome://oobe/oobe.js"></script>
 </head>
 <body class="oobe-display chromeos" i18n-values=".style.fontFamily:fontfamily;">
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js
index d8b9d72..8ef7dea 100644
--- a/chrome/browser/resources/chromeos/login/oobe.js
+++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -7,7 +7,6 @@
  * This is the main code for the OOBE WebUI implementation.
  */
 
-// <include src="test_util.js">
 // <include src="components/display_manager_types.js">
 // <include src="components/oobe_types.js">
 // <include src="display_manager.js">
diff --git a/chrome/browser/resources/chromeos/login/oobe_polymer3.js b/chrome/browser/resources/chromeos/login/oobe_polymer3.js
index efeb4f6..0f3c2ab 100644
--- a/chrome/browser/resources/chromeos/login/oobe_polymer3.js
+++ b/chrome/browser/resources/chromeos/login/oobe_polymer3.js
@@ -2,6 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {Oobe} from './cr_ui.m.js';
+import {DebuggerUI} from './debug/debug.m.js';
+import {loadTimeData} from './i18n_setup.js';
+import 'chrome://oobe/components/test_util.m.js';
+
 import 'chrome://oobe/screens/common/app_downloading.m.js';
 import 'chrome://oobe/screens/common/app_launch_splash.m.js';
 import 'chrome://oobe/screens/common/adb_sideloading.m.js';
@@ -46,10 +51,6 @@
 import 'chrome://oobe/screens/oobe/packaged_license.m.js';
 import 'chrome://oobe/screens/oobe/update.m.js';
 
-import {Oobe} from './cr_ui.m.js';
-import {DebuggerUI} from './debug/debug.m.js';
-import {loadTimeData} from './i18n_setup.js';
-
 function initializeDebugger() {
   if (document.readyState === 'loading')
     return;
diff --git a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
index 3149c3b..d99b6a4 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
@@ -51,9 +51,6 @@
        */
       isChildAccount_: Boolean,
 
-      /** @private */
-      syncConsentOptionalEnabled_: Boolean,
-
       /**
        * Indicates whether user is minor mode user (e.g. under age of 18).
        * @private
@@ -77,7 +74,6 @@
     this.UI_STEPS = SyncUIState;
 
     this.isChildAccount_ = false;
-    this.syncConsentOptionalEnabled_ = false;
     this.isMinorMode_ = false;
   }
 
@@ -96,7 +92,6 @@
    */
   onBeforeShow(data) {
     this.setIsChildAccount(data['isChildAccount']);
-    this.syncConsentOptionalEnabled_ = data['syncConsentOptionalEnabled'];
   }
 
   /**
@@ -160,8 +155,7 @@
    * @private
    */
   getDefaultUIStep_() {
-    return this.syncConsentOptionalEnabled_ ? SyncUIState.SPLIT :
-                                              SyncUIState.NO_SPLIT;
+    return SyncUIState.NO_SPLIT;
   }
 
   /**
@@ -170,7 +164,6 @@
    */
   onSettingsSaveAndContinue_(e, opted_in) {
     assert(e.path);
-    assert(!this.syncConsentOptionalEnabled_);
     chrome.send('login.SyncConsentScreen.nonSplitSettingsContinue', [
       opted_in, this.$.reviewSettingsBox.checked, this.getConsentDescription_(),
       this.getConsentConfirmation_(e.path)
@@ -191,11 +184,7 @@
    * @private
    */
   onAcceptTap_(event) {
-    assert(this.syncConsentOptionalEnabled_);
-    assert(event.path);
-    chrome.send('login.SyncConsentScreen.acceptAndContinue', [
-      this.getConsentDescription_(), this.getConsentConfirmation_(event.path)
-    ]);
+    // TODO(https://crbug.com/1278325): Remove this.
   }
 
   /**
@@ -204,11 +193,7 @@
    * @private
    */
   onDeclineTap_(event) {
-    assert(this.syncConsentOptionalEnabled_);
-    assert(event.path);
-    chrome.send('login.SyncConsentScreen.declineAndContinue', [
-      this.getConsentDescription_(), this.getConsentConfirmation_(event.path)
-    ]);
+    // TODO(https://crbug.com/1278325): Remove this.
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/test_util.js b/chrome/browser/resources/chromeos/login/test_util.js
deleted file mode 100644
index 28cd309..0000000
--- a/chrome/browser/resources/chromeos/login/test_util.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('cr', function() {
-  class ErrorStore {
-    constructor() {
-      this.store_ = [];
-      window.addEventListener('error', (e) => {
-        this.store_.push(e);
-      });
-    }
-
-    get length() {
-      return this.store_.length;
-    }
-  }
-
-  cr.addSingletonGetter(ErrorStore);
-
-  return {
-    ErrorStore: ErrorStore,
-  };
-});
-
-cr.ErrorStore.getInstance();
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
index 583dd93..445676b 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -564,9 +564,9 @@
    * Handler for when os sync preferences are updated.
    * @private
    */
-  handleOsSyncPrefsChanged_(osSyncFeatureEnabled, osSyncPrefs) {
-    this.isWifiSyncEnabled_ = osSyncFeatureEnabled && !!osSyncPrefs &&
-        osSyncPrefs.osWifiConfigurationsSynced;
+  handleOsSyncPrefsChanged_(osSyncPrefs) {
+    this.isWifiSyncEnabled_ =
+        !!osSyncPrefs && osSyncPrefs.osWifiConfigurationsSynced;
   },
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
index 7bec70bb..9cec310 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
@@ -68,12 +68,11 @@
   /**
    * Handler for when os sync preferences are updated.
    * @param {!settings.OsSyncPrefs} osSyncPrefs
-   * @param {!boolean} osSyncFeatureEnabled
    * @private
    */
-  handleOsSyncPrefsChanged_(osSyncFeatureEnabled, osSyncPrefs) {
-    this.isWifiSyncV1Enabled_ = osSyncFeatureEnabled && !!osSyncPrefs &&
-        osSyncPrefs.osWifiConfigurationsSynced;
+  handleOsSyncPrefsChanged_(osSyncPrefs) {
+    this.isWifiSyncV1Enabled_ =
+        !!osSyncPrefs && osSyncPrefs.osWifiConfigurationsSynced;
   },
 
   /** @override */
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
index 65d0e91..5876284 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
@@ -503,5 +503,4 @@
     return loadTimeData.getBoolean('isNearbyShareBackgroundScanningEnabled') &&
         is_hardware_supported;
   },
-
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html
index 215a4074..28062a4 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html
@@ -340,6 +340,11 @@
     <button class="dropdown-item" on-click="onRemoveAccountTap_">
       $i18n{removeAccountLabel}
     </button>
+    <template is="dom-if" if="[[isArcAccountRestrictionsEnabled_]]">
+      <button class="dropdown-item" on-click="onChangeArcAvailability_">
+        [[getChangeArcAvailabilityLabel_(actionMenuAccount_)]]
+      </button>
+    </template>
   </cr-action-menu>
 </div>
 <div class="settings-box"></div>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
index 48fd8e6..fc45e7d0 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
@@ -421,4 +421,46 @@
     this.$.removeConfirmationDialog.close();
     this.$$('#add-account-button').focus();
   },
+
+  /**
+   * Get the test for button that changes ARC availability.
+   * @private
+   */
+  getChangeArcAvailabilityLabel_() {
+    if (!this.actionMenuAccount_) {
+      return '';
+    }
+    // TODO(crbug.com/1260909): Use real strings.
+    return this.actionMenuAccount_.isAvailableInArc ?
+        'Don\'t share with Android apps' :
+        'Share with Android apps';
+  },
+
+  /**
+   * Change ARC availability for |this.actionMenuAccount_|.
+   * Closes the 'More actions' menu and focuses the 'More actions' button for
+   * |this.actionMenuAccount_|.
+   * @private
+   */
+  onChangeArcAvailability_() {
+    this.$$('cr-action-menu').close();
+    const newArcAvailability = !this.actionMenuAccount_.isAvailableInArc;
+    this.browserProxy_.changeArcAvailability(
+        this.actionMenuAccount_, newArcAvailability);
+
+    const actionMenuAccountIndex =
+        this.$$('#account-list').items.indexOf(this.actionMenuAccount_);
+    if (actionMenuAccountIndex >= 0) {
+      // Focus 'More actions' button for the current account.
+      this.shadowRoot
+          .querySelectorAll('.icon-more-vert')[actionMenuAccountIndex]
+          .focus();
+    } else {
+      console.error(
+          'Couldn\'t find active account in the list: ',
+          this.actionMenuAccount_);
+      this.$$('#add-account-button').focus();
+    }
+    this.actionMenuAccount_ = null;
+  },
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js
index ab3c36ae..d81945a5 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js
@@ -57,6 +57,13 @@
   removeAccount(account) {}
 
   /**
+   * Changes ARC availability for |account|.
+   * @param {?Account} account
+   * @param {?boolean} isAvailableInArc new ARC availability value
+   */
+  changeArcAvailability(account, isAvailableInArc) {}
+
+  /**
    * Displays the Account Manager welcome dialog if required.
    */
   showWelcomeDialogIfRequired() {}
@@ -92,6 +99,11 @@
   }
 
   /** @override */
+  changeArcAvailability(account, isAvailableInArc) {
+    chrome.send('changeArcAvailability', [account, isAvailableInArc]);
+  }
+
+  /** @override */
   showWelcomeDialogIfRequired() {
     chrome.send('showWelcomeDialogIfRequired');
   }
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.js
index 4b93a33d..a28578da 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.js
@@ -48,13 +48,6 @@
     sendOsSyncPrefsChanged() {}
 
     /**
-     * Sets whether the OS sync feature should be enabled. Sync will not start
-     * until the user either navigates away from the page or closes settings.
-     * @param {boolean} enabled
-     */
-    setOsSyncFeatureEnabled(enabled) {}
-
-    /**
      * Sets which types of data to sync.
      * @param {!settings.OsSyncPrefs} osSyncPrefs
      */
@@ -81,11 +74,6 @@
     }
 
     /** @override */
-    setOsSyncFeatureEnabled(enabled) {
-      return chrome.send('SetOsSyncFeatureEnabled', [enabled]);
-    }
-
-    /** @override */
     setOsSyncDatatypes(osSyncPrefs) {
       return chrome.send('SetOsSyncDatatypes', [osSyncPrefs]);
     }
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
index a7d86dd..1eab5fb 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
@@ -81,7 +81,7 @@
 <div class="settings-box first two-line">
   <div id="avatarContainer">
     <img id="avatarIcon" alt="" src="[[profileIconUrl]]">
-    <div id="syncIconContainer" hidden="[[!osSyncFeatureEnabled]]"
+    <div id="syncIconContainer"
         class$="[[getSyncIconStyle_(
             syncStatus.hasError, syncStatus.statusAction,
             syncStatus.disabled)]]">
@@ -96,21 +96,10 @@
         [[getAccountTitle_(profileName, syncStatus.hasError)]]
       </span>
       <div id="accountSubtitle" class="secondary" aria-hidden="true">
-        [[getAccountSubtitle_(profileEmail, syncStatus.hasError,
-            osSyncFeatureEnabled)]]
+        [[getAccountSubtitle_(profileEmail, syncStatus.hasError)]]
       </div>
     </div>
   </div>
-  <template is="dom-if" if="[[syncConsentOptionalEnabled_]]" restamp>
-    <cr-button id="syncOnOffButton"
-        class="action-button"
-        on-click="onSyncOnOffButtonClick_"
-        aria-labelledby="syncOnOffButton accountTitle accountSubtitle"
-        aria-describedby="featureLabel"
-        deep-link-focus-id$="[[Setting.kSplitSyncOnOff]]">
-      [[getSyncOnOffButtonLabel_(osSyncFeatureEnabled)]]
-    </cr-button>
-  </template>
 </div>
 <div id="featureLabel" class="settings-box">
   <localized-link class="secondary"
@@ -120,14 +109,12 @@
 </div>
 <div class="settings-box">
   <div id="syncEverythingCheckboxLabel"
-      class="start"
-      label-disabled$="[[!osSyncFeatureEnabled]]">
+      class="start">
     $i18n{syncEverythingCheckboxLabel}
   </div>
   <cr-toggle id="syncAllOsTypesControl"
       checked="{{osSyncPrefs.syncAllOsTypes}}"
       on-change="onSyncAllOsTypesChanged_"
-      disabled="[[!osSyncFeatureEnabled]]"
       aria-labelledby="syncEverythingCheckboxLabel">
   </cr-toggle>
 </div>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
index 3b2a5262..c9ddc39 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
@@ -88,13 +88,6 @@
     profileEmail: String,
 
     /**
-     * Whether the OS sync feature is enabled. This object does not directly
-     * manipulate prefs so we can defer turning on OS sync until the user
-     * navigates away from the page.
-     */
-    osSyncFeatureEnabled: Boolean,
-
-    /**
      * The current OS sync preferences. Cached so we can restore individual
      * toggle state when turning "sync everything" on and off, without affecting
      * the underlying chrome prefs.
@@ -106,8 +99,7 @@
     areDataTypeTogglesDisabled_: {
       type: Boolean,
       value: true,
-      computed: `computeDataTypeTogglesDisabled_(osSyncFeatureEnabled,
-          osSyncPrefs.syncAllOsTypes)`,
+      computed: `computeDataTypeTogglesDisabled_(osSyncPrefs.syncAllOsTypes)`,
     },
 
     /**
@@ -118,14 +110,6 @@
       type: Object,
       value: () => new Set([chromeos.settings.mojom.Setting.kSplitSyncOnOff]),
     },
-
-    /** @private */
-    syncConsentOptionalEnabled_: {
-      type: Boolean,
-      value() {
-        return loadTimeData.getBoolean('syncConsentOptionalEnabled');
-      },
-    },
   },
 
   /** @private {?OsSyncBrowserProxy} */
@@ -185,23 +169,12 @@
     if (!this.syncStatus) {
       return '';
     }
-    return this.osSyncFeatureEnabled && !this.syncStatus.hasError ?
+    return !this.syncStatus.hasError ?
         this.i18n('syncingTo', this.profileEmail) :
         this.profileEmail;
   },
 
   /**
-   * @return {string}
-   * @private
-   */
-  getSyncOnOffButtonLabel_() {
-    if (!this.osSyncFeatureEnabled) {
-      return this.i18n('osSyncTurnOn');
-    }
-    return this.i18n('osSyncTurnOff');
-  },
-
-  /**
    * Returns the CSS class for the sync status icon.
    * @return {string}
    * @private
@@ -247,33 +220,15 @@
    * Handler for when the sync preferences are updated.
    * @private
    */
-  handleOsSyncPrefsChanged_(osSyncFeatureEnabled, osSyncPrefs) {
-    assert(osSyncFeatureEnabled || this.syncConsentOptionalEnabled_);
-    this.osSyncFeatureEnabled = osSyncFeatureEnabled;
+  handleOsSyncPrefsChanged_(osSyncPrefs) {
     this.osSyncPrefs = osSyncPrefs;
 
-    // If the feature is disabled the checkboxes appear toggled off, regardless
-    // of the underlying chrome pref.
-    if (!this.osSyncFeatureEnabled) {
-      this.set('osSyncPrefs.syncAllOsTypes', false);
-      for (const dataType of SyncPrefsIndividualDataTypes) {
-        this.set(['osSyncPrefs', dataType], false);
-      }
-    }
-
     // If apps are not registered or synced, force wallpaper off.
     if (!this.osSyncPrefs.osAppsRegistered || !this.osSyncPrefs.osAppsSynced) {
       this.set('osSyncPrefs.wallpaperEnabled', false);
     }
   },
 
-  /** @private */
-  onSyncOnOffButtonClick_() {
-    assert(this.syncConsentOptionalEnabled_);
-    this.browserProxy_.setOsSyncFeatureEnabled(!this.osSyncFeatureEnabled);
-    recordSettingChange();
-  },
-
   /**
    * Handler for when the sync all data types checkbox is changed.
    * @param {!Event} event
@@ -335,8 +290,7 @@
    * @private
    */
   computeDataTypeTogglesDisabled_() {
-    return !this.osSyncFeatureEnabled ||
-        (this.osSyncPrefs !== undefined && this.osSyncPrefs.syncAllOsTypes);
+    return this.osSyncPrefs !== undefined && this.osSyncPrefs.syncAllOsTypes;
   },
 
   /**
diff --git a/chrome/browser/ssl/sct_reporting_service.cc b/chrome/browser/ssl/sct_reporting_service.cc
index 4fcf26b6..6385371b 100644
--- a/chrome/browser/ssl/sct_reporting_service.cc
+++ b/chrome/browser/ssl/sct_reporting_service.cc
@@ -68,14 +68,11 @@
   bool is_sct_auditing_enabled =
       base::FeatureList::IsEnabled(features::kSCTAuditing);
   double sct_sampling_rate = features::kSCTAuditingSamplingRate.Get();
-  mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote;
-  SystemNetworkContextManager::GetInstance()->GetURLLoaderFactory()->Clone(
-      factory_remote.InitWithNewPipeAndPassReceiver());
   content::GetNetworkService()->ConfigureSCTAuditing(
       is_sct_auditing_enabled, sct_sampling_rate,
       SCTReportingService::GetReportURLInstance(),
-      net::MutableNetworkTrafficAnnotationTag(kSCTAuditReportTrafficAnnotation),
-      std::move(factory_remote));
+      net::MutableNetworkTrafficAnnotationTag(
+          kSCTAuditReportTrafficAnnotation));
 }
 
 SCTReportingService::SCTReportingService(
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
index 3e7e2f4..824ad68e 100644
--- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
+++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -101,14 +101,6 @@
   ExpectNotificationShown(false);
 }
 
-TEST_F(SyncErrorNotifierTest, NoNotificationWhenSyncDisabled) {
-  service_.SetPassphraseRequiredForPreferredDataTypes(true);
-  service_.SetFirstSetupComplete(false);
-  service_.GetUserSettings()->SetOsSyncFeatureEnabled(false);
-  error_notifier_->OnStateChanged(&service_);
-  ExpectNotificationShown(false);
-}
-
 TEST_F(SyncErrorNotifierTest, NotificationShownWhenBrowserSyncEnabled) {
   service_.SetPassphraseRequiredForPreferredDataTypes(true);
   service_.SetFirstSetupComplete(true);
@@ -116,23 +108,8 @@
   ExpectNotificationShown(true);
 }
 
-TEST_F(SyncErrorNotifierTest, NotificationShownWhenOsSyncEnabled) {
-  base::test::ScopedFeatureList feature_list;
-  // SyncConsentOptional requires SyncSettingsCategorization.
-  feature_list.InitWithFeatures(
-      {chromeos::features::kSyncSettingsCategorization,
-       chromeos::features::kSyncConsentOptional},
-      {});
-  service_.SetPassphraseRequiredForPreferredDataTypes(true);
-  service_.GetUserSettings()->SetOsSyncFeatureEnabled(true);
-  service_.SetFirstSetupComplete(false);
-  error_notifier_->OnStateChanged(&service_);
-  ExpectNotificationShown(true);
-}
-
 TEST_F(SyncErrorNotifierTest, NotificationShownOnce) {
   service_.SetPassphraseRequiredForPreferredDataTypes(true);
-  service_.GetUserSettings()->SetOsSyncFeatureEnabled(true);
   service_.SetFirstSetupComplete(true);
   error_notifier_->OnStateChanged(&service_);
   ExpectNotificationShown(true);
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc
index 8d918de..2bf97bd 100644
--- a/chrome/browser/sync/sync_service_factory.cc
+++ b/chrome/browser/sync/sync_service_factory.cc
@@ -147,10 +147,7 @@
     // need to take care that SyncServiceImpl doesn't get tripped up between
     // those two cases. Bug 88109.
     bool is_auto_start = browser_defaults::kSyncAutoStarts;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    if (chromeos::features::IsSyncConsentOptionalEnabled())
-      is_auto_start = false;
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
     // TODO(https://crbug.com/1194983): Figure out how split sync settings will
     // work here. For now, we will mimic Ash's behaviour of having sync turned
     // on by default.
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index 61f2375..5e8619c 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -197,20 +197,6 @@
   Navigate(&params);
 }
 
-// Returns true if the user has consented to browser sync-the-feature or
-// Chrome OS sync.
-bool HasUserOptedInToSync(const syncer::SyncUserSettings* settings) {
-  if (settings->IsFirstSetupComplete())
-    return true;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (chromeos::features::IsSyncConsentOptionalEnabled() &&
-      settings->IsOsSyncFeatureEnabled()) {
-    return true;
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  return false;
-}
-
 absl::optional<AvatarSyncErrorType> GetTrustedVaultError(
     const syncer::SyncService* sync_service,
     const PrefService* pref_service) {
@@ -278,7 +264,7 @@
   if (!service->HasSyncConsent()) {
     // Only trusted vault errors can be shown if the account isn't a consented
     // primary account.
-    // Note the condition checked is not HasUserOptedInToSync(), because the
+    // Note the condition checked is not IsFirstSetupComplete(), because the
     // setup incomplete case is treated separately below. See the comment in
     // ShouldRequestSyncConfirmation() about dashboard resets.
     return GetTrustedVaultError(service, profile->GetPrefs());
@@ -367,7 +353,7 @@
 
 bool ShouldShowSyncPassphraseError(const syncer::SyncService* service) {
   const syncer::SyncUserSettings* settings = service->GetUserSettings();
-  return HasUserOptedInToSync(settings) &&
+  return settings->IsFirstSetupComplete() &&
          settings->IsPassphraseRequiredForPreferredDataTypes();
 }
 
@@ -378,7 +364,7 @@
     return false;
   }
 
-  if (HasUserOptedInToSync(settings)) {
+  if (settings->IsFirstSetupComplete()) {
     return true;
   }
 
@@ -413,7 +399,7 @@
     return false;
   }
 
-  if (HasUserOptedInToSync(settings)) {
+  if (settings->IsFirstSetupComplete()) {
     return true;
   }
 
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
index 7c769960..f6017db0 100644
--- a/chrome/browser/sync/sync_ui_util_unittest.cc
+++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -369,9 +369,6 @@
 TEST(SyncUIUtilTest, ShouldShowSyncPassphraseError_SyncDisabled) {
   syncer::TestSyncService service;
   service.SetFirstSetupComplete(false);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  service.GetUserSettings()->SetOsSyncFeatureEnabled(false);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   service.SetPassphraseRequiredForPreferredDataTypes(true);
   EXPECT_FALSE(ShouldShowSyncPassphraseError(&service));
 }
@@ -383,20 +380,4 @@
   EXPECT_FALSE(ShouldShowSyncPassphraseError(&service));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-TEST(SyncUIUtilTest, ShouldShowSyncPassphraseError_OsSyncEnabled) {
-  base::test::ScopedFeatureList feature_list;
-  // SyncConsentOptional requires SyncSettingsCategorization.
-  feature_list.InitWithFeatures(
-      {chromeos::features::kSyncSettingsCategorization,
-       chromeos::features::kSyncConsentOptional},
-      {});
-  syncer::TestSyncService service;
-  service.SetPassphraseRequiredForPreferredDataTypes(true);
-  service.SetFirstSetupComplete(false);
-  service.GetUserSettings()->SetOsSyncFeatureEnabled(true);
-  EXPECT_TRUE(ShouldShowSyncPassphraseError(&service));
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc b/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
index 8c9566b..897f4036 100644
--- a/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/user_selectable_type.h"
@@ -11,41 +10,13 @@
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
-#endif
-
 using syncer::UserSelectableType;
 using syncer::UserSelectableTypeSet;
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// Chrome OS syncs apps as an OS type.
-class SingleClientAppSettingsOsSyncTest : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientAppSettingsOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-  ~SingleClientAppSettingsOsSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientAppSettingsOsSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncServiceImpl* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::APP_SETTINGS));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::APP_SETTINGS));
-}
-
-#else   // !BUILDFLAG(IS_CHROMEOS_ASH)
+// TODO(https://crbug.com/1280212): See if this test can be enabled on ChromeOS.
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
 
 // See also TwoClientExtensionSettingsAndAppSettingsSyncTest.
 class SingleClientAppSettingsSyncTest : public SyncTest {
@@ -65,6 +36,7 @@
   EXPECT_FALSE(settings->GetSelectedTypes().Has(UserSelectableType::kApps));
   EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::APP_SETTINGS));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_arc_package_sync_test.cc b/chrome/browser/sync/test/integration/single_client_arc_package_sync_test.cc
index 8287d94..4f5dab7f 100644
--- a/chrome/browser/sync/test/integration/single_client_arc_package_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_arc_package_sync_test.cc
@@ -5,7 +5,6 @@
 #include "ash/constants/ash_features.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/test/integration/sync_arc_package_helper.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
 #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
@@ -91,27 +90,5 @@
   ASSERT_TRUE(AllProfilesHaveSameArcPackageDetails());
 }
 
-class SingleClientArcPackageOsSyncTest : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientArcPackageOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-  ~SingleClientArcPackageOsSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientArcPackageOsSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::ARC_PACKAGE));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::ARC_PACKAGE));
-}
-
 }  // namespace
 }  // namespace arc
diff --git a/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
index dc7eed3..31ec8ed 100644
--- a/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
@@ -2,19 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/sync/test/integration/apps_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
-#endif
-
 using apps_helper::AllProfilesHaveSameApps;
 using apps_helper::InstallHostedApp;
 using apps_helper::InstallPlatformApp;
@@ -114,36 +107,3 @@
   ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
   ASSERT_TRUE(AllProfilesHaveSameApps());
 }
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
-// Tests for SyncConsentOptional.
-class SingleClientExtensionAppsOsSyncTest : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientExtensionAppsOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-
-  SingleClientExtensionAppsOsSyncTest(
-      const SingleClientExtensionAppsOsSyncTest&) = delete;
-  SingleClientExtensionAppsOsSyncTest& operator=(
-      const SingleClientExtensionAppsOsSyncTest&) = delete;
-
-  ~SingleClientExtensionAppsOsSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientExtensionAppsOsSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::APPS));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::APPS));
-}
-
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc
index a71b570..4047b71 100644
--- a/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc
@@ -9,7 +9,6 @@
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "chrome/browser/sync/test/integration/preferences_helper.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
 #include "chrome/browser/sync/test/integration/sync_settings_categorization_sync_test.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
@@ -49,29 +48,6 @@
               Eq(ash::kShelfAlignmentRight));
 }
 
-class SingleClientOsPreferencesOptionalConsentSyncTest
-    : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientOsPreferencesOptionalConsentSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-  ~SingleClientOsPreferencesOptionalConsentSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientOsPreferencesOptionalConsentSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::OS_PREFERENCES));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::OS_PREFERENCES));
-}
-
 class SyncCategorizationBaseTest : public SyncTest {
  public:
   SyncCategorizationBaseTest() : SyncTest(SyncTest::SINGLE_CLIENT) {}
diff --git a/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc b/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc
index d8eb5f3..9e945316 100644
--- a/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc
@@ -6,7 +6,6 @@
 
 #include "chrome/browser/ash/printing/printers_sync_bridge.h"
 #include "chrome/browser/sync/test/integration/printers_helper.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "chromeos/printing/printer_configuration.h"
@@ -116,26 +115,4 @@
   EXPECT_EQ(kServerAddress, spec_printer->print_server_uri());
 }
 
-// Tests for SyncConsentOptional.
-class SingleClientPrintersOsSyncTest : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientPrintersOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-  ~SingleClientPrintersOsSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientPrintersOsSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::PRINTERS));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::PRINTERS));
-}
-
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
index 2b8d2a01..6f542b7 100644
--- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -24,7 +24,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/constants/ash_features.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #endif
 
@@ -82,13 +81,10 @@
   ~SingleClientStandaloneTransportSyncTest() override = default;
 };
 
+// On Chrome OS sync auto-starts on sign-in.
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
                        StartsSyncTransportOnSignin) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // On Chrome OS before SyncConsentOptional, sync auto-starts on sign-in.
-  if (!chromeos::features::IsSyncConsentOptionalEnabled())
-    return;
-#endif
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
 
   // Signing in (without explicitly setting up Sync) should trigger starting the
@@ -122,6 +118,7 @@
                        AllowedTypesInStandaloneTransportMode());
   EXPECT_TRUE(bad_types.Empty()) << syncer::ModelTypeSetToString(bad_types);
 }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
                        SwitchesBetweenTransportAndFeature) {
@@ -285,92 +282,4 @@
   EXPECT_EQ(old_cache_guid, transport_data_prefs.GetCacheGuid());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-class SingleClientStandaloneTransportOsSyncTest
-    : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientStandaloneTransportOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {
-    // Enable in-development types.
-    scoped_features_.InitAndEnableFeature(switches::kSyncWifiConfigurations);
-  }
-  ~SingleClientStandaloneTransportOsSyncTest() override = default;
-
- private:
-  base::test::ScopedFeatureList scoped_features_;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportOsSyncTest,
-                       OsTypesAreActiveWhenBrowserSyncIsOff) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-
-  // Setup clients but don't start syncing yet.
-  ASSERT_TRUE(SetupClients());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  // Simulate a signed-in user with browser sync off and OS sync on.
-  settings->SetSyncRequested(false);
-  settings->SetOsSyncFeatureEnabled(true);
-  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
-  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
-  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-  ASSERT_FALSE(service->IsSyncFeatureActive());
-
-  // OS data types synced by the transport layer are active.
-  syncer::ModelTypeSet active_types = service->GetActiveDataTypes();
-  EXPECT_TRUE(active_types.Has(syncer::APP_LIST));
-  EXPECT_TRUE(active_types.Has(syncer::APP_SETTINGS));
-  EXPECT_TRUE(active_types.Has(syncer::APPS));
-  EXPECT_TRUE(active_types.Has(syncer::ARC_PACKAGE));
-  EXPECT_TRUE(active_types.Has(syncer::OS_PREFERENCES));
-  EXPECT_TRUE(active_types.Has(syncer::OS_PRIORITY_PREFERENCES));
-  EXPECT_TRUE(active_types.Has(syncer::PRINTERS));
-  EXPECT_TRUE(active_types.Has(syncer::WIFI_CONFIGURATIONS));
-
-  // Verify that a few browser non-transport-mode types are not active.
-  EXPECT_FALSE(active_types.Has(syncer::BOOKMARKS));
-  EXPECT_FALSE(active_types.Has(syncer::SESSIONS));
-  EXPECT_FALSE(active_types.Has(syncer::TYPED_URLS));
-  EXPECT_FALSE(active_types.Has(syncer::WEB_APPS));
-}
-
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportOsSyncTest,
-                       OsTypesAreNotActiveWhenOsSyncIsOff) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-
-  // Setup clients but don't start syncing yet.
-  ASSERT_TRUE(SetupClients());
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  // Simulate a user who leaves OS sync disabled but starts browser sync.
-  settings->SetOsSyncFeatureEnabled(false);
-  ASSERT_TRUE(GetClient(0)->SetupSync());
-  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
-  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-  ASSERT_TRUE(service->IsSyncFeatureActive());
-  ASSERT_FALSE(settings->IsOsSyncFeatureEnabled());
-
-  // OS data types synced by the transport layer are not active.
-  syncer::ModelTypeSet active_types = service->GetActiveDataTypes();
-  EXPECT_FALSE(active_types.Has(syncer::APP_LIST));
-  EXPECT_FALSE(active_types.Has(syncer::APP_SETTINGS));
-  EXPECT_FALSE(active_types.Has(syncer::APPS));
-  EXPECT_FALSE(active_types.Has(syncer::ARC_PACKAGE));
-  EXPECT_FALSE(active_types.Has(syncer::OS_PREFERENCES));
-  EXPECT_FALSE(active_types.Has(syncer::OS_PRIORITY_PREFERENCES));
-  EXPECT_FALSE(active_types.Has(syncer::PRINTERS));
-  EXPECT_FALSE(active_types.Has(syncer::WIFI_CONFIGURATIONS));
-
-  // Browser non-transport-mode types are active.
-  EXPECT_TRUE(active_types.Has(syncer::BOOKMARKS));
-  EXPECT_TRUE(active_types.Has(syncer::SESSIONS));
-  EXPECT_TRUE(active_types.Has(syncer::TYPED_URLS));
-  EXPECT_TRUE(active_types.Has(syncer::WEB_APPS));
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
index 23ddeee..12b2dba 100644
--- a/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
@@ -23,11 +23,6 @@
 #include "content/public/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
-#endif
-
 using syncer::UserSelectableType;
 using syncer::UserSelectableTypeSet;
 
@@ -40,36 +35,6 @@
 // Default version used when creating extension entities.
 const char kVersion[] = "1.0.0.1";
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
-// These tests test the new Web Apps system with next generation sync.
-//
-// Chrome OS syncs Web apps as a browser type, so it shouldn't be affected by
-// the OS sync feature.
-class SingleClientWebAppsOsSyncTest : public SyncConsentOptionalSyncTest {
- public:
-  SingleClientWebAppsOsSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {}
-  ~SingleClientWebAppsOsSyncTest() override = default;
-};
-
-IN_PROC_BROWSER_TEST_F(SingleClientWebAppsOsSyncTest,
-                       DisablingOsSyncFeatureKeepsWebAppsEnabled) {
-  ASSERT_TRUE(chromeos::features::IsSyncConsentOptionalEnabled());
-  ASSERT_TRUE(SetupSync());
-  syncer::SyncServiceImpl* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::WEB_APPS));
-
-  settings->SetOsSyncFeatureEnabled(false);
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  // WEB_APPS is a browser type, so they shouldn't be affected by the OS sync.
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::WEB_APPS));
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 class SingleClientWebAppsSyncTest : public WebAppsSyncTestBase {
  public:
   SingleClientWebAppsSyncTest() : WebAppsSyncTestBase(SINGLE_CLIENT) {}
diff --git a/chrome/browser/sync/test/integration/single_client_workspace_desk_sync_test.cc b/chrome/browser/sync/test/integration/single_client_workspace_desk_sync_test.cc
index dfb94c4f..91a103a 100644
--- a/chrome/browser/sync/test/integration/single_client_workspace_desk_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_workspace_desk_sync_test.cc
@@ -8,9 +8,9 @@
 #include "base/test/bind.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/sync/desk_sync_service_factory.h"
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h"
+#include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/workspace_desk_helper.h"
 #include "chrome/browser/ui/browser.h"
 #include "components/desks_storage/core/desk_model.h"
@@ -42,12 +42,9 @@
   return specifics;
 }
 
-// Desk Sync is a Chrome OS sync type.
-// Therefore this class should subclass from SyncConsentOptionalSyncTest.
-class SingleClientWorkspaceDeskSyncTest : public SyncConsentOptionalSyncTest {
+class SingleClientWorkspaceDeskSyncTest : public SyncTest {
  public:
-  SingleClientWorkspaceDeskSyncTest()
-      : SyncConsentOptionalSyncTest(SINGLE_CLIENT) {
+  SingleClientWorkspaceDeskSyncTest() : SyncTest(SINGLE_CLIENT) {
     kTestUuid1_ =
         base::GUID::ParseCaseInsensitive(base::StringPrintf(kUuidFormat, 1));
   }
@@ -86,22 +83,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(SingleClientWorkspaceDeskSyncTest,
-                       DisablingOsSyncFeatureDisablesDataType) {
-  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-
-  syncer::SyncService* service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = service->GetUserSettings();
-
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::WORKSPACE_DESK));
-
-  settings->SetOsSyncFeatureEnabled(false);
-
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
-  EXPECT_FALSE(service->GetActiveDataTypes().Has(syncer::WORKSPACE_DESK));
-}
-
-IN_PROC_BROWSER_TEST_F(SingleClientWorkspaceDeskSyncTest,
                        DownloadDeskTemplateWhenSyncEnabled) {
   // Inject a test desk template to Sync.
   sync_pb::EntitySpecifics specifics;
@@ -117,9 +98,6 @@
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
   syncer::SyncService* sync_service = GetSyncService(0);
-  syncer::SyncUserSettings* settings = sync_service->GetUserSettings();
-
-  ASSERT_TRUE(settings->IsOsSyncFeatureEnabled());
   ASSERT_TRUE(sync_service->GetActiveDataTypes().Has(syncer::WORKSPACE_DESK));
 
   // Check the test desk template is downloaded.
diff --git a/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.cc b/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.cc
deleted file mode 100644
index 9562e6af..0000000
--- a/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h"
-
-#include "ash/constants/ash_features.h"
-
-SyncConsentOptionalSyncTest::SyncConsentOptionalSyncTest(TestType type)
-    : SyncTest(type) {
-  // SyncSettingsCategorization is required for SyncConsentOptional.
-  settings_feature_list_.InitWithFeatures(
-      {
-          ash::features::kSyncSettingsCategorization,
-          ash::features::kSyncConsentOptional,
-      },
-      {});
-}
-
-SyncConsentOptionalSyncTest::~SyncConsentOptionalSyncTest() = default;
diff --git a/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h b/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h
deleted file mode 100644
index 4834c27..0000000
--- a/chrome/browser/sync/test/integration/sync_consent_optional_sync_test.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_CONSENT_OPTIONAL_SYNC_TEST_H_
-#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_CONSENT_OPTIONAL_SYNC_TEST_H_
-
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/sync/test/integration/sync_test.h"
-
-// Test suite for Chrome OS sync. Enables the SyncConsentOptional feature.
-// TODO(https://crbug.com/1227417): When SyncConsentOptional is on-by-default
-// this class can be deleted.
-class SyncConsentOptionalSyncTest : public SyncTest {
- public:
-  explicit SyncConsentOptionalSyncTest(TestType type);
-  ~SyncConsentOptionalSyncTest() override;
-
-  SyncConsentOptionalSyncTest(const SyncConsentOptionalSyncTest&) = delete;
-  SyncConsentOptionalSyncTest& operator=(const SyncConsentOptionalSyncTest&) =
-      delete;
-
- private:
-  // The names |scoped_feature_list_| and |feature_list_| are both used in
-  // superclasses.
-  base::test::ScopedFeatureList settings_feature_list_;
-};
-
-#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_CONSENT_OPTIONAL_SYNC_TEST_H_
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 2d1a8f4..b44fb952 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -668,14 +668,6 @@
   }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  // SyncSettingsCategorization makes several types (e.g. APPS, APP_LIST,
-  // PRINTERS) into OS sync types. OS sync is on-by-default, so enable it here.
-  if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    for (int i = 0; i < num_clients(); ++i) {
-      GetSyncService(i)->GetUserSettings()->SetOsSyncFeatureEnabled(true);
-    }
-  }
-
   if (ArcAppListPrefsFactory::IsFactorySetForSyncTest()) {
     // Init SyncArcPackageHelper to ensure that the arc services are initialized
     // for each Profile, only can be called after test profiles are created.
diff --git a/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc b/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
index 2b39311..8dc6c15 100644
--- a/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
@@ -587,53 +587,3 @@
   ASSERT_TRUE(AwaitQuiescence());
   ASSERT_TRUE(AllProfilesHaveSameAppList());
 }
-
-// Tests for SyncSettingsCategorization and SyncConsentOptional.
-class TwoClientAppListOsSyncTest : public TwoClientAppListSyncTest {
- public:
-  TwoClientAppListOsSyncTest() {
-    settings_feature_list_.InitWithFeatures(
-        {chromeos::features::kSyncSettingsCategorization,
-         chromeos::features::kSyncConsentOptional},
-        {});
-  }
-  ~TwoClientAppListOsSyncTest() override = default;
-
-  // SyncTest
-  bool SetupClients() override {
-    if (!TwoClientAppListSyncTest::SetupClients())
-      return false;
-    // Enable the OS sync feature for all profiles.
-    for (Profile* profile : GetAllProfiles()) {
-      profile->GetPrefs()->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled,
-                                      true);
-    }
-    return true;
-  }
-
- private:
-  base::test::ScopedFeatureList settings_feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(TwoClientAppListOsSyncTest, DisableOsSync) {
-  ASSERT_TRUE(SetupSync());
-  ASSERT_TRUE(AllProfilesHaveSameAppList());
-
-  // Disable OS sync on the second client.
-  PrefService* prefs = GetProfile(1)->GetPrefs();
-  prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, false);
-
-  // Install a Chrome app and sync.
-  InstallHostedApp(GetProfile(0), 0);
-  ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
-
-  // App list didn't sync because OS sync is off.
-  ASSERT_FALSE(AllProfilesHaveSameAppList());
-
-  // Enable OS sync on the second client.
-  prefs->SetBoolean(syncer::prefs::kOsSyncFeatureEnabled, true);
-  AwaitQuiescenceAndInstallAppsPendingForSync();
-
-  // App list has synced.
-  ASSERT_TRUE(AllProfilesHaveSameAppList());
-}
diff --git a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.cc b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.cc
index bc1a6fe7..a6decf2 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.cc
+++ b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.cc
@@ -67,16 +67,6 @@
   }
 
   arc_prefs_->AddObserver(this);
-
-  // See GetPreconditionState().
-  if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    pref_registrar_.Init(profile_->GetPrefs());
-    pref_registrar_.Add(
-        syncer::prefs::kOsSyncFeatureEnabled,
-        base::BindRepeating(
-            &ArcPackageSyncModelTypeController::OnOsSyncFeaturePrefChanged,
-            base::Unretained(this)));
-  }
 }
 
 ArcPackageSyncModelTypeController::~ArcPackageSyncModelTypeController() {
@@ -93,12 +83,6 @@
   if (!arc::IsArcPlayStoreEnabledForProfile(profile_)) {
     return PreconditionState::kMustStopAndClearData;
   }
-  // Use OS sync feature consent for this ModelType because it can sync in
-  // transport-only mode (and hence isn't tied to browser sync consent).
-  if (chromeos::features::IsSyncSettingsCategorizationEnabled() &&
-      !profile_->GetPrefs()->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled)) {
-    return PreconditionState::kMustStopAndClearData;
-  }
   // Implementing a wait here in the controller, instead of the regular wait in
   // the SyncableService, allows waiting again after this particular datatype
   // has been disabled and reenabled (since core sync code does not support the
diff --git a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
index ea201ee4b..aa63a77 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
+++ b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
@@ -63,7 +63,6 @@
   syncer::SyncService* const sync_service_;
   Profile* const profile_;
   ArcAppListPrefs* const arc_prefs_;
-  PrefChangeRegistrar pref_registrar_;
 };
 
 #endif  // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_PACKAGE_SYNC_MODEL_TYPE_CONTROLLER_H_
diff --git a/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc b/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
index a60fecd..1240131 100644
--- a/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
+++ b/chrome/browser/ui/ash/capture_mode/capture_mode_browsertest.cc
@@ -146,17 +146,8 @@
   EXPECT_TRUE(shell_test_api.IsContextMenuShown());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnVideoEndDismissed \
-  DISABLED_DlpWarningDialogOnVideoEndDismissed
-#else
-#define MAYBE_DlpWarningDialogOnVideoEndDismissed \
-  DlpWarningDialogOnVideoEndDismissed
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnVideoEndDismissed) {
+                       DlpWarningDialogOnVideoEndDismissed) {
   ASSERT_TRUE(browser());
   StartVideoRecording();
 
@@ -183,17 +174,8 @@
   loop.Run();
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnVideoEndAccepted \
-  DISABLED_DlpWarningDialogOnVideoEndAccepted
-#else
-#define MAYBE_DlpWarningDialogOnVideoEndAccepted \
-  DlpWarningDialogOnVideoEndAccepted
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnVideoEndAccepted) {
+                       DlpWarningDialogOnVideoEndAccepted) {
   ASSERT_TRUE(browser());
   StartVideoRecording();
 
@@ -214,17 +196,8 @@
   loop.Run();
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnSessionInitDismissed \
-  DISABLED_DlpWarningDialogOnSessionInitDismissed
-#else
-#define MAYBE_DlpWarningDialogOnSessionInitDismissed \
-  DlpWarningDialogOnSessionInitDismissed
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnSessionInitDismissed) {
+                       DlpWarningDialogOnSessionInitDismissed) {
   ASSERT_TRUE(browser());
 
   MarkActiveTabAsDlpWarnedForScreenCapture(browser());
@@ -244,17 +217,8 @@
   EXPECT_FALSE(test_api.IsPendingDlpCheck());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnSessionInitAccepted \
-  DISABLED_DlpWarningDialogOnSessionInitAccepted
-#else
-#define MAYBE_DlpWarningDialogOnSessionInitAccepted \
-  DlpWarningDialogOnSessionInitAccepted
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnSessionInitAccepted) {
+                       DlpWarningDialogOnSessionInitAccepted) {
   ASSERT_TRUE(browser());
 
   MarkActiveTabAsDlpWarnedForScreenCapture(browser());
@@ -274,17 +238,8 @@
   EXPECT_FALSE(test_api.IsPendingDlpCheck());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnPerformingCaptureDismissed \
-  DISABLED_DlpWarningDialogOnPerformingCaptureDismissed
-#else
-#define MAYBE_DlpWarningDialogOnPerformingCaptureDismissed \
-  DlpWarningDialogOnPerformingCaptureDismissed
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnPerformingCaptureDismissed) {
+                       DlpWarningDialogOnPerformingCaptureDismissed) {
   ASSERT_TRUE(browser());
 
   // Start the session before a window becomes restricted.
@@ -311,17 +266,8 @@
   EXPECT_FALSE(test_api.IsPendingDlpCheck());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnPerformingCaptureAccepted \
-  DISABLED_DlpWarningDialogOnPerformingCaptureAccepted
-#else
-#define MAYBE_DlpWarningDialogOnPerformingCaptureAccepted \
-  DlpWarningDialogOnPerformingCaptureAccepted
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnPerformingCaptureAccepted) {
+                       DlpWarningDialogOnPerformingCaptureAccepted) {
   ASSERT_TRUE(browser());
 
   // Start the session before a window becomes restricted.
@@ -351,17 +297,8 @@
   loop.Run();
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnCountdownEndDismissed \
-  DISABLED_DlpWarningDialogOnCountdownEndDismissed
-#else
-#define MAYBE_DlpWarningDialogOnCountdownEndDismissed \
-  DlpWarningDialogOnCountdownEndDismissed
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnCountdownEndDismissed) {
+                       DlpWarningDialogOnCountdownEndDismissed) {
   ASSERT_TRUE(browser());
   ash::CaptureModeTestApi test_api;
   test_api.StartForFullscreen(/*for_video=*/true);
@@ -389,17 +326,8 @@
   EXPECT_FALSE(test_api.IsPendingDlpCheck());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnCountdownEndAccepted \
-  DISABLED_DlpWarningDialogOnCountdownEndAccepted
-#else
-#define MAYBE_DlpWarningDialogOnCountdownEndAccepted \
-  DlpWarningDialogOnCountdownEndAccepted
-#endif
 IN_PROC_BROWSER_TEST_F(CaptureModeBrowserTest,
-                       MAYBE_DlpWarningDialogOnCountdownEndAccepted) {
+                       DlpWarningDialogOnCountdownEndAccepted) {
   ASSERT_TRUE(browser());
   ash::CaptureModeTestApi test_api;
   test_api.StartForFullscreen(/*for_video=*/true);
@@ -433,18 +361,9 @@
   loop.Run();
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed \
-  DISABLED_DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed
-#else
-#define MAYBE_DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed \
-  DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed
-#endif
 IN_PROC_BROWSER_TEST_F(
     CaptureModeBrowserTest,
-    MAYBE_DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed) {
+    DlpWarningDialogOnCaptureScreenshotsOfAllDisplaysDismissed) {
   ASSERT_TRUE(browser());
 
   MarkActiveTabAsDlpWarnedForScreenCapture(browser());
@@ -463,18 +382,9 @@
   EXPECT_FALSE(test_api.IsPendingDlpCheck());
 }
 
-// TODO(crbug.com/1281985) Disabled due to MSAN use-of-uninitialized-value
-// errors.
-#if defined(OS_CHROMEOS) && defined(MEMORY_SANITIZER)
-#define MAYBE_DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted \
-  DISABLED_DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted
-#else
-#define MAYBE_DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted \
-  DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted
-#endif
 IN_PROC_BROWSER_TEST_F(
     CaptureModeBrowserTest,
-    MAYBE_DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted) {
+    DlpWarningDialogOnFullscreenScreenCaptureShortcutAccepted) {
   ASSERT_TRUE(browser());
 
   MarkActiveTabAsDlpWarnedForScreenCapture(browser());
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
index 4fb5faa..8f01eafb 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
@@ -452,13 +452,6 @@
     extension_system->ready().Post(FROM_HERE, run_loop.QuitClosure());
     run_loop.Run();
 
-    // Many pinned app tests assume OS sync is enabled.
-    if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-      syncer::SyncService* sync_service =
-          SyncServiceFactory::GetForProfile(profile());
-      sync_service->GetUserSettings()->SetOsSyncFeatureEnabled(true);
-    }
-
     app_list_syncable_service_ =
         app_list::AppListSyncableServiceFactory::GetForProfile(profile());
     StartAppSyncService(app_list_syncable_service_->GetAllSyncDataForTesting());
@@ -1174,16 +1167,11 @@
  public:
   ChromeShelfControllerTest() {
     if (ShouldEnableSyncSettingsCategorization()) {
-      feature_list_.InitWithFeatures(
-          /*enabled_features=*/{chromeos::features::
-                                    kSyncSettingsCategorization},
-          /*disabled_features=*/{chromeos::features::kSyncConsentOptional});
+      feature_list_.InitAndEnableFeature(
+          chromeos::features::kSyncSettingsCategorization);
     } else {
-      feature_list_.InitWithFeatures(
-          /*enabled_features=*/{},
-          /*disabled_features=*/{
-              chromeos::features::kSyncSettingsCategorization,
-              chromeos::features::kSyncConsentOptional});
+      feature_list_.InitAndDisableFeature(
+          chromeos::features::kSyncSettingsCategorization);
     }
   }
   ~ChromeShelfControllerTest() override = default;
@@ -1194,24 +1182,6 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-// Tests for feature SyncConsentOptional. Exists as a separate class
-// because the feature must be initialized before
-// ChromeShelfControllerTestBase::SetUp().
-class ChromeShelfControllerSyncConsentOptionalTest
-    : public ChromeShelfControllerTestBase {
- public:
-  ChromeShelfControllerSyncConsentOptionalTest() {
-    feature_list_.InitWithFeatures(
-        /*enabled_features=*/{chromeos::features::kSyncSettingsCategorization,
-                              chromeos::features::kSyncConsentOptional},
-        /*disabled_features=*/{});
-  }
-  ~ChromeShelfControllerSyncConsentOptionalTest() override = default;
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
 // Tests for Lacros integration. Exists as a separate class because the feature
 // must be initialized before ChromeShelfControllerTestBase::SetUp().
 class ChromeShelfControllerLacrosTest : public ChromeShelfControllerTestBase {
@@ -1554,26 +1524,6 @@
             GetPinnedAppStatus());
 }
 
-TEST_F(ChromeShelfControllerSyncConsentOptionalTest, PreinstalledApps) {
-  // Simulate a user who opted out of sync.
-  syncer::SyncService* sync_service =
-      SyncServiceFactory::GetForProfile(profile());
-  sync_service->GetUserSettings()->SetOsSyncFeatureEnabled(false);
-
-  InitShelfController();
-  EXPECT_EQ("Chrome", GetPinnedAppStatus());
-
-  // Simulate the preinstalled app loader installing some apps. Don't start the
-  // pref sync service, because this user opted out of sync.
-  AddWebApp(web_app::kYoutubeAppId);
-  AddWebApp(web_app::kMessagesAppId);
-  AddWebApp(web_app::kGmailAppId);
-  AddWebApp(web_app::kGoogleDocsAppId);
-
-  // Default apps are pinned.
-  EXPECT_EQ("Chrome, Gmail, Messages, Youtube", GetPinnedAppStatus());
-}
-
 TEST_F(ChromeShelfControllerLacrosTest, LacrosPinnedByDefault) {
   InitShelfController();
   EXPECT_EQ("Chrome, Lacros", GetPinnedAppStatus());
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
index 164f457a..081c8d51 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
@@ -138,8 +138,7 @@
   // apps is likely override it. There is a case when App sync is disabled and
   // in last case local cache is available immediately.
   if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    if (settings->IsOsSyncFeatureEnabled() &&
-        settings->GetSelectedOsTypes().Has(UserSelectableOsType::kOsApps) &&
+    if (settings->GetSelectedOsTypes().Has(UserSelectableOsType::kOsApps) &&
         !app_list::AppListSyncableServiceFactory::GetForProfile(profile)
              ->IsSyncing()) {
       return false;
@@ -156,8 +155,7 @@
   // If shelf pin layout rolls preference is not started yet then we cannot say
   // if we rolled layout or not.
   if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-    if (settings->IsOsSyncFeatureEnabled() &&
-        settings->GetSelectedOsTypes().Has(
+    if (settings->GetSelectedOsTypes().Has(
             UserSelectableOsType::kOsPreferences) &&
         !PrefServiceSyncableFromProfile(profile)->AreOsPrefsSyncing()) {
       return false;
diff --git a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc
index 76f6b22..9e6aa2f 100644
--- a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc
+++ b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc
@@ -538,9 +538,8 @@
     return false;
   if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
     // If in client use profile otherwise use GetUserPrefServiceSyncable.
-    return sync_service->GetUserSettings()->IsOsSyncFeatureEnabled() &&
-           profile->GetPrefs()->GetBoolean(
-               chromeos::settings::prefs::kSyncOsWallpaper);
+    return profile->GetPrefs()->GetBoolean(
+        chromeos::settings::prefs::kSyncOsWallpaper);
   }
   return sync_service->CanSyncFeatureStart() &&
          sync_service->GetUserSettings()->GetSelectedTypes().Has(
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
index 4e7da46..9260e86 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
@@ -55,7 +55,7 @@
     const std::vector<std::string>& host_permissions) {
   scoped_refptr<const extensions::Extension> extension =
       extensions::ExtensionBuilder(name)
-          .SetManifestKey("manifest_version", 3)
+          .SetManifestVersion(3)
           .SetManifestKey("host_permissions", ToListValue(host_permissions))
           .SetID(crx_file::id_util::GenerateId(name))
           .Build();
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
index 02a05d6..3db4942 100644
--- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
@@ -160,8 +160,11 @@
 
   if (SupportsClientFrameShadow()) {
     // Set the frame decoration insets.
-    auto insets = layout->MirroredFrameBorderInsets();
-    auto insets_px = gfx::ScaleToCeiledInsets(insets, scale);
+    const gfx::Insets insets =
+        (window->GetPlatformWindowState() == ui::PlatformWindowState::kNormal)
+            ? layout->MirroredFrameBorderInsets()
+            : gfx::Insets();
+    const gfx::Insets insets_px = gfx::ScaleToCeiledInsets(insets, scale);
     window->SetDecorationInsets(showing_frame ? &insets_px : nullptr);
 
     // Set the input region.
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
index 021aa58a..d8191760 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -344,9 +344,17 @@
   helper_.CheckAppInListWindowed("SiteA");
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown \
+  DISABLED_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown
+#else
+#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown \
+  WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown) {
+    MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -693,9 +701,17 @@
   helper_.CheckLaunchIconShown();
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone \
+  DISABLED_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone
+#else
+#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone \
+  WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone) {
+    MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -808,9 +824,17 @@
   helper_.CheckAppNotInList("SiteA");
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
+  DISABLED_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
+#else
+#define MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
+  WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
+    MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1194,9 +1218,17 @@
   helper_.CheckLaunchIconShown();
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated \
+  DISABLED_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated
+#else
+#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated \
+  WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated) {
+    MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1289,9 +1321,17 @@
   helper_.CheckLaunchIconShown();
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal \
+  DISABLED_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal
+#else
+#define MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal \
+  WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal) {
+    MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1508,9 +1548,17 @@
   helper_.CheckInstallIconNotShown();
 }
 
+// TODO(crbug.com/1279704): Flaky on macOS.
+#if defined(OS_MAC)
+#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
+  DISABLED_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
+#else
+#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
+  WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) {
+    MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
index b4d4f988..2ba5af4 100644
--- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -70,8 +70,7 @@
 
 constexpr StaticOobeScreenId SyncConsentScreenView::kScreenId;
 
-// TODO(https://crbug.com/1229582) Break SplitSettings names into
-// SyncConsentOptional and SyncSettingsCategorization in the whole file.
+// TODO(https://crbug.com/1229582): Remove SplitSettings from names in this file
 SyncConsentScreenHandler::SyncConsentScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
@@ -126,7 +125,8 @@
   RememberLocalizedValue("syncConsentTurnOnSync",
                          IDS_LOGIN_SYNC_CONSENT_SCREEN_TURN_ON_SYNC, builder);
 
-  // SplitSettingsSync strings.
+  // TODO(https://crbug.com/1278325): Remove this strings after removing
+  //                                  the corresponding UI.
   RememberLocalizedValue("syncConsentScreenSplitSettingsTitle",
                          IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE, builder);
   RememberLocalizedValue("syncConsentScreenSplitSettingsSubtitle",
@@ -168,8 +168,6 @@
   auto* user_manager = user_manager::UserManager::Get();
   base::DictionaryValue data;
   data.SetBoolean("isChildAccount", user_manager->IsLoggedInAsChildUser());
-  data.SetBoolean("syncConsentOptionalEnabled",
-                  chromeos::features::IsSyncConsentOptionalEnabled());
   ShowScreenWithData(kScreenId, &data);
 }
 
@@ -199,7 +197,6 @@
     const bool review_sync,
     const login::StringList& consent_description,
     const std::string& consent_confirmation) {
-  DCHECK(!chromeos::features::IsSyncConsentOptionalEnabled());
   std::vector<int> consent_description_ids;
   int consent_confirmation_id;
   GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
@@ -217,32 +214,15 @@
 void SyncConsentScreenHandler::HandleAcceptAndContinue(
     const login::StringList& consent_description,
     const std::string& consent_confirmation) {
-  Continue(consent_description, consent_confirmation, UserChoice::kAccepted);
+  NOTREACHED();
+  // TODO(https://crbug.com/1278325): Remove this.
 }
 
 void SyncConsentScreenHandler::HandleDeclineAndContinue(
     const login::StringList& consent_description,
     const std::string& consent_confirmation) {
-  Continue(consent_description, consent_confirmation, UserChoice::kDeclined);
-}
-
-void SyncConsentScreenHandler::Continue(
-    const login::StringList& consent_description,
-    const std::string& consent_confirmation,
-    UserChoice choice) {
-  DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
-  std::vector<int> consent_description_ids;
-  int consent_confirmation_id;
-  GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
-                &consent_description_ids, &consent_confirmation_id);
-  screen_->OnContinue(consent_description_ids, consent_confirmation_id, choice);
-
-  SyncConsentScreen::SyncConsentScreenTestDelegate* test_delegate =
-      screen_->GetDelegateForTesting();
-  if (test_delegate) {
-    test_delegate->OnConsentRecordedStrings(consent_description,
-                                            consent_confirmation);
-  }
+  NOTREACHED();
+  // TODO(https://crbug.com/1278325): Remove this.
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
index 9534646..50a3b5a3 100644
--- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
@@ -82,16 +82,12 @@
       const std::string& consent_confirmation);
 
   // WebUI message handlers for SplitSettingsSync.
+  // TODO(https://crbug.com/1278325): Remove these.
   void HandleAcceptAndContinue(const ::login::StringList& consent_description,
                                const std::string& consent_confirmation);
   void HandleDeclineAndContinue(const ::login::StringList& consent_description,
                                 const std::string& consent_confirmation);
 
-  // Helper for the accept and decline cases.
-  void Continue(const ::login::StringList& consent_description,
-                const std::string& consent_confirmation,
-                UserChoice choice);
-
   // Adds resource `resource_id` both to `builder` and to `known_string_ids_`.
   void RememberLocalizedValue(const std::string& name,
                               const int resource_id,
diff --git a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
index dae3f19..d8fb81c6 100644
--- a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
@@ -33,7 +33,6 @@
 
 OSSyncHandler::~OSSyncHandler() {
   RemoveSyncServiceObserver();
-  CommitFeatureEnabledPref();
 }
 
 void OSSyncHandler::RegisterMessages() {
@@ -50,10 +49,6 @@
       base::BindRepeating(&OSSyncHandler::HandleOsSyncPrefsDispatch,
                           base::Unretained(this)));
   web_ui()->RegisterDeprecatedMessageCallback(
-      "SetOsSyncFeatureEnabled",
-      base::BindRepeating(&OSSyncHandler::HandleSetOsSyncFeatureEnabled,
-                          base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback(
       "SetOsSyncDatatypes",
       base::BindRepeating(&OSSyncHandler::HandleSetOsSyncDatatypes,
                           base::Unretained(this)));
@@ -79,25 +74,12 @@
 void OSSyncHandler::HandleOsSyncPrefsDispatch(const base::ListValue* args) {
   AllowJavascript();
 
-  // Cache the feature enabled pref.
-  SyncService* service = GetSyncService();
-  if (service)
-    feature_enabled_ = service->GetUserSettings()->IsOsSyncFeatureEnabled();
   PushSyncPrefs();
 }
 
 void OSSyncHandler::HandleDidNavigateAwayFromOsSyncPage(
     const base::ListValue* args) {
-  CommitFeatureEnabledPref();
-}
-
-void OSSyncHandler::HandleSetOsSyncFeatureEnabled(const base::ListValue* args) {
-  const auto& list = args->GetList();
-  CHECK(!list.empty());
-  feature_enabled_ = list[0].GetBool();
-  should_commit_feature_enabled_ = true;
-  // Changing the feature enabled state may change toggle state.
-  PushSyncPrefs();
+  // TODO(https://crbug.com/1278325): Remove this.
 }
 
 void OSSyncHandler::HandleSetOsSyncDatatypes(const base::ListValue* args) {
@@ -148,16 +130,6 @@
   set_web_ui(web_ui);
 }
 
-void OSSyncHandler::CommitFeatureEnabledPref() {
-  if (!should_commit_feature_enabled_)
-    return;
-  SyncService* service = GetSyncService();
-  if (!service)
-    return;
-  service->GetUserSettings()->SetOsSyncFeatureEnabled(feature_enabled_);
-  should_commit_feature_enabled_ = false;
-}
-
 void OSSyncHandler::PushSyncPrefs() {
   syncer::SyncService* service = GetSyncService();
   // The sync service may be nullptr if it has been just disabled by policy.
@@ -185,8 +157,7 @@
                       profile_->GetPrefs()->GetBoolean(
                           chromeos::settings::prefs::kSyncOsWallpaper));
 
-  FireWebUIListener("os-sync-prefs-changed", base::Value(feature_enabled_),
-                    args);
+  FireWebUIListener("os-sync-prefs-changed", args);
 }
 
 syncer::SyncService* OSSyncHandler::GetSyncService() const {
diff --git a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
index 23c772e..4c2609b 100644
--- a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
+++ b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
@@ -42,15 +42,11 @@
   void HandleDidNavigateToOsSyncPage(const base::ListValue* args);
   void HandleDidNavigateAwayFromOsSyncPage(const base::ListValue* args);
   void HandleOsSyncPrefsDispatch(const base::ListValue* args);
-  void HandleSetOsSyncFeatureEnabled(const base::ListValue* args);
   void HandleSetOsSyncDatatypes(const base::ListValue* args);
 
   void SetWebUIForTest(content::WebUI* web_ui);
 
  private:
-  // Sets the OS sync feature enabled pref if the user changed the setting.
-  void CommitFeatureEnabledPref();
-
   // Pushes the updated sync prefs to JavaScript.
   void PushSyncPrefs();
 
@@ -62,13 +58,6 @@
 
   Profile* const profile_;
 
-  // Cached copy of the OS sync feature enabled pref. Used to avoid turning on
-  // OS sync before the user is done configuring the toggles.
-  bool feature_enabled_ = false;
-
-  // Whether to commit the feature enabled state when the user closes the UI.
-  bool should_commit_feature_enabled_ = false;
-
   // Prevents messages to JS layer while data type prefs are being set.
   bool is_setting_prefs_ = false;
 };
diff --git a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
index 5fec615..5c6e2e7de0 100644
--- a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
@@ -136,8 +136,7 @@
 
   // Expects that an "os-sync-prefs-changed" event was sent to the WebUI and
   // returns the data passed to that event.
-  void ExpectOsSyncPrefsSent(bool* feature_enabled,
-                             const DictionaryValue** os_sync_prefs) {
+  void ExpectOsSyncPrefsSent(const DictionaryValue** os_sync_prefs) {
     const TestWebUI::CallData& call_data = *web_ui_.call_data().back();
     EXPECT_EQ("cr.webUIListenerCallback", call_data.function_name());
 
@@ -145,9 +144,7 @@
     EXPECT_TRUE(event);
     EXPECT_EQ(*event, "os-sync-prefs-changed");
 
-    EXPECT_TRUE(call_data.arg2()->is_bool());
-    *feature_enabled = call_data.arg2()->GetBool();
-    EXPECT_TRUE(call_data.arg3()->GetAsDictionary(os_sync_prefs));
+    EXPECT_TRUE(call_data.arg2()->GetAsDictionary(os_sync_prefs));
   }
 
   void NotifySyncStateChanged() { handler_->OnStateChanged(sync_service_); }
@@ -173,7 +170,6 @@
 };
 
 TEST_F(OsSyncHandlerTest, OsSyncPrefsSentOnNavigateToPage) {
-  user_settings_->SetOsSyncFeatureEnabled(true);
   handler_->HandleDidNavigateToOsSyncPage(nullptr);
 
   ASSERT_EQ(1U, web_ui_.call_data().size());
@@ -181,19 +177,6 @@
 
   std::string event_name = call_data.arg1()->GetString();
   EXPECT_EQ(event_name, "os-sync-prefs-changed");
-
-  bool feature_enabled = call_data.arg2()->GetBool();
-  EXPECT_TRUE(feature_enabled);
-}
-
-TEST_F(OsSyncHandlerTest, OsSyncPrefsWhenFeatureIsDisabled) {
-  user_settings_->SetOsSyncFeatureEnabled(false);
-  handler_->HandleDidNavigateToOsSyncPage(nullptr);
-
-  ASSERT_EQ(1U, web_ui_.call_data().size());
-  const TestWebUI::CallData& call_data = *web_ui_.call_data().back();
-  bool feature_enabled = call_data.arg2()->GetBool();
-  EXPECT_FALSE(feature_enabled);
 }
 
 TEST_F(OsSyncHandlerTest, OpenConfigPageBeforeSyncEngineInitialized) {
@@ -227,38 +210,6 @@
   EXPECT_FALSE(user_settings_->IsSyncRequested());
 }
 
-TEST_F(OsSyncHandlerTest, UserEnablesFeatureThenNavigatesAway) {
-  // Open the page with the feature disabled.
-  user_settings_->SetOsSyncFeatureEnabled(false);
-  handler_->HandleDidNavigateToOsSyncPage(nullptr);
-
-  // Clicking "Turn on" doesn't set the pref yet.
-  base::ListValue args;
-  args.Append(base::Value(true));  // feature_enabled
-  handler_->HandleSetOsSyncFeatureEnabled(&args);
-  EXPECT_FALSE(user_settings_->IsOsSyncFeatureEnabled());
-
-  // The pref is set when the user navigates away.
-  handler_->HandleDidNavigateAwayFromOsSyncPage(nullptr);
-  EXPECT_TRUE(user_settings_->IsOsSyncFeatureEnabled());
-}
-
-TEST_F(OsSyncHandlerTest, UserEnablesFeatureThenClosesSettings) {
-  // Open the page with the feature disabled.
-  user_settings_->SetOsSyncFeatureEnabled(false);
-  handler_->HandleDidNavigateToOsSyncPage(nullptr);
-
-  // Clicking "Turn on" doesn't set the pref yet.
-  base::ListValue args;
-  args.Append(base::Value(true));  // feature_enabled
-  handler_->HandleSetOsSyncFeatureEnabled(&args);
-  EXPECT_FALSE(user_settings_->IsOsSyncFeatureEnabled());
-
-  // The pref is set when the settings window closes and destroys the handler.
-  handler_.reset();
-  EXPECT_TRUE(user_settings_->IsOsSyncFeatureEnabled());
-}
-
 TEST_F(OsSyncHandlerTest, TestSyncEverything) {
   base::ListValue list_args;
   list_args.Append(CreateOsSyncPrefs(SYNC_ALL_OS_TYPES,
@@ -309,10 +260,8 @@
   SetWallperEnabledPref(true);
   handler_->HandleDidNavigateToOsSyncPage(nullptr);
 
-  bool feature_enabled;
   const DictionaryValue* dictionary;
-  ExpectOsSyncPrefsSent(&feature_enabled, &dictionary);
-  EXPECT_TRUE(feature_enabled);
+  ExpectOsSyncPrefsSent(&dictionary);
   CheckBool(dictionary, "syncAllOsTypes", true);
   CheckBool(dictionary, "osAppsRegistered", true);
   CheckBool(dictionary, "osPreferencesRegistered", true);
@@ -328,10 +277,8 @@
   SetWallperEnabledPref(true);
   handler_->HandleDidNavigateToOsSyncPage(nullptr);
 
-  bool feature_enabled;
   const DictionaryValue* dictionary;
-  ExpectOsSyncPrefsSent(&feature_enabled, &dictionary);
-  EXPECT_TRUE(feature_enabled);
+  ExpectOsSyncPrefsSent(&dictionary);
   CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC,
                                UserSelectableOsTypeSet::All(),
                                /*wallpaper_enabled=*/true);
@@ -343,10 +290,8 @@
     user_settings_->SetSelectedOsTypes(/*sync_all_os_types=*/false, types);
     handler_->HandleDidNavigateToOsSyncPage(nullptr);
 
-    bool feature_enabled;
     const DictionaryValue* dictionary;
-    ExpectOsSyncPrefsSent(&feature_enabled, &dictionary);
-    EXPECT_TRUE(feature_enabled);
+    ExpectOsSyncPrefsSent(&dictionary);
     CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, types,
                                  /*wallpaper_enabled=*/false);
   }
@@ -355,10 +300,8 @@
   user_settings_->SetSelectedOsTypes(/*sync_all_os_types=*/false, /*types=*/{});
   SetWallperEnabledPref(true);
   handler_->HandleDidNavigateToOsSyncPage(nullptr);
-  bool feature_enabled;
   const DictionaryValue* dictionary;
-  ExpectOsSyncPrefsSent(&feature_enabled, &dictionary);
-  EXPECT_TRUE(feature_enabled);
+  ExpectOsSyncPrefsSent(&dictionary);
   CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, /*types=*/{},
                                /*wallpaper_enabled=*/true);
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
index e265c0e..424c7824 100644
--- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -67,6 +67,14 @@
   return ::account_manager::AccountKey{id, account_type};
 }
 
+::account_manager::Account GetAccountFromJsCallback(
+    const base::DictionaryValue* const dictionary) {
+  ::account_manager::AccountKey key = GetAccountKeyFromJsCallback(dictionary);
+  const std::string* email = dictionary->FindStringKey("email");
+  DCHECK(email);
+  return ::account_manager::Account{key, *email};
+}
+
 bool IsSameAccount(const ::account_manager::AccountKey& account_key,
                    const AccountId& account_id) {
   switch (account_key.account_type()) {
@@ -222,6 +230,10 @@
       base::BindRepeating(
           &AccountManagerUIHandler::HandleShowWelcomeDialogIfRequired,
           weak_factory_.GetWeakPtr()));
+  web_ui()->RegisterDeprecatedMessageCallback(
+      "changeArcAvailability",
+      base::BindRepeating(&AccountManagerUIHandler::HandleChangeArcAvailability,
+                          weak_factory_.GetWeakPtr()));
 }
 
 void AccountManagerUIHandler::SetProfileForTesting(Profile* profile) {
@@ -445,6 +457,25 @@
   chromeos::AccountManagerWelcomeDialog::ShowIfRequired();
 }
 
+void AccountManagerUIHandler::HandleChangeArcAvailability(
+    const base::ListValue* args) {
+  DCHECK(ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled());
+
+  // 2 args: account, is_available.
+  CHECK_GT(args->GetList().size(), 1);
+  const base::DictionaryValue* account_dict = nullptr;
+  args->GetList()[0].GetAsDictionary(&account_dict);
+  CHECK(account_dict);
+  const absl::optional<bool> is_available = args->GetList()[1].GetIfBool();
+  CHECK(is_available.has_value());
+
+  const ::account_manager::Account account =
+      GetAccountFromJsCallback(account_dict);
+  account_apps_availability_->SetIsAccountAvailableInArc(account,
+                                                         is_available.value());
+  // Note: the observer call will update the UI.
+}
+
 void AccountManagerUIHandler::OnJavascriptAllowed() {
   account_manager_facade_observation_.Observe(account_manager_facade_);
   identity_manager_observation_.Observe(identity_manager_);
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
index eb11b64..da71dc6 100644
--- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
@@ -90,6 +90,9 @@
   // WebUI "showWelcomeDialogIfRequired" message callback.
   void HandleShowWelcomeDialogIfRequired(const base::ListValue* args);
 
+  // WebUI "changeArcAvailability" message callback.
+  void HandleChangeArcAvailability(const base::ListValue* args);
+
   // |account_manager::AccountManager::CheckDummyGaiaTokenForAllAccounts|
   // callback.
   void OnCheckDummyGaiaTokenForAllAccounts(
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
index 998d6552..ad588ef 100644
--- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
@@ -29,13 +29,19 @@
 #include "components/user_manager/user_type.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_web_ui.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace {
 
+using testing::Contains;
+using testing::Not;
+
 using ::account_manager::AccountManager;
 
+constexpr char kSecondaryAccount1Email[] = "secondary1@example.com";
+constexpr char kSecondaryAccount2Email[] = "secondary2@example.com";
 constexpr char kGetAccountsMessage[] = "getAccounts";
 constexpr char kHandleFunctionName[] = "handleFunctionName";
 
@@ -104,6 +110,10 @@
   return str ? *str : std::string();
 }
 
+MATCHER_P(AccountEmailEqual, other, "") {
+  return arg.raw_email == other;
+}
+
 }  // namespace
 
 namespace chromeos {
@@ -322,8 +332,8 @@
 
 IN_PROC_BROWSER_TEST_P(AccountManagerUIHandlerTest,
                        OnGetAccountsWithSecondaryAccounts) {
-  UpsertAccount("secondary1@example.com");
-  UpsertAccount("secondary2@example.com");
+  UpsertAccount(kSecondaryAccount1Email);
+  UpsertAccount(kSecondaryAccount2Email);
   const std::vector<::account_manager::Account> account_manager_accounts =
       GetAccountsFromAccountManager();
   ASSERT_EQ(3UL, account_manager_accounts.size());
@@ -444,6 +454,43 @@
     AccountManagerUIHandlerTest::TearDownOnMainThread();
   }
 
+  base::flat_set<::account_manager::Account> GetAccountsAvailableInArc() const {
+    base::flat_set<::account_manager::Account> accounts;
+
+    base::RunLoop run_loop;
+    account_apps_availability_->GetAccountsAvailableInArc(
+        base::BindLambdaForTesting(
+            [&accounts,
+             &run_loop](const base::flat_set<::account_manager::Account>&
+                            stored_accounts) {
+              accounts = stored_accounts;
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+
+    return accounts;
+  }
+
+  absl::optional<::account_manager::Account> FindAccountByEmail(
+      const std::vector<::account_manager::Account>& accounts,
+      const std::string& email) {
+    for (const auto& account : accounts) {
+      if (account.raw_email == email)
+        return account;
+    }
+    return absl::nullopt;
+  }
+
+  absl::optional<const base::Value> FindAccountDictByEmail(
+      const base::span<const base::Value>& accounts,
+      const std::string& email) {
+    for (const base::Value& account : accounts) {
+      if (ValueOrEmpty(account.FindStringKey("email")) == email)
+        return account.Clone();
+    }
+    return absl::nullopt;
+  }
+
   ash::AccountAppsAvailability* account_apps_availability() {
     return account_apps_availability_;
   }
@@ -456,10 +503,8 @@
 
 IN_PROC_BROWSER_TEST_P(AccountManagerUIHandlerTestWithArcAccountRestrictions,
                        CheckIsAvailableInArcValue) {
-  const std::string secondary_email_1 = "secondary1@example.com";
-  const std::string secondary_email_2 = "secondary2@example.com";
-  UpsertAccount(secondary_email_1);
-  UpsertAccount(secondary_email_2);
+  UpsertAccount(kSecondaryAccount1Email);
+  UpsertAccount(kSecondaryAccount2Email);
   const std::vector<::account_manager::Account> account_manager_accounts =
       GetAccountsFromAccountManager();
   ASSERT_EQ(3UL, account_manager_accounts.size());
@@ -467,13 +512,17 @@
   // Wait for accounts to propagate to IdentityManager.
   base::RunLoop().RunUntilIdle();
 
-  for (const auto& account : account_manager_accounts) {
-    if (account.raw_email == secondary_email_1) {
-      account_apps_availability()->SetIsAccountAvailableInArc(account, true);
-    } else if (account.raw_email == secondary_email_2) {
-      account_apps_availability()->SetIsAccountAvailableInArc(account, false);
-    }
-  }
+  absl::optional<::account_manager::Account> account_1 =
+      FindAccountByEmail(account_manager_accounts, kSecondaryAccount1Email);
+  ASSERT_TRUE(account_1.has_value());
+  absl::optional<::account_manager::Account> account_2 =
+      FindAccountByEmail(account_manager_accounts, kSecondaryAccount2Email);
+  ASSERT_TRUE(account_2.has_value());
+
+  account_apps_availability()->SetIsAccountAvailableInArc(account_1.value(),
+                                                          true);
+  account_apps_availability()->SetIsAccountAvailableInArc(account_2.value(),
+                                                          false);
 
   // Call "getAccounts".
   base::Value args(base::Value::Type::LIST);
@@ -498,16 +547,94 @@
   EXPECT_TRUE(device_account.FindBoolKey("isAvailableInArc").value());
 
   // Check secondary accounts.
-  for (const base::Value& account : result) {
-    if (ValueOrEmpty(account.FindStringKey("id")) == GetDeviceAccountInfo().id)
-      continue;
+  absl::optional<const base::Value> secondary_1_dict =
+      FindAccountDictByEmail(result, kSecondaryAccount1Email);
+  ASSERT_TRUE(secondary_1_dict.has_value());
+  absl::optional<const base::Value> secondary_2_dict =
+      FindAccountDictByEmail(result, kSecondaryAccount2Email);
+  ASSERT_TRUE(secondary_2_dict.has_value());
 
-    std::string email = ValueOrEmpty(account.FindStringKey("email"));
-    if (email == secondary_email_1) {
-      EXPECT_TRUE(account.FindBoolKey("isAvailableInArc").value());
-    } else if (email == secondary_email_2) {
-      EXPECT_FALSE(account.FindBoolKey("isAvailableInArc").value());
-    }
+  absl::optional<bool> is_available_1 =
+      secondary_1_dict.value().FindBoolKey("isAvailableInArc");
+  ASSERT_TRUE(is_available_1.has_value());
+  absl::optional<bool> is_available_2 =
+      secondary_2_dict.value().FindBoolKey("isAvailableInArc");
+  ASSERT_TRUE(is_available_2.has_value());
+
+  // The values should match `SetIsAccountAvailableInArc` calls.
+  EXPECT_TRUE(is_available_1.value());
+  EXPECT_FALSE(is_available_2.value());
+}
+
+IN_PROC_BROWSER_TEST_P(AccountManagerUIHandlerTestWithArcAccountRestrictions,
+                       HandleChangeArcAvailabilityChangesArcAvailability) {
+  UpsertAccount(kSecondaryAccount1Email);
+  UpsertAccount(kSecondaryAccount2Email);
+  const std::vector<::account_manager::Account> account_manager_accounts =
+      GetAccountsFromAccountManager();
+  ASSERT_EQ(3UL, account_manager_accounts.size());
+
+  // Wait for accounts to propagate to IdentityManager.
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<::account_manager::Account> account_1 =
+      FindAccountByEmail(account_manager_accounts, kSecondaryAccount1Email);
+  ASSERT_TRUE(account_1.has_value());
+  absl::optional<::account_manager::Account> account_2 =
+      FindAccountByEmail(account_manager_accounts, kSecondaryAccount2Email);
+  ASSERT_TRUE(account_2.has_value());
+
+  account_apps_availability()->SetIsAccountAvailableInArc(account_1.value(),
+                                                          true);
+  account_apps_availability()->SetIsAccountAvailableInArc(account_2.value(),
+                                                          false);
+
+  {
+    // Make sure that accounts have correct initial values.
+    const base::flat_set<::account_manager::Account> arc_accounts =
+        GetAccountsAvailableInArc();
+    EXPECT_THAT(arc_accounts,
+                Contains(AccountEmailEqual(kSecondaryAccount1Email)));
+    EXPECT_THAT(arc_accounts,
+                Not(Contains(AccountEmailEqual(kSecondaryAccount2Email))));
+  }
+
+  // Call "getAccounts".
+  base::Value args(base::Value::Type::LIST);
+  args.Append(kHandleFunctionName);
+  web_ui()->HandleReceivedMessage(kGetAccountsMessage,
+                                  &base::Value::AsListValue(args));
+
+  // Wait for the async calls to finish.
+  base::RunLoop().RunUntilIdle();
+
+  // Get results from JS callback.
+  const content::TestWebUI::CallData& call_data = *web_ui()->call_data().back();
+  const base::span<const base::Value> accounts_dict =
+      call_data.arg3()->GetList();
+  absl::optional<const base::Value> secondary_1_dict =
+      FindAccountDictByEmail(accounts_dict, kSecondaryAccount1Email);
+  ASSERT_TRUE(secondary_1_dict.has_value());
+
+  // Call "changeArcAvailability".
+  base::Value args_1(base::Value::Type::LIST);
+  args_1.Append(secondary_1_dict.value().Clone());  // account
+  args_1.Append(false);                             // is_available
+  web_ui()->HandleReceivedMessage("changeArcAvailability",
+                                  &base::Value::AsListValue(args_1));
+
+  // Wait for the async calls to finish.
+  base::RunLoop().RunUntilIdle();
+
+  {
+    // Make sure that account with kSecondaryAccount1Email is not available in
+    // ARC now.
+    const base::flat_set<::account_manager::Account> arc_accounts =
+        GetAccountsAvailableInArc();
+    EXPECT_THAT(arc_accounts,
+                Not(Contains(AccountEmailEqual(kSecondaryAccount1Email))));
+    EXPECT_THAT(arc_accounts,
+                Not(Contains(AccountEmailEqual(kSecondaryAccount2Email))));
   }
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
index 4075db4..6703340 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/ash/android_sms/android_sms_service.h"
 #include "chrome/browser/nearby_sharing/common/nearby_share_features.h"
 #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h"
+#include "chrome/browser/nearby_sharing/nearby_sharing_service.h"
 #include "chrome/browser/nearby_sharing/nearby_sharing_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/session_controller_client_impl.h"
@@ -243,16 +244,36 @@
        mojom::SearchResultDefaultRank::kMedium,
        mojom::SearchResultType::kSetting,
        {.setting = mojom::Setting::kNearbyShareDataUsage}},
-      {IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION,
-       mojom::kNearbyShareSubpagePath,
-       mojom::SearchResultIcon::kNearbyShare,
-       mojom::SearchResultDefaultRank::kMedium,
-       mojom::SearchResultType::kSetting,
-       {.setting = mojom::Setting::kDevicesNearbyAreSharingNotificationOnOff}},
   });
   return *tags;
 }
 
+const std::vector<SearchConcept>&
+GetNearbyShareBackgroundScanningOnSearchConcepts() {
+  static const base::NoDestructor<std::vector<SearchConcept>> tags(
+      {{IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_ON,
+        mojom::kNearbyShareSubpagePath,
+        mojom::SearchResultIcon::kNearbyShare,
+        mojom::SearchResultDefaultRank::kMedium,
+        mojom::SearchResultType::kSetting,
+        {.setting =
+             mojom::Setting::kDevicesNearbyAreSharingNotificationOnOff}}});
+  return *tags;
+}
+
+const std::vector<SearchConcept>&
+GetNearbyShareBackgroundScanningOffSearchConcepts() {
+  static const base::NoDestructor<std::vector<SearchConcept>> tags(
+      {{IDS_OS_SETTINGS_TAG_NEARBY_SHARE_DEVICES_NEARBY_SHARING_NOTIFICATION_OFF,
+        mojom::kNearbyShareSubpagePath,
+        mojom::SearchResultIcon::kNearbyShare,
+        mojom::SearchResultDefaultRank::kMedium,
+        mojom::SearchResultType::kSetting,
+        {.setting =
+             mojom::Setting::kDevicesNearbyAreSharingNotificationOnOff}}});
+  return *tags;
+}
+
 const std::vector<SearchConcept>& GetNearbyShareOffSearchConcepts() {
   static const base::NoDestructor<std::vector<SearchConcept>> tags({
       {IDS_OS_SETTINGS_TAG_NEARBY_SHARE_TURN_ON,
@@ -302,12 +323,15 @@
       eche_app_manager_(eche_app_manager) {
   if (NearbySharingServiceFactory::IsNearbyShareSupportedForBrowserContext(
           profile)) {
-    pref_change_registrar_.Init(pref_service_);
-    pref_change_registrar_.Add(
-        ::prefs::kNearbySharingEnabledPrefName,
-        base::BindRepeating(&MultiDeviceSection::OnNearbySharingEnabledChanged,
-                            base::Unretained(this)));
-    OnNearbySharingEnabledChanged();
+    NearbySharingService* nearby_sharing_service =
+        NearbySharingServiceFactory::GetForBrowserContext(profile);
+    nearby_sharing_service->GetSettings()->AddSettingsObserver(
+        settings_receiver_.BindNewPipeAndPassRemote());
+
+    NearbyShareSettings* nearby_share_settings =
+        nearby_sharing_service->GetSettings();
+    OnEnabledChanged(nearby_share_settings->GetEnabled());
+    RefreshNearbyBackgroundScanningShareSearchConcepts();
   }
 
   // Note: |multidevice_setup_client_| is null when multi-device features are
@@ -705,10 +729,44 @@
     updater.AddSearchTags(GetMultiDeviceOptedInPhoneHubAppsSearchConcepts());
 }
 
-void MultiDeviceSection::OnNearbySharingEnabledChanged() {
-  SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
+bool MultiDeviceSection::IsFeatureSupported(
+    multidevice_setup::mojom::Feature feature) {
+  const FeatureState feature_state =
+      multidevice_setup_client_->GetFeatureState(feature);
+  return feature_state != FeatureState::kNotSupportedByPhone &&
+         feature_state != FeatureState::kNotSupportedByChromebook;
+}
 
-  if (pref_service_->GetBoolean(::prefs::kNearbySharingEnabledPrefName)) {
+void MultiDeviceSection::RefreshNearbyBackgroundScanningShareSearchConcepts() {
+  SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
+  NearbySharingService* nearby_sharing_service =
+      NearbySharingServiceFactory::GetForBrowserContext(profile());
+  NearbyShareSettings* nearby_share_settings =
+      nearby_sharing_service->GetSettings();
+
+  if (!nearby_share_settings->is_fast_initiation_hardware_supported()) {
+    updater.RemoveSearchTags(
+        GetNearbyShareBackgroundScanningOnSearchConcepts());
+    updater.RemoveSearchTags(
+        GetNearbyShareBackgroundScanningOffSearchConcepts());
+    return;
+  }
+
+  if (nearby_share_settings->GetFastInitiationNotificationState() ==
+      nearby_share::mojom::FastInitiationNotificationState::kEnabled) {
+    updater.AddSearchTags(GetNearbyShareBackgroundScanningOnSearchConcepts());
+    updater.RemoveSearchTags(
+        GetNearbyShareBackgroundScanningOffSearchConcepts());
+  } else {
+    updater.AddSearchTags(GetNearbyShareBackgroundScanningOffSearchConcepts());
+    updater.RemoveSearchTags(
+        GetNearbyShareBackgroundScanningOnSearchConcepts());
+  }
+}
+
+void MultiDeviceSection::OnEnabledChanged(bool enabled) {
+  SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
+  if (enabled) {
     updater.RemoveSearchTags(GetNearbyShareOffSearchConcepts());
     updater.AddSearchTags(GetNearbyShareOnSearchConcepts());
   } else {
@@ -717,12 +775,14 @@
   }
 }
 
-bool MultiDeviceSection::IsFeatureSupported(
-    multidevice_setup::mojom::Feature feature) {
-  const FeatureState feature_state =
-      multidevice_setup_client_->GetFeatureState(feature);
-  return feature_state != FeatureState::kNotSupportedByPhone &&
-         feature_state != FeatureState::kNotSupportedByChromebook;
+void MultiDeviceSection::OnFastInitiationNotificationStateChanged(
+    nearby_share::mojom::FastInitiationNotificationState state) {
+  RefreshNearbyBackgroundScanningShareSearchConcepts();
+}
+
+void MultiDeviceSection::OnIsFastInitiationHardwareSupportedChanged(
+    bool is_supported) {
+  RefreshNearbyBackgroundScanningShareSearchConcepts();
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
index d0775c9..d9547a79 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
 // TODO(https://crbug.com/1164001): move to forward declaration.
 #include "chrome/browser/ash/android_sms/android_sms_service.h"
+#include "chrome/browser/ui/webui/nearby_share/public/mojom/nearby_share_settings.mojom.h"
 #include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
 #include "components/prefs/pref_change_registrar.h"
 
@@ -31,7 +32,8 @@
 // allowed and whether the user has opted into the suite of features.
 class MultiDeviceSection
     : public OsSettingsSection,
-      public multidevice_setup::MultiDeviceSetupClient::Observer {
+      public multidevice_setup::MultiDeviceSetupClient::Observer,
+      public nearby_share::mojom::NearbyShareSettingsObserver {
  public:
   MultiDeviceSection(
       Profile* profile,
@@ -66,6 +68,23 @@
   void OnNearbySharingEnabledChanged();
 
   bool IsFeatureSupported(multidevice_setup::mojom::Feature feature);
+  void RefreshNearbyBackgroundScanningShareSearchConcepts();
+
+  // nearby_share::mojom::NearbyShareSettingsObserver:
+  void OnEnabledChanged(bool enabled) override;
+  void OnFastInitiationNotificationStateChanged(
+      nearby_share::mojom::FastInitiationNotificationState state) override;
+  void OnIsFastInitiationHardwareSupportedChanged(bool is_supported) override;
+  void OnDeviceNameChanged(const std::string& device_name) override {}
+  void OnDataUsageChanged(nearby_share::mojom::DataUsage data_usage) override {}
+  void OnVisibilityChanged(
+      nearby_share::mojom::Visibility visibility) override {}
+  void OnAllowedContactsChanged(
+      const std::vector<std::string>& allowed_contacts) override {}
+  void OnIsOnboardingCompleteChanged(bool is_complete) override {}
+
+  mojo::Receiver<nearby_share::mojom::NearbyShareSettingsObserver>
+      settings_receiver_{this};
 
   multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
   phonehub::PhoneHubManager* phone_hub_manager_;
diff --git a/chrome/browser/ui/webui/settings/chromeos/people_section.cc b/chrome/browser/ui/webui/settings/chromeos/people_section.cc
index 4fef17a..8259e3b 100644
--- a/chrome/browser/ui/webui/settings/chromeos/people_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/people_section.cc
@@ -160,34 +160,6 @@
   return *tags;
 }
 
-const std::vector<SearchConcept>& GetSyncOnSearchConcepts() {
-  DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
-  static const base::NoDestructor<std::vector<SearchConcept>> tags({
-      {IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF,
-       mojom::kSyncSubpagePath,
-       mojom::SearchResultIcon::kSync,
-       mojom::SearchResultDefaultRank::kMedium,
-       mojom::SearchResultType::kSetting,
-       {.setting = mojom::Setting::kSplitSyncOnOff},
-       {IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF_ALT1, SearchConcept::kAltTagEnd}},
-  });
-  return *tags;
-}
-
-const std::vector<SearchConcept>& GetSyncOffSearchConcepts() {
-  DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
-  static const base::NoDestructor<std::vector<SearchConcept>> tags({
-      {IDS_OS_SETTINGS_TAG_SYNC_TURN_ON,
-       mojom::kSyncSubpagePath,
-       mojom::SearchResultIcon::kSync,
-       mojom::SearchResultDefaultRank::kMedium,
-       mojom::SearchResultType::kSetting,
-       {.setting = mojom::Setting::kSplitSyncOnOff},
-       {IDS_OS_SETTINGS_TAG_SYNC_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
-  });
-  return *tags;
-}
-
 const std::vector<SearchConcept>& GetParentalSearchConcepts() {
   static const base::NoDestructor<std::vector<SearchConcept>> tags({
       {IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS,
@@ -491,8 +463,6 @@
   html_source->AddBoolean(
       "syncSettingsCategorizationEnabled",
       chromeos::features::IsSyncSettingsCategorizationEnabled());
-  html_source->AddBoolean("syncConsentOptionalEnabled",
-                          chromeos::features::IsSyncConsentOptionalEnabled());
   html_source->AddString(
       "browserSettingsSyncSetupUrl",
       base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
@@ -558,15 +528,14 @@
 
 }  // namespace
 
-PeopleSection::PeopleSection(
-    Profile* profile,
-    SearchTagRegistry* search_tag_registry,
-    syncer::SyncService* sync_service,
-    SupervisedUserService* supervised_user_service,
-    signin::IdentityManager* identity_manager,
-    PrefService* pref_service)
+// TODO(https://crbug.com/1274802): Remove sync_service param.
+PeopleSection::PeopleSection(Profile* profile,
+                             SearchTagRegistry* search_tag_registry,
+                             syncer::SyncService* sync_service,
+                             SupervisedUserService* supervised_user_service,
+                             signin::IdentityManager* identity_manager,
+                             PrefService* pref_service)
     : OsSettingsSection(profile, search_tag_registry),
-      sync_service_(sync_service),
       supervised_user_service_(supervised_user_service),
       identity_manager_(identity_manager),
       pref_service_(pref_service) {
@@ -594,19 +563,10 @@
     FetchAccounts();
   }
 
-  if (sync_service_) {
-    if (chromeos::features::IsSyncConsentOptionalEnabled()) {
-      DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
-      updater.AddSearchTags(GetCategorizedSyncSearchConcepts());
-
-      // Sync search tags are added/removed dynamically.
-      sync_service_->AddObserver(this);
-      OnStateChanged(sync_service_);
-    } else if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
-      updater.AddSearchTags(GetCategorizedSyncSearchConcepts());
-    } else {
-      updater.AddSearchTags(GetNonCategorizedSyncSearchConcepts());
-    }
+  if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
+    updater.AddSearchTags(GetCategorizedSyncSearchConcepts());
+  } else {
+    updater.AddSearchTags(GetNonCategorizedSyncSearchConcepts());
   }
 
   // Parental control search tags are added if necessary and do not update
@@ -615,10 +575,7 @@
     updater.AddSearchTags(GetParentalSearchConcepts());
 }
 
-PeopleSection::~PeopleSection() {
-  if (chromeos::features::IsSyncConsentOptionalEnabled() && sync_service_)
-    sync_service_->RemoveObserver(this);
-}
+PeopleSection::~PeopleSection() = default;
 
 void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
@@ -849,22 +806,6 @@
   }
 }
 
-void PeopleSection::OnStateChanged(syncer::SyncService* sync_service) {
-  DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
-  DCHECK_EQ(sync_service, sync_service_);
-
-  SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
-
-  if (sync_service_->IsEngineInitialized() &&
-      sync_service_->GetUserSettings()->IsOsSyncFeatureEnabled()) {
-    updater.AddSearchTags(GetSyncOnSearchConcepts());
-    updater.RemoveSearchTags(GetSyncOffSearchConcepts());
-  } else {
-    updater.RemoveSearchTags(GetSyncOnSearchConcepts());
-    updater.AddSearchTags(GetSyncOffSearchConcepts());
-  }
-}
-
 bool PeopleSection::AreFingerprintSettingsAllowed() {
   return quick_unlock::IsFingerprintEnabled(profile());
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/people_section.h b/chrome/browser/ui/webui/settings/chromeos/people_section.h
index e1825483..1f36208 100644
--- a/chrome/browser/ui/webui/settings/chromeos/people_section.h
+++ b/chrome/browser/ui/webui/settings/chromeos/people_section.h
@@ -48,8 +48,7 @@
 // allowed by policy/flags. Different sets of Sync tags are shown depending on
 // whether the feature is enabed or disabled.
 class PeopleSection : public OsSettingsSection,
-                      public account_manager::AccountManagerFacade::Observer,
-                      public syncer::SyncServiceObserver {
+                      public account_manager::AccountManagerFacade::Observer {
  public:
   PeopleSection(Profile* profile,
                 SearchTagRegistry* search_tag_registry,
@@ -74,9 +73,6 @@
   void OnAccountUpserted(const ::account_manager::Account& account) override;
   void OnAccountRemoved(const ::account_manager::Account& account) override;
 
-  // syncer::SyncServiceObserver:
-  void OnStateChanged(syncer::SyncService* sync_service) override;
-
   bool AreFingerprintSettingsAllowed();
   void FetchAccounts();
   void UpdateAccountManagerSearchTags(
@@ -85,7 +81,6 @@
   account_manager::AccountManager* account_manager_ = nullptr;
   account_manager::AccountManagerFacade* account_manager_facade_ = nullptr;
   ash::AccountAppsAvailability* account_apps_availability_ = nullptr;
-  syncer::SyncService* sync_service_;
   SupervisedUserService* supervised_user_service_;
   signin::IdentityManager* identity_manager_;
   PrefService* pref_service_;
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 002cea9..aeb28f4 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -292,8 +292,6 @@
   html_source->AddBoolean(
       "syncSettingsCategorizationEnabled",
       chromeos::features::IsSyncSettingsCategorizationEnabled());
-  html_source->AddBoolean("syncConsentOptionalEnabled",
-                          chromeos::features::IsSyncConsentOptionalEnabled());
 
   html_source->AddBoolean(
       "userCannotManuallyEnterPassword",
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 7283862..08ffae33 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1640757087-4109307386b81a78035f42654cc244ba1772a506.profdata
+chrome-linux-main-1640800560-73580ddf64240d20141589178412a977d5ad0dcf.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 3af68a17..a7ad723 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1640757087-6f4380259505a67d0d10066a472120b3851e6861.profdata
+chrome-mac-main-1640800560-8e13d54ed66f0b4831ddb47bd8f2803ec72f8ff1.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 0da211f..b6c23a26 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1640757087-16de6163c4249666a8fb9ae78ed4db7ddbf245e2.profdata
+chrome-win32-main-1640811237-098e9aa24cae18dda06aaaca93ad72ce42868358.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 864ef726..4c83337 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1640757087-eba12d58679189c3d7e688423ef9904102be0680.profdata
+chrome-win64-main-1640811237-a66687ab0b2dc6619207426773fa5d6fa87f5ab0.profdata
diff --git a/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc b/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc
index 244870b..2effb00 100644
--- a/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc
+++ b/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc
@@ -144,6 +144,16 @@
             user_scripts[6]->match_origin_as_fallback());
 }
 
+TEST_F(ContentScriptsManifestTest, MatchOriginAsFallback_InvalidCases) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      extensions_features::kContentScriptsMatchOriginAsFallback);
+
+  LoadAndExpectWarning(
+      "content_script_match_origin_as_fallback_warning_for_mv2.json",
+      errors::kMatchOriginAsFallbackRestrictedToMV3);
+}
+
 TEST_F(ContentScriptsManifestTest, MatchOriginAsFallback_FeatureDisabled) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(
diff --git a/chrome/renderer/extensions/custom_types_unittest.cc b/chrome/renderer/extensions/custom_types_unittest.cc
index 525ba109..fd005771 100644
--- a/chrome/renderer/extensions/custom_types_unittest.cc
+++ b/chrome/renderer/extensions/custom_types_unittest.cc
@@ -106,7 +106,7 @@
 TEST_F(CustomTypesTest, ContentSettingsPromisesForManifestV3) {
   scoped_refptr<const Extension> extension =
       ExtensionBuilder("foo")
-          .SetManifestKey("manifest_version", 3)
+          .SetManifestVersion(3)
           .AddPermission("contentSettings")
           .Build();
   RegisterExtension(extension);
@@ -233,11 +233,10 @@
 }
 
 TEST_F(CustomTypesTest, ChromeSettingPromisesForManifestV3) {
-  scoped_refptr<const Extension> extension =
-      ExtensionBuilder("foo")
-          .SetManifestKey("manifest_version", 3)
-          .AddPermission("privacy")
-          .Build();
+  scoped_refptr<const Extension> extension = ExtensionBuilder("foo")
+                                                 .SetManifestVersion(3)
+                                                 .AddPermission("privacy")
+                                                 .Build();
   RegisterExtension(extension);
 
   v8::HandleScope handle_scope(isolate());
diff --git a/chrome/renderer/extensions/extension_hooks_delegate_unittest.cc b/chrome/renderer/extensions/extension_hooks_delegate_unittest.cc
index ab27f50..cfa4f6e5 100644
--- a/chrome/renderer/extensions/extension_hooks_delegate_unittest.cc
+++ b/chrome/renderer/extensions/extension_hooks_delegate_unittest.cc
@@ -273,9 +273,7 @@
   ~ExtensionHooksDelegateMV3Test() override = default;
 
   scoped_refptr<const Extension> BuildExtension() override {
-    return ExtensionBuilder("foo")
-        .SetManifestKey("manifest_version", 3)
-        .Build();
+    return ExtensionBuilder("foo").SetManifestVersion(3).Build();
   }
 };
 
diff --git a/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc b/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
index f5f3e18..6a4f76d 100644
--- a/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
+++ b/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
@@ -323,6 +323,11 @@
   NOTIMPLEMENTED();
   return false;
 }
+absl::optional<std::pair<std::int32_t, std::int32_t>>
+WifiLanMedium::GetDynamicPortRange() {
+  NOTIMPLEMENTED();
+  return absl::nullopt;
+}
 /*============================================================================*/
 // End: Not implemented
 /*============================================================================*/
diff --git a/chrome/services/sharing/nearby/platform/wifi_lan_medium.h b/chrome/services/sharing/nearby/platform/wifi_lan_medium.h
index 26485768..253aac00 100644
--- a/chrome/services/sharing/nearby/platform/wifi_lan_medium.h
+++ b/chrome/services/sharing/nearby/platform/wifi_lan_medium.h
@@ -114,6 +114,8 @@
   bool StartDiscovery(const std::string& service_type,
                       DiscoveredServiceCallback callback) override;
   bool StopDiscovery(const std::string& service_type) override;
+  absl::optional<std::pair<std::int32_t, std::int32_t>> GetDynamicPortRange()
+      override;
   /*==========================================================================*/
 
   // Removes |event| from the set of pending events and signals |event|. Calls
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 07b812e..772e2a5 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -9062,8 +9062,6 @@
       "../browser/sync/test/integration/sync_app_list_helper.h",
       "../browser/sync/test/integration/sync_arc_package_helper.cc",
       "../browser/sync/test/integration/sync_arc_package_helper.h",
-      "../browser/sync/test/integration/sync_consent_optional_sync_test.cc",
-      "../browser/sync/test/integration/sync_consent_optional_sync_test.h",
       "../browser/sync/test/integration/sync_settings_categorization_sync_test.cc",
       "../browser/sync/test/integration/sync_settings_categorization_sync_test.h",
       "../browser/sync/test/integration/workspace_desk_helper.cc",
@@ -9359,10 +9357,6 @@
       "//skia",
       "//testing/gmock",
       "//testing/gtest",
-
-      # TODO(uwyiming@chromium.org) create a gn target for Web Page Replay Go (WPR Go) and only WPR Go.
-      # So that test targets requiring WPR Go does not pull down the whole telemetry tool chain.
-      "//third_party/catapult:telemetry_chrome_test_support",
       "//third_party/hunspell",
       "//third_party/icu",
       "//third_party/libpng",
@@ -9936,8 +9930,10 @@
 
     data = [
       "//testing/scripts/run_variations_smoke_tests.py",
+      "//testing/scripts/variations_http_test_server.py",
       "//testing/scripts/variations_seed_access_helper.py",
       "//testing/scripts/variations_smoke_test_data/",
+      "//testing/scripts/variations_smoke_test_data/http_server/",
       "//third_party/webdriver/pylib/",
     ]
   }
diff --git a/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback.json b/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback.json
index 29a9ccd..fdd4c9d 100644
--- a/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback.json
+++ b/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback.json
@@ -2,7 +2,7 @@
   "name": "Content scripts matching data urls",
   "description": "ContentScriptsManifestTest.MatchDataURLs*",
   "version": "0.1",
-  "manifest_version": 2,
+  "manifest_version": 3,
   "content_scripts": [{
     "matches": ["https://example.com/*"],
     "match_origin_as_fallback": true,
diff --git a/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback_warning_for_mv2.json b/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback_warning_for_mv2.json
new file mode 100644
index 0000000..c3b39e3
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_tests/content_script_match_origin_as_fallback_warning_for_mv2.json
@@ -0,0 +1,10 @@
+{
+  "name": "ContentScriptsManifestTest.MatchOriginAsFallback_InvalidCases",
+  "version": "0.1",
+  "manifest_version": 2,
+  "content_scripts": [{
+    "matches": ["https://example.com/*"],
+    "match_origin_as_fallback": true,
+    "js": ["file.js"]
+  }]
+}
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index c220b53e..f3b4c71 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -357,7 +357,6 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_people_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_settings_menu_test.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_sync_controls_optional_disabled_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/lock_screen_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.m.js",
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 0102dc83..0c76d000 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -145,7 +145,6 @@
     "os_settings_menu_test.js",
     "os_settings_ui_test.js",
     "os_settings_ui_test_2.js",
-    "os_sync_controls_optional_disabled_test.js",
     "os_sync_controls_test.js",
     "parental_controls_page_test.js",
     "people_page_account_manager_test.js",
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
index f54e43a..6390a20 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
@@ -114,10 +114,10 @@
     wifiSyncItem.remove();
   });
 
-  test('Chrome Sync off', async () => {
+  test('Wifi Sync off', async () => {
     const prefs = getOsPrefs();
     prefs.osWifiConfigurationsSynced = false;
-    cr.webUIListenerCallback('os-sync-prefs-changed', false, prefs);
+    cr.webUIListenerCallback('os-sync-prefs-changed', prefs);
     Polymer.dom.flush();
 
     assertTrue(
@@ -129,10 +129,10 @@
     assertFalse(toggle.checked);
   });
 
-  test('Chrome Sync on', async () => {
+  test('Wifi Sync on', async () => {
     const prefs = getOsPrefs();
     prefs.osWifiConfigurationsSynced = true;
-    cr.webUIListenerCallback('os-sync-prefs-changed', true, prefs);
+    cr.webUIListenerCallback('os-sync-prefs-changed', prefs);
     Polymer.dom.flush();
 
     assertFalse(
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index 479ca2c04..7aaa7106 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -146,10 +146,8 @@
   /** @override */
   get featureList() {
     return {
-      enabled: super.featureList.enabled.concat([
-        'chromeos::features::kSyncConsentOptional',
-        'chromeos::features::kSyncSettingsCategorization'
-      ])
+      enabled: super.featureList.enabled.concat(
+          ['chromeos::features::kSyncSettingsCategorization'])
     };
   }
 };
@@ -158,29 +156,6 @@
   mocha.run();
 });
 
-var OSSettingsPeoplePageOsSyncOptionalDisabledV3Test =
-    class extends OSSettingsV3BrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/' +
-      'os_sync_controls_optional_disabled_test.m.js';
-  }
-
-  /** @override */
-  get featureList() {
-    return {
-      enabled: super.featureList.enabled.concat(
-          ['chromeos::features::kSyncSettingsCategorization']),
-      disabled: ['chromeos::features::kSyncConsentOptional']
-    };
-  }
-};
-
-TEST_F('OSSettingsPeoplePageOsSyncOptionalDisabledV3Test', 'AllJsTests', () => {
-  mocha.run();
-});
-
-
 // TODO(crbug.com/1234871) Move this test back into the list of tests below once
 // Bluetooth revamp is launched.
 var OSSettingsOsSettingsPageV3Test = class extends OSSettingsV3BrowserTest {
diff --git a/chrome/test/data/webui/settings/chromeos/os_sync_controls_optional_disabled_test.js b/chrome/test/data/webui/settings/chromeos/os_sync_controls_optional_disabled_test.js
deleted file mode 100644
index e9b48cd..0000000
--- a/chrome/test/data/webui/settings/chromeos/os_sync_controls_optional_disabled_test.js
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2018 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.
-
-// clang-format off
-// #import 'chrome://os-settings/chromeos/os_settings.js';
-
-// #import {OsSyncBrowserProxyImpl, Router, StatusAction, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-// #import {flush} from'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
-// #import {waitAfterNextRender} from 'chrome://test/test_util.js';
-// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-// #import {TestBrowserProxy} from '../../test_browser_proxy.js';
-// clang-format on
-
-/** @implements {settings.OsSyncBrowserProxy} */
-class TestOsSyncBrowserProxy extends TestBrowserProxy {
-  constructor() {
-    super([
-      'didNavigateToOsSyncPage',
-      'didNavigateAwayFromOsSyncPage',
-      'setOsSyncFeatureEnabled',
-      'setOsSyncDatatypes',
-    ]);
-  }
-
-  /** @override */
-  didNavigateToOsSyncPage() {
-    this.methodCalled('didNavigateToOsSyncPage');
-  }
-
-  /** @override */
-  didNavigateAwayFromOsSyncPage() {
-    this.methodCalled('didNavigateAwayFromSyncPage');
-  }
-
-  /** @override */
-  setOsSyncFeatureEnabled(enabled) {
-    this.methodCalled('setOsSyncFeatureEnabled', enabled);
-  }
-
-  /** @override */
-  setOsSyncDatatypes(osSyncPrefs) {
-    this.methodCalled('setOsSyncDatatypes', osSyncPrefs);
-  }
-}
-
-/**
- * Returns a sync prefs dictionary with either all or nothing syncing.
- * @param {boolean} syncAll
- * @return {!settings.OsSyncPrefs}
- */
-function getOsSyncPrefs(syncAll) {
-  return {
-    osAppsRegistered: true,
-    osAppsSynced: syncAll,
-    osPreferencesRegistered: true,
-    osPreferencesSynced: syncAll,
-    syncAllOsTypes: syncAll,
-    wallpaperEnabled: syncAll,
-    wifiConfigurationsRegistered: true,
-    wifiConfigurationsSynced: syncAll,
-  };
-}
-
-function getSyncAllPrefs() {
-  return getOsSyncPrefs(true);
-}
-
-function getSyncNothingPrefs() {
-  return getOsSyncPrefs(false);
-}
-
-// Returns a SyncStatus representing the default syncing state.
-function getDefaultSyncStatus() {
-  return {
-    disabled: false,
-    hasError: false,
-    hasUnrecoverableError: false,
-    signedIn: true,
-    statusAction: settings.StatusAction.NO_ACTION,
-  };
-}
-
-function setupWithFeatureEnabled() {
-  cr.webUIListenerCallback(
-      'os-sync-prefs-changed', /*featureEnabled=*/ true, getSyncAllPrefs());
-  Polymer.dom.flush();
-}
-
-suite('OsSyncControlsTest', function() {
-  let browserProxy = null;
-  let syncControls = null;
-  let syncIconContainer = null;
-
-  setup(function() {
-    browserProxy = new TestOsSyncBrowserProxy();
-    settings.OsSyncBrowserProxyImpl.instance_ = browserProxy;
-
-    PolymerTest.clearBody();
-    syncControls = document.createElement('os-sync-controls');
-    syncControls.syncStatus = getDefaultSyncStatus();
-    syncControls.profileName = 'John Cena';
-    syncControls.profileEmail = 'john.cena@gmail.com';
-    syncControls.profileIconUrl = 'data:image/png;base64,abc123';
-    document.body.appendChild(syncControls);
-
-    // Alias to help with line wrapping in test cases.
-    syncIconContainer = syncControls.$.syncIconContainer;
-  });
-
-  teardown(function() {
-    syncControls.remove();
-    settings.Router.getInstance().resetRouteForTesting();
-  });
-
-  test('ControlsHiddenUntilInitialUpdateSent', function() {
-    assertTrue(syncControls.hidden);
-    setupWithFeatureEnabled();
-    assertFalse(syncControls.hidden);
-  });
-
-  test('Avatar icon', function() {
-    assertEquals('data:image/png;base64,abc123', syncControls.$.avatarIcon.src);
-  });
-
-  test('Status icon is visible with feature enabled', function() {
-    setupWithFeatureEnabled();
-    assertFalse(syncControls.$.syncIconContainer.hidden);
-  });
-
-  test('Status icon with error', function() {
-    setupWithFeatureEnabled();
-    const status = getDefaultSyncStatus();
-    status.hasError = true;
-    syncControls.syncStatus = status;
-
-    assertTrue(syncIconContainer.classList.contains('sync-problem'));
-    assertTrue(!!syncControls.$$('[icon="settings:sync-problem"]'));
-  });
-
-  test('Status icon with sync paused for reauthentication', function() {
-    setupWithFeatureEnabled();
-    const status = getDefaultSyncStatus();
-    status.hasError = true;
-    status.statusAction = settings.StatusAction.REAUTHENTICATE;
-    syncControls.syncStatus = status;
-
-    assertTrue(syncIconContainer.classList.contains('sync-paused'));
-    assertTrue(!!syncControls.$$('[icon="settings:sync-disabled"]'));
-  });
-
-  test('Status icon with sync disabled', function() {
-    setupWithFeatureEnabled();
-    const status = getDefaultSyncStatus();
-    status.disabled = true;
-    syncControls.syncStatus = status;
-
-    assertTrue(syncIconContainer.classList.contains('sync-disabled'));
-    assertTrue(!!syncControls.$$('[icon="cr:sync"]'));
-  });
-
-  test('Account name and email with feature enabled', function() {
-    setupWithFeatureEnabled();
-    assertEquals('John Cena', syncControls.$.accountTitle.textContent.trim());
-    assertEquals(
-        'Syncing to john.cena@gmail.com',
-        syncControls.$.accountSubtitle.textContent.trim());
-  });
-
-  test('Account name and email with sync error', function() {
-    setupWithFeatureEnabled();
-    syncControls.syncStatus = {hasError: true};
-    Polymer.dom.flush();
-    assertEquals(
-        `Sync isn't working`, syncControls.$.accountTitle.textContent.trim());
-    assertEquals(
-        'john.cena@gmail.com',
-        syncControls.$.accountSubtitle.textContent.trim());
-  });
-
-  // Regression test for https://crbug.com/1076239
-  test('Handles undefined syncStatus', function() {
-    syncControls.syncStatus = undefined;
-    setupWithFeatureEnabled();
-    assertEquals('', syncControls.$.accountTitle.textContent.trim());
-    assertEquals('', syncControls.$.accountSubtitle.textContent.trim());
-  });
-
-  test('FeatureEnabled', function() {
-    setupWithFeatureEnabled();
-
-    // the button is always hidden when kSyncConsentOptional is disabled.
-    assertTrue(!syncControls.$$('#syncOnOffButton'));
-
-    assertFalse(syncControls.$.syncEverythingCheckboxLabel.hasAttribute(
-        'label-disabled'));
-
-    const syncAllControl = syncControls.$.syncAllOsTypesControl;
-    assertFalse(syncAllControl.disabled);
-    assertTrue(syncAllControl.checked);
-
-    const labels = syncControls.shadowRoot.querySelectorAll(
-        '.list-item:not([hidden]) > div.checkbox-label');
-    for (const label of labels) {
-      assertFalse(label.hasAttribute('label-disabled'));
-    }
-
-    const datatypeControls = syncControls.shadowRoot.querySelectorAll(
-        '.list-item:not([hidden]) > cr-toggle');
-    for (const control of datatypeControls) {
-      assertTrue(control.disabled);
-      assertTrue(control.checked);
-    }
-  });
-
-  test('UncheckingSyncAllEnablesAllIndividualControls', async function() {
-    setupWithFeatureEnabled();
-    syncControls.$.syncAllOsTypesControl.click();
-    const prefs = await browserProxy.whenCalled('setOsSyncDatatypes');
-
-    const expectedPrefs = getSyncAllPrefs();
-    expectedPrefs.syncAllOsTypes = false;
-    assertEquals(JSON.stringify(expectedPrefs), JSON.stringify(prefs));
-  });
-
-  test('PrefChangeUpdatesControls', function() {
-    const prefs = getSyncAllPrefs();
-    prefs.syncAllOsTypes = false;
-    cr.webUIListenerCallback(
-        'os-sync-prefs-changed', /*featureEnabled=*/ true, prefs);
-
-    const datatypeControls = syncControls.shadowRoot.querySelectorAll(
-        '.list-item:not([hidden]) > cr-toggle');
-    for (const control of datatypeControls) {
-      assertFalse(control.disabled);
-      assertTrue(control.checked);
-    }
-  });
-
-  test('DisablingOneControlUpdatesPrefs', async function() {
-    setupWithFeatureEnabled();
-
-    // Disable "Sync All".
-    syncControls.$.syncAllOsTypesControl.click();
-    // Disable "Settings".
-    syncControls.$.osPreferencesControl.click();
-    const prefs = await browserProxy.whenCalled('setOsSyncDatatypes');
-
-    const expectedPrefs = getSyncAllPrefs();
-    expectedPrefs.syncAllOsTypes = false;
-    expectedPrefs.osPreferencesSynced = false;
-    assertEquals(JSON.stringify(expectedPrefs), JSON.stringify(prefs));
-  });
-});
-
-suite('OsSyncControlsNavigationTest', function() {
-  test('DidNavigateEvents', async function() {
-    const browserProxy = new TestOsSyncBrowserProxy();
-    settings.OsSyncBrowserProxyImpl.instance_ = browserProxy;
-
-    settings.Router.getInstance().navigateTo(settings.routes.OS_SYNC);
-    await browserProxy.methodCalled('didNavigateToOsSyncPage');
-
-    settings.Router.getInstance().navigateTo(settings.routes.OS_PEOPLE);
-    await browserProxy.methodCalled('didNavigateAwayFromOsSyncPage');
-  });
-});
diff --git a/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.js b/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.js
index 2afb0292..37f511b 100644
--- a/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.js
@@ -19,7 +19,6 @@
     super([
       'didNavigateToOsSyncPage',
       'didNavigateAwayFromOsSyncPage',
-      'setOsSyncFeatureEnabled',
       'setOsSyncDatatypes',
     ]);
   }
@@ -35,11 +34,6 @@
   }
 
   /** @override */
-  setOsSyncFeatureEnabled(enabled) {
-    this.methodCalled('setOsSyncFeatureEnabled', enabled);
-  }
-
-  /** @override */
   setOsSyncDatatypes(osSyncPrefs) {
     this.methodCalled('setOsSyncDatatypes', osSyncPrefs);
   }
@@ -82,16 +76,8 @@
   };
 }
 
-function setupWithFeatureEnabled() {
-  cr.webUIListenerCallback(
-      'os-sync-prefs-changed', /*featureEnabled=*/ true, getSyncAllPrefs());
-  Polymer.dom.flush();
-}
-
-function setupWithFeatureDisabled() {
-  cr.webUIListenerCallback(
-      'os-sync-prefs-changed', /*featureEnabled=*/ false,
-      getSyncNothingPrefs());
+function setupSync() {
+  cr.webUIListenerCallback('os-sync-prefs-changed', getSyncAllPrefs());
   Polymer.dom.flush();
 }
 
@@ -123,7 +109,7 @@
 
   test('ControlsHiddenUntilInitialUpdateSent', function() {
     assertTrue(syncControls.hidden);
-    setupWithFeatureEnabled();
+    setupSync();
     assertFalse(syncControls.hidden);
   });
 
@@ -132,17 +118,12 @@
   });
 
   test('Status icon is visible with feature enabled', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     assertFalse(syncControls.$.syncIconContainer.hidden);
   });
 
-  test('Status icon is hidden with feature disabled', function() {
-    setupWithFeatureDisabled();
-    assertTrue(syncControls.$.syncIconContainer.hidden);
-  });
-
   test('Status icon with error', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     const status = getDefaultSyncStatus();
     status.hasError = true;
     syncControls.syncStatus = status;
@@ -152,7 +133,7 @@
   });
 
   test('Status icon with sync paused for reauthentication', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     const status = getDefaultSyncStatus();
     status.hasError = true;
     status.statusAction = settings.StatusAction.REAUTHENTICATE;
@@ -163,7 +144,7 @@
   });
 
   test('Status icon with sync disabled', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     const status = getDefaultSyncStatus();
     status.disabled = true;
     syncControls.syncStatus = status;
@@ -173,23 +154,15 @@
   });
 
   test('Account name and email with feature enabled', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     assertEquals('John Cena', syncControls.$.accountTitle.textContent.trim());
     assertEquals(
         'Syncing to john.cena@gmail.com',
         syncControls.$.accountSubtitle.textContent.trim());
   });
 
-  test('Account name and email with feature disabled', function() {
-    setupWithFeatureDisabled();
-    assertEquals('John Cena', syncControls.$.accountTitle.textContent.trim());
-    assertEquals(
-        'john.cena@gmail.com',
-        syncControls.$.accountSubtitle.textContent.trim());
-  });
-
   test('Account name and email with sync error', function() {
-    setupWithFeatureEnabled();
+    setupSync();
     syncControls.syncStatus = {hasError: true};
     Polymer.dom.flush();
     assertEquals(
@@ -202,41 +175,13 @@
   // Regression test for https://crbug.com/1076239
   test('Handles undefined syncStatus', function() {
     syncControls.syncStatus = undefined;
-    setupWithFeatureEnabled();
+    setupSync();
     assertEquals('', syncControls.$.accountTitle.textContent.trim());
     assertEquals('', syncControls.$.accountSubtitle.textContent.trim());
   });
 
-  test('FeatureDisabled', function() {
-    setupWithFeatureDisabled();
-
-    assertTrue(!!syncControls.$$('#syncOnOffButton'));
-
-    assertTrue(syncControls.$.syncEverythingCheckboxLabel.hasAttribute(
-        'label-disabled'));
-
-    const syncAllControl = syncControls.$.syncAllOsTypesControl;
-    assertTrue(syncAllControl.disabled);
-    assertFalse(syncAllControl.checked);
-
-    const labels = syncControls.shadowRoot.querySelectorAll(
-        '.list-item:not([hidden]) > div');
-    for (const label of labels) {
-      assertTrue(label.hasAttribute('label-disabled'));
-    }
-
-    const datatypeControls = syncControls.shadowRoot.querySelectorAll(
-        '.list-item:not([hidden]) > cr-toggle');
-    for (const control of datatypeControls) {
-      assertTrue(control.disabled);
-      assertFalse(control.checked);
-    }
-  });
-
-  test('FeatureEnabled', function() {
-    setupWithFeatureEnabled();
-
-    assertTrue(!!syncControls.$$('#syncOnOffButton'));
+  test('SyncEnabled', function() {
+    setupSync();
 
     assertFalse(syncControls.$.syncEverythingCheckboxLabel.hasAttribute(
         'label-disabled'));
@@ -259,36 +204,8 @@
     }
   });
 
-  test('ClickingTurnOffDisablesFeature', async function() {
-    setupWithFeatureEnabled();
-    syncControls.$$('#syncOnOffButton').click();
-    const enabled = await browserProxy.whenCalled('setOsSyncFeatureEnabled');
-    assertFalse(enabled);
-  });
-
-  test('Deep link to sync on/off', async function() {
-    setupWithFeatureEnabled();
-
-    const params = new URLSearchParams;
-    params.append('settingId', '302');
-    settings.Router.getInstance().navigateTo(settings.routes.OS_SYNC, params);
-
-    const deepLinkElement = syncControls.$$('#syncOnOffButton');
-    await test_util.waitAfterNextRender(deepLinkElement);
-    assertEquals(
-        deepLinkElement, getDeepActiveElement(),
-        'Sync on/off should be focused for settingId=302.');
-  });
-
-  test('ClickingTurnOnEnablesFeature', async function() {
-    setupWithFeatureDisabled();
-    syncControls.$$('#syncOnOffButton').click();
-    const enabled = await browserProxy.whenCalled('setOsSyncFeatureEnabled');
-    assertTrue(enabled);
-  });
-
   test('UncheckingSyncAllEnablesAllIndividualControls', async function() {
-    setupWithFeatureEnabled();
+    setupSync();
     syncControls.$.syncAllOsTypesControl.click();
     const prefs = await browserProxy.whenCalled('setOsSyncDatatypes');
 
@@ -300,8 +217,7 @@
   test('PrefChangeUpdatesControls', function() {
     const prefs = getSyncAllPrefs();
     prefs.syncAllOsTypes = false;
-    cr.webUIListenerCallback(
-        'os-sync-prefs-changed', /*featureEnabled=*/ true, prefs);
+    cr.webUIListenerCallback('os-sync-prefs-changed', prefs);
 
     const datatypeControls = syncControls.shadowRoot.querySelectorAll(
         '.list-item:not([hidden]) > cr-toggle');
@@ -312,7 +228,7 @@
   });
 
   test('DisablingOneControlUpdatesPrefs', async function() {
-    setupWithFeatureEnabled();
+    setupSync();
 
     // Disable "Sync All".
     syncControls.$.syncAllOsTypesControl.click();
diff --git a/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js b/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
index 67ebe0d..a9da480a 100644
--- a/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
+++ b/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
@@ -22,6 +22,7 @@
         'addAccount',
         'reauthenticateAccount',
         'removeAccount',
+        'changeArcAvailability',
         'showWelcomeDialogIfRequired',
       ]);
     }
@@ -95,6 +96,11 @@
     }
 
     /** @override */
+    changeArcAvailability(account, isAvailableInArc) {
+      this.methodCalled('changeArcAvailability', [account, isAvailableInArc]);
+    }
+
+    /** @override */
     showWelcomeDialogIfRequired() {
       this.methodCalled('showWelcomeDialogIfRequired');
     }
@@ -232,8 +238,8 @@
       // Click on 'More Actions' for the second account (First one (index 0)
       // to have the hamburger menu).
       accountManager.root.querySelectorAll('cr-icon-button')[0].click();
-      // Click on 'Remove account'
-      accountManager.$$('cr-action-menu').querySelector('button').click();
+      // Click on 'Remove account' (the first button in the menu).
+      accountManager.$$('cr-action-menu').querySelectorAll('button')[0].click();
 
       if (loadTimeData.getBoolean('lacrosEnabled')) {
         const confirmationDialog =
@@ -304,6 +310,32 @@
         assertEquals(item.isAvailableInArc, notAvailableInArc.hidden);
       });
     });
+
+    test('ChangeArcAvailability', async function() {
+      if (!loadTimeData.getBoolean('arcAccountRestrictionsEnabled')) {
+        return;
+      }
+
+      await browserProxy.whenCalled('getAccounts');
+      Polymer.dom.flush();
+
+      const testAccount = accountList.items[0];
+      const currentValue = testAccount.isAvailableInArc;
+      // Click on 'More Actions' for the |testAccount| (First one (index 0)
+      // to have the hamburger menu).
+      accountManager.root.querySelectorAll('cr-icon-button')[0].click();
+      // Click on the button to change ARC availability (the second button in
+      // the menu).
+      accountManager.$$('cr-action-menu').querySelectorAll('button')[1].click();
+
+      const args = await browserProxy.whenCalled('changeArcAvailability');
+      assertEquals(args[0], testAccount);
+      assertEquals(args[1], !currentValue);
+      // 'More actions' button should be in focus now.
+      assertEquals(
+          accountManager.root.querySelectorAll('cr-icon-button')[0],
+          accountManager.root.activeElement);
+    });
   });
 
   suite('AccountManagerUnmanagedAccountTests', function() {
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index f77a576..02aee2f 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-99-4758.14-1640601734-benchmark-99.0.4792.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-99-4758.14-1640601734-benchmark-99.0.4793.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 432a7702..68c8fd0 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-99-4758.14-1640608967-benchmark-99.0.4792.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-99-4758.14-1640608967-benchmark-99.0.4793.0-r1-redacted.afdo.xz
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index aaadaee5..03383af 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "4.72",
-  "log_list_timestamp": "2021-12-28T01:34:12Z",
+  "version": "4.73",
+  "log_list_timestamp": "2021-12-29T01:36:48Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc b/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
index a2354f10..0c9a823 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
@@ -156,7 +156,7 @@
 void CloudPolicyClientRegistrationHelper::OnGetUserInfoSuccess(
     const base::DictionaryValue* data) {
   user_info_fetcher_.reset();
-  if (!data->HasKey(kGetHostedDomainKey)) {
+  if (!data->FindKey(kGetHostedDomainKey)) {
     DVLOG(1) << "User not from a hosted domain - skipping registration";
     RequestCompleted();
     return;
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 142d73cb..61bb09f1 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -338,6 +338,7 @@
       Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, macht <ph name="PRODUCT_NAME" /> beim Drucken von PDFs die Option „Als Bild drucken“ nicht in der Druckvorschau verfügbar. In diesem Fall werden PDFs ganz normal gedruckt, d. h. es erfolgt vor dem Versenden an das Druckziel keine Rasterung als Bild.</translation>
 <translation id="1435659902881071157">Netzwerkkonfiguration auf Geräteebene</translation>
 <translation id="1438739959477268107">Standardeinstellung für die Schlüsselgenerierung</translation>
+<translation id="1440408958042020947">Zulassen, dass Nutzer, die der Verwendung von Phone Hub zugestimmt haben, auf Fotos und Videos zugreifen können, die kürzlich mit ihrem Smartphone aufgenommen wurden</translation>
 <translation id="1449083855104537880">Wenn Sie die Richtlinie auf "True" setzen, werden die Optionen für Bedienungshilfen im Taskleistenmenü angezeigt. Wenn die Richtlinie auf "False" gesetzt ist, werden die Optionen nicht im Taskleistenmenü angezeigt.
 
       Wenn Sie diese Richtlinie konfigurieren, kann sie von Nutzern nicht geändert werden. Wird sie nicht konfiguriert, erscheinen keine Optionen für Bedienungshilfen im Taskleistenmenü, die Nutzer können sie auf der Seite "Einstellungen" jedoch anzeigen lassen.
@@ -2295,6 +2296,7 @@
 <translation id="3606571057705314194">Profil-Picker beim Start deaktiviert</translation>
 <translation id="3627678165642179114">Webdienst für die Rechtschreibprüfung aktivieren oder deaktivieren</translation>
 <translation id="3628480121685794414">Simplexdruck aktivieren</translation>
+<translation id="3634125384445314047">Zulassen, dass Fotos und Videos, die kürzlich mit dem Smartphone aufgenommen wurden, über Phone Hub abgerufen werden können.</translation>
 <translation id="3643284063603988867">Funktion zum Speichern des Passworts aktivieren</translation>
 <translation id="3646859102161347133">Lupentyp festlegen</translation>
 <translation id="3647212518036289905">Wenn diese Richtlinie konfiguriert ist, wird festgelegt, welche GSSAPI-Bibliothek für die HTTP-Authentifizierung verwendet werden soll. Geben Sie entweder nur den Namen einer Bibliothek oder einen vollständigen Pfad an.
@@ -6287,6 +6289,11 @@
           Diese Richtlinie bietet einen Ersatzwert für die spezifischeren Richtlinien "<ph name="IDLE_ACTION_AC_POLICY_NAME" />" und "<ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />". Wenn die Richtlinie konfiguriert ist, wird ihr Wert verwendet, sofern die jeweilige spezifischere Richtlinie nicht festgelegt ist.
 
           Ist sie nicht konfiguriert, bleibt das Verhalten der spezifischeren Richtlinien unverändert.</translation>
+<translation id="8349255653850367353">Durch Aktivieren dieser Einstellung können Nutzer, die der Verwendung von Phone Hub zugestimmt haben, Fotos und Videos, die kürzlich mit ihrem Smartphone aufgenommen wurden, auf einem Chrome OS-Gerät abrufen und herunterladen.
+
+      Wenn diese Einstellung deaktiviert ist, können Nutzer die Funktion nicht verwenden. Ist die Richtlinie <ph name="PHONE_HUB_ALLOWED_POLICY_NAME" /> deaktiviert, können Nutzer die Funktion ebenfalls nicht verwenden.
+
+      Wenn diese Richtlinie nicht konfiguriert ist, ist die Einstellung für vom Unternehmen verwaltete Nutzer und für nicht verwaltete Nutzer standardmäßig aktiviert.</translation>
 <translation id="8357681633047935212">Dauer einer Nutzersitzung beschränken</translation>
 <translation id="8357989008292691856">Zulassungsliste für Nutzer, die sich anmelden dürfen</translation>
 <translation id="8359734107661430198">ExampleDeprecatedFeature API bis zum 02.09.2008 aktivieren</translation>
@@ -6748,6 +6755,7 @@
       Ist die Richtlinie nicht konfiguriert oder ein leerer String angegeben, wird auf dem Gerät die momentan aktive Zeitzone verwendet. Allerdings können Nutzer diese dann ändern.</translation>
 <translation id="8880294585549584028">Schreibzugriff auf Dateien und Verzeichnisse auf diesen Websites erlauben</translation>
 <translation id="8882006618241293596">Das Plug-in "<ph name="FLASH_PLUGIN_NAME" />" auf diesen Websites blockieren</translation>
+<translation id="8882255181490012651">Verhindert, dass Nutzer, die der Verwendung von Phone Hub zugestimmt haben, auf Fotos und Videos zugreifen können, die kürzlich mit ihrem Smartphone aufgenommen wurden</translation>
 <translation id="8887709920496070892">Zeitraum ohne Nutzereingabe, nach dem eine Warnung angezeigt wird, angegeben in Millisekunden.</translation>
 <translation id="8890438048579188548">Warnungen zu veralteten Funktionen für <ph name="CLOUD_PRINT_NAME" /> ausblenden</translation>
 <translation id="8892286064305622118">Erforderlicher freier Speicherplatz für <ph name="PLUGIN_VM_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 2d32735..8792d0a 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -340,6 +340,7 @@
       정책을 사용 중지하거나 설정하지 않으면 <ph name="PRODUCT_NAME" />의 이미지로 인쇄 옵션이 인쇄 미리보기에서 사용자에게 제공되지 않으며, PDF가 대상 프린터로 전송되기 전에 이미지로 래스터화되지 않고 평소와 같이 인쇄됩니다.</translation>
 <translation id="1435659902881071157">기기 수준 네트워크 설정</translation>
 <translation id="1438739959477268107">기본 키 생성 설정</translation>
+<translation id="1440408958042020947">휴대전화 허브를 통해 휴대전화의 최근 촬영 사진 및 동영상에 액세스하도록 선택한 사용자를 허용합니다.</translation>
 <translation id="1449083855104537880">이 정책을 True로 설정하면 작업 표시줄 메뉴에 접근성 옵션이 표시됩니다. 정책을 False로 설정하면 작업 표시줄 메뉴에 접근성 옵션이 표시되지 않습니다.
 
       정책을 설정하면 사용자가 변경할 수 없습니다. 설정하지 않으면 작업 표시줄 메뉴에 접근성 옵션이 표시되지 않지만 사용자는 설정 페이지에서 이 옵션이 표시되도록 할 수 있습니다.
@@ -2304,6 +2305,7 @@
 <translation id="3606571057705314194">시작 시 프로필 선택도구 사용 안함</translation>
 <translation id="3627678165642179114">맞춤법 검사 웹 서비스 사용 또는 사용 중지</translation>
 <translation id="3628480121685794414">단면 인쇄 사용 설정</translation>
+<translation id="3634125384445314047">휴대전화에서 최근 촬영한 사진 및 동영상을 휴대전화 허브에서 액세스하도록 허용합니다.</translation>
 <translation id="3643284063603988867">'비밀번호 기억' 기능 사용 설정</translation>
 <translation id="3646859102161347133">화면 돋보기 유형 설정</translation>
 <translation id="3647212518036289905">정책을 설정하면 HTTP 인증에 사용할 GSSAPI 라이브러리가 지정됩니다. 정책을 라이브러리 이름 또는 전체 경로 중 하나로 설정합니다.
@@ -6302,6 +6304,11 @@
           이 정책은 <ph name="IDLE_ACTION_AC_POLICY_NAME" /> 및 <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> 정책과 같이 더 구체적인 정책의 대체 값을 제공합니다. 더 구체적인 정책이 설정되지 않은 경우 이 정책에 설정된 대체 값이 사용됩니다.
 
           이 정책이 설정되지 않아도 더 구체적인 정책 사용에 영향을 주지 않습니다.</translation>
+<translation id="8349255653850367353">이 설정을 켜면 휴대전화 허브를 이미 선택한 사용자가 휴대전화에서 최근 촬영한 사진 및 동영상을 Chrome OS에서 확인하고 다운로드할 수 있습니다.
+
+      설정을 끄면 사용자가 이 기능을 사용할 수 없습니다. <ph name="PHONE_HUB_ALLOWED_POLICY_NAME" /> 정책을 꺼도 사용자가 이 기능을 사용할 수 없습니다.
+
+      정책을 설정하지 않으면 기본적으로 기업 관리 사용자 및 관리되지 않는 사용자 모두 사진과 동영상을 확인 및 다운로드할 수 있게 됩니다.</translation>
 <translation id="8357681633047935212">사용자 세션의 길이를 제한합니다.</translation>
 <translation id="8357989008292691856">로그인이 허용된 사용자 목록</translation>
 <translation id="8359734107661430198">ExampleDeprecatedFeature API를 2008년 9월 2일까지 사용하도록 설정</translation>
@@ -6769,6 +6776,7 @@
       설정하지 않거나 빈 문자열을 입력할 경우 기기는 현재 활성화된 시간대를 사용하지만 사용자가 변경할 수 있습니다.</translation>
 <translation id="8880294585549584028">다음 사이트에서 파일 및 디렉터리 쓰기 액세스 허용</translation>
 <translation id="8882006618241293596">이 사이트에서 <ph name="FLASH_PLUGIN_NAME" /> 플러그인 차단</translation>
+<translation id="8882255181490012651">휴대전화 허브를 통해 휴대전화에서 최근 촬영한 사진 및 동영상에 액세스하도록 선택한 사용자를 허용하지 않습니다.</translation>
 <translation id="8887709920496070892">사용자의 입력 없어서 경고 대화상자가 표시되기까지 걸리는 시간(밀리초)입니다.</translation>
 <translation id="8890438048579188548"><ph name="CLOUD_PRINT_NAME" /> 지원 중단 경고 숨기기</translation>
 <translation id="8892286064305622118"><ph name="PLUGIN_VM_NAME" />에 필요한 디스크 여유 공간</translation>
diff --git a/components/reporting/proto/synced/metric_data.proto b/components/reporting/proto/synced/metric_data.proto
index 8568b80..17f0188 100644
--- a/components/reporting/proto/synced/metric_data.proto
+++ b/components/reporting/proto/synced/metric_data.proto
@@ -87,38 +87,20 @@
   optional string gateway = 6;
   // Network connection type.
   optional NetworkType type = 7;
-  // Telemetry related to a specific type of network interface.
-  repeated NetworkInterfaceTelemetry network_interface_telemetry = 8;
-}
-
-// Telemetry that is specific to a certain type of network interface.
-message NetworkInterfaceTelemetry {
-  // Name of the wireless interface
-  optional string interface_name = 1;
-  // The interface represented in the message.
-  oneof interface {
-    // Telemetry for wireless interfaces.
-    WirelessInterfaceTelemetry wireless_interface = 2;
-  }
-}
-
-message WirelessInterfaceTelemetry {
-  // If power management for wifi is enabled.
-  optional bool power_management_enabled = 1;
   // Access point address.
-  optional string access_point_address = 2;
+  optional string access_point_address = 8;
   // Transmission bit rate measured in Mbps.
-  optional int64 tx_bit_rate_mbps = 3;
+  optional int64 tx_bit_rate_mbps = 9;
   // Receiving bit rate measured in Mbps.
-  optional int64 rx_bit_rate_mbps = 4;
+  optional int64 rx_bit_rate_mbps = 10;
   // Transmission power measured in dBm.
-  optional int32 tx_power_dbm = 5;
+  optional int32 tx_power_dbm = 11;
   // Is wifi encryption key on or not.
-  optional bool encryption_on = 6;
+  optional bool encryption_on = 12;
   // Wifi link quality.
-  optional int64 link_quality = 7;
-  // Wifi signal level in dBm.
-  optional int32 signal_level_dbm = 8;
+  optional int64 link_quality = 13;
+  // Wifi power management enabled
+  optional bool power_management_enabled = 14;
 }
 
 // Configured networks telemetry data.
diff --git a/components/services/app_service/public/cpp/intent_util.cc b/components/services/app_service/public/cpp/intent_util.cc
index d08a448..275b648 100644
--- a/components/services/app_service/public/cpp/intent_util.cc
+++ b/components/services/app_service/public/cpp/intent_util.cc
@@ -610,22 +610,20 @@
 absl::optional<std::string> GetStringValueFromDict(
     const base::DictionaryValue& dict,
     const std::string& key_name) {
-  if (!dict.HasKey(key_name))
+  const base::Value* value = dict.FindKey(key_name);
+  if (!value)
     return absl::nullopt;
 
-  const std::string* value = dict.FindStringKey(key_name);
-  if (!value || value->empty())
+  const std::string* string_value = value->GetIfString();
+  if (!string_value || string_value->empty())
     return absl::nullopt;
 
-  return *value;
+  return *string_value;
 }
 
 apps::mojom::OptionalBool GetBoolValueFromDict(
     const base::DictionaryValue& dict,
     const std::string& key_name) {
-  if (!dict.HasKey(key_name))
-    return apps::mojom::OptionalBool::kUnknown;
-
   absl::optional<bool> value = dict.FindBoolKey(key_name);
   if (!value.has_value())
     return apps::mojom::OptionalBool::kUnknown;
@@ -636,9 +634,6 @@
 
 absl::optional<GURL> GetGurlValueFromDict(const base::DictionaryValue& dict,
                                           const std::string& key_name) {
-  if (!dict.HasKey(key_name))
-    return absl::nullopt;
-
   const std::string* url_spec = dict.FindStringKey(key_name);
   if (!url_spec)
     return absl::nullopt;
@@ -653,9 +648,6 @@
 absl::optional<std::vector<apps::mojom::IntentFilePtr>> GetFilesFromDict(
     const base::DictionaryValue& dict,
     const std::string& key_name) {
-  if (!dict.HasKey(key_name))
-    return absl::nullopt;
-
   const base::Value* value = dict.FindListKey(key_name);
   if (!value || !value->is_list() || value->GetList().empty())
     return absl::nullopt;
@@ -675,9 +667,6 @@
 absl::optional<std::vector<std::string>> GetCategoriesFromDict(
     const base::DictionaryValue& dict,
     const std::string& key_name) {
-  if (!dict.HasKey(key_name))
-    return absl::nullopt;
-
   const base::Value* value = dict.FindListKey(key_name);
   if (!value || !value->is_list() || value->GetList().empty())
     return absl::nullopt;
@@ -692,9 +681,6 @@
 absl::optional<base::flat_map<std::string, std::string>> GetExtrasFromDict(
     const base::DictionaryValue& dict,
     const std::string& key_name) {
-  if (!dict.HasKey(key_name))
-    return absl::nullopt;
-
   const base::Value* value = dict.FindDictKey(key_name);
   if (!value || !value->is_dict())
     return absl::nullopt;
diff --git a/components/sync/base/pref_names.cc b/components/sync/base/pref_names.cc
index 63a33f1c..7d79917 100644
--- a/components/sync/base/pref_names.cc
+++ b/components/sync/base/pref_names.cc
@@ -23,10 +23,6 @@
 // SyncSettingsCategorization rollout.
 const char kOsSyncPrefsMigrated[] = "sync.os_sync_prefs_migrated";
 
-// Boolean indicating that the user has enabled the Chrome OS system-setting
-// sync feature.
-const char kOsSyncFeatureEnabled[] = "sync.os_sync_feature_enabled";
-
 // Boolean specifying whether to automatically sync all Chrome OS specific data
 // types (including future ones). This includes types like printers, OS-only
 // settings, etc. If set, the individual type preferences can be ignored.
diff --git a/components/sync/base/pref_names.h b/components/sync/base/pref_names.h
index 9538b77..be3763f 100644
--- a/components/sync/base/pref_names.h
+++ b/components/sync/base/pref_names.h
@@ -17,7 +17,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 extern const char kOsSyncPrefsMigrated[];
-extern const char kOsSyncFeatureEnabled[];
 extern const char kSyncAllOsTypes[];
 extern const char kSyncOsApps[];
 extern const char kSyncOsPreferences[];
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc
index fb2c460..96f4102 100644
--- a/components/sync/base/sync_prefs.cc
+++ b/components/sync/base/sync_prefs.cc
@@ -77,7 +77,6 @@
   }
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   registry->RegisterBooleanPref(prefs::kOsSyncPrefsMigrated, false);
-  registry->RegisterBooleanPref(prefs::kOsSyncFeatureEnabled, false);
   registry->RegisterBooleanPref(prefs::kSyncAllOsTypes, true);
   registry->RegisterBooleanPref(prefs::kSyncOsApps, false);
   registry->RegisterBooleanPref(prefs::kSyncOsPreferences, false);
@@ -231,16 +230,6 @@
   }
 }
 
-bool SyncPrefs::IsOsSyncFeatureEnabled() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return pref_service_->GetBoolean(prefs::kOsSyncFeatureEnabled);
-}
-
-void SyncPrefs::SetOsSyncFeatureEnabled(bool enabled) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  pref_service_->SetBoolean(prefs::kOsSyncFeatureEnabled, enabled);
-}
-
 // static
 const char* SyncPrefs::GetPrefNameForOsType(UserSelectableOsType type) {
   switch (type) {
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h
index 720410b..f2ef64a 100644
--- a/components/sync/base/sync_prefs.h
+++ b/components/sync/base/sync_prefs.h
@@ -90,8 +90,6 @@
   void SetSelectedOsTypes(bool sync_all_os_types,
                           UserSelectableOsTypeSet registered_types,
                           UserSelectableOsTypeSet selected_types);
-  bool IsOsSyncFeatureEnabled() const;
-  void SetOsSyncFeatureEnabled(bool enabled);
 
   // Maps |type| to its corresponding preference name. Returns nullptr if |type|
   // isn't an OS type.
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc
index 88bb41b..0fce6c61 100644
--- a/components/sync/driver/sync_internals_util.cc
+++ b/components/sync/driver/sync_internals_util.cc
@@ -483,13 +483,8 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   if (!chromeos::features::IsSyncSettingsCategorizationEnabled()) {
     os_feature_state->Set("Flag disabled");
-  } else if (!chromeos::features::IsSyncConsentOptionalEnabled()) {
-    DCHECK(service->GetUserSettings()->IsOsSyncFeatureEnabled());
-    os_feature_state->Set("Enforced Enabled");
-  } else if (service->GetUserSettings()->IsOsSyncFeatureEnabled()) {
-    os_feature_state->Set("Enabled");
   } else {
-    os_feature_state->Set("Disabled");
+    os_feature_state->Set("Enforced Enabled");
   }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   feature_enabled->Set(service->IsSyncFeatureEnabled());
diff --git a/components/sync/driver/sync_user_settings.h b/components/sync/driver/sync_user_settings.h
index c685c14d..5d5a3f4 100644
--- a/components/sync/driver/sync_user_settings.h
+++ b/components/sync/driver/sync_user_settings.h
@@ -71,11 +71,6 @@
   virtual void SetSelectedOsTypes(bool sync_all_os_types,
                                   UserSelectableOsTypeSet types) = 0;
   virtual UserSelectableOsTypeSet GetRegisteredSelectableOsTypes() const = 0;
-
-  // Whether the OS sync feature is enabled. Implies the user has consented.
-  // Exists in this interface for easier mocking in tests.
-  virtual bool IsOsSyncFeatureEnabled() const = 0;
-  virtual void SetOsSyncFeatureEnabled(bool enabled) = 0;
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   // Encryption state.
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc
index abdf2097..12f8f39e 100644
--- a/components/sync/driver/sync_user_settings_impl.cc
+++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -145,18 +145,6 @@
   }
   return registered_types;
 }
-
-bool SyncUserSettingsImpl::IsOsSyncFeatureEnabled() const {
-  DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
-  return prefs_->IsOsSyncFeatureEnabled();
-}
-
-void SyncUserSettingsImpl::SetOsSyncFeatureEnabled(bool enabled) {
-  DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
-  // OsSyncFeature can't be disabled unless SyncConsentOptional is on.
-  DCHECK(enabled || chromeos::features::IsSyncConsentOptionalEnabled());
-  prefs_->SetOsSyncFeatureEnabled(enabled);
-}
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 bool SyncUserSettingsImpl::IsCustomPassphraseAllowed() const {
diff --git a/components/sync/driver/sync_user_settings_impl.h b/components/sync/driver/sync_user_settings_impl.h
index fe3c5a1..16ce051 100644
--- a/components/sync/driver/sync_user_settings_impl.h
+++ b/components/sync/driver/sync_user_settings_impl.h
@@ -49,9 +49,6 @@
   void SetSelectedOsTypes(bool sync_all_os_types,
                           UserSelectableOsTypeSet types) override;
   UserSelectableOsTypeSet GetRegisteredSelectableOsTypes() const override;
-
-  bool IsOsSyncFeatureEnabled() const override;
-  void SetOsSyncFeatureEnabled(bool enabled) override;
 #endif
 
   bool IsCustomPassphraseAllowed() const override;
diff --git a/components/sync/driver/sync_user_settings_mock.h b/components/sync/driver/sync_user_settings_mock.h
index 3e9880c..b92bd40 100644
--- a/components/sync/driver/sync_user_settings_mock.h
+++ b/components/sync/driver/sync_user_settings_mock.h
@@ -49,8 +49,6 @@
               GetRegisteredSelectableOsTypes,
               (),
               (const override));
-  MOCK_METHOD(bool, IsOsSyncFeatureEnabled, (), (const override));
-  MOCK_METHOD(void, SetOsSyncFeatureEnabled, (bool), (override));
 #endif
   MOCK_METHOD(bool, IsCustomPassphraseAllowed, (), (const override));
   MOCK_METHOD(bool, IsEncryptEverythingEnabled, (), (const override));
diff --git a/components/sync/driver/test_sync_user_settings.cc b/components/sync/driver/test_sync_user_settings.cc
index 7794b94..2bf25df 100644
--- a/components/sync/driver/test_sync_user_settings.cc
+++ b/components/sync/driver/test_sync_user_settings.cc
@@ -115,14 +115,6 @@
     const {
   return UserSelectableOsTypeSet::All();
 }
-
-bool TestSyncUserSettings::IsOsSyncFeatureEnabled() const {
-  return os_sync_feature_enabled_;
-}
-
-void TestSyncUserSettings::SetOsSyncFeatureEnabled(bool enabled) {
-  os_sync_feature_enabled_ = enabled;
-}
 #endif
 
 bool TestSyncUserSettings::IsCustomPassphraseAllowed() const {
diff --git a/components/sync/driver/test_sync_user_settings.h b/components/sync/driver/test_sync_user_settings.h
index c8be418..acb8e3b4 100644
--- a/components/sync/driver/test_sync_user_settings.h
+++ b/components/sync/driver/test_sync_user_settings.h
@@ -40,9 +40,6 @@
   void SetSelectedOsTypes(bool sync_all_os_types,
                           UserSelectableOsTypeSet types) override;
   UserSelectableOsTypeSet GetRegisteredSelectableOsTypes() const override;
-
-  bool IsOsSyncFeatureEnabled() const override;
-  void SetOsSyncFeatureEnabled(bool enabled) override;
 #endif
 
   bool IsCustomPassphraseAllowed() const override;
@@ -79,7 +76,6 @@
   bool first_setup_complete_ = true;
   bool sync_everything_enabled_ = true;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  bool os_sync_feature_enabled_ = true;
   bool sync_all_os_types_enabled_ = true;
 #endif
 
diff --git a/components/sync/engine/net/sync_server_connection_manager.cc b/components/sync/engine/net/sync_server_connection_manager.cc
index bb3350b3..217fc773 100644
--- a/components/sync/engine/net/sync_server_connection_manager.cc
+++ b/components/sync/engine/net/sync_server_connection_manager.cc
@@ -37,7 +37,6 @@
                     const std::string& access_token,
                     const std::string& payload);
   bool ReadBufferResponse(std::string* buffer_out, HttpResponse* response);
-  bool ReadDownloadResponse(HttpResponse* response, std::string* buffer_out);
 
   // CancelationSignal::Observer overrides.
   void OnCancelationSignalReceived() override;
@@ -135,20 +134,6 @@
   return true;
 }
 
-bool Connection::ReadDownloadResponse(HttpResponse* response,
-                                      std::string* buffer_out) {
-  const int64_t bytes_read =
-      ReadResponse(buffer_out, static_cast<int>(response->content_length));
-
-  if (bytes_read != response->content_length) {
-    LOG(ERROR) << "Mismatched content lengths, server claimed "
-               << response->content_length << ", but sent " << bytes_read;
-    response->server_status = HttpResponse::IO_ERROR;
-    return false;
-  }
-  return true;
-}
-
 int Connection::ReadResponse(std::string* out_buffer, int length) const {
   int bytes_read = buffer_.length();
   CHECK_LE(length, bytes_read);
diff --git a/content/browser/attribution_reporting/attribution_internals.mojom b/content/browser/attribution_reporting/attribution_internals.mojom
index 2f38fd0..4b272f86 100644
--- a/content/browser/attribution_reporting/attribution_internals.mojom
+++ b/content/browser/attribution_reporting/attribution_internals.mojom
@@ -26,6 +26,7 @@
 
   enum Status {
     kPending,
+    kDroppedDueToRateLimiting,
     kDroppedDueToLowPriority,
     kDroppedForNoise,
     kProhibitedByBrowserPolicy,
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
index 44045e3c..cbe9df52 100644
--- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -377,12 +377,18 @@
           .SetReportTime(now + base::Hours(2))
           .SetPriority(12)
           .Build()));
+  manager_.NotifyReportDropped(AttributionStorage::CreateReportResult(
+      CreateReportStatus::kRateLimited,
+      ReportBuilder(SourceBuilder(now).Build())
+          .SetReportTime(now + base::Hours(6))
+          .SetPriority(-3)
+          .Build()));
 
   {
     static constexpr char wait_script[] = R"(
       let table = document.querySelector("#report-table-wrapper tbody");
       let obs = new MutationObserver(() => {
-        if (table.children.length === 6 &&
+        if (table.children.length === 7 &&
             table.children[0].children[1].innerText === "https://conversion.test" &&
             table.children[0].children[2].innerText ===
               "https://report.test/.well-known/attribution-reporting/report-attribution" &&
@@ -397,7 +403,8 @@
             table.children[3].children[6].innerText === "no" &&
             table.children[3].children[7].innerText === "Sent: HTTP 200" &&
             table.children[4].children[7].innerText === "Prohibited by browser policy" &&
-            table.children[5].children[7].innerText === "Network error") {
+            table.children[5].children[7].innerText === "Network error" &&
+            table.children[6].children[7].innerText === "Dropped due to rate-limiting") {
           document.title = $1;
         }
       });
@@ -413,22 +420,23 @@
     static constexpr char wait_script[] = R"(
       let table = document.querySelector("#report-table-wrapper tbody");
       let obs = new MutationObserver(() => {
-        if (table.children.length === 6 &&
-            table.children[5].children[1].innerText === "https://conversion.test" &&
-            table.children[5].children[2].innerText ===
+        if (table.children.length === 7 &&
+            table.children[6].children[1].innerText === "https://conversion.test" &&
+            table.children[6].children[2].innerText ===
               "https://report.test/.well-known/attribution-reporting/report-attribution" &&
-            table.children[5].children[5].innerText === "13" &&
-            table.children[5].children[6].innerText === "yes" &&
-            table.children[5].children[7].innerText === "Pending" &&
-            table.children[4].children[5].innerText === "12" &&
-            table.children[4].children[7].innerText === "Dropped for noise" &&
-            table.children[3].children[5].innerText === "11" &&
-            table.children[3].children[7].innerText === "Dropped due to low priority" &&
-            table.children[2].children[5].innerText === "0" &&
-            table.children[2].children[6].innerText === "no" &&
-            table.children[2].children[7].innerText === "Sent: HTTP 200" &&
-            table.children[1].children[7].innerText === "Prohibited by browser policy" &&
-            table.children[0].children[7].innerText === "Network error") {
+            table.children[6].children[5].innerText === "13" &&
+            table.children[6].children[6].innerText === "yes" &&
+            table.children[6].children[7].innerText === "Pending" &&
+            table.children[5].children[5].innerText === "12" &&
+            table.children[5].children[7].innerText === "Dropped for noise" &&
+            table.children[4].children[5].innerText === "11" &&
+            table.children[4].children[7].innerText === "Dropped due to low priority" &&
+            table.children[3].children[5].innerText === "0" &&
+            table.children[3].children[6].innerText === "no" &&
+            table.children[3].children[7].innerText === "Sent: HTTP 200" &&
+            table.children[2].children[7].innerText === "Prohibited by browser policy" &&
+            table.children[1].children[7].innerText === "Network error" &&
+            table.children[0].children[7].innerText === "Dropped due to rate-limiting") {
           document.title = $1;
         }
       });
@@ -446,7 +454,7 @@
     static constexpr char wait_script[] = R"(
       let table = document.querySelector("#report-table-wrapper tbody");
       let obs = new MutationObserver(() => {
-        if (table.children.length === 6 &&
+        if (table.children.length === 7 &&
             table.children[0].children[1].innerText === "https://conversion.test" &&
             table.children[0].children[2].innerText ===
               "https://report.test/.well-known/attribution-reporting/report-attribution" &&
@@ -461,7 +469,8 @@
             table.children[3].children[6].innerText === "no" &&
             table.children[3].children[7].innerText === "Sent: HTTP 200" &&
             table.children[4].children[7].innerText === "Prohibited by browser policy" &&
-            table.children[5].children[7].innerText === "Network error") {
+            table.children[5].children[7].innerText === "Network error" &&
+            table.children[6].children[7].innerText === "Dropped due to rate-limiting") {
           document.title = $1;
         }
       });
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
index 07cc594..108e59d 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -250,6 +250,9 @@
     case CreateReportStatus::kDroppedForNoise:
       status = mojom::WebUIAttributionReport::Status::kDroppedForNoise;
       break;
+    case CreateReportStatus::kRateLimited:
+      status = mojom::WebUIAttributionReport::Status::kDroppedDueToRateLimiting;
+      break;
     default:
       NOTREACHED();
       return;
diff --git a/content/browser/attribution_reporting/attribution_storage.cc b/content/browser/attribution_reporting/attribution_storage.cc
index fcb17369..027e696d 100644
--- a/content/browser/attribution_reporting/attribution_storage.cc
+++ b/content/browser/attribution_reporting/attribution_storage.cc
@@ -25,6 +25,7 @@
           dropped_report_source_deactivation_reason),
       report_time_(report_time) {
   DCHECK_EQ(status_ == Status::kSuccessDroppedLowerPriority ||
+                status_ == Status::kRateLimited ||
                 status_ == Status::kPriorityTooLow ||
                 status_ == Status::kDroppedForNoise,
             dropped_report_.has_value());
diff --git a/content/browser/attribution_reporting/attribution_storage.h b/content/browser/attribution_reporting/attribution_storage.h
index 7136a8c..b21f0e3 100644
--- a/content/browser/attribution_reporting/attribution_storage.h
+++ b/content/browser/attribution_reporting/attribution_storage.h
@@ -193,7 +193,7 @@
     Status status_;
 
     // Null unless `status` is `kSuccessDroppedLowerPriority`,
-    // `kPriorityTooLow`, or `kDroppedForNoise`.
+    // `kRateLimited`, `kPriorityTooLow`, or `kDroppedForNoise`.
     absl::optional<AttributionReport> dropped_report_;
 
     // Null unless `dropped_report_`'s source was deactivated.
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index 4753c0a..b8aac4a2 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -671,7 +671,8 @@
     case RateLimitTable::AttributionAllowedStatus::kAllowed:
       break;
     case RateLimitTable::AttributionAllowedStatus::kNotAllowed:
-      return CreateReportResult(CreateReportStatus::kRateLimited);
+      return CreateReportResult(CreateReportStatus::kRateLimited,
+                                std::move(report));
     case RateLimitTable::AttributionAllowedStatus::kError:
       return CreateReportResult(CreateReportStatus::kInternalError);
   }
@@ -1494,26 +1495,20 @@
   if (db_empty)
     return CreateSchema();
 
-  int current_version = kCurrentVersionNumber;
-  if (!sql::MetaTable::DoesTableExist(db_.get())) {
-    // Version 1 of the schema did not have a metadata table.
-    current_version = 1;
-    if (!meta_table_.Init(db_.get(), current_version, kCompatibleVersionNumber))
-      return false;
-  } else {
-    if (!meta_table_.Init(db_.get(), current_version, kCompatibleVersionNumber))
-      return false;
-    current_version = meta_table_.GetVersionNumber();
-  }
+  // Create the meta table if it doesn't already exist. The only version for
+  // which this is the case is version 1.
+  if (!meta_table_.Init(db_.get(), /*version=*/1, kCompatibleVersionNumber))
+    return false;
 
-  if (current_version == kCurrentVersionNumber)
+  int version = meta_table_.GetVersionNumber();
+  if (version == kCurrentVersionNumber)
     return true;
 
   // Recreate the DB if the version is deprecated or too new. In the latter
   // case, the DB will never work until Chrome is re-upgraded. Assume the user
   // will continue using this Chrome version and raze the DB to get attribution
   // reporting working.
-  if (current_version <= kDeprecatedVersionNumber ||
+  if (version <= kDeprecatedVersionNumber ||
       meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) {
     // Note that this also razes the meta table, so it will need to be
     // initialized again.
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc
index 4f1403c..e2afe50 100644
--- a/content/browser/attribution_reporting/attribution_storage_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -782,8 +782,10 @@
             MaybeCreateAndStoreReport(conversion));
   EXPECT_EQ(CreateReportStatus::kSuccess,
             MaybeCreateAndStoreReport(conversion));
-  EXPECT_EQ(CreateReportStatus::kRateLimited,
-            MaybeCreateAndStoreReport(conversion));
+  EXPECT_THAT(storage()->MaybeCreateAndStoreReport(conversion),
+              AllOf(Property(&CreateReportResult::status,
+                             CreateReportStatus::kRateLimited),
+                    Property(&CreateReportResult::dropped_report, IsTrue())));
 
   const AttributionReport expected_report =
       GetExpectedReport(impression, conversion);
diff --git a/content/browser/media/media_internals_cdm_helper.cc b/content/browser/media/media_internals_cdm_helper.cc
index b475a30..10906a23a 100644
--- a/content/browser/media/media_internals_cdm_helper.cc
+++ b/content/browser/media/media_internals_cdm_helper.cc
@@ -151,7 +151,7 @@
 void MediaInternalsCdmHelper::SendCdmUpdate() {
   auto cdms = CdmRegistryImpl::GetInstance()->GetRegisteredCdms();
 
-  base::Value cdm_list;
+  base::Value cdm_list(base::Value::Type::LIST);
   for (const auto& cdm_info : cdms) {
     cdm_list.Append(CdmInfoToValue(cdm_info));
   }
diff --git a/content/browser/resources/attribution_reporting/attribution_internals.js b/content/browser/resources/attribution_reporting/attribution_internals.js
index 09849d5b..b6d91aff 100644
--- a/content/browser/resources/attribution_reporting/attribution_internals.js
+++ b/content/browser/resources/attribution_reporting/attribution_internals.js
@@ -394,6 +394,9 @@
       case WebUIAttributionReport_Status.kPending:
         this.status = 'Pending';
         break;
+      case WebUIAttributionReport_Status.kDroppedDueToRateLimiting:
+        this.status = 'Dropped due to rate-limiting';
+        break;
       case WebUIAttributionReport_Status.kDroppedDueToLowPriority:
         this.status = 'Dropped due to low priority';
         break;
diff --git a/content/renderer/media/batching_media_log.cc b/content/renderer/media/batching_media_log.cc
index 381d6f54..4e584cf 100644
--- a/content/renderer/media/batching_media_log.cc
+++ b/content/renderer/media/batching_media_log.cc
@@ -31,7 +31,7 @@
   if (event.type == media::MediaLogRecord::Type::kMediaStatus) {
     DVLOG(1) << "MediaEvent: " << ToJSON(event);
   } else if (event.type == media::MediaLogRecord::Type::kMessage &&
-             event.params.HasKey("error")) {
+             event.params.FindKey("error")) {
     DVLOG(1) << "MediaEvent: " << ToJSON(event);
   } else if (event.type != media::MediaLogRecord::Type::kMediaPropertyChange) {
     DVLOG(1) << "MediaEvent: " << ToJSON(event);
@@ -98,7 +98,7 @@
         break;
 
       case media::MediaLogRecord::Type::kMediaEventTriggered: {
-        DCHECK(event->params.HasKey(MediaLog::kEventKey));
+        DCHECK(event->params.FindKey(MediaLog::kEventKey));
         const auto* event_key =
             event->params.FindStringKey(MediaLog::kEventKey);
         if (*event_key == kDurationChangedMessage) {
@@ -114,7 +114,7 @@
       }
 
       case media::MediaLogRecord::Type::kMessage:
-        if (event->params.HasKey(media::MediaLogMessageLevelToString(
+        if (event->params.FindKey(media::MediaLogMessageLevelToString(
                 media::MediaLogMessageLevel::kERROR)) &&
             !cached_media_error_for_message_) {
           cached_media_error_for_message_ = *event;
diff --git a/device/bluetooth/bluetooth_gatt_service.h b/device/bluetooth/bluetooth_gatt_service.h
index 315aaba..254c62c 100644
--- a/device/bluetooth/bluetooth_gatt_service.h
+++ b/device/bluetooth/bluetooth_gatt_service.h
@@ -21,15 +21,20 @@
  public:
   // Interacting with Characteristics and Descriptors can produce
   // this set of errors.
+  // These values are persisted to logs. Entries should not be renumbered and
+  // numeric values should never be reused. This enum should be kept in sync
+  // with the BluetoothGattServiceGattErrorCode enum in
+  // src/tools/metrics/histograms/enums.xml.
   enum GattErrorCode {
     GATT_ERROR_UNKNOWN = 0,
-    GATT_ERROR_FAILED,
-    GATT_ERROR_IN_PROGRESS,
-    GATT_ERROR_INVALID_LENGTH,
-    GATT_ERROR_NOT_PERMITTED,
-    GATT_ERROR_NOT_AUTHORIZED,
-    GATT_ERROR_NOT_PAIRED,
-    GATT_ERROR_NOT_SUPPORTED
+    GATT_ERROR_FAILED = 1,
+    GATT_ERROR_IN_PROGRESS = 2,
+    GATT_ERROR_INVALID_LENGTH = 3,
+    GATT_ERROR_NOT_PERMITTED = 4,
+    GATT_ERROR_NOT_AUTHORIZED = 5,
+    GATT_ERROR_NOT_PAIRED = 6,
+    GATT_ERROR_NOT_SUPPORTED = 7,
+    kMaxValue = GATT_ERROR_NOT_SUPPORTED,
   };
 
   // The ErrorCallback is used by methods to asynchronously report errors.
diff --git a/docs/mojo_and_services.md b/docs/mojo_and_services.md
index ac69e43..38a3d37 100644
--- a/docs/mojo_and_services.md
+++ b/docs/mojo_and_services.md
@@ -491,6 +491,39 @@
 }
 ```
 
+Workers also have `BrowserInterfaceBroker` connections between the renderer and
+the corresponding remote implementation in the browser process. Adding new
+worker-specific interfaces is similar to the steps detailed above for frames,
+with the following differences:
+ - For Dedicated Workers, add a new method to
+   [`DedicatedWorkerHost`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/worker_host/dedicated_worker_host.h)
+   and register it in
+   [`PopulateDedicatedWorkerBinders`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/browser_interface_binders.cc;l=1126;drc=e24e0a914ff0da18e78044ebad7518afe9e13847)
+ - For Shared Workers, add a new method to
+   [`SharedWorkerHost`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/worker_host/shared_worker_host.h)
+   and register it in
+   [`PopulateSharedWorkerBinders`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/browser_interface_binders.cc;l=1232;drc=e24e0a914ff0da18e78044ebad7518afe9e13847)
+ - For Service Workers, add a new method to
+   [`ServiceWorkerHost`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/service_worker/service_worker_host.h)
+   and register it in
+   [`PopulateServiceWorkerBinders`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/browser_interface_binders.cc;l=1326;drc=e24e0a914ff0da18e78044ebad7518afe9e13847)
+
+Interfaces can also be added at the process level using the
+`BrowserInterfaceBroker` connection between the Blink `Platform` object in the
+renderer and the corresponding `RenderProcessHost` object in the browser
+process. This allows any thread (including frame and worker threads) in the
+renderer to access the interface, but comes with additional overhead because
+the `BrowserInterfaceBroker` implementation used must be thread-safe. To add a
+new process-level interface, add a new method to `RenderProcessHostImpl` and
+register it using a call to
+[`AddUIThreadInterface`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/renderer_host/render_process_host_impl.h;l=918;drc=ec5eaba0e021b757d5cbbf2c27ac8f06809d81e9)
+in
+[`RenderProcessHostImpl::RegisterMojoInterfaces`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/renderer_host/render_process_host_impl.cc;l=2317;drc=a817d852ea2f2085624d64154ad847dfa3faaeb6).
+On the renderer side, use
+[`Platform::GetBrowserInterfaceBroker`](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/public/platform/platform.h;l=781;drc=ee1482552c4c97b40f15605fe6a52565cfe74548)
+to retrieve the corresponding `BrowserInterfaceBroker` object to call
+`GetInterface` on.
+
 For binding an embedder-specific document-scoped interface, override
 [`ContentBrowserClient::RegisterBrowserInterfaceBindersForFrame()`](https://cs.chromium.org/chromium/src/content/public/browser/content_browser_client.h?rcl=3eb14ce219e383daa0cd8d743f475f9d9ce8c81a&l=999)
 and add the binders to the provided map.
@@ -508,7 +541,30 @@
 to have the renderer and browser sides consistent if possible.
 ***
 
-TODO: add information about workers.
+### Navigation-Associated Interfaces
+
+For cases where the ordering of messages from different frames is important,
+and when messages need to be ordered correctly with respect to the messages
+implementing navigation, navigation-associated interfaces can be used.
+Navigation-associated interfaces leverage connections from each frame to the
+corresponding `RenderFrameHostImpl` object and send messages from each
+connection over the same FIFO pipe that's used for messages relating to
+navigation. As a result, messages sent after a navigation are guaranteed to
+arrive in the browser process after the navigation-related messages, and the
+ordering of messages sent from different frames of the same document is
+preserved as well.
+
+To add a new navigation-associated interface, create a new method for
+`RenderFrameHostImpl` and register it with a call to
+`associated_registry_->AddInterface` in
+[`RenderFrameHostImpl::SetUpMojoConnection`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/renderer_host/render_frame_host_impl.cc;l=8365;drc=a817d852ea2f2085624d64154ad847dfa3faaeb6).
+From the renderer, use
+[`LocalFrame::GetRemoteNavigationAssociatedInterfaces`](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/local_frame.h;l=409;drc=19f17a30e102f811bc90a13f79e8ad39193a6403)
+to get an object to call
+`GetInterface` on (this call is similar to
+`BrowserInterfaceBroker::GetInterface` except that it takes a
+[pending associated receiver](https://chromium.googlesource.com/chromium/src/+/main/mojo/public/cpp/bindings/README.md#associated-interfaces)
+instead of a pending receiver).
 
 ## Additional Support
 
diff --git a/extensions/common/api/runtime.json b/extensions/common/api/runtime.json
index 2052002f..4e5da82 100644
--- a/extensions/common/api/runtime.json
+++ b/extensions/common/api/runtime.json
@@ -173,12 +173,12 @@
         "name": "openOptionsPage",
         "type": "function",
         "description": "<p>Open your Extension's options page, if possible.</p><p>The precise behavior may depend on your manifest's <code><a href=\"optionsV2\">options_ui</a></code> or <code><a href=\"options\">options_page</a></code> key, or what Chrome happens to support at the time. For example, the page may be opened in a new tab, within chrome://extensions, within an App, or it may just focus an open options page. It will never cause the caller page to reload.</p><p>If your Extension does not declare an options page, or Chrome failed to create one for some other reason, the callback will set $(ref:lastError).</p>",
-        "parameters": [{
-          "type": "function",
+        "parameters": [],
+        "returns_async": {
           "name": "callback",
           "parameters": [],
           "optional": true
-        }]
+        }
       },
       {
         "name": "getManifest",
@@ -220,15 +220,14 @@
             "name": "url",
             "maxLength": 255,
             "description": "URL to be opened after the extension is uninstalled. This URL must have an http: or https: scheme. Set an empty string to not open a new tab upon uninstallation."
-          },
-          {
-            "type": "function",
-            "name": "callback",
-            "optional": true,
-            "description": "Called when the uninstall URL is set. If the given URL is invalid, $(ref:runtime.lastError) will be set.",
-            "parameters": []
           }
-        ]
+        ],
+        "returns_async": {
+          "name": "callback",
+          "optional": true,
+          "description": "Called when the uninstall URL is set. If the given URL is invalid, $(ref:runtime.lastError) will be set.",
+          "parameters": []
+        }
       },
       {
         "name": "reload",
@@ -281,14 +280,14 @@
             "type": "integer",
             "name": "seconds",
             "description": "Time to wait in seconds before rebooting the device, or -1 to cancel a scheduled reboot."
-          },
-          {
-            "type": "function",
-            "name": "callback",
-            "description": "A callback to be invoked when a restart request was successfully rescheduled.",
-            "optional": true
           }
-        ]
+        ],
+        "returns_async": {
+          "name": "callback",
+          "description": "A callback to be invoked when a restart request was successfully rescheduled.",
+          "parameters": [],
+          "optional": true
+        }
       },
       {
         "name": "connect",
@@ -398,19 +397,17 @@
         "name": "getPlatformInfo",
         "type": "function",
         "description": "Returns information about the current platform.",
-        "parameters": [
-          {
-            "type": "function",
-            "name": "callback",
-            "description": "Called with results",
-            "parameters": [
-              {
-                "name": "platformInfo",
-                "$ref": "PlatformInfo"
-              }
-            ]
-          }
-        ]
+        "parameters": [],
+        "returns_async": {
+          "name": "callback",
+          "description": "Called with results",
+          "parameters": [
+            {
+              "name": "platformInfo",
+              "$ref": "PlatformInfo"
+            }
+          ]
+        }
       },
       {
         "name": "getPackageDirectoryEntry",
diff --git a/extensions/common/extension_builder.cc b/extensions/common/extension_builder.cc
index 2f26601..fecb06a1 100644
--- a/extensions/common/extension_builder.cc
+++ b/extensions/common/extension_builder.cc
@@ -25,6 +25,7 @@
   absl::optional<ActionType> action;
   absl::optional<BackgroundContext> background_context;
   absl::optional<std::string> version;
+  absl::optional<int> manifest_version;
 
   // A ContentScriptEntry includes a string name, and a vector of string
   // match patterns.
@@ -36,7 +37,7 @@
   std::unique_ptr<base::DictionaryValue> GetValue() const {
     DictionaryBuilder manifest;
     manifest.Set(manifest_keys::kName, name)
-        .Set(manifest_keys::kManifestVersion, 2)
+        .Set(manifest_keys::kManifestVersion, manifest_version.value_or(2))
         .Set(manifest_keys::kVersion, version.value_or("0.1"))
         .Set(manifest_keys::kDescription, "some description");
 
@@ -216,6 +217,12 @@
   return *this;
 }
 
+ExtensionBuilder& ExtensionBuilder::SetManifestVersion(int manifest_version) {
+  CHECK(manifest_data_);
+  manifest_data_->manifest_version = manifest_version;
+  return *this;
+}
+
 ExtensionBuilder& ExtensionBuilder::AddJSON(base::StringPiece json) {
   CHECK(manifest_data_);
   std::string wrapped_json = base::StringPrintf("{%s}", json.data());
diff --git a/extensions/common/extension_builder.h b/extensions/common/extension_builder.h
index 482f8f9..4a5c960 100644
--- a/extensions/common/extension_builder.h
+++ b/extensions/common/extension_builder.h
@@ -106,10 +106,11 @@
       const std::string& script_name,
       const std::vector<std::string>& match_patterns);
 
-  // Shortcut for setting a specific manifest version. Typically we'd use
-  // SetManifestKey() or SetManifestPath() for these, but provide a faster
-  // route for version, since it's so central.
+  // Shortcuts for extremely popular keys.
+  // Typically we'd use SetManifestKey() or SetManifestPath() for these, but
+  // provide a faster route for these, since they're so central.
   ExtensionBuilder& SetVersion(const std::string& version);
+  ExtensionBuilder& SetManifestVersion(int manifest_version);
 
   // Shortcuts to setting values on the manifest dictionary without needing to
   // go all the way through MergeManifest(). Sample usage:
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index c3249102..0cbffe63 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -7,18 +7,6 @@
 
 namespace extensions_features {
 
-// Controls whether we disable extensions that are marked as policy violation
-// by the Omaha attribute.
-const base::Feature kDisablePolicyViolationExtensionsRemotely{
-    "DisablePolicyViolationExtensionsRemotely",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Controls whether we disable extensions that are marked as potentially
-// unwanted by the Omaha attribute.
-const base::Feature kDisablePotentiallyUwsExtensionsRemotely{
-    "DisablePotentiallyUwsExtensionsRemotely",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Controls whether we show an install friction dialog when an Enhanced Safe
 // Browsing user tries to install an extension that is not included in the
 // Safe Browsing CRX allowlist. This feature also controls if we show a warning
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index 198a295..33f6d79d 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -9,8 +9,6 @@
 
 namespace extensions_features {
 
-extern const base::Feature kDisablePolicyViolationExtensionsRemotely;
-extern const base::Feature kDisablePotentiallyUwsExtensionsRemotely;
 extern const base::Feature kSafeBrowsingCrxAllowlistShowWarnings;
 extern const base::Feature kSafeBrowsingCrxAllowlistAutoDisable;
 
diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc
index d97f203e..c5c07c1 100644
--- a/extensions/common/manifest_constants.cc
+++ b/extensions/common/manifest_constants.cc
@@ -643,6 +643,9 @@
     "Certain features may not work as expected.";
 const char kMissingFile[] =
     "At least one js or css file is required for 'content_scripts[*]'.";
+const char kMatchOriginAsFallbackRestrictedToMV3[] =
+    "The 'match_origin_as_fallback' property is restricted to extensions with "
+    "'manifest_version' set to 3 or higher.";
 const char16_t kMultipleOverrides[] =
     u"An extension cannot override more than one page.";
 const char kNoWildCardsInPaths[] =
diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h
index fca2868..32711df 100644
--- a/extensions/common/manifest_constants.h
+++ b/extensions/common/manifest_constants.h
@@ -435,6 +435,7 @@
 extern const char kManifestParseError[];
 extern const char kManifestUnreadable[];
 extern const char kManifestVersionTooHighWarning[];
+extern const char kMatchOriginAsFallbackRestrictedToMV3[];
 extern const char kMissingFile[];
 extern const char16_t kMultipleOverrides[];
 extern const char kNoWildCardsInPaths[];
diff --git a/extensions/common/manifest_handlers/content_scripts_handler.cc b/extensions/common/manifest_handlers/content_scripts_handler.cc
index b010aed..d090b1da 100644
--- a/extensions/common/manifest_handlers/content_scripts_handler.cc
+++ b/extensions/common/manifest_handlers/content_scripts_handler.cc
@@ -77,28 +77,37 @@
   if (content_script.all_frames)
     result->set_match_all_frames(*content_script.all_frames);
 
-  // match_origin_as_fallback
-  bool has_match_origin_as_fallback = false;
+  // match_origin_as_fallback and match_about_blank.
+  // Note: `match_about_blank` is ignored if `match_origin_as_fallback` was
+  // specified. `match_origin_as_fallback` can only be specified for extensions
+  // running manifest version 3 or higher. `match_about_blank` can be specified
+  // by any extensions (and is used by MV3+ extensions for compatibility).
+  absl::optional<MatchOriginAsFallbackBehavior> match_origin_as_fallback;
+
   if (content_script.match_origin_as_fallback &&
       base::FeatureList::IsEnabled(
           extensions_features::kContentScriptsMatchOriginAsFallback)) {
-    has_match_origin_as_fallback = true;
-    result->set_match_origin_as_fallback(
-        *content_script.match_origin_as_fallback
-            ? MatchOriginAsFallbackBehavior::kAlways
-            : MatchOriginAsFallbackBehavior::kNever);
+    if (extension->manifest_version() >= 3) {
+      match_origin_as_fallback = *content_script.match_origin_as_fallback
+                                     ? MatchOriginAsFallbackBehavior::kAlways
+                                     : MatchOriginAsFallbackBehavior::kNever;
+    } else {
+      extension->AddInstallWarning(
+          InstallWarning(errors::kMatchOriginAsFallbackRestrictedToMV3,
+                         ContentScriptsKeys::kContentScripts));
+    }
   }
 
-  // match_about_blank
-  // Note: match_about_blank is ignored if |match_origin_as_fallback| was
-  // specified.
-  if (!has_match_origin_as_fallback && content_script.match_about_blank) {
-    result->set_match_origin_as_fallback(
+  if (!match_origin_as_fallback && content_script.match_about_blank) {
+    match_origin_as_fallback =
         *content_script.match_about_blank
             ? MatchOriginAsFallbackBehavior::kMatchForAboutSchemeAndClimbTree
-            : MatchOriginAsFallbackBehavior::kNever);
+            : MatchOriginAsFallbackBehavior::kNever;
   }
 
+  if (match_origin_as_fallback)
+    result->set_match_origin_as_fallback(*match_origin_as_fallback);
+
   bool wants_file_access = false;
   if (!script_parsing::ParseMatchPatterns(
           content_script.matches, content_script.exclude_matches.get(),
diff --git a/extensions/renderer/storage_area_unittest.cc b/extensions/renderer/storage_area_unittest.cc
index 9cae268..4240589 100644
--- a/extensions/renderer/storage_area_unittest.cc
+++ b/extensions/renderer/storage_area_unittest.cc
@@ -120,11 +120,10 @@
 }
 
 TEST_F(StorageAreaTest, HasOnChanged) {
-  scoped_refptr<const Extension> extension =
-      ExtensionBuilder("foo")
-          .SetManifestKey("manifest_version", 3)
-          .AddPermission("storage")
-          .Build();
+  scoped_refptr<const Extension> extension = ExtensionBuilder("foo")
+                                                 .SetManifestVersion(3)
+                                                 .AddPermission("storage")
+                                                 .Build();
   RegisterExtension(extension);
 
   v8::HandleScope handle_scope(isolate());
@@ -160,11 +159,10 @@
 }
 
 TEST_F(StorageAreaTest, PromiseBasedFunctionsForManifestV3) {
-  scoped_refptr<const Extension> extension =
-      ExtensionBuilder("foo")
-          .SetManifestKey("manifest_version", 3)
-          .AddPermission("storage")
-          .Build();
+  scoped_refptr<const Extension> extension = ExtensionBuilder("foo")
+                                                 .SetManifestVersion(3)
+                                                 .AddPermission("storage")
+                                                 .Build();
   RegisterExtension(extension);
 
   v8::HandleScope handle_scope(isolate());
@@ -210,11 +208,10 @@
 }
 
 TEST_F(StorageAreaTest, PromiseBasedFunctionsDisallowedForManifestV2) {
-  scoped_refptr<const Extension> extension =
-      ExtensionBuilder("foo")
-          .SetManifestKey("manifest_version", 2)
-          .AddPermission("storage")
-          .Build();
+  scoped_refptr<const Extension> extension = ExtensionBuilder("foo")
+                                                 .SetManifestVersion(2)
+                                                 .AddPermission("storage")
+                                                 .Build();
   RegisterExtension(extension);
 
   v8::HandleScope handle_scope(isolate());
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
index e213c7ce..cfeb28f 100644
--- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -901,7 +901,8 @@
 
 // Checks that sync is turned on after the user chose to turn on
 // sync in the advanced sync settings screen.
-- (void)testCustomSyncOn {
+// TODO(crbug.com/1283229): re-enable the test.
+- (void)DISABLED_testCustomSyncOn {
   FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
 
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 334a098..6c80d9e4 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8cfaa19c109197efd489d8041a870762b6dbaee0
\ No newline at end of file
+e338b60759438206edbab47f1fbef99c9c0461f6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index eefad18..32e3b428 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-465c73cde43d19ad5037ab958cf29193645937b1
\ No newline at end of file
+5c7f08a5ad73ea119e0880a8fdb7690b709a7acc
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 402bfa4..d694c97 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-b62dbd99577196c254864eabb779aaf1c95ac72d
\ No newline at end of file
+159d7e24207b16abead60a8eb78ac7cb4c8aebc3
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 2b90bdf..6a6597b 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-815eea75ea393f2ea16b47d18bc71df5f169375b
\ No newline at end of file
+2e1d1691154be2e7863592c5b84614138bbee549
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 546971d3..ed6e41ad 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d6438f645d499129974f3ff4685c7cf1a7b8b3a4
\ No newline at end of file
+d1fe075ba67d9324669971dd5910b24f51761a57
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index 67f40b3..446101b 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-bcca609480c1550cabe669b80911f087ee42f54c
\ No newline at end of file
+233be0bd5307800c9d4cdbd99a8900d9026a0765
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index afc021b..37af2a3 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ed3b734cd7bac99ca950850b9194755ed6f427ce
\ No newline at end of file
+28f5cd99f7292d4889c6ecfd76a7b6b1586b21d9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 6f6e2e8..39e0d115 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-e61c5cd51bb43ce537d421d7e0088af32d7a7b19
\ No newline at end of file
+1e282511fe756cd25f0efa5a19df2cd119a8c70a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 6cce5579..cb5a9f1 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-35136f17a070f48362f869cf9b18f6e3fca9960d
\ No newline at end of file
+76eb8a1f0b8aa57fa3deb14760add64c6de32a09
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index d9c24a75..633f6af07 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-229595511f186135da5542dbd72da15fd42a50b8
\ No newline at end of file
+32b38a0cf0193c7a8ec0cf93b51776f366441e64
\ No newline at end of file
diff --git a/media/cast/net/cast_transport_impl.cc b/media/cast/net/cast_transport_impl.cc
index 906b818..e2bfc33 100644
--- a/media/cast/net/cast_transport_impl.cc
+++ b/media/cast/net/cast_transport_impl.cc
@@ -430,10 +430,10 @@
 
   // Set Wifi options.
   int wifi_options = 0;
-  if (options.HasKey(kOptionWifiDisableScan)) {
+  if (options.FindKey(kOptionWifiDisableScan)) {
     wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN;
   }
-  if (options.HasKey(kOptionWifiMediaStreamingMode)) {
+  if (options.FindKey(kOptionWifiMediaStreamingMode)) {
     wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE;
   }
   if (wifi_options)
diff --git a/media/cast/net/udp_transport_impl.cc b/media/cast/net/udp_transport_impl.cc
index e921191f..2287c92 100644
--- a/media/cast/net/udp_transport_impl.cc
+++ b/media/cast/net/udp_transport_impl.cc
@@ -331,7 +331,7 @@
 
 void UdpTransportImpl::SetUdpOptions(const base::DictionaryValue& options) {
   SetSendBufferSize(GetTransportSendBufferSize(options));
-  if (options.HasKey(kOptionDscp)) {
+  if (options.FindKey(kOptionDscp)) {
     // The default DSCP value for cast is AF41. Which gives it a higher
     // priority over other traffic.
     SetDscp(net::DSCP_AF41);
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 1840b5f..b4cc320 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -515,6 +515,7 @@
 #if BUILDFLAG(IS_CT_SUPPORTED)
   if (params_->ct_policy)
     SetCTPolicy(std::move(params_->ct_policy));
+
   sct_auditing_handler()->SetEnabled(params_->enable_sct_auditing);
 #endif
 
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 6784d76..40cd0e3d 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -751,7 +751,7 @@
   raw_ptr<certificate_transparency::ChromeCTPolicyEnforcer>
       ct_policy_enforcer_ = nullptr;
 
-  SCTAuditingHandler sct_auditing_handler_;
+  SCTAuditingHandler sct_auditing_handler_{this};
 #endif  // BUILDFLAG(IS_CT_SUPPORTED)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index ee8ba84..e878973 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -692,13 +692,11 @@
     bool enabled,
     double sampling_rate,
     const GURL& reporting_uri,
-    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-    mojo::PendingRemote<mojom::URLLoaderFactory> factory) {
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
   sct_auditing_cache_->set_enabled(enabled);
   sct_auditing_cache_->set_sampling_rate(sampling_rate);
   sct_auditing_cache_->set_report_uri(reporting_uri);
   sct_auditing_cache_->set_traffic_annotation(traffic_annotation);
-  sct_auditing_cache_->set_url_loader_factory(std::move(factory));
 }
 
 void NetworkService::UpdateCtLogList(std::vector<mojom::CTLogInfoPtr> log_list,
diff --git a/services/network/network_service.h b/services/network/network_service.h
index 91fae509..2fac6bb 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -179,12 +179,11 @@
                     ParseHeadersCallback callback) override;
 #if BUILDFLAG(IS_CT_SUPPORTED)
   void ClearSCTAuditingCache() override;
-  void ConfigureSCTAuditing(
-      bool enabled,
-      double sampling_rate,
-      const GURL& reporting_uri,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-      mojo::PendingRemote<mojom::URLLoaderFactory> factory) override;
+  void ConfigureSCTAuditing(bool enabled,
+                            double sampling_rate,
+                            const GURL& reporting_uri,
+                            const net::MutableNetworkTrafficAnnotationTag&
+                                traffic_annotation) override;
   void UpdateCtLogList(std::vector<mojom::CTLogInfoPtr> log_list,
                        base::Time update_time) override;
   void SetCtEnforcementEnabled(bool enabled) override;
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 032cf2c..245313f 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -29,8 +29,6 @@
 import "services/network/public/mojom/network_service_test.mojom";
 import "services/network/public/mojom/trust_tokens.mojom";
 import "services/network/public/mojom/parsed_headers.mojom";
-import "services/network/public/mojom/url_loader.mojom";
-import "services/network/public/mojom/url_loader_factory.mojom";
 import "services/network/public/mojom/url_loader_network_service_observer.mojom";
 import "services/network/public/mojom/url_request.mojom";
 import "services/network/public/mojom/url_response_head.mojom";
@@ -308,15 +306,13 @@
 
   // Configures SCT auditing.
   // This allows the embedder to specify whether SCT auditing should be enabled,
-  // what sampling rate to use on reports, and which URLLoaderFactory to use for
-  // sending reports.
-  // TODO(cthomp): Document what happens if the URLLoaderFactory is destroyed.
+  // what sampling rate to use on reports, where reports should be sent, and the
+  // traffic annotation to use.
   [EnableIf=is_ct_supported]
   ConfigureSCTAuditing(bool enabled,
                        double sampling_rate,
                        url.mojom.Url report_uri,
-                       MutableNetworkTrafficAnnotationTag traffic_annotation,
-                       pending_remote<network.mojom.URLLoaderFactory> factory);
+                       MutableNetworkTrafficAnnotationTag traffic_annotation);
 
 
   // Updates the log list used for CT verification. `update_time` should
diff --git a/services/network/sct_auditing/sct_auditing_cache.cc b/services/network/sct_auditing/sct_auditing_cache.cc
index 258482e8..e1a0e43b 100644
--- a/services/network/sct_auditing/sct_auditing_cache.cc
+++ b/services/network/sct_auditing/sct_auditing_cache.cc
@@ -7,6 +7,7 @@
 #include "base/callback.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/rand_util.h"
+#include "base/time/time.h"
 #include "components/version_info/version_info.h"
 #include "crypto/secure_hash.h"
 #include "crypto/sha2.h"
@@ -105,8 +106,8 @@
   if (tls_report->included_sct().empty())
     return;
 
-  net::SHA256HashValue cache_key;
-  SHA256_Final(reinterpret_cast<uint8_t*>(&cache_key), &ctx);
+  net::HashValue cache_key(net::HASH_VALUE_SHA256);
+  SHA256_Final(reinterpret_cast<uint8_t*>(cache_key.data()), &ctx);
 
   // Check if the SCTs are already in the cache. This will update the last seen
   // time if they are present in the cache.
@@ -154,15 +155,7 @@
   if (dedupe_cache_.size() > dedupe_cache_size_hwm_)
     dedupe_cache_size_hwm_ = dedupe_cache_.size();
 
-  // Ensure that the URLLoaderFactory is still bound.
-  if (!url_loader_factory_ || !url_loader_factory_.is_connected()) {
-    // TODO(cthomp): Should this signal to embedder that something has failed?
-    return;
-  }
-
-  context->sct_auditing_handler()->AddReporter(
-      cache_key, std::move(report), *url_loader_factory_, report_uri_,
-      traffic_annotation_);
+  context->sct_auditing_handler()->AddReporter(cache_key, std::move(report));
 }
 
 void SCTAuditingCache::ClearCache() {
diff --git a/services/network/sct_auditing/sct_auditing_cache.h b/services/network/sct_auditing/sct_auditing_cache.h
index dac50c6..aad251b 100644
--- a/services/network/sct_auditing/sct_auditing_cache.h
+++ b/services/network/sct_auditing/sct_auditing_cache.h
@@ -5,21 +5,15 @@
 #ifndef SERVICES_NETWORK_SCT_AUDITING_SCT_AUDITING_CACHE_H_
 #define SERVICES_NETWORK_SCT_AUDITING_SCT_AUDITING_CACHE_H_
 
-#include <map>
-#include <vector>
-
 #include "base/component_export.h"
 #include "base/containers/lru_cache.h"
-#include "base/time/time.h"
-#include "mojo/public/cpp/bindings/remote.h"
+#include "base/timer/timer.h"
 #include "net/base/hash_value.h"
 #include "net/base/host_port_pair.h"
 #include "net/cert/sct_auditing_delegate.h"
 #include "net/cert/signed_certificate_timestamp_and_status.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
-#include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "services/network/public/proto/sct_audit_report.pb.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace net {
@@ -78,12 +72,12 @@
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
     traffic_annotation_ = traffic_annotation;
   }
-  void set_url_loader_factory(
-      mojo::PendingRemote<mojom::URLLoaderFactory> factory) {
-    url_loader_factory_.Bind(std::move(factory));
+  net::MutableNetworkTrafficAnnotationTag traffic_annotation() {
+    return traffic_annotation_;
   }
+  GURL report_uri() { return report_uri_; }
 
-  base::LRUCache<net::SHA256HashValue, bool>* GetCacheForTesting() {
+  base::LRUCache<net::HashValue, bool>* GetCacheForTesting() {
     return &dedupe_cache_;
   }
 
@@ -94,7 +88,7 @@
   // Value `bool` is ignored in the dedupe cache. This cache only stores
   // recently seen hashes of SCTs in order to deduplicate on SCTs, and the bool
   // will always be `true`.
-  base::LRUCache<net::SHA256HashValue, bool> dedupe_cache_;
+  base::LRUCache<net::HashValue, bool> dedupe_cache_;
   // Tracks high-water-mark of `dedupe_cache_.size()`.
   size_t dedupe_cache_size_hwm_ = 0;
 
@@ -102,7 +96,6 @@
   double sampling_rate_ = 0;
   GURL report_uri_;
   net::MutableNetworkTrafficAnnotationTag traffic_annotation_;
-  mojo::Remote<mojom::URLLoaderFactory> url_loader_factory_;
 
   base::RepeatingTimer histogram_timer_;
 };
diff --git a/services/network/sct_auditing/sct_auditing_cache_unittest.cc b/services/network/sct_auditing/sct_auditing_cache_unittest.cc
index 1391aab..22a2f75 100644
--- a/services/network/sct_auditing/sct_auditing_cache_unittest.cc
+++ b/services/network/sct_auditing/sct_auditing_cache_unittest.cc
@@ -69,6 +69,7 @@
         network_service_.get(),
         network_context_remote.BindNewPipeAndPassReceiver(),
         std::move(context_params));
+    InitSCTAuditing(network_service_->sct_auditing_cache());
   }
 
  protected:
@@ -85,7 +86,8 @@
     url_loader_factory_ = std::make_unique<TestURLLoaderFactory>();
     mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote;
     url_loader_factory_->Clone(factory_remote.InitWithNewPipeAndPassReceiver());
-    cache->set_url_loader_factory(std::move(factory_remote));
+    network_context_->sct_auditing_handler()->SetURLLoaderFactoryForTesting(
+        std::move(factory_remote));
   }
 
   // Getter for TestURLLoaderFactory to allow tests to specify responses.
@@ -166,15 +168,15 @@
 
 // Computes the cache key from a list of SCTs. This matches how SCTAuditingCache
 // computes cache keys internally.
-net::SHA256HashValue ComputeCacheKey(
+net::HashValue ComputeCacheKey(
     net::SignedCertificateTimestampAndStatusList sct_list) {
-  net::SHA256HashValue cache_key;
+  net::HashValue cache_key(net::HASH_VALUE_SHA256);
   SHA256_CTX ctx;
   SHA256_Init(&ctx);
   std::string encoded_sct;
   net::ct::EncodeSignedCertificateTimestamp(sct_list.at(0).sct, &encoded_sct);
   SHA256_Update(&ctx, encoded_sct.data(), encoded_sct.size());
-  SHA256_Final(reinterpret_cast<uint8_t*>(&cache_key), &ctx);
+  SHA256_Final(reinterpret_cast<uint8_t*>(cache_key.data()), &ctx);
   return cache_key;
 }
 
@@ -229,7 +231,7 @@
   const net::HostPortPair host_port_pair2("example2.com", 443);
   const net::HostPortPair host_port_pair3("example3.com", 443);
 
-  net::SHA256HashValue first_key;
+  net::HashValue first_key(net::HASH_VALUE_SHA256);
   {
     net::SignedCertificateTimestampAndStatusList sct_list;
     MakeTestSCTAndStatus(net::ct::SignedCertificateTimestamp::SCT_EMBEDDED,
@@ -349,7 +351,7 @@
 
   EXPECT_EQ(2u, cache.GetCacheForTesting()->size());
 
-  net::SHA256HashValue evicted_key = ComputeCacheKey(sct_list2);
+  net::HashValue evicted_key = ComputeCacheKey(sct_list2);
   EXPECT_EQ(cache.GetCacheForTesting()->Get(evicted_key),
             cache.GetCacheForTesting()->end());
 }
@@ -453,8 +455,9 @@
 TEST_F(SCTAuditingCacheTest, HighWaterMarkMetrics) {
   base::HistogramTester histograms;
 
-  SCTAuditingCache cache(5);
-  InitSCTAuditing(&cache);
+  // Use the default Cache from the test NetworkService to avoid emitting extra
+  // histograms.
+  auto* cache = network_service_->sct_auditing_cache();
 
   const net::HostPortPair host_port_pair1("example1.com", 443);
   const net::HostPortPair host_port_pair2("example2.com", 443);
@@ -464,17 +467,17 @@
   MakeTestSCTAndStatus(net::ct::SignedCertificateTimestamp::SCT_EMBEDDED,
                        "extensions1", "signature1", base::Time::Now(),
                        net::ct::SCT_STATUS_OK, &sct_list1);
-  cache.MaybeEnqueueReport(network_context_.get(), host_port_pair1,
-                           chain_.get(), sct_list1);
+  cache->MaybeEnqueueReport(network_context_.get(), host_port_pair1,
+                            chain_.get(), sct_list1);
 
   net::SignedCertificateTimestampAndStatusList sct_list2;
   MakeTestSCTAndStatus(net::ct::SignedCertificateTimestamp::SCT_EMBEDDED,
                        "extensions2", "signature2", base::Time::Now(),
                        net::ct::SCT_STATUS_OK, &sct_list2);
-  cache.MaybeEnqueueReport(network_context_.get(), host_port_pair2,
-                           chain_.get(), sct_list2);
+  cache->MaybeEnqueueReport(network_context_.get(), host_port_pair2,
+                            chain_.get(), sct_list2);
 
-  EXPECT_EQ(2u, cache.GetCacheForTesting()->size());
+  EXPECT_EQ(2u, cache->GetCacheForTesting()->size());
   EXPECT_EQ(2u, network_context_->sct_auditing_handler()
                     ->GetPendingReportersForTesting()
                     ->size());
diff --git a/services/network/sct_auditing/sct_auditing_handler.cc b/services/network/sct_auditing/sct_auditing_handler.cc
index 673b5ccc..aecb59e2 100644
--- a/services/network/sct_auditing/sct_auditing_handler.cc
+++ b/services/network/sct_auditing/sct_auditing_handler.cc
@@ -7,28 +7,41 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 #include "net/base/hash_value.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/network_context.h"
+#include "services/network/network_service.h"
+#include "services/network/public/mojom/network_context.mojom.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "services/network/public/proto/sct_audit_report.pb.h"
+#include "services/network/sct_auditing/sct_auditing_cache.h"
 #include "services/network/sct_auditing/sct_auditing_reporter.h"
 
 namespace network {
 
-SCTAuditingHandler::SCTAuditingHandler(size_t cache_size)
-    : pending_reporters_(cache_size) {}
+SCTAuditingHandler::SCTAuditingHandler(NetworkContext* context,
+                                       size_t cache_size)
+    : owner_network_context_(context), pending_reporters_(cache_size) {}
 
 SCTAuditingHandler::~SCTAuditingHandler() = default;
 
 void SCTAuditingHandler::AddReporter(
-    net::SHA256HashValue reporter_key,
-    std::unique_ptr<sct_auditing::SCTClientReport> report,
-    mojom::URLLoaderFactory& url_loader_factory,
-    const GURL& report_uri,
-    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
+    net::HashValue reporter_key,
+    std::unique_ptr<sct_auditing::SCTClientReport> report) {
   if (!enabled_) {
     return;
   }
 
+  // Get the ReportURI and traffic annotation as configured on the
+  // SCTAuditingCache.
+  auto report_uri = owner_network_context_->network_service()
+                        ->sct_auditing_cache()
+                        ->report_uri();
+  auto traffic_annotation = owner_network_context_->network_service()
+                                ->sct_auditing_cache()
+                                ->traffic_annotation();
+
   auto reporter = std::make_unique<SCTAuditingReporter>(
-      reporter_key, std::move(report), url_loader_factory, report_uri,
+      reporter_key, std::move(report), GetURLLoaderFactory(), report_uri,
       traffic_annotation,
       base::BindOnce(&SCTAuditingHandler::OnReporterFinished, GetWeakPtr()));
   reporter->Start();
@@ -68,12 +81,11 @@
   return weak_factory_.GetWeakPtr();
 }
 
-void SCTAuditingHandler::OnReporterFinished(net::SHA256HashValue reporter_key) {
+void SCTAuditingHandler::OnReporterFinished(net::HashValue reporter_key) {
   auto it = pending_reporters_.Get(reporter_key);
   if (it != pending_reporters_.end()) {
     pending_reporters_.Erase(it);
   }
-  // TODO(crbug.com/1144205): Delete any persisted state for the reporter.
 }
 
 void SCTAuditingHandler::ReportHWMMetrics() {
@@ -84,4 +96,24 @@
                                pending_reporters_size_hwm_);
 }
 
+network::mojom::URLLoaderFactory* SCTAuditingHandler::GetURLLoaderFactory() {
+  // Create the URLLoaderFactory as needed.
+  if (url_loader_factory_ && url_loader_factory_.is_connected()) {
+    return url_loader_factory_.get();
+  }
+
+  network::mojom::URLLoaderFactoryParamsPtr params =
+      network::mojom::URLLoaderFactoryParams::New();
+  params->process_id = network::mojom::kBrowserProcessId;
+  params->is_corb_enabled = false;
+  params->is_trusted = true;
+  params->automatically_assign_isolation_info = true;
+
+  url_loader_factory_.reset();
+  owner_network_context_->CreateURLLoaderFactory(
+      url_loader_factory_.BindNewPipeAndPassReceiver(), std::move(params));
+
+  return url_loader_factory_.get();
+}
+
 }  // namespace network
diff --git a/services/network/sct_auditing/sct_auditing_handler.h b/services/network/sct_auditing/sct_auditing_handler.h
index e10280b..47c6bd6 100644
--- a/services/network/sct_auditing/sct_auditing_handler.h
+++ b/services/network/sct_auditing/sct_auditing_handler.h
@@ -10,8 +10,8 @@
 #include "base/containers/lru_cache.h"
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/hash_value.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "url/gurl.h"
 
@@ -21,13 +21,15 @@
 
 namespace network {
 
+class NetworkContext;
 class SCTAuditingReporter;
 
 // SCTAuditingHandler owns SCT auditing reports for a specific NetworkContext.
 // Each SCTAuditingHandler is owned by its matching NetworkContext.
 class SCTAuditingHandler {
  public:
-  explicit SCTAuditingHandler(size_t cache_size = 1024);
+  explicit SCTAuditingHandler(NetworkContext* context,
+                              size_t cache_size = 1024);
   ~SCTAuditingHandler();
 
   SCTAuditingHandler(const SCTAuditingHandler&) = delete;
@@ -36,17 +38,13 @@
   // Creates a new SCTAuditingReporter for the report and adds it to this
   // SCTAuditingHandler's pending reporters set. After creating the reporter,
   // this will call SCTAuditingReporter::Start() to initiate sending the report.
-  void AddReporter(
-      net::SHA256HashValue,
-      std::unique_ptr<sct_auditing::SCTClientReport> report,
-      mojom::URLLoaderFactory& url_loader_factory,
-      const GURL& report_uri,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation);
+  void AddReporter(net::HashValue reporter_key,
+                   std::unique_ptr<sct_auditing::SCTClientReport> report);
 
   // Clears the set of pending reporters for this SCTAuditingHandler.
   void ClearPendingReports();
 
-  base::LRUCache<net::SHA256HashValue, std::unique_ptr<SCTAuditingReporter>>*
+  base::LRUCache<net::HashValue, std::unique_ptr<SCTAuditingReporter>>*
   GetPendingReportersForTesting() {
     return &pending_reporters_;
   }
@@ -54,18 +52,28 @@
   void SetEnabled(bool enabled);
   bool is_enabled() { return enabled_; }
 
+  void SetURLLoaderFactoryForTesting(
+      mojo::PendingRemote<mojom::URLLoaderFactory> factory) {
+    url_loader_factory_.reset();
+    url_loader_factory_.Bind(std::move(factory));
+  }
+
   base::WeakPtr<SCTAuditingHandler> GetWeakPtr();
 
  private:
-  void OnReporterFinished(net::SHA256HashValue reporter_key);
+  void OnReporterFinished(net::HashValue reporter_key);
   void ReportHWMMetrics();
+  network::mojom::URLLoaderFactory* GetURLLoaderFactory();
+
+  // The NetworkContext which owns this SCTAuditingHandler.
+  NetworkContext* owner_network_context_;
 
   // The pending reporters set is an LRUCache, so that the total number of
   // pending reporters can be capped. The LRUCache means that reporters will be
   // evicted (and canceled) oldest first. If a new report is triggered for the
   // same SCTs it will get deduplicated if a previous report is still pending,
   // but the last-seen time will be updated.
-  base::LRUCache<net::SHA256HashValue, std::unique_ptr<SCTAuditingReporter>>
+  base::LRUCache<net::HashValue, std::unique_ptr<SCTAuditingReporter>>
       pending_reporters_;
   // Tracks high-water-mark of `pending_reporters_.size()`.
   size_t pending_reporters_size_hwm_ = 0;
@@ -73,6 +81,9 @@
   bool enabled_ = false;
   base::RepeatingTimer histogram_timer_;
 
+  // Used to send reports.
+  mojo::Remote<mojom::URLLoaderFactory> url_loader_factory_;
+
   base::WeakPtrFactory<SCTAuditingHandler> weak_factory_{this};
 };
 
diff --git a/services/network/sct_auditing/sct_auditing_reporter.cc b/services/network/sct_auditing/sct_auditing_reporter.cc
index 4c448bc3..0cca80d 100644
--- a/services/network/sct_auditing/sct_auditing_reporter.cc
+++ b/services/network/sct_auditing/sct_auditing_reporter.cc
@@ -76,9 +76,9 @@
 constexpr size_t kMaxRetries = 15;
 
 SCTAuditingReporter::SCTAuditingReporter(
-    net::SHA256HashValue reporter_key,
+    net::HashValue reporter_key,
     std::unique_ptr<sct_auditing::SCTClientReport> report,
-    mojom::URLLoaderFactory& url_loader_factory,
+    mojom::URLLoaderFactory* url_loader_factory,
     const GURL& report_uri,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
     ReporterDoneCallback done_callback)
@@ -95,7 +95,7 @@
   // and deduplication), so some cost of copying is reasonable. If more
   // optimization is needed, this could potentially use a mojo::SharedRemote
   // or a WrappedPendingSharedURLLoaderFactory instead.
-  url_loader_factory.Clone(
+  url_loader_factory->Clone(
       url_loader_factory_remote_.BindNewPipeAndPassReceiver());
 
   // Override the retry delay if set by tests.
diff --git a/services/network/sct_auditing/sct_auditing_reporter.h b/services/network/sct_auditing/sct_auditing_reporter.h
index 06f5bc4..9bcdd2120 100644
--- a/services/network/sct_auditing/sct_auditing_reporter.h
+++ b/services/network/sct_auditing/sct_auditing_reporter.h
@@ -44,12 +44,12 @@
   // Callback to notify the SCTAuditingHandler that this reporter has completed.
   // The SHA256HashValue `reporter_key` is passed to uniquely identify this
   // reporter instance.
-  using ReporterDoneCallback = base::OnceCallback<void(net::SHA256HashValue)>;
+  using ReporterDoneCallback = base::OnceCallback<void(net::HashValue)>;
 
   SCTAuditingReporter(
-      net::SHA256HashValue reporter_key,
+      net::HashValue reporter_key,
       std::unique_ptr<sct_auditing::SCTClientReport> report,
-      mojom::URLLoaderFactory& url_loader_factory,
+      mojom::URLLoaderFactory* url_loader_factory,
       const GURL& report_uri,
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
       ReporterDoneCallback done_callback);
@@ -62,7 +62,7 @@
 
   void Start();
 
-  net::SHA256HashValue key() { return reporter_key_; }
+  net::HashValue key() { return reporter_key_; }
   sct_auditing::SCTClientReport* report() { return report_.get(); }
 
   // These values are persisted to logs. Entries should not be renumbered and
@@ -81,7 +81,7 @@
   void SendReport();
   void OnSendReportComplete(scoped_refptr<net::HttpResponseHeaders> headers);
 
-  net::SHA256HashValue reporter_key_;
+  net::HashValue reporter_key_;
   std::unique_ptr<sct_auditing::SCTClientReport> report_;
   mojo::Remote<mojom::URLLoaderFactory> url_loader_factory_remote_;
   std::unique_ptr<SimpleURLLoader> url_loader_;
diff --git a/testing/scripts/get_compile_targets.py b/testing/scripts/get_compile_targets.py
index 9c7e3372..247c66d 100755
--- a/testing/scripts/get_compile_targets.py
+++ b/testing/scripts/get_compile_targets.py
@@ -33,6 +33,7 @@
                     'PRESUBMIT.py',
                     'sizes_common.py',
                     'variations_seed_access_helper.py',
+                    'variations_http_test_server.py',
                     'wpt_android_lib.py',
                     'wpt_common.py',
                     'wpt_common_unittest.py',
diff --git a/testing/scripts/run_variations_smoke_tests.py b/testing/scripts/run_variations_smoke_tests.py
index b795443f..e80022d9 100755
--- a/testing/scripts/run_variations_smoke_tests.py
+++ b/testing/scripts/run_variations_smoke_tests.py
@@ -15,13 +15,17 @@
 import tempfile
 import time
 import six.moves.urllib.error
+from threading import Thread
 
 import common
 import variations_seed_access_helper as seed_helper
+from variations_http_test_server import HTTPServer
+from variations_http_test_server import HTTPHandler
 
 _THIS_DIR = os.path.dirname(os.path.abspath(__file__))
 _SRC_DIR = os.path.join(_THIS_DIR, os.path.pardir, os.path.pardir)
 _WEBDRIVER_PATH = os.path.join(_SRC_DIR, 'third_party', 'webdriver', 'pylib')
+_VARIATIONS_TEST_DATA = 'variations_smoke_test_data'
 
 sys.path.insert(0, _WEBDRIVER_PATH)
 from selenium import webdriver
@@ -42,15 +46,22 @@
         'expected_text': 'Success',
     },
     {
-        # TODO(crbug.com/1234165): Make tests hermetic by using a test http
-        # server or WPR.
-        'url': 'https://chromium.org/',
-        'expected_id': 'chromium',
-        'expected_text': 'Chromium',
+        'url': 'https://localhost:8000',
+        'expected_id': 'sites-chrome-userheader-title',
+        'expected_text': 'The Chromium Projects',
     },
 ]
 
 
+def _get_httpd():
+  """Returns a HTTPServer instance."""
+  hostname = "localhost"
+  port = 0
+  directory = os.path.join(_THIS_DIR, _VARIATIONS_TEST_DATA, "http_server")
+  httpd = HTTPServer(directory, (hostname, port))
+  return httpd
+
+
 def _get_platform():
   """Returns the host platform.
 
@@ -166,7 +177,7 @@
     # Inject the test seed.
     # This is a path as fallback when |seed_helper.load_test_seed_from_file()|
     # can't find one under src root.
-    hardcoded_seed_path = os.path.join(_THIS_DIR, 'variations_smoke_test_data',
+    hardcoded_seed_path = os.path.join(_THIS_DIR, _VARIATIONS_TEST_DATA,
                              'variations_seed_beta_%s.json' % _get_platform())
     seed, signature = seed_helper.load_test_seed_from_file(hardcoded_seed_path)
     if not seed or not signature:
@@ -232,17 +243,36 @@
   return 0
 
 
+def _start_local_http_server():
+  """Starts a local http server.
+
+  Returns:
+    A local http.server.HTTPServer.
+  """
+  httpd = _get_httpd()
+  logging.info("%s is used as local http server.", httpd.address_string())
+  thread = Thread(target=httpd.server_forever)
+  thread.daemon = True
+  thread.start()
+  return httpd
+
+
 def main_run(args):
   """Runs the variations smoke tests."""
   logging.basicConfig(level=logging.INFO)
   parser = argparse.ArgumentParser()
   parser.add_argument('--isolated-script-test-output', type=str)
   args, rest = parser.parse_known_args()
-  rc = _run_tests(*rest)
-  if args.isolated_script_test_output:
-    with open(args.isolated_script_test_output, 'w') as f:
-      common.record_local_script_results('run_variations_smoke_tests', f, [],
-                                         rc == 0)
+
+  httpd = _start_local_http_server()
+  try:
+    rc = _run_tests(*rest)
+    if args.isolated_script_test_output:
+      with open(args.isolated_script_test_output, 'w') as f:
+        common.record_local_script_results('run_variations_smoke_tests', f, [],
+                                           rc == 0)
+  finally:
+    httpd.shutdown()
 
   return rc
 
diff --git a/testing/scripts/variations_http_test_server.py b/testing/scripts/variations_http_test_server.py
new file mode 100644
index 0000000..e0817d70
--- /dev/null
+++ b/testing/scripts/variations_http_test_server.py
@@ -0,0 +1,39 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""A http server implementation based on SimpleHTTPServer or http.server and
+serves content from a base_path.
+"""
+
+try:
+  # Python 2
+  from SimpleHTTPServer import SimpleHTTPRequestHandler
+  from BaseHTTPServer import HTTPServer as BaseHTTPServer
+except ImportError:
+  # Python 3
+  from http.server import SimpleHTTPRequestHandler
+  from http.server import HTTPServer as BaseHTTPServer
+
+class HTTPHandler(SimpleHTTPRequestHandler):
+  """This handler allows to specify a bath_path. """
+  def translate_path(self, path):
+    """Uses server.base_path to combine full path."""
+    path = SimpleHTTPRequestHandler.translate_path(self, path)
+    real_path = os.path.relpath(path, os.getcwd())
+    return os.path.join(self.server.base_path, real_path)
+
+class HTTPServer(BaseHTTPServer):
+  """The main server, which you couild override base_path."""
+  def __init__(self, base_path, server_address,
+               RequestHandlerClass=HTTPHandler):
+    self.base_path = base_path
+    self.stop = False
+    BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)
+
+  def serve_forever(self, poll_interval=0.1):
+    self.stop = False
+    while not self.stop:
+      self.handle_request()
+
+  def shutdown(self):
+    self.stop = True
diff --git a/testing/scripts/variations_smoke_test_data/http_server/index.html b/testing/scripts/variations_smoke_test_data/http_server/index.html
new file mode 100644
index 0000000..81683dc0
--- /dev/null
+++ b/testing/scripts/variations_smoke_test_data/http_server/index.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" itemscope="" itemtype="http://schema.org/WebPage">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="chrome=1" />
+<script type="text/javascript">/* Copyright 2008 Google. */ (function() { /*
+
+Copyright The Closure Library Authors.
+SPDX-License-Identifier: Apache-2.0
+*/
+(function(){function e(g){this.t={};this.tick=function(h,k,f){this.t[h]=[void 0!=f?f:(new Date).getTime(),k];if(void 0==f)try{window.console.timeStamp("CSI/"+h)}catch(m){}};this.getStartTickTime=function(){return this.t.start[0]};this.tick("start",null,g)}var a;if(window.performance)var d=(a=window.performance.timing)&&a.responseStart;var l=0<d?new e(d):new e;window.jstiming={Timer:e,load:l};if(a){var b=a.navigationStart;0<b&&d>=b&&(window.jstiming.srt=d-b)}if(a){var c=window.jstiming.load;0<b&&d>=
+b&&(c.tick("_wtsrt",void 0,b),c.tick("wtsrt_","_wtsrt",d),c.tick("tbsd_","wtsrt_"))}try{a=null,window.chrome&&window.chrome.csi&&(a=Math.floor(window.chrome.csi().pageT),c&&0<b&&(c.tick("_tbnd",void 0,window.chrome.csi().startE),c.tick("tbnd_","_tbnd",b))),null==a&&window.gtbExternal&&(a=window.gtbExternal.pageT()),null==a&&window.external&&(a=window.external.pageT,c&&0<b&&(c.tick("_tbnd",void 0,window.external.startE),c.tick("tbnd_","_tbnd",b))),a&&(window.jstiming.pt=a)}catch(g){}})(); })()
+</script>
+<link rel="shortcut icon" href="/_/rsrc/1354323194313/favicon.ico" type="image/x-icon" />
+<link rel="apple-touch-icon" href="/_/rsrc/1484148948583/apple-touch-icon.png" type="image/png" />
+<script type="text/javascript">/* Copyright 2008 Google. */ (function() { function d(a){return document.getElementById(a)}window.byId=d;function g(a){return a.replace(/^\s+|\s+$/g,"")}window.trim=g;var h=[],k=0;window.JOT_addListener=function(a,b,c){var f=new String(k++);a={eventName:a,handler:b,compId:c,key:f};h.push(a);return f};window.JOT_removeListenerByKey=function(a){for(var b=0;b<h.length;b++)if(h[b].key==a){h.splice(b,1);break}};window.JOT_removeAllListenersForName=function(a){for(var b=0;b<h.length;b++)h[b].eventName==a&&h.splice(b,1)};
+window.JOT_postEvent=function(a,b,c){var f={eventName:a,eventSrc:b||{},payload:c||{}};if(window.JOT_fullyLoaded)for(b=h.length,c=0;c<b&&c<h.length;c++){var e=h[c];e&&e.eventName==a&&(f.listenerCompId=e.compId||"",(e="function"==typeof e.handler?e.handler:window[e.handler])&&e(f))}else window.JOT_delayedEvents.push({eventName:a,eventSrc:b,payload:c})};window.JOT_delayedEvents=[];window.JOT_fullyLoaded=!1;
+window.JOT_formatRelativeToNow=function(a,b){a=((new Date).getTime()-a)/6E4;if(1440<=a||0>a)return null;var c=0;60<=a&&(a/=60,c=2);2<=a&&c++;return b?window.JOT_siteRelTimeStrs[c].replace("__duration__",Math.floor(a)):window.JOT_userRelTimeStrs[c].replace("__duration__",Math.floor(a))}; })()
+</script>
+<script>
+
+
+
+  var breadcrumbs = [{"path":"/chromium-projects","deleted":false,"title":"Home","dir":"ltr"}];
+  var JOT_clearDotPath = 'https://ssl.gstatic.com/sites/p/8ef4a1/system/app/images/cleardot.gif';
+
+
+  var JOT_userRelTimeStrs = ["a minute ago","__duration__ minutes ago","an hour ago","__duration__ hours ago"];
+
+
+
+
+
+
+  var webspace = {"gvizGstaticVersion":"current","enableAnalytics":true,"pageSharingId":"jotspot_page","codeembeds":{"outerIframeSrc":"https://www.gstatic.com/jotspot/embeds/code/0f08d42392f2000e7e3f3daf5b427a43/outer_iframe.html","innerIframeSrc":"https://817409141-jotspot-embeds.googleusercontent.com/code/8d87fa64604b2a11fae2ed06104c58d3/inner_iframe.html"},"enableUniversalAnalytics":false,"sharingPolicy":"OPENED_WITH_INDICATOR","siteTitle":"The Chromium Projects","experiments":{"enableSubpagesGadgetInTakeout":true,"overrideDisableDomainEditing":false,"DisableSiteEditingFeature__disable_site_editing":true,"disableDomainEditing":false},"jot2atari":{"eligibility":"INELIGIBLE"},"onepickUrl":"https://docs.google.com/picker","adsensePublisherId":null,"features":{"moreMobileStyleImprovements":null,"subscriptionDataMigrationInProgress":null,"plusBadge":false},"configProperties":{"disableSiteEditing":null},"isPublic":true,"newSitesBaseUrl":"https://sites.google.com","isConsumer":false,"serverFlags":{"jot2AtariLearnMoreUrl":"https://support.google.com/sites/answer/7035197"},"domainAnalyticsAccountId":"","plusPageId":"","signInUrl":"https://accounts.google.com/AccountChooser?continue=https://sites.google.com/a/chromium.org/dev/chromium-projects&service=jotspot","analyticsAccountId":"UA-5484340-1","scottyUrl":"/_/upload","homePath":"/","siteNoticeUrlEnabled":null,"plusPageUrl":"","adsensePromoClickedOrSiteIneligible":true,"csiReportUri":"https://gg.google.com/csi","sharingId":"jotspot","termsUrl":"//www.google.com/intl/en/policies/terms/","gvizVersion":1,"editorResources":{"sitelayout":["https://ssl.gstatic.com/sites/p/8ef4a1/system/app/css/sitelayouteditor.css"],"text":["https://ssl.gstatic.com/sites/p/8ef4a1/system/js/codemirror.js","https://ssl.gstatic.com/sites/p/8ef4a1/system/app/css/codemirror_css.css","https://ssl.gstatic.com/sites/p/8ef4a1/system/js/trog_edit__en.js","https://ssl.gstatic.com/sites/p/8ef4a1/system/app/css/trogedit.css","/_/rsrc/1638433988000/system/app/css/editor.css","https://ssl.gstatic.com/sites/p/8ef4a1/system/app/css/codeeditor.css","/_/rsrc/1638433988000/system/app/css/camelot/editor-jfk.css"]},"sharingUrlPrefix":"/_/sharing","isAdsenseEnabled":true,"domain":"chromium.org","baseUri":"","name":"dev","siteTemplateId":false,"siteNoticeRevision":null,"siteNoticeUrlAddress":null,"siteNoticeMessage":null,"page":{"isRtlLocale":false,"canDeleteWebspace":null,"isPageDraft":null,"parentPath":null,"parentWuid":null,"siteLocale":"en","timeZone":"America/Los_Angeles","type":"text","title":"Home","locale":"en","wuid":"wuid:gx:10ae433dadbbab13","revision":24,"path":"/chromium-projects","isSiteRtlLocale":false,"pageInheritsPermissions":null,"name":"chromium-projects","canChangePath":false,"state":"","properties":{},"bidiEnabled":false,"currentTemplate":{"path":"/system/app/pagetemplates/text","title":"Web Page"}},"canPublishScriptToAnyone":true,"user":{"keyboardShortcuts":true,"sessionIndex":"","guest_":true,"displayNameOrEmail":"guest","userName":"guest","uid":"","renderMobile":false,"domain":"","namespace":"","hasWriteAccess":false,"namespaceUser":false,"primaryEmail":"guest","hasAdminAccess":false,"isGoogleAdmin":false},"gadgets":{"baseUri":"/system/app/pages/gadgets"}};
+  webspace.page.breadcrumbs = breadcrumbs;
+
+
+  var JOT_siteRelTimeStrs = ["a minute ago","__duration__ minutes ago","an hour ago","__duration__ hours ago"];
+
+</script>
+<script type="text/javascript">
+                window.jstiming.load.tick('scl');
+              </script>
+<meta name="title" content="The Chromium Projects" />
+<meta itemprop="name" content="The Chromium Projects" />
+<meta property="og:title" content="The Chromium Projects" />
+<meta name="description" content="Home of the Chromium Open Source Project" />
+<meta itemprop="description" content="Home of the Chromium Open Source Project" />
+<meta id="meta-tag-description" property="og:description" content="Home of the Chromium Open Source Project" />
+<style type="text/css">
+</style>
+<link rel="stylesheet" type="text/css" href="https://ssl.gstatic.com/sites/p/8ef4a1/system/app/themes/beigeandblue/standard-css-beigeandblue-ltr-ltr.css" />
+<link rel="stylesheet" type="text/css" href="/_/rsrc/1638433988000/system/app/css/overlay.css?cb=beigeandblueundefineda100%25%25150goog-ws-leftthemedefaultstandard" />
+<link rel="stylesheet" type="text/css" href="/_/rsrc/1638433988000/system/app/css/camelot/allthemes-view.css" />
+<!--[if IE]>
+          <link rel="stylesheet" type="text/css" href="/system/app/css/camelot/allthemes%2die.css" />
+        <![endif]-->
+<title>The Chromium Projects</title>
+<meta itemprop="image" content="https://www.chromium.org/_/rsrc/1438811752264/chromium-projects/logo_chrome_color_1x_web_32dp.png" />
+<meta property="og:image" content="https://www.chromium.org/_/rsrc/1438811752264/chromium-projects/logo_chrome_color_1x_web_32dp.png" />
+<script type="text/javascript">
+                window.jstiming.load.tick('cl');
+              </script>
+</head>
+<body xmlns="http://www.google.com/ns/jotspot" id="body" class=" en            ">
+<div id="sites-page-toolbar" class="sites-header-divider">
+<div xmlns="http://www.w3.org/1999/xhtml" id="sites-status" class="sites-status" style="display:none;"><div id="sites-notice" class="sites-notice" role="status" aria-live="assertive"> </div></div>
+</div>
+<div id="sites-chrome-everything-scrollbar">
+<div id="sites-chrome-everything" class="">
+<div id="sites-chrome-page-wrapper" style="direction: ltr">
+<div id="sites-chrome-page-wrapper-inside">
+<div xmlns="http://www.w3.org/1999/xhtml" id="sites-chrome-header-wrapper" style="height:auto;">
+<table id="sites-chrome-header" class="sites-layout-hbox" cellspacing="0" style="height:auto;">
+<tr class="sites-header-primary-row" id="sites-chrome-userheader">
+<td id="sites-header-title" class="" role="banner"><div class="sites-header-cell-buffer-wrapper"><a href="https://www.chromium.org/" id="sites-chrome-userheader-logo"><img id="logo-img-id" src="/_/rsrc/1438879449147/config/customLogo.gif?revision=3" alt="The Chromium Projects" class="sites-logo  " /></a><h2><a href="https://www.chromium.org/" dir="ltr" id="sites-chrome-userheader-title">The Chromium Projects</a></h2></div></td><td class="sites-layout-searchbox  "><div class="sites-header-cell-buffer-wrapper"><form id="sites-searchbox-form" action="/system/app/pages/search" role="search"><input type="hidden" id="sites-searchbox-scope" name="scope" value="search-site" /><input type="text" id="jot-ui-searchInput" name="q" size="20" value="" aria-label="Search this site" /><div id="sites-searchbox-button-set" class="goog-inline-block"><div role="button" id="sites-searchbox-search-button" class="goog-inline-block jfk-button jfk-button-standard" tabindex="0">Search this site</div></div></form></div></td>
+</tr>
+<tr class="sites-header-secondary-row" id="sites-chrome-horizontal-nav">
+<td colspan="2" id="sites-chrome-header-horizontal-nav-container" role="navigation">
+</td>
+</tr>
+</table>
+</div>
+<div id="sites-chrome-main-wrapper">
+<div id="sites-chrome-main-wrapper-inside">
+<table id="sites-chrome-main" class="sites-layout-hbox" cellspacing="0" cellpadding="{scmCellpadding}" border="0">
+<tr>
+<td id="sites-chrome-sidebar-left" class="sites-layout-sidebar-left initial" style="width:150px">
+<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_7648876402527094" class="sites-embed" role="navigation"><div class="sites-embed-content sites-sidebar-nav"><ul role="navigation" jotId="navList"><li class="nav-first "><div class="current-bg" jotId="wuid:gx:10ae433dadbbab13" dir="ltr" style="padding-left: 5px;">Home</div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="/Home" jotId="wuid:gx:43582b9d2029d3af" class="sites-navigation-link">Chromium</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="/chromium-os" jotId="wuid:gx:83df2ab1f8880ba" class="sites-navigation-link">Chromium OS</a></div></li></ul></div></div>
+<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_14720868319272995" class="sites-embed" role="navigation"><h4 class="sites-embed-title">Quick links</h4><div class="sites-embed-content sites-sidebar-nav"><ul role="navigation" jotId="navList"><li class="nav-first "><div dir="ltr" style="padding-left: 5px;"><a href="https://www.chromium.org/for-testers/bug-reporting-guidelines" class="sites-navigation-link">Report bugs</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://www.chromium.org/developers/discussion-groups" class="sites-navigation-link">Discuss</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="/system/app/pages/sitemap/hierarchy" jotId="wuid:gx:c638c2cb1e1732c" class="sites-navigation-link">Sitemap</a></div></li></ul></div></div>
+<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_19690813310444355" class="sites-embed" role="navigation"><h4 class="sites-embed-title">Other sites</h4><div class="sites-embed-content sites-sidebar-nav"><ul role="navigation" jotId="navList"><li class="nav-first "><div dir="ltr" style="padding-left: 5px;"><a href="https://blog.chromium.org/" class="sites-navigation-link">Chromium Blog</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://developer.chrome.com/extensions" class="sites-navigation-link">Google Chrome Extensions</a></div></li></ul></div></div>
+<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_19695218559354544" class="sites-embed" role="complementary"><h4 class="sites-embed-title"></h4><div class="sites-embed-content sites-embed-content-sidebar-textbox"><div dir="ltr"><span style="font-size:x-small">Except as otherwise </span><a href="https://developers.google.com/site-policies.html#restrictions"><span style="font-size:x-small">noted</span></a><span style="font-size:x-small">, the content of this page is licensed under a </span><a href="https://creativecommons.org/licenses/by/2.5/"><span style="font-size:x-small">Creative Commons Attribution 2.5 license</span></a><span style="font-size:x-small">, and examples are licensed under the </span><a href="https://chromium.googlesource.com/chromium/src/+/master/LICENSE" target="_blank"><span style="font-size:x-small">BSD License</span></a><span style="font-size:x-small">.<br /></span></div></div></div>
+</td>
+<td id="sites-canvas-wrapper">
+<div id="sites-canvas" role="main">
+<div id="goog-ws-editor-toolbar-container"> </div>
+<div xmlns="http://www.w3.org/1999/xhtml" id="title-crumbs" style="display: none;">
+</div>
+<h3 xmlns="http://www.w3.org/1999/xhtml" id="sites-page-title-header" style="display: none;" align="left">
+<span id="sites-page-title" dir="ltr" tabindex="-1" style="outline: none">Home</span>
+</h3>
+<div id="sites-canvas-main" class="sites-canvas-main">
+<div id="sites-canvas-main-content">
+<div xmlns="http://www.w3.org/1999/xhtml" class="sites-layout-name-two-column-hf sites-layout-vbox"><div class="sites-layout-tile sites-tile-name-header"><div dir="ltr">The Chromium projects include Chromium and Chromium OS, the open-source projects behind the <a href="https://www.google.com/chrome">Google Chrome</a> browser and Google Chrome OS, respectively. This site houses the documentation and code related to the Chromium projects and is intended for developers interested in learning about and contributing to the open-source projects.<br /></div></div><table cellspacing="0" class="sites-layout-hbox"><tbody><tr><td class="sites-layout-tile sites-tile-name-content-1"><div dir="ltr"><b><a href="https://www.chromium.org/Home"><span style="font-size:large">Chromium</span></a><span style="font-size:large"> </span></b><br />
+Chromium is an open-source browser project that aims to build a
+safer, faster, and more stable way for all users to experience
+the web. This site contains design documents, architecture overviews,
+testing information, and more to help you learn to build and work with
+the Chromium source code.
+<div><br />
+</div>
+<div>
+<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
+<tbody>
+<tr>
+<td style="width:622px;height:55px" valign="bottom">
+<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
+<tbody>
+<tr>
+<td><a href="https://www.google.com/chrome" imageanchor="1" style="font-size:13.3333px;background-color:rgb(255,255,255)"><img alt="https://www.google.com/chrome" border="0" src="https://www.chromium.org/_/rsrc/1438811752264/chromium-projects/logo_chrome_color_1x_web_32dp.png" /></a></td>
+<td style="padding:5px"><div style="display:block;text-align:left"><span style="font-size:10pt;background-color:transparent">Looking for Google Chrome?</span></div>
+<br />
+<a href="https://www.google.com/chrome">Download Google Chrome</a></td>
+</tr>
+</tbody>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+</div></div></td><td class="sites-layout-tile sites-tile-name-content-2"><div dir="ltr"><b><a href="https://www.chromium.org/chromium-os"><span style="font-size:large">Chromium OS</span></a></b>
+<div>Chromium OS is an open-source project that aims to provide a fast, simple, and more secure computing experience for people who spend most of their time on the web. Learn more about the <a href="https://googleblog.blogspot.com/2009/11/releasing-chromium-os-open-source.html">project goals</a>, obtain the latest build, and learn how you can get involved, submit code, and file bugs.</div>
+<div><br />
+</div>
+<div>
+<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
+<tbody>
+<tr>
+<td style="width:619px;height:55px" valign="bottom">
+<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse" width="100%">
+<tbody>
+<tr>
+<td valign="bottom" width="50%">
+<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
+<tbody>
+<tr>
+<td><div style="display:block;text-align:left"><a href="https://www.google.com/chromeos" imageanchor="1"><img alt="https://www.google.com/chromeos" border="0" src="https://www.chromium.org/_/rsrc/1438811752264/chromium-projects/logo_chrome_color_1x_web_32dp.png" /></a></div>
+</td>
+<td style="padding:5px">Looking for Google Chrome OS devices?<br />
+<br />
+<a href="https://www.google.com/chromeos">Visit the Google Chrome OS site</a></td>
+</tr>
+</tbody>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+</div></div></td></tr></tbody></table><div class="sites-layout-tile sites-tile-name-footer sites-layout-empty-tile"><div dir="ltr"><br /></div></div></div>
+</div>
+</div>
+<div id="sites-canvas-bottom-panel">
+<div id="sites-attachments-container">
+</div>
+</div>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div id="sites-chrome-footer-wrapper">
+<div id="sites-chrome-footer-wrapper-inside">
+<div id="sites-chrome-footer">
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="sites-chrome-adminfooter-container">
+<div xmlns="http://www.w3.org/1999/xhtml" class="sites-adminfooter" role="navigation"><p><a class="sites-system-link" href="https://accounts.google.com/ServiceLogin?continue=https://sites.google.com/a/chromium.org/dev/chromium-projects&amp;service=jotspot">Sign in</a><span aria-hidden="true">|</span><a class="sites-system-link" href="/system/app/pages/recentChanges">Recent Site Activity</a><span aria-hidden="true">|</span><a class="sites-system-link" href="https://sites.google.com/a/chromium.org/dev/system/app/pages/reportAbuse" target="_blank">Report Abuse</a><span aria-hidden="true">|</span><a class="sites-system-link" href="javascript:;" onclick="window.open(webspace.printUrl)">Print Page</a><span aria-hidden="true">|</span><span class="sites-system-link">Powered By</span> <b class="powered-by"><a href="http://sites.google.com/site">Google Sites</a></b></p></div>
+</div>
+</div>
+</div>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+    window.jstiming.load.tick('sjl');
+  </script>
+<script xmlns="http://www.w3.org/1999/xhtml" src="https://ssl.gstatic.com/sites/p/8ef4a1/system/js/jot_min_view__en.js"></script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+    window.jstiming.load.tick('jl');
+  </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+                    sites.Searchbox.initialize(
+                        'sites-searchbox-search-button',
+                        {"object":[]}['object'],
+                        'search-site',
+                        {"label":"Configure search options...","url":"/system/app/pages/admin/settings"});
+                  </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+      gsites.HoverPopupMenu.createSiteDropdownMenus('sites-header-nav-dropdown', false);
+    </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
+            JOT_setupNav("7648876402527094", "Navigation", false);
+            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_7648876402527094');
+          </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
+            JOT_setupNav("14720868319272995", "Quick links", false);
+            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_14720868319272995');
+          </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
+            JOT_setupNav("19690813310444355", "Other sites", false);
+            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_19690813310444355');
+          </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+  setTimeout(function() {
+    var fingerprint = gsites.date.TimeZone.getFingerprint([1109635200000, 1128902400000, 1130657000000, 1143333000000, 1143806400000, 1145000000000, 1146380000000, 1152489600000, 1159800000000, 1159500000000, 1162095000000, 1162075000000, 1162105500000]);
+    gsites.Xhr.send('https://www.chromium.org/_/tz', null, null, 'GET', null, null, { afjstz: fingerprint });
+  }, 500);
+</script>
+<script xmlns="http://www.w3.org/1999/xhtml">
+                    window.onload = function() {
+                      if (false) {
+                        JOT_setMobilePreview();
+                      }
+                      var loadTimer = window.jstiming.load;
+                      loadTimer.tick("ol");
+                      loadTimer["name"] = "load," + webspace.page.type + ",user_page";
+                      window.jstiming.report(loadTimer, {}, 'https://gg.google.com/csi');
+                    }
+                  </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+        JOT_insertAnalyticsCode(false,
+            false);
+      </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+    var maestroRunner = new gsites.pages.view.SitesMaestroRunner(
+        webspace, "en");
+    maestroRunner.initListeners();
+    maestroRunner.installEditRender();
+  </script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
+  //<![CDATA[
+    // Decorate any fastUI buttons on the page with a class of 'goog-button'.
+    if (webspace.user.hasWriteAccess) {
+      JOT_decorateButtons();
+    }
+
+    // Fires delayed events.
+    (function() {
+      JOT_fullyLoaded = true;
+      var delayedEvents = JOT_delayedEvents;
+      for (var x = 0; x < delayedEvents.length; x++) {
+        var event = delayedEvents[x];
+        JOT_postEvent(event.eventName, event.eventSrc, event.payload);
+      }
+      JOT_delayedEvents = null;
+      JOT_postEvent('pageLoaded');
+    })();
+  //]]>
+</script>
+<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
+    JOT_postEvent('decorateGvizCharts');
+  </script>
+<script type="text/javascript">
+          JOT_setupPostRenderingManager();
+        </script>
+<script type="text/javascript">
+          JOT_postEvent('renderPlus', null, 'sites-chrome-main');
+        </script>
+<script type="text/javascript">
+          sites.codeembed.init();
+        </script>
+<div id="server-timer-div" style="display:none"> </div>
+<script type="text/javascript">
+          window.jstiming.load.tick('render');
+          JOT_postEvent('usercontentrendered', this);
+        </script>
+</body>
+</html>
+
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index 0c3cc31..77794db9 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -256,27 +256,58 @@
   configs += [ "//build/config/compiler:no_chromium_code" ]
 }
 
-source_set("core_internal_mediums_webrtc") {
+source_set("core_internal_mediums_utils") {
   public_configs = [ ":nearby_include_config" ]
   sources = [
     "src/cpp/core/internal/mediums/utils.cc",
-    "src/cpp/core/internal/mediums/webrtc/connection_flow.cc",
-    "src/cpp/core/internal/mediums/webrtc/signaling_frames.cc",
-    "src/cpp/core/internal/mediums/webrtc/webrtc_socket.cc",
     "src/cpp/core/internal/mediums/webrtc_peer_id.cc",
   ]
   public = [
+    "//third_party/abseil-cpp:absl",
     "src/cpp/core/internal/mediums/utils.h",
+    "src/cpp/core/internal/mediums/webrtc_peer_id.h",
+    "src/cpp/core/internal/mediums/webrtc_socket.h",
+  ]
+  public_deps = [
+    ":core_internal_mediums_webrtc_data_types",
+    ":offline_wire_formats_proto",
+    ":platform_base",
+    ":platform_public_types",
+  ]
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+}
+
+source_set("core_internal_mediums_webrtc_data_types") {
+  public_configs = [ ":nearby_include_config" ]
+  sources = [ "src/cpp/core/internal/mediums/webrtc/webrtc_socket_impl.cc" ]
+  public = [ "src/cpp/core/internal/mediums/webrtc/webrtc_socket_impl.h" ]
+  public_deps = [
+    ":core_types",
+    ":platform_base",
+    ":platform_public_types",
+    "//third_party/webrtc_overrides:webrtc_component",
+  ]
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+}
+
+source_set("core_internal_mediums_webrtc") {
+  public_configs = [ ":nearby_include_config" ]
+  sources = [
+    "src/cpp/core/internal/mediums/webrtc/connection_flow.cc",
+    "src/cpp/core/internal/mediums/webrtc/signaling_frames.cc",
+  ]
+  public = [
     "src/cpp/core/internal/mediums/webrtc/connection_flow.h",
     "src/cpp/core/internal/mediums/webrtc/data_channel_listener.h",
     "src/cpp/core/internal/mediums/webrtc/local_ice_candidate_listener.h",
     "src/cpp/core/internal/mediums/webrtc/session_description_wrapper.h",
     "src/cpp/core/internal/mediums/webrtc/signaling_frames.h",
-    "src/cpp/core/internal/mediums/webrtc/webrtc_socket.h",
-    "src/cpp/core/internal/mediums/webrtc_peer_id.h",
-    "src/cpp/core/internal/mediums/webrtc_socket_wrapper.h",
   ]
   public_deps = [
+    ":core_internal_mediums_utils",
+    ":core_internal_mediums_webrtc_data_types",
     ":core_types",
     ":platform_base",
     ":platform_public_comm",
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index abaff24..ac11bd5 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby-connections
-Version: 8c2dd35eac5092fb74d5a673a564689aee790546
+Version: 9ce7be981221037a9abfb625e9e51262c5be58c2
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f23ac56..2ced712 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -8750,6 +8750,17 @@
   <int value="3" label="Not Paired"/>
 </enum>
 
+<enum name="BluetoothGattServiceGattErrorCode">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Failed"/>
+  <int value="2" label="In Progress"/>
+  <int value="3" label="Invalid Length"/>
+  <int value="4" label="Not Permitted"/>
+  <int value="5" label="Not Authorized"/>
+  <int value="6" label="Not Paired"/>
+  <int value="7" label="Not Supported"/>
+</enum>
+
 <enum name="BluetoothPairingMethod">
   <int value="0" label="No user interaction required"/>
   <int value="1" label="PIN Code requested from user"/>
@@ -39946,6 +39957,17 @@
              00002900-0000-1000-8000-00805f9b34fb"/>
 </enum>
 
+<enum name="GattErrorCode">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Failed"/>
+  <int value="2" label="In Progress"/>
+  <int value="3" label="Invalid Length"/>
+  <int value="4" label="Not Permitted"/>
+  <int value="5" label="Not Authorized"/>
+  <int value="6" label="Not Paired"/>
+  <int value="7" label="Not Supported"/>
+</enum>
+
 <enum name="GATTServiceHash">
 <!-- Hash values can be produced using tool: bluetooth_metrics_hash -->
 
@@ -50824,6 +50846,7 @@
   <int value="-1482685863" label="enable-request-tablet-site"/>
   <int value="-1481990501" label="Windows10CustomTitlebar:disabled"/>
   <int value="-1481918315" label="SmsReceiverCrossDevice:enabled"/>
+  <int value="-1481777496" label="DragAndDropAndroid:disabled"/>
   <int value="-1480926949" label="MaterialDesignBookmarks:enabled"/>
   <int value="-1480866718" label="ash-disable-login-dim-and-blur"/>
   <int value="-1480606359" label="AssistantIntentPageUrl:enabled"/>
@@ -55136,6 +55159,7 @@
   <int value="1707873180"
       label="OmniboxOnFocusSuggestionsContextualWebAllowSRP:disabled"/>
   <int value="1708118086" label="TextFragmentAnchor:disabled"/>
+  <int value="1709255374" label="DragAndDropAndroid:enabled"/>
   <int value="1709898387"
       label="AutofillUseUnassociatedListedElements:enabled"/>
   <int value="1710630380"
@@ -65747,7 +65771,7 @@
   <int value="218" label="Phone Hub Apps: On/Off"/>
   <int value="219" label="Phone Hub Camera Roll: On/Off"/>
   <int value="220"
-      label="Nearby Share: Devices nearby are sharing notification"/>
+      label="Nearby Share: Devices nearby are sharing notification: On/Off"/>
   <int value="300" label="Add Account"/>
   <int value="301" label="Remove Account"/>
   <int value="302" label="Split Sync On/Off"/>
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
index c75dffbf..70c9c81f 100644
--- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml
+++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -245,6 +245,22 @@
   </token>
 </histogram>
 
+<histogram
+    name="Bluetooth.ChromeOS.FastPair.FastPairDataEncryptor.CreateResult"
+    enum="BooleanSuccess" expires_after="2022-06-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Records success or failure of creating the FastPairDataEncryptor during the
+    Fast Pair handshake process: exchanging the secret key with the device for
+    subsequent encryption used to write to the device. The handshake occurs on
+    the device discovery, before the user elects to begin the pairing process.
+    Emitted in the FastPair handshake (key exchange with the device) following
+    the async call to create the data encryptor.
+  </summary>
+</histogram>
+
 <histogram name="Bluetooth.ChromeOS.FastPair.GattConnection.ErrorReason"
     enum="BluetoothDeviceConnectErrorCode" expires_after="2022-09-20">
   <owner>shanefitz@google.com</owner>
@@ -269,6 +285,58 @@
   </summary>
 </histogram>
 
+<histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.NotifyTime"
+    units="ms" expires_after="2022-09-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Records the total time it takes to be notified of the Key-based pairing Gatt
+    characteristic of the device changing during the handshake. The time is
+    calculated as the difference between when the WriteRequest is sent to the
+    device, and when we are notified of a response. If the write request attempt
+    fails or takes longer than 5 seconds, no value is logged to this metric.
+  </summary>
+</histogram>
+
+<histogram
+    name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.GattErrorReason"
+    enum="BluetoothGattServiceGattErrorCode" expires_after="2022-09-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Breaks down why a written attempt to the Key-based pairing Gatt
+    characteristic of a device failed if it was a result of a Gatt error.
+    Emitted following a OnWriteRequest error in the FastPairGattServiceClient.
+  </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.PairFailure"
+    enum="FastPairPairFailure" expires_after="2022-09-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Breaks down why a written attempt to the Key-based pairing Gatt
+    characteristic of a device failed (see
+    'Bluetooth.ChromeOS.FastPair.WriteKeyBasedPairing.Result'). Emitted on the
+    OnWriteResponse event in the Fast Pair handshake.
+  </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.Result"
+    enum="BooleanSuccess" expires_after="2022-06-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Records success or failure of writing to the key-based pairing Gatt
+    characteristic of the device during the handshake. Emitted following the
+    writing request in FastPairHandshake.
+  </summary>
+</histogram>
+
 <histogram name="Bluetooth.ChromeOS.FastPair.KeyGenerationResult"
     enum="BooleanSuccess" expires_after="2022-06-20">
   <owner>shanefitz@google.com</owner>
@@ -398,6 +466,44 @@
   </token>
 </histogram>
 
+<histogram
+    name="Bluetooth.ChromeOS.FastPair.WriteKeyBasedPairing.GattErrorReason"
+    enum="GattErrorCode" expires_after="2022-09-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Breaks down why a written attempt to the Key-based pairing Gatt
+    characteristic of a device failed if it was a result of a Gatt error.
+    Emitted following a OnWriteRequest error in the FastPairGattServiceClient.
+  </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.FastPair.WriteKeyBasedPairing.PairFailure"
+    enum="FastPairPairFailure" expires_after="2022-09-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Breaks down why a written attempt to the Key-based pairing Gatt
+    characteristic of a device failed (see
+    'Bluetooth.ChromeOS.FastPair.WriteKeyBasedPairing.Result'). Emitted on the
+    OnWriteResponse event in the Fast Pair handshake.
+  </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.FastPair.WriteKeyBasedPairing.Result"
+    enum="BooleanSuccess" expires_after="2022-06-20">
+  <owner>shanefitz@google.com</owner>
+  <owner>julietlevesque@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    Records success or failure of writing to the Key-based pairing Gatt
+    characteristic of the device during the handshake. Emitted following the
+    writing request in FastPairHandshake.
+  </summary>
+</histogram>
+
 <histogram name="Bluetooth.ChromeOS.Forget.Result" enum="ForgetResult"
     expires_after="2022-07-21">
   <owner>khorimoto@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index 76a830a..5391a4f6 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -91,7 +91,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.AppliedDiscount" units="count"
-    expires_after="2021-12-30">
+    expires_after="2022-06-30">
   <owner>meiliang@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.ClickCart" units="index"
-    expires_after="2021-12-30">
+    expires_after="2022-06-30">
   <owner>wychen@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -140,7 +140,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.DataRequest" enum="CartDiscountDataType"
-    expires_after="2021-12-30">
+    expires_after="2022-06-30">
   <owner>meiliang@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.DiscountAt" units="index"
-    expires_after="2021-12-30">
+    expires_after="2022-06-30">
   <owner>meiliang@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -168,7 +168,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Carts.DiscountConsentShow" units="count"
-    expires_after="2021-12-30">
+    expires_after="2022-06-30">
   <owner>meiliang@chromium.org</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 2d2ccb7..dc36edb7 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,32 +1,36 @@
 {
     "trace_processor_shell": {
+        "linux_arm64": {
+            "hash": "5074025a2898ec41a872e70a5719e417acb0a380",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
+        },
+        "win": {
+            "hash": "721a33cf76548482ca67d76a59793e52d05a73cf",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/e780c370b9272c36eab718bacaa100537fd8d215/trace_processor_shell.exe"
+        },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
-        "win": {
-            "hash": "721a33cf76548482ca67d76a59793e52d05a73cf",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/78be2dc30c38c08ca3eeddb83b0738efc39e4528/trace_processor_shell.exe"
+        "linux_arm": {
+            "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
             "hash": "802fed751d62ca3db41bc4ae27e43b546d000ce8",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/78be2dc30c38c08ca3eeddb83b0738efc39e4528/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/e780c370b9272c36eab718bacaa100537fd8d215/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
             "remote_path": "perfetto_binaries/trace_processor_shell/mac_arm64/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell"
         },
-        "linux_arm64": {
-            "hash": "5074025a2898ec41a872e70a5719e417acb0a380",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
-        },
         "linux": {
             "hash": "b398814dcad4d922530117d4c3d0d3517e8ac4a7",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/78be2dc30c38c08ca3eeddb83b0738efc39e4528/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/e780c370b9272c36eab718bacaa100537fd8d215/trace_processor_shell"
         }
     },
     "power_profile.sql": {
         "hash": "5bc5eae952c72d04403409a56838f66da13394d6",
         "remote_path": "perfetto_data/power_profile.sql/20200713T171147/power_profile.sql"
     }
-}
+}
\ No newline at end of file