diff --git a/DEPS b/DEPS
index cb30c66..60bc1d7 100644
--- a/DEPS
+++ b/DEPS
@@ -133,7 +133,7 @@
   # 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': 'a8603a711413b4d7228ed60e53ac5b26db32eb3c',
+  'v8_revision': '2723b1866729248e4e384c440dd1b07c0bad3646',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -141,15 +141,15 @@
   # 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': '62e274e86c7eeedeb764ed58e14911e75b852d84',
+  'angle_revision': 'cb8f677cbfb4b6c70b170322920644f51b0f3722',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'ed46cde6ee671297e5b56de68307b9b8286517fd',
+  'swiftshader_revision': 'ea1b0983c7b43146e098498e41438075772da018',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'e9fa6a97fea60fcacb3088a6f012fb4dd218095e',
+  'pdfium_revision': 'd8beda83b6696f4745c49f5fb77861fb953f9575',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -767,7 +767,7 @@
   },
 
   'src/third_party/breakpad/breakpad':
-    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + '232c45abee1753785ae32938589eede535bdb06d',
+    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + '1fc9cc0d0e1dfafb8d29dba8d01f09587d870026',
 
   'src/third_party/byte_buddy': {
       'packages': [
@@ -805,7 +805,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '34fa2d0df828258a29a31211d1ae2285f89019b3',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '95b5ef9328dd1dcfb46d23a51c71f8c05a445752',
       'condition': 'checkout_linux',
   },
 
@@ -1183,7 +1183,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'd63e3ca06b1e4ce812ea6a60def1b06048019655',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '505f9c976576a0b521a8bba8a9008eab4445a0dd',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1395,7 +1395,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@819eccad594dbf00e629489604adf4375a4f7f63',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2695bdcbd7bb4f49f17b7802b9a7e989dca1e7ed',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 3d82da6..e75d3b44 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -827,8 +827,7 @@
     }
   }
 
-  if (request.resource_type ==
-      static_cast<int>(content::ResourceType::kMainFrame)) {
+  if (request.resource_type == content::ResourceType::kMainFrame) {
     const bool is_load_url =
         request.transition_type & ui::PAGE_TRANSITION_FROM_API;
     const bool is_go_back_forward =
diff --git a/android_webview/browser/gfx/aw_draw_fn_impl.cc b/android_webview/browser/gfx/aw_draw_fn_impl.cc
index 245a3b1..0b2410b8 100644
--- a/android_webview/browser/gfx/aw_draw_fn_impl.cc
+++ b/android_webview/browser/gfx/aw_draw_fn_impl.cc
@@ -307,7 +307,7 @@
   if (!vulkan_context_provider_)
     return;
 
-  DCHECK(!draw_context_);
+  DCHECK(!scoped_secondary_cb_draw_);
 
   auto color_space = CreateColorSpace(params);
   if (!color_space) {
@@ -315,13 +315,13 @@
     LOG(ERROR) << "Received invalid colorspace.";
     color_space = SkColorSpace::MakeSRGB();
   }
-  draw_context_ = CreateDrawContext(vulkan_context_provider_->gr_context(),
-                                    params, color_space);
+  auto draw_context = CreateDrawContext(vulkan_context_provider_->gr_context(),
+                                        params, color_space);
 
   // Set the draw contexct in |vulkan_context_provider_|, so the SkiaRenderer
   // and SkiaOutputSurface* will use it as frame render target.
-  AwVulkanContextProvider::ScopedDrawContext scoped_draw_context(
-      vulkan_context_provider_.get(), draw_context_.get());
+  scoped_secondary_cb_draw_.emplace(vulkan_context_provider_.get(),
+                                    std::move(draw_context));
   DrawInternal(params, color_space.get());
 }
 
@@ -329,16 +329,8 @@
   if (!vulkan_context_provider_)
     return;
 
-  gpu::VulkanFenceHelper* fence_helper =
-      vulkan_context_provider_->GetDeviceQueue()->GetFenceHelper();
-
-  fence_helper->EnqueueCleanupTaskForSubmittedWork(
-      base::BindOnce(&CleanupInFlightDraw, std::move(draw_context_),
-                     static_cast<VkSemaphore>(VK_NULL_HANDLE)));
-
-  // Process cleanup tasks and generate fences at the end of each PostDrawVk.
-  fence_helper->GenerateCleanupFence();
-  fence_helper->ProcessCleanupTasks();
+  DCHECK(scoped_secondary_cb_draw_);
+  scoped_secondary_cb_draw_.reset();
 }
 
 void AwDrawFnImpl::DrawVkInterop(AwDrawFn_DrawVkParams* params) {
diff --git a/android_webview/browser/gfx/aw_draw_fn_impl.h b/android_webview/browser/gfx/aw_draw_fn_impl.h
index a75362c2..aa54c39c 100644
--- a/android_webview/browser/gfx/aw_draw_fn_impl.h
+++ b/android_webview/browser/gfx/aw_draw_fn_impl.h
@@ -7,12 +7,14 @@
 
 #include <memory>
 
+#include "android_webview/browser/gfx/aw_vulkan_context_provider.h"
 #include "android_webview/browser/gfx/compositor_frame_consumer.h"
 #include "android_webview/browser/gfx/render_thread_manager.h"
 #include "android_webview/public/browser/draw_fn.h"
 #include "base/android/jni_weak_ref.h"
 #include "base/containers/queue.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/gpu/vk/GrVkTypes.h"
 
@@ -24,7 +26,6 @@
 
 namespace android_webview {
 class GLNonOwnedCompatibilityContext;
-class AwVulkanContextProvider;
 
 class AwDrawFnImpl {
  public:
@@ -91,8 +92,8 @@
   // Vulkan context provider for Vk rendering.
   scoped_refptr<AwVulkanContextProvider> vulkan_context_provider_;
 
-  // The draw context for the current frame. It is for direct mode only.
-  sk_sp<GrVkSecondaryCBDrawContext> draw_context_;
+  base::Optional<AwVulkanContextProvider::ScopedSecondaryCBDraw>
+      scoped_secondary_cb_draw_;
 
   // GL context used to draw via GL in Vk interop path.
   scoped_refptr<GLNonOwnedCompatibilityContext> gl_context_;
diff --git a/android_webview/browser/gfx/aw_vulkan_context_provider.cc b/android_webview/browser/gfx/aw_vulkan_context_provider.cc
index 77011da..5057e76 100644
--- a/android_webview/browser/gfx/aw_vulkan_context_provider.cc
+++ b/android_webview/browser/gfx/aw_vulkan_context_provider.cc
@@ -7,11 +7,15 @@
 #include <utility>
 
 #include "android_webview/public/browser/draw_fn.h"
+#include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/native_library.h"
 #include "gpu/vulkan/init/vulkan_factory.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
+#include "gpu/vulkan/vulkan_fence_helper.h"
 #include "gpu/vulkan/vulkan_function_pointers.h"
+#include "gpu/vulkan/vulkan_util.h"
 #include "third_party/skia/include/gpu/GrContext.h"
 #include "third_party/skia/include/gpu/vk/GrVkBackendContext.h"
 #include "third_party/skia/include/gpu/vk/GrVkExtensions.h"
@@ -66,7 +70,6 @@
 // static
 scoped_refptr<AwVulkanContextProvider>
 AwVulkanContextProvider::GetOrCreateInstance(AwDrawFn_InitVkParams* params) {
-  DCHECK(g_vulkan_context_provider || params);
   if (g_vulkan_context_provider) {
     DCHECK(!params || params->device == g_vulkan_context_provider->device());
     DCHECK(!params || params->queue == g_vulkan_context_provider->queue());
@@ -106,10 +109,24 @@
 
 GrVkSecondaryCBDrawContext*
 AwVulkanContextProvider::GetGrSecondaryCBDrawContext() {
-  return draw_context_;
+  return draw_context_.get();
+}
+
+void AwVulkanContextProvider::EnqueueSecondaryCBSemaphores(
+    std::vector<VkSemaphore> semaphores) {
+  post_submit_semaphores_.reserve(post_submit_semaphores_.size() +
+                                  semaphores.size());
+  std::copy(semaphores.begin(), semaphores.end(),
+            std::back_inserter(post_submit_semaphores_));
+}
+
+void AwVulkanContextProvider::EnqueueSecondaryCBPostSubmitTask(
+    base::OnceClosure closure) {
+  post_submit_tasks_.push_back(std::move(closure));
 }
 
 bool AwVulkanContextProvider::Initialize(AwDrawFn_InitVkParams* params) {
+  DCHECK(params);
   // Don't call init on implementation. Instead call InitVulkanForWebView,
   // which avoids creating a new instance.
   implementation_ = gpu::CreateVulkanImplementation();
@@ -157,4 +174,39 @@
   return true;
 }
 
+void AwVulkanContextProvider::SecondaryCBDrawBegin(
+    sk_sp<GrVkSecondaryCBDrawContext> draw_context) {
+  DCHECK(draw_context);
+  DCHECK(!draw_context_);
+  DCHECK(post_submit_tasks_.empty());
+  draw_context_ = draw_context;
+}
+
+void AwVulkanContextProvider::SecondaryCMBDrawSubmitted() {
+  DCHECK(draw_context_);
+  auto draw_context = std::move(draw_context_);
+
+  auto* fence_helper = device_queue_->GetFenceHelper();
+  VkFence vk_fence = VK_NULL_HANDLE;
+  auto result = fence_helper->GetFence(&vk_fence);
+  DCHECK(result == VK_SUCCESS);
+  gpu::SubmitSignalVkSemaphores(queue(), post_submit_semaphores_, vk_fence);
+
+  post_submit_semaphores_.clear();
+  fence_helper->EnqueueCleanupTaskForSubmittedWork(base::BindOnce(
+      [](sk_sp<GrVkSecondaryCBDrawContext> context,
+         gpu::VulkanDeviceQueue* device_queue, bool device_lost) {
+        context->releaseResources();
+        DCHECK(context->unique());
+        context = nullptr;
+      },
+      std::move(draw_context)));
+  for (auto& closure : post_submit_tasks_)
+    std::move(closure).Run();
+  post_submit_tasks_.clear();
+
+  fence_helper->EnqueueFence(vk_fence);
+  fence_helper->ProcessCleanupTasks();
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/gfx/aw_vulkan_context_provider.h b/android_webview/browser/gfx/aw_vulkan_context_provider.h
index f820c1c..7af52ae5 100644
--- a/android_webview/browser/gfx/aw_vulkan_context_provider.h
+++ b/android_webview/browser/gfx/aw_vulkan_context_provider.h
@@ -11,6 +11,8 @@
 #include "components/viz/common/gpu/vulkan_context_provider.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
+#include "third_party/skia/src/gpu/vk/GrVkSecondaryCBDrawContext.h"
 
 struct AwDrawFn_InitVkParams;
 class GrContext;
@@ -25,19 +27,19 @@
 
 class AwVulkanContextProvider final : public viz::VulkanContextProvider {
  public:
-  class ScopedDrawContext {
+  class ScopedSecondaryCBDraw {
    public:
-    ScopedDrawContext(AwVulkanContextProvider* provider,
-                      GrVkSecondaryCBDrawContext* draw_context)
+    ScopedSecondaryCBDraw(AwVulkanContextProvider* provider,
+                          sk_sp<GrVkSecondaryCBDrawContext> draw_context)
         : provider_(provider) {
-      provider_->set_draw_context(draw_context);
+      provider_->SecondaryCBDrawBegin(std::move(draw_context));
     }
-    ~ScopedDrawContext() { provider_->set_draw_context(nullptr); }
+    ~ScopedSecondaryCBDraw() { provider_->SecondaryCMBDrawSubmitted(); }
 
    private:
     AwVulkanContextProvider* const provider_;
 
-    DISALLOW_COPY_AND_ASSIGN(ScopedDrawContext);
+    DISALLOW_COPY_AND_ASSIGN(ScopedSecondaryCBDraw);
   };
 
   static scoped_refptr<AwVulkanContextProvider> GetOrCreateInstance(
@@ -48,6 +50,9 @@
   gpu::VulkanDeviceQueue* GetDeviceQueue() override;
   GrContext* GetGrContext() override;
   GrVkSecondaryCBDrawContext* GetGrSecondaryCBDrawContext() override;
+  void EnqueueSecondaryCBSemaphores(
+      std::vector<VkSemaphore> semaphores) override;
+  void EnqueueSecondaryCBPostSubmitTask(base::OnceClosure closure) override;
 
   VkPhysicalDevice physical_device() {
     return device_queue_->GetVulkanPhysicalDevice();
@@ -64,16 +69,15 @@
   ~AwVulkanContextProvider() override;
 
   bool Initialize(AwDrawFn_InitVkParams* params);
-
-  void set_draw_context(GrVkSecondaryCBDrawContext* draw_context) {
-    DCHECK_NE(!!draw_context_, !!draw_context);
-    draw_context_ = draw_context;
-  }
+  void SecondaryCBDrawBegin(sk_sp<GrVkSecondaryCBDrawContext> draw_context);
+  void SecondaryCMBDrawSubmitted();
 
   std::unique_ptr<gpu::VulkanImplementation> implementation_;
   std::unique_ptr<gpu::VulkanDeviceQueue> device_queue_;
   sk_sp<GrContext> gr_context_;
-  GrVkSecondaryCBDrawContext* draw_context_ = nullptr;
+  sk_sp<GrVkSecondaryCBDrawContext> draw_context_;
+  std::vector<base::OnceClosure> post_submit_tasks_;
+  std::vector<VkSemaphore> post_submit_semaphores_;
 
   DISALLOW_COPY_AND_ASSIGN(AwVulkanContextProvider);
 };
diff --git a/android_webview/browser/net/aw_web_resource_request.cc b/android_webview/browser/net/aw_web_resource_request.cc
index ec66a86a..c9ce0e6 100644
--- a/android_webview/browser/net/aw_web_resource_request.cc
+++ b/android_webview/browser/net/aw_web_resource_request.cc
@@ -54,8 +54,7 @@
     const network::ResourceRequest& request)
     : url(request.url.spec()),
       method(request.method),
-      is_main_frame(request.resource_type ==
-                    static_cast<int>(content::ResourceType::kMainFrame)),
+      is_main_frame(request.resource_type == content::ResourceType::kMainFrame),
       has_user_gesture(request.has_user_gesture),
       is_renderer_initiated(ui::PageTransitionIsWebTriggerable(
           static_cast<ui::PageTransition>(request.transition_type))) {
diff --git a/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc b/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc
index a55511e..da153c41 100644
--- a/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc
+++ b/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc
@@ -159,8 +159,7 @@
     network::ResourceRequest request;
     request.url = url;
     request.method = "GET";
-    request.resource_type =
-        static_cast<int>(content::ResourceType::kSubResource);
+    request.resource_type = content::ResourceType::kSubResource;
     return request;
   }
 
diff --git a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
index e211a29..d73e3c1 100644
--- a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
+++ b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
@@ -498,8 +498,7 @@
                        std::move(error_info)));
   }
 
-  if (request_.resource_type ==
-      static_cast<int>(content::ResourceType::kMainFrame)) {
+  if (request_.resource_type == content::ResourceType::kMainFrame) {
     // Check for x-auto-login-header
     HeaderData header_data;
     std::string header_string;
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 0d36ac0..431fcf3 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -841,6 +841,13 @@
 
     UMA_HISTOGRAM_COUNTS_100(app_list::kSearchQueryLength,
                              last_raw_query_.size());
+    if (IsTabletMode()) {
+      UMA_HISTOGRAM_COUNTS_100(app_list::kSearchQueryLengthInTablet,
+                               last_raw_query_.size());
+    } else {
+      UMA_HISTOGRAM_COUNTS_100(app_list::kSearchQueryLengthInClamshell,
+                               last_raw_query_.size());
+    }
 
     if (result->distance_from_origin() >= 0) {
       UMA_HISTOGRAM_COUNTS_100(app_list::kSearchResultDistanceFromOrigin,
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h
index a48bf4c..c5a4880d 100644
--- a/ash/app_list/app_list_metrics.h
+++ b/ash/app_list/app_list_metrics.h
@@ -89,6 +89,16 @@
 // opened.
 constexpr char kSearchQueryLength[] = "Apps.AppListSearchQueryLength";
 
+// The UMA histogram that logs how long the search query was when a result was
+// opened in clamshell mode.
+constexpr char kSearchQueryLengthInClamshell[] =
+    "Apps.AppListSearchQueryLength.ClamshellMode";
+
+// The UMA histogram that logs how long the search query was when a result was
+// opened in tablet mode.
+constexpr char kSearchQueryLengthInTablet[] =
+    "Apps.AppListSearchQueryLength.TabletMode";
+
 // The UMA histogram that logs the Manhattan distance from the origin of the
 // search results to the selected result.
 constexpr char kSearchResultDistanceFromOrigin[] =
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.cc b/base/task/thread_pool/platform_native_worker_pool_win.cc
index 8eb2218..9b16a5e5 100644
--- a/base/task/thread_pool/platform_native_worker_pool_win.cc
+++ b/base/task/thread_pool/platform_native_worker_pool_win.cc
@@ -6,38 +6,11 @@
 
 #include "base/optional.h"
 #include "base/task/thread_pool/task_tracker.h"
-#include "base/threading/scoped_blocking_call.h"
 #include "base/win/scoped_com_initializer.h"
 
 namespace base {
 namespace internal {
 
-class PlatformNativeWorkerPoolWin::ScopedCallbackMayRunLongObserver
-    : public BlockingObserver {
- public:
-  ScopedCallbackMayRunLongObserver(PTP_CALLBACK_INSTANCE callback)
-      : callback_(callback) {
-    SetBlockingObserverForCurrentThread(this);
-  }
-
-  ~ScopedCallbackMayRunLongObserver() override {
-    ClearBlockingObserverForCurrentThread();
-  }
-
-  // BlockingObserver:
-  void BlockingStarted(BlockingType blocking_type) override {
-    ::CallbackMayRunLong(callback_);
-  }
-
-  void BlockingTypeUpgraded() override {}
-  void BlockingEnded() override {}
-
- private:
-  PTP_CALLBACK_INSTANCE callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedCallbackMayRunLongObserver);
-};
-
 PlatformNativeWorkerPoolWin::PlatformNativeWorkerPoolWin(
     TrackedRef<TaskTracker> task_tracker,
     TrackedRef<Delegate> delegate,
@@ -71,13 +44,13 @@
 
 void PlatformNativeWorkerPoolWin::SubmitWork() {
   // TODO(fdoray): Handle priorities by having different work objects and using
-  // SetThreadpoolCallbackPriority().
+  // SetThreadpoolCallbackPriority() and SetThreadpoolCallbackRunsLong().
   ::SubmitThreadpoolWork(work_);
 }
 
 // static
 void CALLBACK PlatformNativeWorkerPoolWin::RunNextSequence(
-    PTP_CALLBACK_INSTANCE callback_instance,
+    PTP_CALLBACK_INSTANCE,
     void* scheduler_worker_pool_windows_impl,
     PTP_WORK) {
   auto* worker_pool = static_cast<PlatformNativeWorkerPoolWin*>(
@@ -90,9 +63,6 @@
   if (worker_pool->worker_environment_ == WorkerEnvironment::COM_MTA)
     com_initializer.emplace(win::ScopedCOMInitializer::kMTA);
 
-  ScopedCallbackMayRunLongObserver callback_may_run_long_observer(
-      callback_instance);
-
   worker_pool->RunNextSequenceImpl();
 }
 
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.h b/base/task/thread_pool/platform_native_worker_pool_win.h
index 5adb15f..cb7fe7a 100644
--- a/base/task/thread_pool/platform_native_worker_pool_win.h
+++ b/base/task/thread_pool/platform_native_worker_pool_win.h
@@ -34,10 +34,8 @@
   ~PlatformNativeWorkerPoolWin() override;
 
  private:
-  class ScopedCallbackMayRunLongObserver;
-
   // Callback that gets run by |pool_|.
-  static void CALLBACK RunNextSequence(PTP_CALLBACK_INSTANCE callback_instance,
+  static void CALLBACK RunNextSequence(PTP_CALLBACK_INSTANCE,
                                        void* scheduler_worker_pool_windows_impl,
                                        PTP_WORK);
 
diff --git a/base/threading/scoped_blocking_call.cc b/base/threading/scoped_blocking_call.cc
index a548e12..f5fcad0 100644
--- a/base/threading/scoped_blocking_call.cc
+++ b/base/threading/scoped_blocking_call.cc
@@ -121,7 +121,7 @@
   tls_blocking_observer.Get().Set(blocking_observer);
 }
 
-void ClearBlockingObserverForCurrentThread() {
+void ClearBlockingObserverForTesting() {
   tls_blocking_observer.Get().Set(nullptr);
 }
 
diff --git a/base/threading/scoped_blocking_call.h b/base/threading/scoped_blocking_call.h
index 4b3666b..9161f20 100644
--- a/base/threading/scoped_blocking_call.h
+++ b/base/threading/scoped_blocking_call.h
@@ -160,7 +160,7 @@
 BASE_EXPORT void SetBlockingObserverForCurrentThread(
     BlockingObserver* blocking_observer);
 
-BASE_EXPORT void ClearBlockingObserverForCurrentThread();
+BASE_EXPORT void ClearBlockingObserverForTesting();
 
 // Unregisters the |blocking_observer| on the current thread within its scope.
 // Used in ThreadPool tests to prevent calls to //base sync primitives from
diff --git a/base/threading/scoped_blocking_call_unittest.cc b/base/threading/scoped_blocking_call_unittest.cc
index 4c703b5..3ddf07bb 100644
--- a/base/threading/scoped_blocking_call_unittest.cc
+++ b/base/threading/scoped_blocking_call_unittest.cc
@@ -34,7 +34,7 @@
   }
 
   ~ScopedBlockingCallTest() override {
-    internal::ClearBlockingObserverForCurrentThread();
+    internal::ClearBlockingObserverForTesting();
   }
 
   testing::StrictMock<MockBlockingObserver> observer_;
diff --git a/base/threading/simple_thread.cc b/base/threading/simple_thread.cc
index 83a6e3f..2477bc7 100644
--- a/base/threading/simple_thread.cc
+++ b/base/threading/simple_thread.cc
@@ -11,12 +11,11 @@
 
 namespace base {
 
-SimpleThread::SimpleThread(const std::string& name_prefix)
-    : SimpleThread(name_prefix, Options()) {}
+SimpleThread::SimpleThread(const std::string& name)
+    : SimpleThread(name, Options()) {}
 
-SimpleThread::SimpleThread(const std::string& name_prefix,
-                           const Options& options)
-    : name_prefix_(name_prefix),
+SimpleThread::SimpleThread(const std::string& name, const Options& options)
+    : name_(name),
       options_(options),
       event_(WaitableEvent::ResetPolicy::MANUAL,
              WaitableEvent::InitialState::NOT_SIGNALED) {}
@@ -67,11 +66,7 @@
 
 void SimpleThread::ThreadMain() {
   tid_ = PlatformThread::CurrentId();
-  // Construct our full name of the form "name_prefix_/TID".
-  std::string name(name_prefix_);
-  name.push_back('/');
-  name.append(NumberToString(tid_));
-  PlatformThread::SetName(name);
+  PlatformThread::SetName(name_);
 
   // We've initialized our new thread, signal that we're done to Start().
   event_.Signal();
@@ -81,14 +76,13 @@
 }
 
 DelegateSimpleThread::DelegateSimpleThread(Delegate* delegate,
-                                           const std::string& name_prefix)
-    : DelegateSimpleThread(delegate, name_prefix, Options()) {}
+                                           const std::string& name)
+    : DelegateSimpleThread(delegate, name, Options()) {}
 
 DelegateSimpleThread::DelegateSimpleThread(Delegate* delegate,
-                                           const std::string& name_prefix,
+                                           const std::string& name,
                                            const Options& options)
-    : SimpleThread(name_prefix, options),
-      delegate_(delegate) {
+    : SimpleThread(name, options), delegate_(delegate) {
   DCHECK(delegate_);
 }
 
@@ -121,7 +115,10 @@
 void DelegateSimpleThreadPool::Start() {
   DCHECK(threads_.empty()) << "Start() called with outstanding threads.";
   for (int i = 0; i < num_threads_; ++i) {
-    DelegateSimpleThread* thread = new DelegateSimpleThread(this, name_prefix_);
+    std::string name(name_prefix_);
+    name.push_back('/');
+    name.append(NumberToString(i));
+    DelegateSimpleThread* thread = new DelegateSimpleThread(this, name);
     thread->Start();
     threads_.push_back(thread);
   }
diff --git a/base/threading/simple_thread.h b/base/threading/simple_thread.h
index 769ce21..791b883 100644
--- a/base/threading/simple_thread.h
+++ b/base/threading/simple_thread.h
@@ -81,12 +81,12 @@
     bool joinable = true;
   };
 
-  // Create a SimpleThread.  |options| should be used to manage any specific
+  // Creates a SimpleThread. |options| should be used to manage any specific
   // configuration involving the thread creation and management.
-  // Every thread has a name, in the form of |name_prefix|/TID, for example
-  // "my_thread/321".  The thread will not be created until Start() is called.
-  explicit SimpleThread(const std::string& name_prefix);
-  SimpleThread(const std::string& name_prefix, const Options& options);
+  // Every thread has a name, which is a display string to identify the thread.
+  // The thread will not be created until Start() is called.
+  explicit SimpleThread(const std::string& name);
+  SimpleThread(const std::string& name, const Options& options);
 
   ~SimpleThread() override;
 
@@ -140,8 +140,7 @@
   // has been initialized before this is called.
   virtual void BeforeJoin() {}
 
-  const std::string name_prefix_;
-  std::string name_;
+  const std::string name_;
   const Options options_;
   PlatformThreadHandle thread_;  // PlatformThread handle, reset after Join.
   WaitableEvent event_;          // Signaled if Start() was ever called.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 051e431..6ca5f9c8 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8915367507034027888
\ No newline at end of file
+8915340996931770800
\ No newline at end of file
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index 299d343..3c12862 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -108,46 +108,12 @@
       update_submission_state_callback_.Run(will_draw);
   }
 
-  return surface_range_.IsValid() && will_draw;
+  return will_draw;
 }
 
 void SurfaceLayerImpl::AppendQuads(viz::RenderPass* render_pass,
                                    AppendQuadsData* append_quads_data) {
   AppendRainbowDebugBorder(render_pass);
-  if (!surface_range_.IsValid())
-    return;
-
-  auto* primary = CreateSurfaceDrawQuad(render_pass, surface_range_);
-  if (primary) {
-    // Add the primary surface ID as a dependency.
-    append_quads_data->activation_dependencies.push_back(surface_range_.end());
-    if (deadline_in_frames_) {
-      if (!append_quads_data->deadline_in_frames)
-        append_quads_data->deadline_in_frames = 0u;
-      append_quads_data->deadline_in_frames = std::max(
-          *append_quads_data->deadline_in_frames, *deadline_in_frames_);
-    } else {
-      append_quads_data->use_default_lower_bound_deadline = true;
-    }
-  }
-  // Unless the client explicitly specifies otherwise, don't block on
-  // |surface_range_| more than once.
-  deadline_in_frames_ = 0u;
-}
-
-bool SurfaceLayerImpl::is_surface_layer() const {
-  return true;
-}
-
-gfx::Rect SurfaceLayerImpl::GetEnclosingRectInTargetSpace() const {
-  return GetScaledEnclosingRectInTargetSpace(
-      layer_tree_impl()->device_scale_factor());
-}
-
-viz::SurfaceDrawQuad* SurfaceLayerImpl::CreateSurfaceDrawQuad(
-    viz::RenderPass* render_pass,
-    const viz::SurfaceRange& surface_range) {
-  DCHECK(surface_range.end().is_valid());
 
   float device_scale_factor = layer_tree_impl()->device_scale_factor();
 
@@ -162,7 +128,7 @@
   visible_quad_rect = gfx::IntersectRects(quad_rect, visible_quad_rect);
 
   if (visible_quad_rect.IsEmpty())
-    return nullptr;
+    return;
 
   viz::SharedQuadState* shared_quad_state =
       render_pass->CreateAndAppendSharedQuadState();
@@ -170,14 +136,40 @@
   PopulateScaledSharedQuadState(shared_quad_state, device_scale_factor,
                                 device_scale_factor, contents_opaque());
 
-  auto* surface_draw_quad =
-      render_pass->CreateAndAppendDrawQuad<viz::SurfaceDrawQuad>();
-  surface_draw_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
-                            surface_range, background_color(),
-                            stretch_content_to_fill_bounds_,
-                            has_pointer_events_none_);
+  if (surface_range_.IsValid()) {
+    auto* quad = render_pass->CreateAndAppendDrawQuad<viz::SurfaceDrawQuad>();
+    quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
+                 surface_range_, background_color(),
+                 stretch_content_to_fill_bounds_, has_pointer_events_none_);
+    // Add the primary surface ID as a dependency.
+    append_quads_data->activation_dependencies.push_back(surface_range_.end());
+    if (deadline_in_frames_) {
+      if (!append_quads_data->deadline_in_frames)
+        append_quads_data->deadline_in_frames = 0u;
+      append_quads_data->deadline_in_frames = std::max(
+          *append_quads_data->deadline_in_frames, *deadline_in_frames_);
+    } else {
+      append_quads_data->use_default_lower_bound_deadline = true;
+    }
+  } else {
+    auto* quad =
+        render_pass->CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
+    quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
+                 background_color(), false /* force_anti_aliasing_off */);
+  }
 
-  return surface_draw_quad;
+  // Unless the client explicitly specifies otherwise, don't block on
+  // |surface_range_| more than once.
+  deadline_in_frames_ = 0u;
+}
+
+bool SurfaceLayerImpl::is_surface_layer() const {
+  return true;
+}
+
+gfx::Rect SurfaceLayerImpl::GetEnclosingRectInTargetSpace() const {
+  return GetScaledEnclosingRectInTargetSpace(
+      layer_tree_impl()->device_scale_factor());
 }
 
 void SurfaceLayerImpl::GetDebugBorderProperties(SkColor* color,
diff --git a/cc/layers/surface_layer_impl.h b/cc/layers/surface_layer_impl.h
index 1c3849f95..933664a 100644
--- a/cc/layers/surface_layer_impl.h
+++ b/cc/layers/surface_layer_impl.h
@@ -75,10 +75,6 @@
   SurfaceLayerImpl(LayerTreeImpl* tree_impl, int id, UpdateSubmissionStateCB);
 
  private:
-  viz::SurfaceDrawQuad* CreateSurfaceDrawQuad(
-      viz::RenderPass* render_pass,
-      const viz::SurfaceRange& surface_range);
-
   void GetDebugBorderProperties(SkColor* color, float* width) const override;
   void AppendRainbowDebugBorder(viz::RenderPass* render_pass);
   void AsValueInto(base::trace_event::TracedValue* dict) const override;
diff --git a/chrome/VERSION b/chrome/VERSION
index 317810a..3bebf77 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=76
 MINOR=0
-BUILD=3775
+BUILD=3776
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 011c7e0e..311abb01 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -238,12 +238,22 @@
   }
 }
 
+# This prevents a cyclic dependency for features depending on the compositor.
+# TODO(crbug.com/846440): Move this to features/compositor when ready.
+android_library("chrome_public_java") {
+  java_files = [ "//chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewResizer.java" ]
+  deps = [
+    "//third_party/android_deps:com_android_support_support_annotations_java",
+  ]
+}
+
 android_library("chrome_java") {
   deps = [
     ":chrome_app_java_resources",
     ":chrome_download_java_resources",
     ":chrome_public_android_manifest",
     ":chrome_public_apk_template_resources",
+    ":chrome_public_java",
     ":chrome_version_constants",
     ":document_tab_model_info_proto_java",
     ":partner_location_descriptor_proto_java",
@@ -260,6 +270,8 @@
     "$google_play_services_package:google_play_services_tasks_java",
     "//base:base_java",
     "//base:jni_java",
+    "//chrome/android/features/keyboard_accessory/factory:java",
+    "//chrome/android/features/keyboard_accessory/public:java",
     "//chrome/android/third_party/compositor_animator:compositor_animator_java",
     "//chrome/android/webapk/libs/client:client_java",
     "//chrome/android/webapk/libs/common:common_java",
@@ -459,6 +471,7 @@
 java_group("chrome_all_java") {
   deps = [
     ":chrome_java",
+    "//chrome/android/features/keyboard_accessory/internal:java",
     "//chrome/android/features/media_router:java",
   ]
 }
@@ -469,6 +482,7 @@
   public_deps = [
     ":chrome_jni_headers",
     "//chrome/android/features/autofill_assistant:jni_headers",
+    "//chrome/android/features/keyboard_accessory:jni_headers",
     "//chrome/android/features/media_router:jni_headers",
   ]
 }
@@ -504,12 +518,10 @@
     "//chrome/browser/android/webapk/webapk_install_service.h",
     "//chrome/browser/android/webapk/webapk_installer.h",
     "//chrome/browser/android/webapk/webapk_types.h",
-    "//chrome/browser/autofill/manual_filling_view_interface.h",
     "//chrome/browser/banners/app_banner_settings_helper.h",
     "//chrome/browser/notifications/notification_channels_provider_android.h",
     "//chrome/browser/notifications/notification_platform_bridge_android.cc",
     "//chrome/browser/ntp_snippets/ntp_snippets_metrics.h",
-    "//chrome/browser/password_manager/password_accessory_metrics_util.h",
     "//chrome/browser/profiles/profile_metrics.h",
     "//chrome/browser/translate/android/translate_utils.h",
     "//chrome/browser/ui/android/infobars/infobar_android.h",
@@ -606,6 +618,7 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
+    "//chrome/android/features/keyboard_accessory/internal:java",
     "//chrome/android/features/tab_ui:java",
     "//chrome/android/webapk/libs/client:client_java",
     "//chrome/android/webapk/libs/common:common_java",
@@ -1923,6 +1936,7 @@
     ":chrome_test_apk_template_resources",
     ":chrome_test_java",
     "//chrome/android/features/autofill_assistant:test_java",
+    "//chrome/android/features/keyboard_accessory:test_java",
     "//chrome/android/features/media_router:test_java",
     "//chrome/android/webapk/libs/runtime_library:runtime_library_javatests",
     "//chrome/android/webapk/shell_apk:shell_apk_javatests",
@@ -2298,8 +2312,6 @@
     "java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java",
     "java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
     "java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
-    "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java",
-    "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingBridge.java",
     "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTask.java",
     "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java",
     "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index c5ae594..66793921 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -91,52 +91,6 @@
   "java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java",
   "java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
   "java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMetricsRecorder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardExtensionViewResizer.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingBridge.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponent.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingProperties.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/Provider.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/PropertyProvider.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/CachedProviderAdapter.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/KeyboardAccessoryData.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java",
-  "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java",
   "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java",
   "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTask.java",
   "java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java",
@@ -221,7 +175,6 @@
   "java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java",
   "java/src/org/chromium/chrome/browser/compositor/CompositorView.java",
   "java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java",
-  "java/src/org/chromium/chrome/browser/compositor/CompositorViewResizer.java",
   "java/src/org/chromium/chrome/browser/compositor/EventOffsetHandler.java",
   "java/src/org/chromium/chrome/browser/compositor/Invalidator.java",
   "java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index 5c995a6..c7229d5 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -17,11 +17,6 @@
   "junit/src/org/chromium/chrome/browser/ShortcutHelperTest.java",
   "junit/src/org/chromium/chrome/browser/SSLClientCertificateRequestTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/AutofillUiUtilsTest.java",
-  "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java",
-  "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java",
-  "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java",
-  "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java",
-  "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java",
   "junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java",
   "junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java",
   "junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 1c03171..338b5d8 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -60,20 +60,6 @@
   "javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java",
   "javatests/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java",
-  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java",
   "javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
diff --git a/chrome/android/features/keyboard_accessory/BUILD.gn b/chrome/android/features/keyboard_accessory/BUILD.gn
new file mode 100644
index 0000000..d03685c
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/BUILD.gn
@@ -0,0 +1,80 @@
+# Copyright 2019 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("//build/config/android/rules.gni")
+
+generate_jni("jni_headers") {
+  sources = [
+    "internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java",
+    "internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java",
+  ]
+  jni_package = "chrome"
+}
+
+android_library("test_java") {
+  testonly = true
+
+  java_files = [
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingTestHelper.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/FakeKeyboard.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java",
+    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java",
+  ]
+
+  deps = [
+    "internal:java",
+    "public:java",
+    "//base:base_java",
+    "//base:base_java_test_support",
+    "//chrome/android:chrome_java",
+    "//chrome/android:chrome_test_java",
+    "//chrome/android:chrome_test_util_java",
+    "//chrome/test/android:chrome_java_test_support",
+    "//components/autofill/android:autofill_java",
+    "//content/public/android:content_java",
+    "//content/public/test/android:content_java_test_support",
+    "//net/android:net_java_test_support",
+    "//third_party/android_deps:com_android_support_design_java",
+    "//third_party/android_deps:com_android_support_recyclerview_v7_java",
+    "//third_party/android_support_test_runner:runner_java",
+    "//third_party/espresso:espresso_all_java",
+    "//third_party/hamcrest:hamcrest_java",
+    "//third_party/junit",
+    "//ui/android:ui_full_java",
+    "//ui/android:ui_utils_java",
+  ]
+}
+
+junit_binary("keyboard_accessory_junit_tests") {
+  testonly = true
+
+  java_files = [
+    "junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java",
+    "junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java",
+    "junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java",
+    "junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java",
+    "junit/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java",
+  ]
+
+  deps = [
+    "internal:java",
+    "public:java",
+    "//base:base_java_test_support",
+    "//base:base_junit_test_support",
+    "//chrome/android:chrome_junit_test_support",
+    "//chrome/android:chrome_test_util_java",
+    "//third_party/junit",
+    "//third_party/mockito:mockito_java",
+  ]
+}
diff --git a/chrome/android/features/keyboard_accessory/DEPS b/chrome/android/features/keyboard_accessory/DEPS
new file mode 100644
index 0000000..8654603
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+  "+components/autofill/android/java/src/org/chromium/components/autofill",
+  "-content/public/android",
+  "+content/public/android/java/src/org/chromium/content_public",
+]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS b/chrome/android/features/keyboard_accessory/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
rename to chrome/android/features/keyboard_accessory/OWNERS
diff --git a/chrome/android/features/keyboard_accessory/factory/BUILD.gn b/chrome/android/features/keyboard_accessory/factory/BUILD.gn
new file mode 100644
index 0000000..89e7000
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/factory/BUILD.gn
@@ -0,0 +1,14 @@
+# Copyright 2019 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("//build/config/android/rules.gni")
+
+# Only need to depend on this target if explicitly calling ManualFillingComponent#createComponent.
+android_library("java") {
+  deps = [
+    "//chrome/android/features/keyboard_accessory/public:java",
+  ]
+  java_files = [ "generated/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java" ]
+  jar_excluded_patterns = [ "*" ]
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java b/chrome/android/features/keyboard_accessory/factory/generated/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
similarity index 73%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java
rename to chrome/android/features/keyboard_accessory/factory/generated/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
index 8aaa0858f..8310e65e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java
+++ b/chrome/android/features/keyboard_accessory/factory/generated/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 /**
  * Use {@link #createComponent()} to instantiate a {@link ManualFillingComponent}.
@@ -12,10 +12,10 @@
 
     /**
      * Creates a {@link ManualFillingComponent} if the implementation is available. If it isn't,
-     * null is returned instead.
-     * @return A {@link ManualFillingComponent}.
+     * null is returned instead which doesn't do anything.
+     * @return null.
      */
     public static ManualFillingComponent createComponent() {
-        return new ManualFillingCoordinator();
+        return null;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java b/chrome/android/features/keyboard_accessory/factory/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
similarity index 66%
copy from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java
copy to chrome/android/features/keyboard_accessory/factory/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
index 8aaa0858f..2d538da 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponentFactory.java
+++ b/chrome/android/features/keyboard_accessory/factory/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 /**
  * Use {@link #createComponent()} to instantiate a {@link ManualFillingComponent}.
@@ -11,11 +11,10 @@
     private ManualFillingComponentFactory() {}
 
     /**
-     * Creates a {@link ManualFillingComponent} if the implementation is available. If it isn't,
-     * null is returned instead.
-     * @return A {@link ManualFillingComponent}.
+     * Creates a {@link ManualFillingCoordinator}.
+     * @return A {@link ManualFillingCoordinator}.
      */
     public static ManualFillingComponent createComponent() {
         return new ManualFillingCoordinator();
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/features/keyboard_accessory/internal/BUILD.gn b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
new file mode 100644
index 0000000..79e64f32
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
@@ -0,0 +1,129 @@
+# Copyright 2019 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("//build/config/android/rules.gni")
+import("//chrome/common/features.gni")
+
+android_library("java") {
+  deps = [
+    ":java_resources",
+    "//base:base_java",
+
+    # TODO(crbug/951695): Cyclic dependency. Depend on public only when ready.
+    "//chrome/android:chrome_java",
+    "//chrome/android:chrome_public_java",
+    "//chrome/android/features/keyboard_accessory/public:java",
+    "//components/autofill/android:autofill_java",
+    "//content/public/android:content_java",
+    "//third_party/android_deps:android_support_v7_appcompat_java",
+    "//third_party/android_deps:com_android_support_design_java",
+    "//third_party/android_deps:com_android_support_recyclerview_v7_java",
+    "//ui/android:ui_java",
+    "//ui/android:ui_utils_java",
+  ]
+  java_files = [
+    "../factory/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentFactory.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/KeyboardExtensionViewResizer.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMetricsRecorder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingProperties.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingState.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java",
+  ]
+}
+
+android_resources("java_resources") {
+  resource_dirs = [ "java/res" ]
+  deps = [
+    ":java_strings_grd",
+    "//chrome/android:chrome_app_java_resources",
+  ]
+  custom_package = "org.chromium.chrome.browser.keyboard_accessory"
+}
+
+java_strings_grd("java_strings_grd") {
+  defines = chrome_grit_defines
+  grd_file = "java/strings/android_keyboard_accessory_strings.grd"
+  outputs = [
+    "values-am/android_chrome_keyboard_accessory_strings.xml",
+    "values-ar/android_chrome_keyboard_accessory_strings.xml",
+    "values-bg/android_chrome_keyboard_accessory_strings.xml",
+    "values-ca/android_chrome_keyboard_accessory_strings.xml",
+    "values-cs/android_chrome_keyboard_accessory_strings.xml",
+    "values-da/android_chrome_keyboard_accessory_strings.xml",
+    "values-de/android_chrome_keyboard_accessory_strings.xml",
+    "values-el/android_chrome_keyboard_accessory_strings.xml",
+    "values/android_chrome_keyboard_accessory_strings.xml",
+    "values-en-rGB/android_chrome_keyboard_accessory_strings.xml",
+    "values-es/android_chrome_keyboard_accessory_strings.xml",
+    "values-es-rUS/android_chrome_keyboard_accessory_strings.xml",
+    "values-fa/android_chrome_keyboard_accessory_strings.xml",
+    "values-fi/android_chrome_keyboard_accessory_strings.xml",
+    "values-tl/android_chrome_keyboard_accessory_strings.xml",
+    "values-fr/android_chrome_keyboard_accessory_strings.xml",
+    "values-hi/android_chrome_keyboard_accessory_strings.xml",
+    "values-hr/android_chrome_keyboard_accessory_strings.xml",
+    "values-hu/android_chrome_keyboard_accessory_strings.xml",
+    "values-in/android_chrome_keyboard_accessory_strings.xml",
+    "values-it/android_chrome_keyboard_accessory_strings.xml",
+    "values-iw/android_chrome_keyboard_accessory_strings.xml",
+    "values-ja/android_chrome_keyboard_accessory_strings.xml",
+    "values-ko/android_chrome_keyboard_accessory_strings.xml",
+    "values-lt/android_chrome_keyboard_accessory_strings.xml",
+    "values-lv/android_chrome_keyboard_accessory_strings.xml",
+    "values-nl/android_chrome_keyboard_accessory_strings.xml",
+    "values-nb/android_chrome_keyboard_accessory_strings.xml",
+    "values-pl/android_chrome_keyboard_accessory_strings.xml",
+    "values-pt-rBR/android_chrome_keyboard_accessory_strings.xml",
+    "values-pt-rPT/android_chrome_keyboard_accessory_strings.xml",
+    "values-ro/android_chrome_keyboard_accessory_strings.xml",
+    "values-ru/android_chrome_keyboard_accessory_strings.xml",
+    "values-sk/android_chrome_keyboard_accessory_strings.xml",
+    "values-sl/android_chrome_keyboard_accessory_strings.xml",
+    "values-sr/android_chrome_keyboard_accessory_strings.xml",
+    "values-sv/android_chrome_keyboard_accessory_strings.xml",
+    "values-sw/android_chrome_keyboard_accessory_strings.xml",
+    "values-th/android_chrome_keyboard_accessory_strings.xml",
+    "values-tr/android_chrome_keyboard_accessory_strings.xml",
+    "values-uk/android_chrome_keyboard_accessory_strings.xml",
+    "values-vi/android_chrome_keyboard_accessory_strings.xml",
+    "values-zh-rCN/android_chrome_keyboard_accessory_strings.xml",
+    "values-zh-rTW/android_chrome_keyboard_accessory_strings.xml",
+  ]
+}
diff --git a/chrome/android/java/res/drawable/autofill_chip_inset.xml b/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml
similarity index 100%
rename from chrome/android/java/res/drawable/autofill_chip_inset.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory.xml
similarity index 90%
rename from chrome/android/java/res/layout/keyboard_accessory.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory.xml
index b9eb0c0..fe4e134 100644
--- a/chrome/android/java/res/layout/keyboard_accessory.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryView
+<org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/keyboard_accessory"
@@ -46,4 +46,4 @@
             android:layout_height="match_parent"/>
     </LinearLayout>
 
-</org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryView>
+</org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryView>
diff --git a/chrome/android/java/res/layout/keyboard_accessory_action.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_action.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_action_modern.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action_modern.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_action_modern.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action_modern.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_chip.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_chip.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_chip.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_chip.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_modern.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml
similarity index 93%
rename from chrome/android/java/res/layout/keyboard_accessory_modern.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml
index 662ff32e..9f4ab02 100644
--- a/chrome/android/java/res/layout/keyboard_accessory_modern.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryModernView
+<org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryModernView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/keyboard_accessory"
@@ -68,4 +68,4 @@
 
     </LinearLayout>
 
-</org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryModernView>
+</org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryModernView>
diff --git a/chrome/android/java/res/layout/keyboard_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml
similarity index 85%
rename from chrome/android/java/res/layout/keyboard_accessory_sheet.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml
index db70449..c8b58513 100644
--- a/chrome/android/java/res/layout/keyboard_accessory_sheet.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetView
+<org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:fillViewport="true"
     android:paddingTop="0dp"
@@ -27,4 +27,4 @@
         android:scaleType="fitXY"
         android:visibility="invisible"
         android:importantForAccessibility="no" />
-</org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetView>
\ No newline at end of file
+</org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetView>
diff --git a/chrome/android/java/res/layout/keyboard_accessory_sheet_tab_legacy_password_info.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_legacy_password_info.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_sheet_tab_legacy_password_info.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_legacy_password_info.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_sheet_tab_legacy_title.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_legacy_title.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_sheet_tab_legacy_title.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_legacy_title.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml
similarity index 92%
rename from chrome/android/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml
index c7b849e1..053f28bd 100644
--- a/chrome/android/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_password_info.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessoryInfoView
+<org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessoryInfoView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:gravity="center_vertical|start"
     android:fillViewport="true"
@@ -55,4 +55,4 @@
         android:layout_marginBottom="@dimen/keyboard_accessory_sheet_padding"
         style="@style/InputChip" />
 
-</org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessoryInfoView>
+</org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessoryInfoView>
diff --git a/chrome/android/java/res/layout/keyboard_accessory_sheet_tab_title.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_title.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_sheet_tab_title.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_title.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_suggestion.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_suggestion.xml
similarity index 100%
rename from chrome/android/java/res/layout/keyboard_accessory_suggestion.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_suggestion.xml
diff --git a/chrome/android/java/res/layout/keyboard_accessory_tabs.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_tabs.xml
similarity index 85%
rename from chrome/android/java/res/layout/keyboard_accessory_tabs.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_tabs.xml
index b1116b1a..0ff34f6f 100644
--- a/chrome/android/java/res/layout/keyboard_accessory_tabs.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_tabs.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView
+<org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     app:tabIndicatorHeight="@dimen/divider_height"
diff --git a/chrome/android/java/res/layout/password_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml
similarity index 100%
rename from chrome/android/java/res/layout/password_accessory_sheet.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml
diff --git a/chrome/android/java/res/layout/password_accessory_sheet_label.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_label.xml
similarity index 100%
rename from chrome/android/java/res/layout/password_accessory_sheet_label.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_label.xml
diff --git a/chrome/android/java/res/layout/password_accessory_sheet_legacy_option.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_legacy_option.xml
similarity index 100%
rename from chrome/android/java/res/layout/password_accessory_sheet_legacy_option.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_legacy_option.xml
diff --git a/chrome/android/java/res/layout/password_accessory_sheet_option.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_option.xml
similarity index 100%
rename from chrome/android/java/res/layout/password_accessory_sheet_option.xml
rename to chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet_option.xml
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml b/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml
new file mode 100644
index 0000000..4e9b898
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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. -->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Autofill keyboard accessory dimensions -->
+    <dimen name="keyboard_accessory_bar_item_height">36dp</dimen>
+    <dimen name="keyboard_accessory_bar_item_padding">8dp</dimen>
+    <dimen name="keyboard_accessory_half_padding">6dp</dimen>
+    <dimen name="keyboard_accessory_height">48dp</dimen>
+    <!--dimen name="keyboard_accessory_height_with_shadow">56dp</dimen-->
+    <dimen name="keyboard_accessory_image_top_padding">12dp</dimen>
+    <dimen name="keyboard_accessory_shadow">5dp</dimen>
+    <!--dimen name="keyboard_accessory_sheet_height">330dp</dimen-->
+    <dimen name="keyboard_accessory_sheet_padding">8dp</dimen>
+    <dimen name="keyboard_accessory_sheet_top_margin">16dp</dimen>
+    <dimen name="keyboard_accessory_suggestion_padding">16dp</dimen>
+    <dimen name="keyboard_accessory_suggestion_top_bottom_margin">8dp</dimen>
+    <dimen name="keyboard_accessory_suggestion_offset">12dp</dimen>
+    <dimen name="keyboard_accessory_suggestion_height">48dp</dimen>
+    <dimen name="keyboard_accessory_suggestion_icon_size">20dp</dimen>
+    <dimen name="keyboard_accessory_scroll_shadow_width">40dp</dimen>
+    <dimen name="keyboard_accessory_bar_item_cc_icon_width">32dp</dimen>
+    <dimen name="keyboard_accessory_tab_size">@dimen/keyboard_accessory_height</dimen>
+</resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
index b8bd9ba..7fe8ae59 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -11,7 +11,7 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ResourceId;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.DropdownItem;
@@ -23,7 +23,7 @@
  * --enable-autofill-keyboard-accessory-view is passed on the command line.
  */
 @JNINamespace("autofill")
-public class AutofillKeyboardAccessoryBridge
+public class AutofillKeyboardAccessoryViewBridge
         implements AutofillDelegate, DialogInterface.OnClickListener {
     private long mNativeAutofillKeyboardAccessory;
     private ManualFillingComponent mManualFillingComponent;
@@ -31,11 +31,11 @@
     private PropertyProvider<AutofillSuggestion[]> mChipProvider =
             new PropertyProvider<>(AccessoryAction.AUTOFILL_SUGGESTION);
 
-    private AutofillKeyboardAccessoryBridge() {}
+    private AutofillKeyboardAccessoryViewBridge() {}
 
     @CalledByNative
-    private static AutofillKeyboardAccessoryBridge create() {
-        return new AutofillKeyboardAccessoryBridge();
+    private static AutofillKeyboardAccessoryViewBridge create() {
+        return new AutofillKeyboardAccessoryViewBridge();
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardExtensionViewResizer.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/KeyboardExtensionViewResizer.java
similarity index 71%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardExtensionViewResizer.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/KeyboardExtensionViewResizer.java
index 9381d44..fba4b59 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardExtensionViewResizer.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/KeyboardExtensionViewResizer.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.support.annotation.Px;
 
@@ -10,8 +10,9 @@
 import org.chromium.chrome.browser.compositor.CompositorViewResizer;
 
 /**
- * This class is used by {@link ManualFillingMediator} to provide the combined height of
- * KeyboardAccessoryCoordinator and AccessorySheetCoordinator.
+ * This class holds the size of any extension to or even replacement for a keyboard. The height can
+ * be used to either compute an offset for bottom bars (e.g. CCTs or PWAs) or to push up the content
+ * area.
  */
 class KeyboardExtensionViewResizer implements CompositorViewResizer {
     private int mHeight;
@@ -32,9 +33,13 @@
         mObservers.removeObserver(observer);
     }
 
+    /**
+     * Sets a new extension height and notifies observers if its value changed.
+     * @param newKeyboardExtensionHeight The height in pixels.
+     */
     void setKeyboardExtensionHeight(@Px int newKeyboardExtensionHeight) {
         if (mHeight == newKeyboardExtensionHeight) return;
         mHeight = newKeyboardExtensionHeight;
         for (Observer observer : mObservers) observer.onHeightChanged(mHeight);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java
similarity index 87%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingBridge.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java
index 38c1c5b..c002353c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingBridge.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.graphics.Bitmap;
 import android.support.annotation.Px;
@@ -10,17 +10,16 @@
 import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 
-class ManualFillingBridge {
+class ManualFillingComponentBridge {
     private final PropertyProvider<AccessorySheetData> mSheetDataProvider =
             new PropertyProvider<>();
     private final PropertyProvider<Action[]> mActionProvider =
@@ -29,7 +28,7 @@
     private final ChromeActivity mActivity;
     private long mNativeView;
 
-    private ManualFillingBridge(long nativeView, WindowAndroid windowAndroid) {
+    private ManualFillingComponentBridge(long nativeView, WindowAndroid windowAndroid) {
         mNativeView = nativeView;
         mActivity = (ChromeActivity) windowAndroid.getActivity().get();
         mManualFillingComponent = mActivity.getManualFillingComponent();
@@ -39,8 +38,9 @@
     }
 
     @CalledByNative
-    private static ManualFillingBridge create(long nativeView, WindowAndroid windowAndroid) {
-        return new ManualFillingBridge(nativeView, windowAndroid);
+    private static ManualFillingComponentBridge create(
+            long nativeView, WindowAndroid windowAndroid) {
+        return new ManualFillingComponentBridge(nativeView, windowAndroid);
     }
 
     @CalledByNative
@@ -162,4 +162,4 @@
 
     private static native void nativeCachePasswordSheetDataForTesting(
             WebContents webContents, String[] userNames, String[] passwords);
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java
similarity index 81%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java
index 594a53d..11d4c9a6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java
@@ -2,19 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.view.View;
 import android.view.ViewStub;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
 import org.chromium.chrome.browser.compositor.CompositorViewResizer;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.DropdownPopupWindow;
@@ -31,6 +30,8 @@
 class ManualFillingCoordinator implements ManualFillingComponent {
     private final ManualFillingMediator mMediator = new ManualFillingMediator();
 
+    public ManualFillingCoordinator() {}
+
     @Override
     public void initialize(WindowAndroid windowAndroid, ViewStub barStub, ViewStub sheetStub) {
         if (barStub == null || sheetStub == null) return; // The manual filling isn't needed.
@@ -55,27 +56,16 @@
         mMediator.destroy();
     }
 
-    /**
-     * Handles tapping on the Android back button.
-     * @return Whether tapping the back button dismissed the accessory sheet or not.
-     */
     @Override
     public boolean handleBackPress() {
         return mMediator.handleBackPress();
     }
 
-    /**
-     * Ensures that keyboard accessory and keyboard are hidden and reset.
-     */
     @Override
     public void dismiss() {
         mMediator.dismiss();
     }
 
-    /**
-     * Notifies the component that a popup window exists so it can be dismissed if necessary.
-     * @param popup A {@link DropdownPopupWindow} that might be dismissed later.
-     */
     @Override
     public void notifyPopupAvailable(DropdownPopupWindow popup) {
         mMediator.notifyPopupOpened(popup);
@@ -148,4 +138,4 @@
     ManualFillingMediator getMediatorForTesting() {
         return mMediator;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
index 3e00c01..7892826 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KEYBOARD_EXTENSION_STATE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.PORTRAIT_ORIENTATION;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.SHOW_WHEN_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KEYBOARD_EXTENSION_STATE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.PORTRAIT_ORIENTATION;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.SHOW_WHEN_VISIBLE;
 
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
@@ -22,21 +22,11 @@
 
 import org.chromium.base.Supplier;
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeKeyboardVisibilityDelegate;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.InsetObserverView;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.StateProperty;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.CreditCardAccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.compositor.CompositorViewResizer;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
@@ -44,6 +34,15 @@
 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
 import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.StateProperty;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.CreditCardAccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMetricsRecorder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMetricsRecorder.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMetricsRecorder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMetricsRecorder.java
index 7b83a1de..49b56eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMetricsRecorder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMetricsRecorder.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import org.chromium.base.metrics.RecordHistogram;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingProperties.java
similarity index 69%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingProperties.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingProperties.java
index 538a23a..e018de6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingProperties.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingProperties.java
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.StateProperty.BAR;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.StateProperty.FLOATING;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.StateProperty.HIDDEN_SHEET;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.StateProperty.VISIBLE_SHEET;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.StateProperty.BAR;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.StateProperty.FLOATING;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.StateProperty.HIDDEN_SHEET;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.StateProperty.VISIBLE_SHEET;
 
 import android.support.annotation.IntDef;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingState.java
similarity index 88%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingState.java
index 698f8aa..f1cd6046 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingState.java
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.support.annotation.Nullable;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.CachedProviderAdapter;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.Provider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.CreditCardAccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.CachedProviderAdapter;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.CreditCardAccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache.java
index b02b06b..3ae037a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.support.annotation.Nullable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/README.md b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/README.md
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/README.md
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/README.md
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
index 63780c14..5226496 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
@@ -13,11 +13,11 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.Provider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.DeferredViewStubInflationProvider;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
similarity index 81%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
index 0c6aaeb..f88c8b77 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
@@ -2,33 +2,33 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessorySheetTrigger;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator.TabSwitchingDelegate;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator.VisibilityDelegate;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.Provider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessorySheetTrigger;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator.TabSwitchingDelegate;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator.VisibilityDelegate;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.components.autofill.PopupItemId;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java
index d8ba950..ff9e39e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder.java
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
 import android.support.annotation.Nullable;
 
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryBarContents;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryBarContents;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.ListObservable;
 import org.chromium.ui.modelutil.PropertyKey;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
index 8998c15..cc1567e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import android.content.Context;
 import android.support.annotation.Px;
@@ -15,7 +15,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 
 /**
  * The Accessory sitting above the keyboard and below the content area. It is used for autofill
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
similarity index 76%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
index 02d68a2..23c3058 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
 
 import android.support.design.widget.TabLayout;
 import android.view.View;
 import android.view.ViewGroup;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.widget.ChipView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
index 9832caf1..801c5e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.design.widget.TabLayout;
 import android.support.v7.widget.RecyclerView;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator.TabLayoutCallbacks;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator.TabLayoutCallbacks;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
index f704da6..5fe6f62 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
@@ -1,7 +1,7 @@
 // Copyright 2019 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.
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import android.support.annotation.Nullable;
 
@@ -47,4 +47,4 @@
         super(model, itemViewTypeCallback, viewBinder);
         mViewRecycler = viewRecycler;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java
index 080aa1f..3ba0672 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import static org.chromium.ui.base.LocalizationUtils.isLayoutRtl;
 
@@ -17,8 +17,8 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.LinearLayout;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 
 /**
  * The Accessory sitting above the keyboard and below the content area. It is used for autofill
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
similarity index 79%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
index 9acdc6c..981dff0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_KEYBOARD_CALLBACK;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
 import android.os.Build;
 import android.support.annotation.LayoutRes;
@@ -21,9 +21,9 @@
 import android.view.ViewParent;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/CachedProviderAdapter.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/CachedProviderAdapter.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java
index 48ee0eb..5e9ce46 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/CachedProviderAdapter.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.data;
+package org.chromium.chrome.browser.keyboard_accessory.data;
 
 import android.support.annotation.Nullable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
index 4ca988f..6b68905 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -12,7 +12,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Tab;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.ListModelChangeProcessor;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
similarity index 83%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
index 050ed5ae..a304d37a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
@@ -20,7 +20,7 @@
 import android.view.ViewStub;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.DeferredViewStubInflationProvider;
 import org.chromium.ui.ViewProvider;
 import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
@@ -153,4 +153,4 @@
     AccessorySheetMediator getMediatorForTesting() {
         return mMediator;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
similarity index 82%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
index 39ca66e..72d9781 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
@@ -17,7 +17,7 @@
 import android.support.v7.widget.RecyclerView;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyObservable;
@@ -132,4 +132,4 @@
     void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
         mModel.set(PAGE_CHANGE_LISTENER, onPageChangeListener);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java
similarity index 70%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java
index 6afc9ee..5312bf1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder.java
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessorySheetTrigger.MANUAL_OPEN;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder.recordSheetTrigger;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessorySheetTrigger.MANUAL_OPEN;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder.recordSheetTrigger;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessorySheetTrigger;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.AccessorySheetTrigger;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
index e3ee9fc..4a7cabe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import android.support.v4.view.ViewPager;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Tab;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
@@ -32,4 +32,4 @@
     static final int NO_ACTIVE_TAB = -1;
 
     private AccessorySheetProperties() {}
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
similarity index 86%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
index a7154ef..7a473e5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import static org.chromium.ui.base.LocalizationUtils.isLayoutRtl;
 
@@ -14,6 +14,8 @@
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
+import org.chromium.chrome.browser.keyboard_accessory.R;
+
 /**
  * Displays the data provided by the {@link AccessorySheetViewBinder}.
  */
@@ -31,8 +33,8 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mViewPager = findViewById(org.chromium.chrome.R.id.keyboard_accessory_sheet);
-        mTopShadow = findViewById(org.chromium.chrome.R.id.accessory_sheet_shadow);
+        mViewPager = findViewById(R.id.keyboard_accessory_sheet);
+        mTopShadow = findViewById(R.id.accessory_sheet_shadow);
 
         // Ensure that sub components of the sheet use the RTL direction:
         int layoutDirection = isLayoutRtl() ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
similarity index 72%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
index 48b6367..3785e43 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.PAGE_CHANGE_LISTENER;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
 import android.os.Build;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java
similarity index 90%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java
index 4943301..ef8cbb5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.graphics.drawable.Drawable;
 import android.support.annotation.CallSuper;
@@ -11,8 +11,8 @@
 import android.support.v7.widget.RecyclerView;
 import android.view.ViewGroup;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 
 /**
  * This coordinator aims to be the base class for sheets to be added to the ManualFillingCoordinator
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java
similarity index 76%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java
index 861e720..891eb93 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder.getHistogramForType;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.PASSWORD_INFO;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.getType;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder.getHistogramForType;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.PASSWORD_INFO;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.getType;
 
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
 import org.chromium.ui.modelutil.ListModel;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
similarity index 90%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
index 0e18239..a23ae129 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.support.annotation.IntDef;
 import android.support.v7.widget.RecyclerView;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
 import org.chromium.ui.modelutil.ListModel;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java
index 2df32cbf..1177a6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.support.annotation.LayoutRes;
 import android.support.annotation.Nullable;
@@ -14,9 +14,9 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
 import org.chromium.ui.modelutil.ListModel;
 
 /**
@@ -101,4 +101,4 @@
         view.setItemAnimator(null);
         if (scrollListener != null) view.addOnScrollListener(scrollListener);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java
index d7c27f9..d4a0519 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.content.Context;
 import android.support.annotation.Nullable;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.RecyclerView;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 
 /**
  * This component is a tab that can be added to the ManualFillingCoordinator. This tab
@@ -36,4 +36,4 @@
 
     @Override
     public void onTabShown() {}
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java
index 7fc0b2e..346f968 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -17,7 +17,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.ui.widget.ChipView;
 
 /**
@@ -84,4 +84,4 @@
     ChipView getPassword() {
         return mPassword;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
similarity index 91%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
index 23b8ecdb..0af7662 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
@@ -12,12 +12,12 @@
 import android.view.ViewGroup;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.Provider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.RecyclerViewAdapter;
 import org.chromium.ui.modelutil.SimpleRecyclerViewMcp;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java
similarity index 70%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java
index 1ee9255a..ae17561a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.Provider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java
similarity index 87%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java
index c9980d9..014a9af9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import android.support.v7.widget.RecyclerView;
 import android.text.method.PasswordTransformationMethod;
 import android.view.ViewGroup;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.widget.ChipView;
 
@@ -72,4 +72,4 @@
         view.setAdapter(PasswordAccessorySheetCoordinator.createModernAdapter(model));
         view.addItemDecoration(new PasswordAccessoryInfoView.DynamicBottomSpacer());
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
index 9b5e8d522..d33e000a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static org.chromium.ui.base.LocalizationUtils.isLayoutRtl;
 
@@ -20,11 +20,11 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
 import org.chromium.ui.modelutil.ListModel;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
similarity index 91%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
index 6db8d37..2db5e692 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 
 import android.support.design.widget.TabLayout;
 import android.support.v4.view.ViewPager;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.ListModelChangeProcessor;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
similarity index 85%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
index 8a74c3f..2ff72be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 
 import android.support.annotation.Nullable;
 import android.support.design.widget.TabLayout;
 import android.support.v4.view.ViewPager;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator.AccessoryTabObserver;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator.AccessoryTabObserver;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyObservable;
@@ -151,4 +151,4 @@
 
         return tabLayoutPosition;
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
similarity index 86%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
index aabf68e1b..4d164bd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
 import android.support.design.widget.TabLayout;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
index cf29eaae..72375c9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
@@ -12,7 +12,7 @@
 import android.support.v4.graphics.drawable.DrawableCompat;
 import android.util.AttributeSet;
 
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 
 /**
  * A {@link TabLayout} containing the tabs in the keyboard accessory.
@@ -105,4 +105,4 @@
         TabLayout.Tab tab = getTabAt(i);
         if (tab != null) tab.setContentDescription(messageId);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java
similarity index 84%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java
rename to chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java
index e9a8a5df..3249add 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewBinder.java
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 
 import android.support.design.widget.TabLayout;
 
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.ListModelChangeProcessor;
 import org.chromium.ui.modelutil.PropertyKey;
@@ -87,4 +87,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd
new file mode 100644
index 0000000..6145470
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- android_chrome_strings.grd contains strings for the keyboard accessory in Chrome for Android. -->
+<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+  <outputs>
+    <output filename="values-am/android_chrome_keyboard_accessory_strings.xml" lang="am" type="android" />
+    <output filename="values-ar/android_chrome_keyboard_accessory_strings.xml" lang="ar" type="android" />
+    <output filename="values-bg/android_chrome_keyboard_accessory_strings.xml" lang="bg" type="android" />
+    <output filename="values-ca/android_chrome_keyboard_accessory_strings.xml" lang="ca" type="android" />
+    <output filename="values-cs/android_chrome_keyboard_accessory_strings.xml" lang="cs" type="android" />
+    <output filename="values-da/android_chrome_keyboard_accessory_strings.xml" lang="da" type="android" />
+    <output filename="values-de/android_chrome_keyboard_accessory_strings.xml" lang="de" type="android" />
+    <output filename="values-el/android_chrome_keyboard_accessory_strings.xml" lang="el" type="android" />
+    <output filename="values/android_chrome_keyboard_accessory_strings.xml" lang="en" type="android" />
+    <output filename="values-en-rGB/android_chrome_keyboard_accessory_strings.xml" lang="en-GB" type="android" />
+    <output filename="values-es/android_chrome_keyboard_accessory_strings.xml" lang="es" type="android" />
+    <output filename="values-es-rUS/android_chrome_keyboard_accessory_strings.xml" lang="es-419" type="android" />
+    <output filename="values-fa/android_chrome_keyboard_accessory_strings.xml" lang="fa" type="android" />
+    <output filename="values-fi/android_chrome_keyboard_accessory_strings.xml" lang="fi" type="android" />
+    <output filename="values-tl/android_chrome_keyboard_accessory_strings.xml" lang="fil" type="android" />
+    <output filename="values-fr/android_chrome_keyboard_accessory_strings.xml" lang="fr" type="android" />
+    <output filename="values-hi/android_chrome_keyboard_accessory_strings.xml" lang="hi" type="android" />
+    <output filename="values-hr/android_chrome_keyboard_accessory_strings.xml" lang="hr" type="android" />
+    <output filename="values-hu/android_chrome_keyboard_accessory_strings.xml" lang="hu" type="android" />
+    <output filename="values-in/android_chrome_keyboard_accessory_strings.xml" lang="id" type="android" />
+    <output filename="values-it/android_chrome_keyboard_accessory_strings.xml" lang="it" type="android" />
+    <output filename="values-iw/android_chrome_keyboard_accessory_strings.xml" lang="iw" type="android" />
+    <output filename="values-ja/android_chrome_keyboard_accessory_strings.xml" lang="ja" type="android" />
+    <output filename="values-ko/android_chrome_keyboard_accessory_strings.xml" lang="ko" type="android" />
+    <output filename="values-lt/android_chrome_keyboard_accessory_strings.xml" lang="lt" type="android" />
+    <output filename="values-lv/android_chrome_keyboard_accessory_strings.xml" lang="lv" type="android" />
+    <output filename="values-nl/android_chrome_keyboard_accessory_strings.xml" lang="nl" type="android" />
+    <output filename="values-nb/android_chrome_keyboard_accessory_strings.xml" lang="no" type="android" />
+    <output filename="values-pl/android_chrome_keyboard_accessory_strings.xml" lang="pl" type="android" />
+    <output filename="values-pt-rBR/android_chrome_keyboard_accessory_strings.xml" lang="pt-BR" type="android" />
+    <output filename="values-pt-rPT/android_chrome_keyboard_accessory_strings.xml" lang="pt-PT" type="android" />
+    <output filename="values-ro/android_chrome_keyboard_accessory_strings.xml" lang="ro" type="android" />
+    <output filename="values-ru/android_chrome_keyboard_accessory_strings.xml" lang="ru" type="android" />
+    <output filename="values-sk/android_chrome_keyboard_accessory_strings.xml" lang="sk" type="android" />
+    <output filename="values-sl/android_chrome_keyboard_accessory_strings.xml" lang="sl" type="android" />
+    <output filename="values-sr/android_chrome_keyboard_accessory_strings.xml" lang="sr" type="android" />
+    <output filename="values-sv/android_chrome_keyboard_accessory_strings.xml" lang="sv" type="android" />
+    <output filename="values-sw/android_chrome_keyboard_accessory_strings.xml" lang="sw" type="android" />
+    <output filename="values-th/android_chrome_keyboard_accessory_strings.xml" lang="th" type="android" />
+    <output filename="values-tr/android_chrome_keyboard_accessory_strings.xml" lang="tr" type="android" />
+    <output filename="values-uk/android_chrome_keyboard_accessory_strings.xml" lang="uk" type="android" />
+    <output filename="values-vi/android_chrome_keyboard_accessory_strings.xml" lang="vi" type="android" />
+    <output filename="values-zh-rCN/android_chrome_keyboard_accessory_strings.xml" lang="zh-CN" type="android" />
+    <output filename="values-zh-rTW/android_chrome_keyboard_accessory_strings.xml" lang="zh-TW" type="android" />
+  </outputs>
+  <translations>
+    <file lang="am" path="translations/android_chrome_keyboard_accessory_strings_am.xtb" />
+    <file lang="ar" path="translations/android_chrome_keyboard_accessory_strings_ar.xtb" />
+    <file lang="bg" path="translations/android_chrome_keyboard_accessory_strings_bg.xtb" />
+    <file lang="bn" path="translations/android_chrome_keyboard_accessory_strings_bn.xtb" />
+    <file lang="ca" path="translations/android_chrome_keyboard_accessory_strings_ca.xtb" />
+    <file lang="cs" path="translations/android_chrome_keyboard_accessory_strings_cs.xtb" />
+    <file lang="da" path="translations/android_chrome_keyboard_accessory_strings_da.xtb" />
+    <file lang="de" path="translations/android_chrome_keyboard_accessory_strings_de.xtb" />
+    <file lang="el" path="translations/android_chrome_keyboard_accessory_strings_el.xtb" />
+    <file lang="en-GB" path="translations/android_chrome_keyboard_accessory_strings_en-GB.xtb" />
+    <file lang="es" path="translations/android_chrome_keyboard_accessory_strings_es.xtb" />
+    <file lang="es-419" path="translations/android_chrome_keyboard_accessory_strings_es-419.xtb" />
+    <file lang="et" path="translations/android_chrome_keyboard_accessory_strings_et.xtb" />
+    <file lang="fa" path="translations/android_chrome_keyboard_accessory_strings_fa.xtb" />
+    <file lang="fi" path="translations/android_chrome_keyboard_accessory_strings_fi.xtb" />
+    <file lang="fil" path="translations/android_chrome_keyboard_accessory_strings_fil.xtb" />
+    <file lang="fr" path="translations/android_chrome_keyboard_accessory_strings_fr.xtb" />
+    <file lang="gu" path="translations/android_chrome_keyboard_accessory_strings_gu.xtb" />
+    <file lang="hi" path="translations/android_chrome_keyboard_accessory_strings_hi.xtb" />
+    <file lang="hr" path="translations/android_chrome_keyboard_accessory_strings_hr.xtb" />
+    <file lang="hu" path="translations/android_chrome_keyboard_accessory_strings_hu.xtb" />
+    <file lang="id" path="translations/android_chrome_keyboard_accessory_strings_id.xtb" />
+    <file lang="it" path="translations/android_chrome_keyboard_accessory_strings_it.xtb" />
+    <file lang="iw" path="translations/android_chrome_keyboard_accessory_strings_iw.xtb" />
+    <file lang="ja" path="translations/android_chrome_keyboard_accessory_strings_ja.xtb" />
+    <file lang="ko" path="translations/android_chrome_keyboard_accessory_strings_ko.xtb" />
+    <file lang="kn" path="translations/android_chrome_keyboard_accessory_strings_kn.xtb" />
+    <file lang="lt" path="translations/android_chrome_keyboard_accessory_strings_lt.xtb" />
+    <file lang="lv" path="translations/android_chrome_keyboard_accessory_strings_lv.xtb" />
+    <file lang="ml" path="translations/android_chrome_keyboard_accessory_strings_ml.xtb" />
+    <file lang="mr" path="translations/android_chrome_keyboard_accessory_strings_mr.xtb" />
+    <file lang="ms" path="translations/android_chrome_keyboard_accessory_strings_ms.xtb" />
+    <file lang="nl" path="translations/android_chrome_keyboard_accessory_strings_nl.xtb" />
+    <file lang="no" path="translations/android_chrome_keyboard_accessory_strings_no.xtb" />
+    <file lang="pl" path="translations/android_chrome_keyboard_accessory_strings_pl.xtb" />
+    <file lang="pt-BR" path="translations/android_chrome_keyboard_accessory_strings_pt-BR.xtb" />
+    <file lang="pt-PT" path="translations/android_chrome_keyboard_accessory_strings_pt-PT.xtb" />
+    <file lang="ro" path="translations/android_chrome_keyboard_accessory_strings_ro.xtb" />
+    <file lang="ru" path="translations/android_chrome_keyboard_accessory_strings_ru.xtb" />
+    <file lang="sk" path="translations/android_chrome_keyboard_accessory_strings_sk.xtb" />
+    <file lang="sl" path="translations/android_chrome_keyboard_accessory_strings_sl.xtb" />
+    <file lang="sr" path="translations/android_chrome_keyboard_accessory_strings_sr.xtb" />
+    <file lang="sv" path="translations/android_chrome_keyboard_accessory_strings_sv.xtb" />
+    <file lang="sw" path="translations/android_chrome_keyboard_accessory_strings_sw.xtb" />
+    <file lang="ta" path="translations/android_chrome_keyboard_accessory_strings_ta.xtb" />
+    <file lang="te" path="translations/android_chrome_keyboard_accessory_strings_te.xtb" />
+    <file lang="th" path="translations/android_chrome_keyboard_accessory_strings_th.xtb" />
+    <file lang="tr" path="translations/android_chrome_keyboard_accessory_strings_tr.xtb" />
+    <file lang="uk" path="translations/android_chrome_keyboard_accessory_strings_uk.xtb" />
+    <file lang="vi" path="translations/android_chrome_keyboard_accessory_strings_vi.xtb" />
+    <file lang="zh-CN" path="translations/android_chrome_keyboard_accessory_strings_zh-CN.xtb" />
+    <file lang="zh-TW" path="translations/android_chrome_keyboard_accessory_strings_zh-TW.xtb" />
+  </translations>
+  <release allow_pseudo="false" seq="1">
+    <messages fallback_to_english="true">
+      <message name="IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION" desc="The text announced by the screen reader when the autofill suggestions are shown.">
+        Passwords available
+      </message>
+      <message name="IDS_KEYBOARD_ACCESSORY_SHEET_HIDE" desc="Description for the active icon button that closes an accessory sheet and brings back the keyboard.">
+          Show keyboard
+      </message>
+      <message name="IDS_PASSWORD_GENERATION_ACCESSORY_BUTTON" desc="Text for the button used to generate a password.">
+          Suggest strong password
+      </message>
+      <message name="IDS_PASSWORD_GENERATION_ACCESSORY_BUTTON_SHORT" desc="Shortened text for the button used to generate a password. This is used for devices with small screen.">
+          Suggest password
+      </message>
+      <message name="IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE" desc="Description for the icon button used to open and close the password accessory sheet.">
+          Show passwords
+      </message>
+      <message name="IDS_PASSWORD_ACCESSORY_SHEET_OPENED" desc="Accessibility announcement when opening a password bottom sheet containing saved credentials and options like managing and generating passwords.">
+          Showing saved passwords and password options
+      </message>
+    </messages>
+  </release>
+</grit>
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION.png.sha1 b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION.png.sha1
rename to chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_KEYBOARD_ACCESSORY_SHEET_HIDE.png.sha1 b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_KEYBOARD_ACCESSORY_SHEET_HIDE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_KEYBOARD_ACCESSORY_SHEET_HIDE.png.sha1
rename to chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_KEYBOARD_ACCESSORY_SHEET_HIDE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_OPENED.png.sha1 b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_OPENED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_OPENED.png.sha1
rename to chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_OPENED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE.png.sha1 b/chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE.png.sha1
rename to chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings_grd/IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE.png.sha1
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_am.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_am.xtb
new file mode 100644
index 0000000..92406ec2
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_am.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="am">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ar.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ar.xtb
new file mode 100644
index 0000000..198ea62
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ar.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ar">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bg.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bg.xtb
new file mode 100644
index 0000000..6681995
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bg.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="bg">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bn.xtb
new file mode 100644
index 0000000..eca68d46
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_bn.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="bn">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ca.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ca.xtb
new file mode 100644
index 0000000..71cdd772
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ca.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ca">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_cs.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_cs.xtb
new file mode 100644
index 0000000..dc153a85
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_cs.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="cs">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_da.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_da.xtb
new file mode 100644
index 0000000..1256832
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_da.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="da">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_de.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_de.xtb
new file mode 100644
index 0000000..43dd909
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_de.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="de">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_el.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_el.xtb
new file mode 100644
index 0000000..1b096642
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_el.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="el">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_en-GB.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_en-GB.xtb
new file mode 100644
index 0000000..12c3fa00
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_en-GB.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="en-GB">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es-419.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es-419.xtb
new file mode 100644
index 0000000..b652ed0
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es-419.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="es-419">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es.xtb
new file mode 100644
index 0000000..4d4f400
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_es.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="es">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_et.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_et.xtb
new file mode 100644
index 0000000..ab777bc5
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_et.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="et">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fa.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fa.xtb
new file mode 100644
index 0000000..4cff15d
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fa.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fa">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fi.xtb
new file mode 100644
index 0000000..60ba9aa
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fi">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fil.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fil.xtb
new file mode 100644
index 0000000..8f6a880
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fil.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fil">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fr.xtb
new file mode 100644
index 0000000..bf48975a
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_fr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fr">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_gu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_gu.xtb
new file mode 100644
index 0000000..7969d06
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_gu.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="gu">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hi.xtb
new file mode 100644
index 0000000..279503cd
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hi">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hr.xtb
new file mode 100644
index 0000000..9ec62af
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hr">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hu.xtb
new file mode 100644
index 0000000..bdc02eeac
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_hu.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hu">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_id.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_id.xtb
new file mode 100644
index 0000000..5f2882d0
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_id.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="id">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_it.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_it.xtb
new file mode 100644
index 0000000..e7df702
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_it.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="it">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_iw.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_iw.xtb
new file mode 100644
index 0000000..a29d4ad
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_iw.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="iw">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ja.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ja.xtb
new file mode 100644
index 0000000..d8a3543
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ja.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ja">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_kn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_kn.xtb
new file mode 100644
index 0000000..4ecb12ba
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_kn.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="kn">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ko.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ko.xtb
new file mode 100644
index 0000000..558b05b
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ko.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ko">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lt.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lt.xtb
new file mode 100644
index 0000000..f20c0fa2
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lt.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="lt">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lv.xtb
new file mode 100644
index 0000000..6f3afbc
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_lv.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="lv">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ml.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ml.xtb
new file mode 100644
index 0000000..e01197e
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ml.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ml">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_mr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_mr.xtb
new file mode 100644
index 0000000..b137924e
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_mr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="mr">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ms.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ms.xtb
new file mode 100644
index 0000000..518685dd
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ms.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ms">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_nl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_nl.xtb
new file mode 100644
index 0000000..05ab957
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_nl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="nl">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_no.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_no.xtb
new file mode 100644
index 0000000..ede4de30
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_no.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="no">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pl.xtb
new file mode 100644
index 0000000..1bf17bd5
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pl">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-BR.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-BR.xtb
new file mode 100644
index 0000000..de39dfa
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-BR.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pt-BR">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-PT.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-PT.xtb
new file mode 100644
index 0000000..0b98ee77
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_pt-PT.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pt-PT">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ro.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ro.xtb
new file mode 100644
index 0000000..7129eb4
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ro.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ro">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ru.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ru.xtb
new file mode 100644
index 0000000..6dfaa442
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ru.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ru">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sk.xtb
new file mode 100644
index 0000000..202e515a
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sk.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sk">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sl.xtb
new file mode 100644
index 0000000..31b5a1a
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sl">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sr.xtb
new file mode 100644
index 0000000..984d7192
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sr">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sv.xtb
new file mode 100644
index 0000000..9a787b8
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sv.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sv">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sw.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sw.xtb
new file mode 100644
index 0000000..9aa61cb
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_sw.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sw">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ta.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ta.xtb
new file mode 100644
index 0000000..c983c75f2
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_ta.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ta">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_te.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_te.xtb
new file mode 100644
index 0000000..7affb9a
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_te.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="te">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_th.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_th.xtb
new file mode 100644
index 0000000..dbe6a601
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_th.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="th">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_tr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_tr.xtb
new file mode 100644
index 0000000..d99480c0
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_tr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="tr">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_uk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_uk.xtb
new file mode 100644
index 0000000..6e80099d
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_uk.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="uk">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_vi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_vi.xtb
new file mode 100644
index 0000000..8a42ab1
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_vi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="vi">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-CN.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-CN.xtb
new file mode 100644
index 0000000..c7d76e8
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-CN.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="zh-CN">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-TW.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-TW.xtb
new file mode 100644
index 0000000..3e0c306
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_chrome_keyboard_accessory_strings_zh-TW.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="zh-TW">
+</translationbundle>
\ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
similarity index 93%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
index 8c4f4357..2f8fc040 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static android.support.test.espresso.action.ViewActions.click;
 import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItem;
@@ -12,10 +12,10 @@
 
 import static org.junit.Assert.assertTrue;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.waitToBeHidden;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.waitToBeHidden;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
 
 import android.app.Activity;
 import android.support.test.filters.MediumTest;
@@ -30,7 +30,6 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeWindow;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/FakeKeyboard.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/FakeKeyboard.java
index ea42bf6..15bd9a83 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/FakeKeyboard.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
similarity index 96%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
index 7e87be4..f0c3a3b71 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -20,10 +20,10 @@
 import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertNotNull;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.waitToBeHidden;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.waitToBeHidden;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
 
 import android.support.test.espresso.Espresso;
 import android.support.test.filters.SmallTest;
@@ -38,7 +38,6 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
@@ -399,7 +398,8 @@
         // Create a simple, persistent snackbar and verify it's displayed.
         SnackbarManager manager = mActivityTestRule.getActivity().getSnackbarManager();
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT,
-                () -> manager.showSnackbar(Snackbar.make(kSnackbarText,
+                ()
+                        -> manager.showSnackbar(Snackbar.make(kSnackbarText,
                                 new SnackbarManager.SnackbarController() {},
                                 Snackbar.TYPE_PERSISTENT, Snackbar.UMA_TEST_SNACKBAR)));
         CriteriaHelper.pollUiThread(manager::isShowing);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingTestHelper.java
similarity index 96%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingTestHelper.java
index b978a24..37ea094 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingTestHelper.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
@@ -36,16 +36,15 @@
 import org.junit.Assert;
 
 import org.chromium.base.task.PostTask;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.ImeAdapter;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
@@ -283,7 +282,7 @@
      */
     public void cacheCredentials(String[] usernames, String[] passwords) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ManualFillingBridge.cachePasswordSheetData(
+            ManualFillingComponentBridge.cachePasswordSheetData(
                     mActivityTestRule.getWebContents(), usernames, passwords);
         });
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
similarity index 92%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
index 2c4a880..477dea6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItem;
@@ -11,10 +11,10 @@
 import static android.support.test.espresso.matcher.ViewMatchers.withParent;
 
 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.scrollToLastElement;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.scrollToLastElement;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
 
 import android.support.test.filters.MediumTest;
 import android.support.v7.widget.RecyclerView;
@@ -27,7 +27,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.test.ScreenShooter;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
similarity index 85%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
index 6f124f1..001be32 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -14,12 +14,12 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.KEYBOARD_TOGGLE_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.waitForView;
 
 import android.content.pm.ActivityInfo;
@@ -40,12 +40,12 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
similarity index 87%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
index d9de169..4210274 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -17,11 +17,11 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TAB_LAYOUT_ITEM;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_GONE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_INVISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_NULL;
@@ -39,13 +39,13 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
similarity index 90%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
index 8209dbe..5a682d0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
@@ -18,12 +18,12 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.NO_ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.waitForView;
 
 import android.support.test.filters.MediumTest;
@@ -39,10 +39,10 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Tab;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ViewUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
similarity index 90%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
index 4aee97a..a3ea3f6f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
@@ -23,13 +23,13 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
similarity index 91%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
index 200f516..e5ae3ff 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -13,9 +13,9 @@
 
 import static org.hamcrest.Matchers.containsString;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.isTransformed;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.isTransformed;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
 
 import android.support.test.filters.SmallTest;
 
@@ -27,10 +27,10 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper;
+import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
similarity index 91%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
index e935aa8..dd4fac4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
@@ -25,13 +25,13 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
similarity index 91%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
index 6d53036..07558b5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
@@ -26,13 +26,13 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
similarity index 89%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
index cb30ab4..b7c95ac 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
@@ -14,9 +14,9 @@
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.core.AllOf.allOf;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_GONE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_INVISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_NULL;
@@ -35,10 +35,10 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ui.DummyUiActivity;
 import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
similarity index 87%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
rename to chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
index 100bf221..67b600168 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
 import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java
similarity index 95%
rename from chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
rename to chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java
index a53d1e7..3510106 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
+++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import static android.content.res.Configuration.HARDKEYBOARDHIDDEN_UNDEFINED;
 
@@ -22,15 +22,15 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KEYBOARD_EXTENSION_STATE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingProperties.SHOW_WHEN_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KEYBOARD_EXTENSION_STATE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.EXTENDING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_BAR;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.FLOATING_SHEET;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.HIDDEN;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.REPLACING_KEYBOARD;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.KeyboardExtensionState.WAITING_TO_REPLACE;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingProperties.SHOW_WHEN_VISIBLE;
 import static org.chromium.chrome.browser.tab.Tab.INVALID_TAB_ID;
 import static org.chromium.chrome.browser.tabmodel.TabLaunchType.FROM_BROWSER_ACTIONS;
 import static org.chromium.chrome.browser.tabmodel.TabSelectionType.FROM_NEW;
@@ -61,16 +61,16 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeKeyboardVisibilityDelegate;
 import org.chromium.chrome.browser.ChromeWindow;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
rename to chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
index bbe307e..1ed9aca78 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
+++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component;
+package org.chromium.chrome.browser.keyboard_accessory.bar_component;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -15,11 +15,11 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
 import android.support.design.widget.TabLayout;
 
@@ -35,15 +35,15 @@
 import org.chromium.base.task.test.CustomShadowAsyncTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryBarContents;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryBarContents;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.modelutil.ListObservable;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
similarity index 87%
rename from chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
rename to chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
index 4d1c37f..f552a620 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
+++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -12,11 +12,11 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.ACTIVE_TAB_INDEX;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.HEIGHT;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
 import android.support.v7.widget.RecyclerView;
 import android.view.ViewGroup;
@@ -32,9 +32,9 @@
 import org.chromium.base.metrics.test.ShadowRecordHistogram;
 import org.chromium.base.task.test.CustomShadowAsyncTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessorySheetTrigger;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Tab;
+import org.chromium.chrome.browser.keyboard_accessory.AccessorySheetTrigger;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.ui.modelutil.ListObservable;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
similarity index 85%
rename from chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
rename to chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
index ded87ad..63840b1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
+++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs;
+package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.Matchers.equalTo;
@@ -13,13 +13,13 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder.UMA_KEYBOARD_ACCESSORY_ACTION_IMPRESSION;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder.getHistogramForType;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabMetricsRecorder.UMA_KEYBOARD_ACCESSORY_SHEET_SUGGESTIONS;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.FOOTER_COMMAND;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.PASSWORD_INFO;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.TITLE;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.getType;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder.UMA_KEYBOARD_ACCESSORY_ACTION_IMPRESSION;
+import static org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder.getHistogramForType;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabMetricsRecorder.UMA_KEYBOARD_ACCESSORY_SHEET_SUGGESTIONS;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.FOOTER_COMMAND;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.PASSWORD_INFO;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.TITLE;
+import static org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.getType;
 
 import android.support.v7.widget.RecyclerView;
 
@@ -36,14 +36,14 @@
 import org.chromium.base.task.test.CustomShadowAsyncTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.FallbackSheetType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.FallbackSheetType;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
 import org.chromium.ui.modelutil.ListObservable;
 
 import java.util.HashMap;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java
similarity index 92%
rename from chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java
rename to chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java
index cefd9dc..173675c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java
+++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+package org.chromium.chrome.browser.keyboard_accessory.tab_layout_component;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -12,8 +12,8 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
+import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
 
 import android.support.design.widget.TabLayout;
 
@@ -28,7 +28,7 @@
 import org.chromium.base.task.test.CustomShadowAsyncTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.ListObservable;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/features/keyboard_accessory/public/BUILD.gn b/chrome/android/features/keyboard_accessory/public/BUILD.gn
new file mode 100644
index 0000000..d9371680
--- /dev/null
+++ b/chrome/android/features/keyboard_accessory/public/BUILD.gn
@@ -0,0 +1,29 @@
+# Copyright 2019 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("//build/config/android/rules.gni")
+
+android_library("java") {
+  deps = [
+    "//base:base_java",
+    "//chrome/android:chrome_public_java",
+    "//components/autofill/android:autofill_java",
+    "//third_party/android_deps:com_android_support_support_annotations_java",
+  ]
+  java_files = [
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponent.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/data/Provider.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/data/PropertyProvider.java",
+    "java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java",
+  ]
+  srcjar_deps = [ ":java_enums_srcjar" ]
+}
+
+java_cpp_enum("java_enums_srcjar") {
+  sources = [
+    "//chrome/browser/autofill/manual_filling_view_interface.h",
+    "//chrome/browser/password_manager/password_accessory_metrics_util.h",
+  ]
+  visibility = [ ":*" ]
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponent.java b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponent.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponent.java
rename to chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponent.java
index 0d0c501..44d9fd00 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingComponent.java
+++ b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponent.java
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory;
+package org.chromium.chrome.browser.keyboard_accessory;
 
 import android.view.View;
 import android.view.ViewStub;
 
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
 import org.chromium.chrome.browser.compositor.CompositorViewResizer;
+import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.DropdownPopupWindow;
@@ -126,4 +126,4 @@
      * @param view A {@link View} that is used to find the window root.
      */
     boolean isFillingViewShown(View view);
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/KeyboardAccessoryData.java b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/KeyboardAccessoryData.java
rename to chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java
index 07a81b02..2a828fe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/KeyboardAccessoryData.java
+++ b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.data;
+package org.chromium.chrome.browser.keyboard_accessory.data;
 
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
@@ -12,9 +12,9 @@
 import android.view.ViewGroup;
 
 import org.chromium.base.Callback;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.FallbackSheetType;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
+import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
+import org.chromium.chrome.browser.keyboard_accessory.FallbackSheetType;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/PropertyProvider.java b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/PropertyProvider.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/PropertyProvider.java
rename to chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/PropertyProvider.java
index cf8a122..1f75313 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/PropertyProvider.java
+++ b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/PropertyProvider.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.data;
+package org.chromium.chrome.browser.keyboard_accessory.data;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/Provider.java b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/Provider.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/Provider.java
rename to chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/Provider.java
index 1af67757..caa7aeac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/data/Provider.java
+++ b/chrome/android/features/keyboard_accessory/public/java/src/org/chromium/chrome/browser/keyboard_accessory/data/Provider.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill.keyboard_accessory.data;
+package org.chromium.chrome.browser.keyboard_accessory.data;
 
 /**
  * A provider notifies all registered {@link Observer}s about a changed object.
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS
index 3f29a70e..3101c15e 100644
--- a/chrome/android/java/DEPS
+++ b/chrome/android/java/DEPS
@@ -1,4 +1,7 @@
 include_rules = [
+  "-chrome/android/features/keyboard_accessory/internal"
+
+  "+components/embedder_support/android",
   "+components/embedder_support/android",
   "+components/autofill/android/java/src/org/chromium/components/autofill",
   "+components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler",
diff --git a/chrome/android/java/res/drawable/circle_white.xml b/chrome/android/java/res/drawable/circle_white.xml
index 513d4a1..f30ad00 100644
--- a/chrome/android/java/res/drawable/circle_white.xml
+++ b/chrome/android/java/res/drawable/circle_white.xml
@@ -9,5 +9,5 @@
         android:width="20dp"/>
     <stroke
         android:width="2dp"
-        android:color="@color/white_alpha_50"/>
+        android:color="@android:color/white"/>
 </shape>
diff --git a/chrome/android/java/res/drawable/download_circular_selector_transparent.xml b/chrome/android/java/res/drawable/download_circular_selector_transparent.xml
deleted file mode 100644
index 4cb748d..0000000
--- a/chrome/android/java/res/drawable/download_circular_selector_transparent.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
-    <item android:id="@android:id/background">
-        <shape
-            android:shape="oval">
-            <solid android:color="@android:color/transparent"/>
-            <stroke
-                android:width="2dp"
-                android:color="@color/modern_grey_500"/>
-        </shape>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/list_selection_handle_view.xml b/chrome/android/java/res/layout/list_selection_handle_view.xml
index af7562fd..183eaca 100644
--- a/chrome/android/java/res/layout/list_selection_handle_view.xml
+++ b/chrome/android/java/res/layout/list_selection_handle_view.xml
@@ -26,7 +26,7 @@
         android:layout_height="match_parent"
         android:layout_gravity="center"
         android:background="@null"
-        android:src="@drawable/download_circular_selector_transparent"
+        android:src="@drawable/circle_white"
         android:visibility="gone"
         app:tint="@null"
         tools:ignore="ContentDescription"/>
diff --git a/chrome/android/java/res/layout/main.xml b/chrome/android/java/res/layout/main.xml
index 6d2ede1d..5c8b7ef 100644
--- a/chrome/android/java/res/layout/main.xml
+++ b/chrome/android/java/res/layout/main.xml
@@ -30,14 +30,12 @@
         <ViewStub
             android:id="@+id/keyboard_accessory_stub"
             android:inflatedId="@+id/keyboard_accessory"
-            android:layout="@layout/keyboard_accessory"
             android:layout_height="@dimen/keyboard_accessory_height_with_shadow"
             android:layout_width="match_parent"
             android:layout_gravity="start|bottom"/>
 
         <ViewStub
             android:id="@+id/keyboard_accessory_sheet_stub"
-            android:layout="@layout/keyboard_accessory_sheet"
             android:layout_height="@dimen/keyboard_accessory_sheet_height"
             android:layout_width="match_parent"
             android:layout_gravity="start|bottom"/>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index 04474334..7612819 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -58,7 +58,7 @@
     <color name="app_banner_install_button_bg">#0F9D58</color>
 
     <!-- App menu colors -->
-    <color name="update_menu_item_text_color">#DC5554</color>
+    <color name="update_menu_item_text_color">@color/default_red</color>
 
     <!-- URL Emphasizer colors -->
     <color name="url_emphasis_non_emphasized_text">#80333333</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 56afacb..42eedeb5 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -129,24 +129,8 @@
     <dimen name="overlay_panel_bar_height">56dp</dimen>
 
     <!-- Autofill keyboard accessory dimensions -->
-    <dimen name="keyboard_accessory_bar_item_height">36dp</dimen>
-    <dimen name="keyboard_accessory_bar_item_padding">8dp</dimen>
-    <dimen name="keyboard_accessory_half_padding">6dp</dimen>
-    <dimen name="keyboard_accessory_height">48dp</dimen>
     <dimen name="keyboard_accessory_height_with_shadow">56dp</dimen>
-    <dimen name="keyboard_accessory_image_top_padding">12dp</dimen>
-    <dimen name="keyboard_accessory_shadow">5dp</dimen>
     <dimen name="keyboard_accessory_sheet_height">330dp</dimen>
-    <dimen name="keyboard_accessory_sheet_padding">8dp</dimen>
-    <dimen name="keyboard_accessory_sheet_top_margin">16dp</dimen>
-    <dimen name="keyboard_accessory_suggestion_padding">16dp</dimen>
-    <dimen name="keyboard_accessory_suggestion_top_bottom_margin">8dp</dimen>
-    <dimen name="keyboard_accessory_suggestion_offset">12dp</dimen>
-    <dimen name="keyboard_accessory_suggestion_height">48dp</dimen>
-    <dimen name="keyboard_accessory_suggestion_icon_size">20dp</dimen>
-    <dimen name="keyboard_accessory_scroll_shadow_width">40dp</dimen>
-    <dimen name="keyboard_accessory_bar_item_cc_icon_width">32dp</dimen>
-    <dimen name="keyboard_accessory_tab_size">@dimen/keyboard_accessory_height</dimen>
 
     <!-- Password generation popup dimensions -->
     <dimen name="password_generation_text_size">14sp</dimen>
@@ -592,8 +576,8 @@
     <dimen name="download_manager_ideal_image_width">150dp</dimen>
     <dimen name="download_manager_recycler_view_min_padding_wide_screen">16dp</dimen>
     <dimen name="download_manager_max_image_item_width_wide_screen">300dp</dimen>
-    <dimen name="download_manager_image_padding">2dp</dimen>
-    <dimen name="download_manager_prefetch_horizontal_margin">16dp</dimen>
+    <dimen name="download_manager_image_padding">5dp</dimen>
+    <dimen name="download_manager_horizontal_margin">16dp</dimen>
     <dimen name="download_manager_prefetch_vertical_margin">12dp</dimen>
     <dimen name="download_manager_section_title_padding_top">16dp</dimen>
     <dimen name="download_manager_section_title_padding_bottom">0dp</dimen>
diff --git a/chrome/android/java/res/values/drawable.xml b/chrome/android/java/res/values/drawable.xml
deleted file mode 100644
index 1090885e6..0000000
--- a/chrome/android/java/res/values/drawable.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<resources>
-    <item type="drawable" name="ntp_search_box">@drawable/modern_toolbar_text_box_background</item>
-</resources>
\ No newline at end of file
diff --git a/chrome/android/java/res/values/drawables.xml b/chrome/android/java/res/values/drawables.xml
new file mode 100644
index 0000000..c4cc320
--- /dev/null
+++ b/chrome/android/java/res/values/drawables.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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. -->
+
+<resources>
+    <drawable name="ntp_search_box">@drawable/modern_toolbar_text_box_background</drawable>
+    <drawable name="badge_update">@drawable/badge_update_dark</drawable>
+</resources>
\ No newline at end of file
diff --git a/chrome/android/java/res_night/values-night/drawables.xml b/chrome/android/java/res_night/values-night/drawables.xml
new file mode 100644
index 0000000..602df802
--- /dev/null
+++ b/chrome/android/java/res_night/values-night/drawables.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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. -->
+<resources>
+    <drawable name="badge_update">@drawable/badge_update_light</drawable>
+</resources>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index a51527f..258753a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -62,8 +62,6 @@
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.appmenu.AppMenuObserver;
 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingComponent;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingComponentFactory;
 import org.chromium.chrome.browser.banners.AppBannerManager;
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
 import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
@@ -102,6 +100,8 @@
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.init.AsyncInitializationActivity;
 import org.chromium.chrome.browser.init.ProcessInitializationHandler;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
+import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentFactory;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.media.PictureInPicture;
 import org.chromium.chrome.browser.media.PictureInPictureController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/ModuleLoader.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/ModuleLoader.java
index 4517e0d..67b0351 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/ModuleLoader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/ModuleLoader.java
@@ -518,6 +518,7 @@
                 CrashKeys crashKeys = CrashKeys.getInstance();
                 crashKeys.set(CrashKeyIndex.LOADED_DYNAMIC_MODULE, mModuleId);
                 crashKeys.set(CrashKeyIndex.ACTIVE_DYNAMIC_MODULE, mModuleId);
+                crashKeys.set(CrashKeyIndex.DYNAMIC_MODULE_DEX_NAME, mDexAssetName);
 
                 ModuleMetrics.registerLifecycleState(ModuleMetrics.LifecycleState.INSTANTIATED);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
index 7ee7a76..b99a5b3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
@@ -37,12 +37,13 @@
     private final DecoratedListItemModel mModel;
 
     private final int mIdealImageWidthPx;
-    private final int mImagePaddingPx;
+    private final int mInterImagePaddingPx;
     private final int mPrefetchVerticalPaddingPx;
-    private final int mPrefetchHorizontalPaddingPx;
+    private final int mHorizontalPaddingPx;
     private final int mMaxWidthImageItemPx;
 
     private final RecyclerView mView;
+    private final GridLayoutManager mGridLayoutManager;
     private final UiConfig mUiConfig;
 
     /** Creates an instance of a {@link DateOrderedListView} representing {@code model}. */
@@ -53,10 +54,10 @@
 
         mIdealImageWidthPx = context.getResources().getDimensionPixelSize(
                 R.dimen.download_manager_ideal_image_width);
-        mImagePaddingPx = context.getResources().getDimensionPixelOffset(
+        mInterImagePaddingPx = context.getResources().getDimensionPixelOffset(
                 R.dimen.download_manager_image_padding);
-        mPrefetchHorizontalPaddingPx = context.getResources().getDimensionPixelSize(
-                R.dimen.download_manager_prefetch_horizontal_margin);
+        mHorizontalPaddingPx = context.getResources().getDimensionPixelSize(
+                R.dimen.download_manager_horizontal_margin);
         mPrefetchVerticalPaddingPx = context.getResources().getDimensionPixelSize(
                 R.dimen.download_manager_prefetch_vertical_margin);
         mMaxWidthImageItemPx = context.getResources().getDimensionPixelSize(
@@ -78,7 +79,9 @@
         mView.setHasFixedSize(true);
         ((DefaultItemAnimator) mView.getItemAnimator()).setSupportsChangeAnimations(false);
         mView.getItemAnimator().setMoveDuration(0);
-        mView.setLayoutManager(new GridLayoutManagerImpl(context));
+
+        mGridLayoutManager = new GridLayoutManagerImpl(context);
+        mView.setLayoutManager(mGridLayoutManager);
         mView.addItemDecoration(new ItemDecorationImpl());
         mView.setClipToPadding(false);
 
@@ -146,8 +149,8 @@
         public void onLayoutChildren(Recycler recycler, State state) {
             assert getOrientation() == VERTICAL;
 
-            int availableWidth = getAvailableViewWidth() - mImagePaddingPx;
-            int columnWidth = mIdealImageWidthPx - mImagePaddingPx;
+            int availableWidth = getAvailableViewWidth() - 2 * mHorizontalPaddingPx;
+            int columnWidth = mIdealImageWidthPx - mInterImagePaddingPx;
 
             int easyFitSpan = availableWidth / columnWidth;
             double remaining =
@@ -185,23 +188,28 @@
                 case ListUtils.ViewType.IMAGE:
                 case ListUtils.ViewType.IMAGE_FULL_WIDTH:
                 case ListUtils.ViewType.IN_PROGRESS_IMAGE:
-                    outRect.left = mImagePaddingPx;
-                    outRect.right = mImagePaddingPx;
-                    outRect.top = mImagePaddingPx;
-                    outRect.bottom = mImagePaddingPx;
                     isFullWidthMedia = ((ListItem.OfflineItemListItem) item).spanFullWidth;
+                    if (isFullWidthMedia || mGridLayoutManager.getSpanCount() == 1) {
+                        outRect.left = mHorizontalPaddingPx;
+                        outRect.right = mHorizontalPaddingPx;
+                    } else {
+                        computeItemDecoration(position, outRect);
+                    }
+
+                    outRect.top = mInterImagePaddingPx / 2;
+                    outRect.bottom = mInterImagePaddingPx / 2;
                     break;
                 case ListUtils.ViewType.VIDEO: // Intentional fallthrough.
                 case ListUtils.ViewType.IN_PROGRESS_VIDEO:
-                    outRect.left = mPrefetchHorizontalPaddingPx;
-                    outRect.right = mPrefetchHorizontalPaddingPx;
+                    outRect.left = mHorizontalPaddingPx;
+                    outRect.right = mHorizontalPaddingPx;
                     outRect.top = mPrefetchVerticalPaddingPx / 2;
                     outRect.bottom = mPrefetchVerticalPaddingPx / 2;
                     isFullWidthMedia = true;
                     break;
                 case ListUtils.ViewType.PREFETCH:
-                    outRect.left = mPrefetchHorizontalPaddingPx;
-                    outRect.right = mPrefetchHorizontalPaddingPx;
+                    outRect.left = mHorizontalPaddingPx;
+                    outRect.right = mHorizontalPaddingPx;
                     outRect.top = mPrefetchVerticalPaddingPx / 2;
                     outRect.bottom = mPrefetchVerticalPaddingPx / 2;
                     break;
@@ -213,6 +221,46 @@
                 outRect.right += Math.max(getAvailableViewWidth() - mMaxWidthImageItemPx, 0);
             }
         }
+
+        private void computeItemDecoration(int position, Rect outRect) {
+            GridLayoutManager.SpanSizeLookup spanLookup = mGridLayoutManager.getSpanSizeLookup();
+            int spanCount = mGridLayoutManager.getSpanCount();
+            int columnIndex = spanLookup.getSpanIndex(position, spanCount);
+
+            horizontallyRepositionGridItem(columnIndex, spanCount, mHorizontalPaddingPx,
+                    mHorizontalPaddingPx, mInterImagePaddingPx, outRect);
+        }
+    }
+
+    /**
+     * Given the column index for an image in a grid view, computes the left and right edge
+     * offsets.
+     * @param columnIndex Column index for the item
+     * @param spanCount Span count of the grid
+     * @param leftMargin Leftmost margin in the row
+     * @param rightMargin Rightmost margin in the row
+     * @param padding Spacing between two items
+     * @param outRect The output rect that contains the computed offsets
+     */
+    private static void horizontallyRepositionGridItem(int columnIndex, int spanCount,
+            int leftMargin, int rightMargin, int padding, Rect outRect) {
+        assert spanCount > 1;
+
+        // Margin here refers to the leftmost or rightmost margin in the row, and padding here
+        // refers to the inter-image spacing.
+
+        // Calculate how much each image should be shrunk compared to the ideal image size if no
+        // margin or padding were present.
+        int shrink = (leftMargin + rightMargin + (spanCount - 1) * padding) / spanCount;
+
+        // Starting from left, calculate how much the image is shifted from ideal position
+        // due to the leftmost margin and padding between previous images. Subtract the
+        // total shrink for the previous images from this value.
+        outRect.left = leftMargin + columnIndex * padding - columnIndex * shrink;
+
+        // For right edge, the calculation is exactly same as left, except we have one extra
+        // shrink. Negate the final value.
+        outRect.right = -(leftMargin + columnIndex * padding - (columnIndex + 1) * shrink);
     }
 
     private class ModelChangeProcessor extends ForwardingListObservable<Void>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
index d48149b..7fd1fb44 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
@@ -90,6 +90,11 @@
     public static final int NOTIFICATION_ID_DOWNLOAD_SUMMARY = 999999;
 
     /**
+     * Unique identifier for a single update notification.
+     */
+    public static final int NOTIFICATION_ID_UPDATE = 8;
+
+    /**
      * Separator used to separate the notification origin from additional data such as the
      * developer specified tag. This and the prefix following it need to be the same as the one
      * specified in notification_id_generator.cc.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
index 91873c5..f3373cdf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
@@ -48,7 +48,7 @@
             SystemNotificationType.WEBAPP_ACTIONS,
             SystemNotificationType.OFFLINE_CONTENT_SUGGESTION,
             SystemNotificationType.TRUSTED_WEB_ACTIVITY_SITES, SystemNotificationType.OFFLINE_PAGES,
-            SystemNotificationType.SEND_TAB_TO_SELF})
+            SystemNotificationType.SEND_TAB_TO_SELF, SystemNotificationType.UPDATES})
     @Retention(RetentionPolicy.SOURCE)
     public @interface SystemNotificationType {
         int UNKNOWN = -1;
@@ -68,8 +68,9 @@
         int TRUSTED_WEB_ACTIVITY_SITES = 13;
         int OFFLINE_PAGES = 14;
         int SEND_TAB_TO_SELF = 15;
+        int UPDATES = 16;
 
-        int NUM_ENTRIES = 16;
+        int NUM_ENTRIES = 17;
     }
 
     /*
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelDefinitions.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelDefinitions.java
index 23bc7a5..7ce21b1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelDefinitions.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelDefinitions.java
@@ -53,11 +53,9 @@
      * and add the ID to the LEGACY_CHANNELS_ID array below. See the README in this directory for
      * more detailed instructions.
      */
-    @StringDef({
-            ChannelId.BROWSER, ChannelId.DOWNLOADS, ChannelId.INCOGNITO, ChannelId.MEDIA,
+    @StringDef({ChannelId.BROWSER, ChannelId.DOWNLOADS, ChannelId.INCOGNITO, ChannelId.MEDIA,
             ChannelId.SCREEN_CAPTURE, ChannelId.CONTENT_SUGGESTIONS, ChannelId.WEBAPP_ACTIONS,
-            ChannelId.SITES, ChannelId.SHARING
-    })
+            ChannelId.SITES, ChannelId.SHARING, ChannelId.UPDATES})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ChannelId {
         String BROWSER = "browser";
@@ -71,6 +69,7 @@
         String SITES = "sites";
         String VR = "vr";
         String SHARING = "sharing";
+        String UPDATES = "updates";
     }
 
     @StringDef({
@@ -165,6 +164,10 @@
                     new PredefinedChannel(ChannelId.VR, R.string.notification_category_vr,
                             NotificationManager.IMPORTANCE_HIGH, ChannelGroupId.GENERAL));
 
+            map.put(ChannelId.UPDATES,
+                    new PredefinedChannel(ChannelId.UPDATES, R.string.notification_category_updates,
+                            NotificationManager.IMPORTANCE_HIGH, ChannelGroupId.GENERAL));
+
             MAP = Collections.unmodifiableMap(map);
             STARTUP = Collections.unmodifiableSet(startup);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
index fbd2af2..1c769c1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.omaha;
 
+import android.content.res.Resources;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -11,6 +12,8 @@
 import android.text.format.DateUtils;
 
 import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.omaha.UpdateStatusProvider.UpdateState;
@@ -56,6 +59,8 @@
     private static final String UPDATE_NOTIFICATION_INTERVAL_PARAM_NAME =
             "update_notification_interval_days";
     private static final String UPDATE_NOTIFICATION_STATE_PARAM_NAME = "update_notification_state";
+    private static final String UPDATE_NOTIFICATION_EXPERIMENTAL_PARAM_NAME =
+            "update_notification_experimental_context";
 
     private static final long DEFAULT_UPDATE_NOTIFICATION_INTERVAL = 21 * DateUtils.DAY_IN_MILLIS;
 
@@ -214,6 +219,47 @@
         return ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
                 ChromeFeatureList.INLINE_UPDATE_FLOW, UPDATE_NOTIFICATION_STATE_PARAM_NAME, false);
     }
+
+    /**
+     * @return A title of update notification.
+     */
+    public static String getUpdateNotificationTitle() {
+        Resources resources = ContextUtils.getApplicationContext().getResources();
+        String configuration = ChromeFeatureList.getFieldTrialParamByFeature(
+                ChromeFeatureList.INLINE_UPDATE_FLOW, UPDATE_NOTIFICATION_EXPERIMENTAL_PARAM_NAME);
+        switch (configuration) {
+            case "experimental_update_chrome":
+                return resources.getString(
+                        R.string.update_notification_title_experimental_update_chrome);
+            case "experimental_translate_the_web":
+                return resources.getString(
+                        R.string.update_notification_title_experimental_translate_the_web);
+            case "default": // Intentional fallthrough.
+            default:
+                return resources.getString(R.string.update_notification_title_default);
+        }
+    }
+
+    /**
+     * @return A text body of update notification.
+     */
+    public static String getUpdateNotificationTextBody() {
+        Resources resources = ContextUtils.getApplicationContext().getResources();
+        String configuration = ChromeFeatureList.getFieldTrialParamByFeature(
+                ChromeFeatureList.INLINE_UPDATE_FLOW, UPDATE_NOTIFICATION_EXPERIMENTAL_PARAM_NAME);
+        switch (configuration) {
+            case "experimental_update_chrome":
+                return resources.getString(
+                        R.string.update_notification_text_body_experimental_update_chrome);
+            case "experimental_translate_the_web":
+                return resources.getString(
+                        R.string.update_notification_text_body_experimental_translate_the_web);
+            case "default": // Intentional fallthrough.
+            default:
+                return resources.getString(R.string.update_notification_text_body_default);
+        }
+    }
+
     /**
      * Gets a String VariationsAssociatedData parameter. Also checks for a command-line switch
      * with the same name, for easy local testing.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java
index ab328ac8..ff09c839 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java
@@ -288,7 +288,7 @@
                 mMenuUiState.itemState = new MenuItemState();
                 mMenuUiState.itemState.title = R.string.menu_update;
                 mMenuUiState.itemState.titleColor = R.color.error_text_color;
-                mMenuUiState.itemState.icon = R.drawable.badge_update_dark;
+                mMenuUiState.itemState.icon = R.drawable.badge_update;
                 mMenuUiState.itemState.enabled = true;
                 mMenuUiState.itemState.summary = UpdateConfigs.getCustomSummary();
                 if (TextUtils.isEmpty(mMenuUiState.itemState.summary)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateNotificationController.java
index 9c4ba10..b39a912 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateNotificationController.java
@@ -4,17 +4,17 @@
 package org.chromium.chrome.browser.omaha;
 
 import static org.chromium.chrome.browser.omaha.UpdateConfigs.getUpdateNotificationInterval;
+import static org.chromium.chrome.browser.omaha.UpdateConfigs.getUpdateNotificationTextBody;
+import static org.chromium.chrome.browser.omaha.UpdateConfigs.getUpdateNotificationTitle;
 import static org.chromium.chrome.browser.omaha.UpdateConfigs.isUpdateNotificationEnabled;
 import static org.chromium.chrome.browser.omaha.UpdateStatusProvider.UpdateState.INLINE_UPDATE_AVAILABLE;
 import static org.chromium.chrome.browser.omaha.UpdateStatusProvider.UpdateState.UPDATE_AVAILABLE;
 
-import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.content.res.Resources;
 import android.net.Uri;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
@@ -112,23 +112,18 @@
     private void scheduleUpdateNotification() {
         if (!shouldPushNotification()) return;
 
-        Resources resources = ContextUtils.getApplicationContext().getResources();
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
-                        .createChromeNotificationBuilder(false,
-                                ChannelDefinitions.ChannelId.BROWSER, null,
+                        .createChromeNotificationBuilder(true, ChannelDefinitions.ChannelId.UPDATES,
+                                null,
                                 new NotificationMetadata(
-                                        NotificationUmaTracker.SystemNotificationType
-                                                .BROWSER_ACTIONS,
+                                        NotificationUmaTracker.SystemNotificationType.UPDATES,
                                         UPDATE_NOTIFICATION_TAG /* notificationTag */,
-                                        NotificationConstants.NOTIFICATION_ID_BROWSER_ACTIONS))
+                                        NotificationConstants.NOTIFICATION_ID_UPDATE))
                         .setSmallIcon(R.drawable.ic_chrome)
                         .setAutoCancel(true)
-                        .setContentTitle(resources.getString(R.string.update_notification_title));
-
-        Notification.BigTextStyle style = new Notification.BigTextStyle();
-        style.bigText(resources.getString(R.string.update_notification_text_body));
-        builder.setStyle(style);
+                        .setContentTitle(getUpdateNotificationTitle())
+                        .setContentText(getUpdateNotificationTextBody());
 
         builder.setContentIntent(createContentIntent(mUpdateStatus));
         NotificationManagerProxy notificationManager = new NotificationManagerProxyImpl(mActivity);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
index 2732c24..3e5a5ceb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
@@ -12,7 +12,6 @@
 import android.provider.Settings;
 import android.support.annotation.Nullable;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -20,6 +19,7 @@
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.GAIAServiceType;
+import org.chromium.components.signin.SigninActivityMonitor;
 import org.chromium.ui.base.WindowAndroid;
 
 /**
@@ -49,6 +49,7 @@
         return IntentUtils.safeStartActivity(context, intent);
     }
 
+    // TODO(https://crbug.com/955501): Migrate all clients to WindowAndroid and remove this.
     /**
      * Opens a Settings page with all accounts on the device.
      * @param context Context to use when starting the Activity.
@@ -60,6 +61,16 @@
         return IntentUtils.safeStartActivity(context, intent);
     }
 
+    /**
+     * Opens a Settings page with all accounts on the device.
+     * @param windowAndroid WindowAndroid to use when starting the Activity.
+     * @return Whether or not Android accepted the Intent.
+     */
+    public static boolean openSettingsForAllAccounts(WindowAndroid windowAndroid) {
+        Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
+        return startActivity(windowAndroid, intent);
+    }
+
     @CalledByNative
     private static void openAccountManagementScreen(WindowAndroid windowAndroid,
             @GAIAServiceType int gaiaServiceType, @Nullable String email) {
@@ -86,7 +97,7 @@
                     break;
                 default:
                     // Open generic accounts settings.
-                    SigninUtils.openSettingsForAllAccounts(ContextUtils.getApplicationContext());
+                    openSettingsForAllAccounts(windowAndroid);
                     break;
             }
             return;
@@ -105,16 +116,35 @@
         logEvent(ProfileAccountManagementMetrics.DIRECT_ADD_ACCOUNT, gaiaServiceTypeSignup);
 
         AccountManagerFacade.get().createAddAccountIntent((@Nullable Intent intent) -> {
-            Activity activity = windowAndroid.getActivity().get();
-            if (intent == null || activity == null
-                    || !IntentUtils.safeStartActivity(activity, intent)) {
-                // Failed to create or show an intent, open settings for all accounts so
-                // the user has a chance to create an account manually.
-                SigninUtils.openSettingsForAllAccounts(ContextUtils.getApplicationContext());
+            if (intent != null && startActivity(windowAndroid, intent)) {
+                return;
             }
+            // Failed to create or show an intent, open settings for all accounts so
+            // the user has a chance to create an account manually.
+            SigninUtils.openSettingsForAllAccounts(windowAndroid);
         });
     }
 
+    // TODO(https://crbug.com/953765): Move this to SigninActivityMonitor.
+    /**
+     * Starts an activity using the provided intent. The started activity will be tracked by
+     * {@link SigninActivityMonitor#hasOngoingActivity()}.
+     *
+     * @param windowAndroid The window to use when launching the intent.
+     * @param intent The intent to launch.
+     * @return Whether {@link WindowAndroid#showIntent} succeeded.
+     */
+    private static boolean startActivity(WindowAndroid windowAndroid, Intent intent) {
+        SigninActivityMonitor signinActivityMonitor = SigninActivityMonitor.get();
+        WindowAndroid.IntentCallback intentCallback =
+                (window, resultCode, data) -> signinActivityMonitor.activityFinished();
+        if (windowAndroid.showIntent(intent, intentCallback, null)) {
+            signinActivityMonitor.activityStarted();
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Log a UMA event for a given metric and a signin type.
      * @param metric One of ProfileAccountManagementMetrics constants.
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 7c32553..e601e8ad8 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -319,6 +319,9 @@
       <message name="IDS_NOTIFICATION_CATEGORY_VR" desc="Label for notifications in VR, within a list of notification categories. [CHAR-LIMIT=32]">
         Virtual Reality
       </message>
+      <message name="IDS_NOTIFICATION_CATEGORY_UPDATES" desc="Label for update notifications, within a list of notification categories. [CHAR-LIMIT=32]">
+       Updates
+      </message>
 
       <!-- Sign-in, sync and personalization preferences -->
       <message name="IDS_PREFS_SECTION_ACCOUNT" desc="Title for the group of account-related entries in Settings. [CHAR-LIMIT=32]">
@@ -460,9 +463,6 @@
       </message>
 
       <!-- Autofill and Payments preferences -->
-      <message name="IDS_AUTOFILL_KEYBOARD_ACCESSORY_CONTENT_DESCRIPTION" desc="The text announced by the screen reader when the autofill suggestions are shown.">
-        Passwords available
-      </message>
       <message name="IDS_PAYMENT_APPS_TITLE" desc="Title of the preference to list the payment apps on device.">
         Payment apps
       </message>
@@ -2035,11 +2035,23 @@
       </message>
 
       <!-- Update Notification-->
-      <message name="IDS_UPDATE_NOTIFICATION_TITLE" desc="Title of update notification to remind user to update Chrome.">
+      <message name="IDS_UPDATE_NOTIFICATION_TITLE_DEFAULT" desc="Default title of update notification to remind user to update Chrome.">
         Update Chrome
       </message>
-      <message name="IDS_UPDATE_NOTIFICATION_TEXT_BODY" desc="Text showing in the update notification body, kindly telling user to update to the latest version of Chrome.">
-        You are on an outdated version of Chrome. Open Chrome to update for a safer browsing experience.
+      <message name="IDS_UPDATE_NOTIFICATION_TEXT_BODY_DEFAULT" desc="Default text showing in the update notification body, kindly telling user to update to the latest version of Chrome.">
+        For the best browsing experience, open to update Chrome
+      </message>
+      <message name="IDS_UPDATE_NOTIFICATION_TITLE_EXPERIMENTAL_UPDATE_CHROME" desc="Experimental version A title of update notification to remind user to update Chrome.">
+        Update Chrome
+      </message>
+      <message name="IDS_UPDATE_NOTIFICATION_TEXT_BODY_EXPERIMENTAL_UPDATE_CHROME" desc="Experimental version A text showing in the update notification body, kindly telling user to update to the latest version of Chrome.">
+        To see the web in your language, get the latest version of Chrome
+      </message>
+      <message name="IDS_UPDATE_NOTIFICATION_TITLE_EXPERIMENTAL_TRANSLATE_THE_WEB" desc="Experimental version B title of update notification to remind user to update Chrome.">
+        Translate the Web
+      </message>
+      <message name="IDS_UPDATE_NOTIFICATION_TEXT_BODY_EXPERIMENTAL_TRANSLATE_THE_WEB" desc="Experimental version B text showing in the update notification body, kindly telling user to update to the latest version of Chrome.">
+        Update to get your language in the latest version of Chrome
       </message>
 
       <!-- TranslateInfoBar -->
@@ -3962,24 +3974,6 @@
         Links to your favorite websites can be found on this page
       </message>
 
-      <!-- Password Accessory Strings -->
-      <message name="IDS_KEYBOARD_ACCESSORY_SHEET_HIDE" desc="Description for the active icon button that closes an accessory sheet and brings back the keyboard.">
-          Show keyboard
-      </message>
-      <message name="IDS_PASSWORD_GENERATION_ACCESSORY_BUTTON" desc="Text for the button used to generate a password.">
-          Suggest strong password
-      </message>
-      <message name="IDS_PASSWORD_GENERATION_ACCESSORY_BUTTON_SHORT" desc="Shortened text for the button used to generate a password. This is used for devices with small screen.">
-          Suggest password
-      </message>
-      <message name="IDS_PASSWORD_ACCESSORY_SHEET_TOGGLE" desc="Description for the icon button used to open and close the password accessory sheet.">
-          Show passwords
-      </message>
-      <message name="IDS_PASSWORD_ACCESSORY_SHEET_OPENED" desc="Accessibility announcement when opening a password bottom sheet containing saved credentials and options like managing and generating passwords.">
-          Showing saved passwords and password options
-      </message>
-
-
       <!-- Launcher Shortcuts -->
       <message name="IDS_DISABLED_INCOGNITO_LAUNCHER_SHORTCUT_MESSAGE" desc="Text for a toast displayed prompting the user to remove the disabled 'New incognito tab' app shortcut and recreate it.">
         Remove and recreate this shortcut
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
deleted file mode 100644
index 5c54721..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
-
-# COMPONENT: UI>Browser>Autofill
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
deleted file mode 100644
index 5c54721..0000000
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/OWNERS
-
-# COMPONENT: UI>Browser>Autofill
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 94e1b88..2f03da8b 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-76.0.3774.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-76.0.3775.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a3bebd2c..6eb815e 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1779,11 +1779,6 @@
      flag_descriptions::kMediaRouterCastAllowAllIPsDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(media_router::kCastAllowAllIPsFeature)},
 #endif  // !OS_ANDROID
-#if defined(OS_CHROMEOS)
-    {"disable-mtp-write-support", flag_descriptions::kMtpWriteSupportName,
-     flag_descriptions::kMtpWriteSupportDescription, kOsCrOS,
-     SINGLE_DISABLE_VALUE_TYPE(chromeos::switches::kDisableMtpWriteSupport)},
-#endif  // OS_CHROMEOS
 #if defined(OS_ANDROID)
     {"autofill-keyboard-accessory-view",
      flag_descriptions::kAutofillAccessoryViewName,
diff --git a/chrome/browser/android/customtabs/detached_resource_request.cc b/chrome/browser/android/customtabs/detached_resource_request.cc
index 2b94bc8..eca15fe 100644
--- a/chrome/browser/android/customtabs/detached_resource_request.cc
+++ b/chrome/browser/android/customtabs/detached_resource_request.cc
@@ -83,8 +83,7 @@
   resource_request->referrer_policy = referrer_policy;
   resource_request->site_for_cookies = site_for_cookies_;
   resource_request->request_initiator = url::Origin::Create(site_for_cookies_);
-  resource_request->resource_type =
-      static_cast<int>(content::ResourceType::kSubResource);
+  resource_request->resource_type = content::ResourceType::kSubResource;
   resource_request->do_not_prompt_for_login = true;
   resource_request->render_frame_id = -1;
   resource_request->enable_load_timing = false;
diff --git a/chrome/browser/apps/app_service/crostini_apps.cc b/chrome/browser/apps/app_service/crostini_apps.cc
index d555b47..c12baba3 100644
--- a/chrome/browser/apps/app_service/crostini_apps.cc
+++ b/chrome/browser/apps/app_service/crostini_apps.cc
@@ -210,7 +210,9 @@
                                         : apps::mojom::OptionalBool::kFalse;
   app->show_in_launcher = show;
   app->show_in_search = show;
-  app->show_in_management = show;
+  // TODO(crbug.com/955937): Enable once Crostini apps are managed inside App
+  // Management.
+  app->show_in_management = apps::mojom::OptionalBool::kFalse;
 
   return app;
 }
diff --git a/chrome/browser/apps/app_service/extension_apps.cc b/chrome/browser/apps/app_service/extension_apps.cc
index 310537ae..783f8fed 100644
--- a/chrome/browser/apps/app_service/extension_apps.cc
+++ b/chrome/browser/apps/app_service/extension_apps.cc
@@ -376,7 +376,7 @@
                     : apps::mojom::OptionalBool::kFalse;
     app->show_in_launcher = show;
     app->show_in_search = show;
-    app->show_in_management = ShouldShowInAppManagement(extension);
+    app->show_in_management = show;
   } else {
     app->show_in_launcher = apps::mojom::OptionalBool::kFalse;
     app->show_in_search = apps::mojom::OptionalBool::kFalse;
@@ -402,21 +402,6 @@
          registry->terminated_extensions().Contains(app_id);
 }
 
-// static
-apps::mojom::OptionalBool ExtensionApps::ShouldShowInAppManagement(
-    const extensions::Extension* extension) {
-  // Component extensions should not show up in App Management as they
-  // are only extensions as an implementation detail of Chrome, and have
-  // no meaningful settings.
-  if (extensions::Manifest::IsComponentLocation(extension->location()) &&
-      !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          extensions::switches::kShowComponentExtensionOptions)) {
-    return apps::mojom::OptionalBool::kFalse;
-  } else {
-    return apps::mojom::OptionalBool::kTrue;
-  }
-}
-
 void ExtensionApps::PopulatePermissions(
     const extensions::Extension* extension,
     std::vector<mojom::PermissionPtr>* target) {
diff --git a/chrome/browser/apps/app_service/extension_apps.h b/chrome/browser/apps/app_service/extension_apps.h
index 4f0e98ea..6e4407c 100644
--- a/chrome/browser/apps/app_service/extension_apps.h
+++ b/chrome/browser/apps/app_service/extension_apps.h
@@ -94,8 +94,6 @@
                               Profile* profile);
   static bool ShouldShow(const extensions::Extension* extension,
                          Profile* profile);
-  static apps::mojom::OptionalBool ShouldShowInAppManagement(
-      const extensions::Extension* extension);
 
   void PopulatePermissions(const extensions::Extension* extension,
                            std::vector<mojom::PermissionPtr>* target);
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index abb712a..cae4582f1 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1256,6 +1256,8 @@
     "login/saml/saml_offline_signin_limiter.h",
     "login/saml/saml_offline_signin_limiter_factory.cc",
     "login/saml/saml_offline_signin_limiter_factory.h",
+    "login/saml/saml_password_expiry_notification.cc",
+    "login/saml/saml_password_expiry_notification.h",
     "login/saml/saml_profile_prefs.cc",
     "login/saml/saml_profile_prefs.h",
     "login/screen_manager.cc",
@@ -2429,6 +2431,7 @@
     "login/quick_unlock/pin_storage_prefs_unittest.cc",
     "login/quick_unlock/quick_unlock_storage_unittest.cc",
     "login/saml/saml_offline_signin_limiter_unittest.cc",
+    "login/saml/saml_password_expiry_notification_unittest.cc",
     "login/screens/multidevice_setup_screen_unittest.cc",
     "login/screens/network_screen_unittest.cc",
     "login/screens/recommend_apps/recommend_apps_fetcher_impl_unittest.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 0dbbbc4..9ec534e0 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -641,6 +641,7 @@
   system_token_certdb_initializer_->Initialize();
 
   CrasAudioHandler::Initialize(
+      content::ServiceManagerConnection::GetForProcess()->GetConnector(),
       new AudioDevicesPrefHandlerImpl(g_browser_process->local_state()));
 
   content::MediaCaptureDevices::GetInstance()->AddVideoCaptureObserver(
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc
index fd4b78c..c7c21cd 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -1195,8 +1195,6 @@
   // hierarchical file system, and writing to external storage devices is not
   // prohibited by the preference.
   const bool read_only =
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          chromeos::switches::kDisableMtpWriteSupport) ||
       mtp_storage_info->access_capability != kAccessCapabilityReadWrite ||
       mtp_storage_info->filesystem_type !=
           kFilesystemTypeGenericHierarchical ||
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend.cc b/chrome/browser/chromeos/fileapi/file_system_backend.cc
index 4e66eb4..edc3bc31c 100644
--- a/chrome/browser/chromeos/fileapi/file_system_backend.cc
+++ b/chrome/browser/chromeos/fileapi/file_system_backend.cc
@@ -304,9 +304,7 @@
   if (type == storage::kFileSystemTypeProvided)
     return file_system_provider_delegate_->GetWatcherManager(type);
 
-  if (type == storage::kFileSystemTypeDeviceMediaAsFileStorage &&
-      !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          chromeos::switches::kDisableMtpWriteSupport)) {
+  if (type == storage::kFileSystemTypeDeviceMediaAsFileStorage) {
     return mtp_delegate_->GetWatcherManager(type);
   }
 
diff --git a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
index b2655dfd..97bada2 100644
--- a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
+++ b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
@@ -12,11 +12,13 @@
 #include "chrome/browser/chromeos/authpolicy/data_pipe_utils.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
 #include "chromeos/components/account_manager/account_manager.h"
 #include "chromeos/components/account_manager/account_manager_factory.h"
 #include "chromeos/dbus/kerberos/kerberos_client.h"
 #include "chromeos/dbus/kerberos/kerberos_service.pb.h"
 #include "chromeos/dbus/upstart/upstart_client.h"
+#include "components/prefs/pref_registry_simple.h"
 #include "dbus/message.h"
 #include "third_party/cros_system_api/dbus/kerberos/dbus-constants.h"
 
@@ -266,6 +268,21 @@
 
 KerberosCredentialsManager::~KerberosCredentialsManager() = default;
 
+// static
+void KerberosCredentialsManager::RegisterProfilePrefs(
+    PrefRegistrySimple* registry) {
+  registry->RegisterBooleanPref(prefs::kKerberosRememberPasswordEnabled, true);
+  registry->RegisterBooleanPref(prefs::kKerberosAddAccountsAllowed, true);
+  registry->RegisterDictionaryPref(prefs::kKerberosAccounts);
+}
+
+void KerberosCredentialsManager::RegisterLocalStatePrefs(
+    PrefRegistrySimple* registry) {
+  // Kerberos enabled is used by SystemNetworkContextManager, which reads prefs
+  // off of local state.
+  registry->RegisterBooleanPref(prefs::kKerberosEnabled, false);
+}
+
 void KerberosCredentialsManager::AddAccountAndAuthenticate(
     std::string principal_name,
     const std::string& password,
diff --git a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
index 56f7cc4d..430ef3d 100644
--- a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
+++ b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
@@ -12,6 +12,7 @@
 #include "chrome/browser/chromeos/authpolicy/kerberos_files_handler.h"
 #include "chromeos/dbus/kerberos/kerberos_service.pb.h"
 
+class PrefRegistrySimple;
 class Profile;
 
 namespace chromeos {
@@ -25,6 +26,12 @@
   explicit KerberosCredentialsManager(Profile* profile);
   ~KerberosCredentialsManager();
 
+  // Registers prefs stored in the user profile.
+  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
+  // Registers prefs stored in local state.
+  static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
+
   // Adds an account for the given |principal_name| and authenticates it using
   // the given |password|. Sets |principal_name| as active principal on success.
   void AddAccountAndAuthenticate(std::string principal_name,
diff --git a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
index a6bf35f..7760d2d 100644
--- a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
+++ b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
@@ -461,6 +461,11 @@
   testing_auto_enrollment_client_factory_ = auto_enrollment_client_factory;
 }
 
+void AutoEnrollmentController::FireSafeguardTimerForTesting() {
+  DCHECK(safeguard_timer_.IsRunning());
+  safeguard_timer_.FireNow();
+}
+
 AutoEnrollmentController::InitialEnrollmentRequirement
 AutoEnrollmentController::GetInitialEnrollmentRequirement() {
   system::StatisticsProvider* provider =
diff --git a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h
index daa643c8..9ff003bd 100644
--- a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h
+++ b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h
@@ -143,6 +143,8 @@
   void SetAutoEnrollmentClientFactoryForTesting(
       policy::AutoEnrollmentClient::Factory* auto_enrollment_client_factory);
 
+  void FireSafeguardTimerForTesting();
+
  private:
   class SystemClockSyncWaiter;
 
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc
index f6d4f44..77cc4d2a 100644
--- a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc
+++ b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
 #include "chrome/browser/policy/test/local_policy_test_server.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/attestation/mock_attestation_flow.h"
@@ -26,6 +27,8 @@
 #include "chromeos/cryptohome/async_method_caller.h"
 #include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/session_manager/fake_session_manager_client.h"
+#include "chromeos/system/fake_statistics_provider.h"
 #include "chromeos/tpm/install_attributes.h"
 #include "components/policy/core/common/policy_switches.h"
 #include "components/strings/grit/components_strings.h"
@@ -129,10 +132,62 @@
         ->GetStateKeysBroker();
   }
 
+  void FireSafeguardTimer() {
+    WizardController::default_controller()
+        ->GetAutoEnrollmentController()
+        ->FireSafeguardTimerForTesting();
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentLocalPolicyServer);
 };
 
+class AutoEnrollmentWithStatistics : public AutoEnrollmentLocalPolicyServer {
+ public:
+  AutoEnrollmentWithStatistics() : AutoEnrollmentLocalPolicyServer() {
+    // AutoEnrollmentController assumes that VPD is in valid state if
+    // "serial_number" or "Product_S/N" could be read from it.
+    fake_statistics_provider_.SetMachineStatistic("serial_number", "111111");
+  }
+
+  ~AutoEnrollmentWithStatistics() override = default;
+
+ protected:
+  void SetFRERequiredKey(const std::string& value) {
+    fake_statistics_provider_.SetMachineStatistic(system::kCheckEnrollmentKey,
+                                                  value);
+  }
+
+  void SetActivateDate(const std::string& value) {
+    fake_statistics_provider_.SetMachineStatistic(system::kActivateDateKey,
+                                                  value);
+  }
+
+  void SetVPDCorrupted() {
+    fake_statistics_provider_.ClearMachineStatistic("serial_number");
+  }
+
+ private:
+  system::ScopedFakeStatisticsProvider fake_statistics_provider_;
+  DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentWithStatistics);
+};
+
+class AutoEnrollmentNoStateKeys : public AutoEnrollmentWithStatistics {
+ public:
+  AutoEnrollmentNoStateKeys() = default;
+  ~AutoEnrollmentNoStateKeys() override = default;
+
+  // AutoEnrollmentWithStatistics:
+  void SetUpInProcessBrowserTestFixture() override {
+    AutoEnrollmentWithStatistics::SetUpInProcessBrowserTestFixture();
+    SessionManagerClient::InitializeFakeInMemory();
+    FakeSessionManagerClient::Get()->set_force_state_keys_missing(true);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentNoStateKeys);
+};
+
 // Simple manual enrollment.
 IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, ManualEnrollment) {
   TriggerEnrollmentAndSignInSuccessfully();
@@ -468,4 +523,81 @@
   EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged());
 }
 
+// FRE explicitly required in VPD, but the state keys are missing.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentNoStateKeys, FREExplicitlyRequired) {
+  SetFRERequiredKey("1");
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK).Wait();
+
+  // Chrome waits for state keys to be available, force a timeout.
+  FireSafeguardTimer();
+
+  OobeScreenWaiter(OobeScreen::SCREEN_ERROR_MESSAGE).Wait();
+  test::OobeJS().ExpectHasNoClass("allow-guest-signin", {"error-message"});
+}
+
+// FRE not explicitly required and the state keys are missing. Should proceed to
+// normal signin.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentNoStateKeys, FRENotRequired) {
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
+}
+
+// FRE explicitly not required in VPD, so it should not even contact the policy
+// server.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentWithStatistics, FREExplicitlyNotRequired) {
+  SetFRERequiredKey("0");
+
+  // Should be ignored.
+  EXPECT_TRUE(policy_server_.SetDeviceStateRetrievalResponse(
+      state_keys_broker(),
+      enterprise_management::DeviceStateRetrievalResponse::
+          RESTORE_MODE_REENROLLMENT_ENFORCED,
+      kTestDomain));
+
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
+}
+
+// FRE is not required when VPD is valid and activate date is not there.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentWithStatistics, MachineNotActivated) {
+  // Should be ignored.
+  EXPECT_TRUE(policy_server_.SetDeviceStateRetrievalResponse(
+      state_keys_broker(),
+      enterprise_management::DeviceStateRetrievalResponse::
+          RESTORE_MODE_REENROLLMENT_ENFORCED,
+      kTestDomain));
+
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
+}
+
+// FRE is required when VPD is valid and activate date is there.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentWithStatistics, MachineActivated) {
+  SetActivateDate("1970-01");
+
+  EXPECT_TRUE(policy_server_.SetDeviceStateRetrievalResponse(
+      state_keys_broker(),
+      enterprise_management::DeviceStateRetrievalResponse::
+          RESTORE_MODE_REENROLLMENT_ENFORCED,
+      kTestDomain));
+
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_ENROLLMENT).Wait();
+}
+
+// FRE is required when VPD in invalid state.
+IN_PROC_BROWSER_TEST_F(AutoEnrollmentWithStatistics, CorruptedVPD) {
+  SetVPDCorrupted();
+
+  EXPECT_TRUE(policy_server_.SetDeviceStateRetrievalResponse(
+      state_keys_broker(),
+      enterprise_management::DeviceStateRetrievalResponse::
+          RESTORE_MODE_REENROLLMENT_ENFORCED,
+      kTestDomain));
+
+  host()->StartWizard(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_ENROLLMENT).Wait();
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc
new file mode 100644
index 0000000..49456b1
--- /dev/null
+++ b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc
@@ -0,0 +1,118 @@
+// Copyright 2019 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/chromeos/login/saml/saml_password_expiry_notification.h"
+
+#include "ash/public/cpp/notification_utils.h"
+#include "base/bind.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_util.h"
+#include "chrome/browser/notifications/notification_common.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/notification_display_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/ash/chrome_new_window_client.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/public/cpp/notification.h"
+#include "ui/message_center/public/cpp/notification_delegate.h"
+
+using message_center::HandleNotificationClickDelegate;
+using message_center::Notification;
+using message_center::NotificationType;
+using message_center::NotifierId;
+using message_center::NotifierType;
+using message_center::RichNotificationData;
+using message_center::SystemNotificationWarningLevel;
+
+namespace chromeos {
+
+namespace {
+
+// Unique ID for this notification.
+const char kNotificationId[] = "saml.password-expiry-notification";
+
+// NotifierId for histogram reporting.
+const base::NoDestructor<NotifierId> kNotifierId(
+    message_center::NotifierType::SYSTEM_COMPONENT,
+    kNotificationId);
+
+// Simplest type of notification - has text but no other UI elements.
+const NotificationType kNotificationType =
+    message_center::NOTIFICATION_TYPE_SIMPLE;
+
+// Generic type for notifications that are not from web pages etc.
+const NotificationHandler::Type kNotificationHandlerType =
+    NotificationHandler::Type::TRANSIENT;
+
+// The icon to use for this notification - looks like an office building.
+const gfx::VectorIcon& kIcon = vector_icons::kBusinessIcon;
+
+// Warning level NORMAL means the notification heading is blue.
+const SystemNotificationWarningLevel kWarningLevel =
+    SystemNotificationWarningLevel::NORMAL;
+
+// Leaving this empty means the notification is attributed to the system -
+// ie "Chromium OS" or similar.
+const base::NoDestructor<base::string16> kDisplaySource;
+
+// These extra attributes aren't needed, so they are left empty.
+const base::NoDestructor<GURL> kOriginUrl;
+const base::NoDestructor<RichNotificationData> kRichNotificationData;
+
+// Line separator in the notification body.
+const base::NoDestructor<base::string16> kLineSeparator(
+    base::string16(1, '\n'));
+
+// Callback called when notification is clicked - opens password-change page.
+void OnNotificationClicked() {
+  ChromeNewWindowClient* client = ChromeNewWindowClient::Get();
+  if (client) {
+    client->NewTabWithUrl(GURL(chrome::kChromeUIPasswordChangeUrl),
+                          /*from_user_interaction=*/true);
+  }
+}
+
+const base::NoDestructor<scoped_refptr<HandleNotificationClickDelegate>>
+    kClickDelegate(base::MakeRefCounted<HandleNotificationClickDelegate>(
+        base::BindRepeating(&OnNotificationClicked)));
+
+base::string16 GetTitleText(int lessThanNDays) {
+  const bool hasExpired = (lessThanNDays <= 0);
+  return hasExpired ? l10n_util::GetStringUTF16(IDS_PASSWORD_HAS_EXPIRED_TITLE)
+                    : l10n_util::GetStringUTF16(IDS_PASSWORD_WILL_EXPIRE_TITLE);
+}
+
+base::string16 GetBodyText(int lessThanNDays) {
+  const std::vector<base::string16> body_lines = {
+      l10n_util::GetPluralStringFUTF16(IDS_PASSWORD_EXPIRY_DAYS_BODY,
+                                       std::max(lessThanNDays, 0)),
+      l10n_util::GetStringUTF16(IDS_PASSWORD_EXPIRY_CHOOSE_NEW_PASSWORD_LINK)};
+
+  return base::JoinString(body_lines, *kLineSeparator);
+}
+
+}  // namespace
+
+void ShowSamlPasswordExpiryNotification(Profile* profile, int lessThanNDays) {
+  const base::string16 title = GetTitleText(lessThanNDays);
+  const base::string16 body = GetBodyText(lessThanNDays);
+
+  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+      kNotificationType, kNotificationId, title, body, *kDisplaySource,
+      *kOriginUrl, *kNotifierId, *kRichNotificationData, *kClickDelegate, kIcon,
+      kWarningLevel);
+
+  NotificationDisplayServiceFactory::GetForProfile(profile)->Display(
+      kNotificationHandlerType, *notification, /*metadata=*/nullptr);
+}
+
+void DismissSamlPasswordExpiryNotification(Profile* profile) {
+  NotificationDisplayServiceFactory::GetForProfile(profile)->Close(
+      kNotificationHandlerType, kNotificationId);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.h b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.h
new file mode 100644
index 0000000..eeb13c6
--- /dev/null
+++ b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.h
@@ -0,0 +1,24 @@
+// Copyright 2019 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_CHROMEOS_LOGIN_SAML_SAML_PASSWORD_EXPIRY_NOTIFICATION_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_SAML_SAML_PASSWORD_EXPIRY_NOTIFICATION_H_
+
+class Profile;
+
+namespace chromeos {
+
+// Utility functions to show or hide a password expiry notification.
+
+// Shows a password expiry notification. |lessThanNDays| should be 1 if the
+// password expires in less than 1 day, 0 if it has already expired, etc.
+// Negative numbers are treated the same as zero.
+void ShowSamlPasswordExpiryNotification(Profile* profile, int lessThanNDays);
+
+// Hides the password expiry notification if it is currently shown.
+void DismissSamlPasswordExpiryNotification(Profile* profile);
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SAML_SAML_PASSWORD_EXPIRY_NOTIFICATION_H_
diff --git a/chrome/browser/chromeos/login/saml/saml_password_expiry_notification_unittest.cc b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification_unittest.cc
new file mode 100644
index 0000000..f293fbe
--- /dev/null
+++ b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification_unittest.cc
@@ -0,0 +1,69 @@
+// Copyright 2019 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/chromeos/login/saml/saml_password_expiry_notification.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/notifications/notification_display_service_impl.h"
+#include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using message_center::Notification;
+
+namespace chromeos {
+
+class SamlPasswordExpiryNotificationTest : public testing::Test {
+ public:
+  void SetUp() override {
+    display_service_tester_ =
+        std::make_unique<NotificationDisplayServiceTester>(&profile_);
+  }
+
+  void TearDown() override { display_service_tester_.reset(); }
+
+ protected:
+  base::Optional<Notification> Notification() {
+    return NotificationDisplayServiceTester::Get()->GetNotification(
+        "saml.password-expiry-notification");
+  }
+
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+
+  std::unique_ptr<NotificationDisplayServiceTester> display_service_tester_;
+};
+
+TEST_F(SamlPasswordExpiryNotificationTest, ShowAlreadyExpired) {
+  ShowSamlPasswordExpiryNotification(&profile_, 0);
+  ASSERT_TRUE(Notification().has_value());
+
+  EXPECT_EQ(base::ASCIIToUTF16("Password has expired"),
+            Notification()->title());
+  EXPECT_EQ(base::ASCIIToUTF16("Your current password has expired!\n"
+                               "Click here to choose a new password"),
+            Notification()->message());
+
+  DismissSamlPasswordExpiryNotification(&profile_);
+  EXPECT_FALSE(Notification().has_value());
+}
+
+TEST_F(SamlPasswordExpiryNotificationTest, ShowWillSoonExpire) {
+  ShowSamlPasswordExpiryNotification(&profile_, 14);
+  ASSERT_TRUE(Notification().has_value());
+
+  EXPECT_EQ(base::ASCIIToUTF16("Password will soon expire"),
+            Notification()->title());
+  EXPECT_EQ(base::ASCIIToUTF16(
+                "Your current password will expire in less than 14 days!\n"
+                "Click here to choose a new password"),
+            Notification()->message());
+
+  DismissSamlPasswordExpiryNotification(&profile_);
+  EXPECT_FALSE(Notification().has_value());
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index d9b71ab..db4f6f5 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -387,6 +387,7 @@
   FRIEND_TEST_ALL_PREFIXES(WizardControllerDeviceStateTest,
                            ControlFlowNoForcedReEnrollmentOnFirstBoot);
 
+  friend class AutoEnrollmentLocalPolicyServer;
   friend class WizardControllerBrokenLocalStateTest;
   friend class WizardControllerDeviceStateTest;
   friend class WizardControllerFlowTest;
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.cc b/chrome/browser/content_settings/tab_specific_content_settings.cc
index 2c514bc..f521d5f78 100644
--- a/chrome/browser/content_settings/tab_specific_content_settings.cc
+++ b/chrome/browser/content_settings/tab_specific_content_settings.cc
@@ -362,17 +362,32 @@
       << "Media stream settings handled by OnMediaStreamPermissionSet";
   bool access_changed = false;
   ContentSettingsStatus& status = content_settings_status_[type];
+
+  // Whether to reset status for the |blocked| setting to avoid ending up
+  // with both |allowed| and |blocked| set, which can mean multiple things
+  // (allowed setting that got disabled, disabled setting that got enabled).
+  bool must_reset_blocked_status = false;
+
+  // For sensors, the status with both allowed/blocked flags set means that
+  // access was previously allowed but the last decision was to block.
+  // Reset the blocked flag so that the UI will properly indicate that the
+  // last decision here instead was to allow sensor access.
+  if (type == CONTENT_SETTINGS_TYPE_SENSORS)
+    must_reset_blocked_status = true;
+
 #if defined(OS_ANDROID)
-  if (type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER &&
-      status.blocked) {
-    // content_settings_status_[type].allowed is always set to true in
-    // OnContentBlocked, so we have to use
-    // content_settings_status_[type].blocked to detect whether the protected
-    // media setting has changed.
+  // content_settings_status_[type].allowed is always set to true in
+  // OnContentBlocked, so we have to use
+  // content_settings_status_[type].blocked to detect whether the protected
+  // media setting has changed.
+  if (type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER)
+    must_reset_blocked_status = true;
+#endif
+
+  if (must_reset_blocked_status && status.blocked) {
     status.blocked = false;
     access_changed = true;
   }
-#endif
 
   if (!status.allowed) {
     status.allowed = true;
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
index f099438..69080a2 100644
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
+++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
@@ -13,6 +13,7 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/metrics/subprocess_metrics_provider.h"
@@ -121,6 +122,12 @@
 
 }  // namespace
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
+#define DISABLE_ON_WIN_MAC_CHROMEOS(x) DISABLED_##x
+#else
+#define DISABLE_ON_WIN_MAC_CHROMEOS(x) x
+#endif
+
 class DataReductionProxyBrowsertestBase : public InProcessBrowserTest {
  public:
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -165,6 +172,10 @@
     WaitForConfig();
   }
 
+  bool IsNetworkServiceEnabled() const {
+    return base::FeatureList::IsEnabled(network::features::kNetworkService);
+  }
+
  protected:
   void EnableDataSaver(bool enabled) {
     data_reduction_proxy::DataReductionProxySettings::
@@ -451,6 +462,55 @@
       1);
 }
 
+// Test that enabling the holdback disables the proxy.
+class DataReductionProxyWithHoldbackBrowsertest
+    : public ::testing::WithParamInterface<bool>,
+      public DataReductionProxyBrowsertest {
+ public:
+  void SetUp() override {
+    if (GetParam()) {
+      scoped_feature_list_.InitWithFeatures(
+          {features::kDataReductionProxyEnabledWithNetworkService,
+           data_reduction_proxy::features::kDataReductionProxyHoldback},
+          {});
+    } else {
+      scoped_feature_list_.InitWithFeatures(
+          {features::kDataReductionProxyEnabledWithNetworkService}, {});
+    }
+
+    InProcessBrowserTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(DataReductionProxyWithHoldbackBrowsertest,
+                       UpdateConfig) {
+  net::EmbeddedTestServer proxy_server;
+  proxy_server.RegisterRequestHandler(
+      base::BindRepeating(&BasicResponse, kPrimaryResponse));
+  ASSERT_TRUE(proxy_server.Start());
+
+  SetConfig(CreateConfigForServer(proxy_server));
+  // A network change forces the config to be fetched.
+  SimulateNetworkChange(network::mojom::ConnectionType::CONNECTION_3G);
+  WaitForConfig();
+
+  ui_test_utils::NavigateToURL(browser(), GURL("http://does.not.resolve/foo"));
+
+  if (GetParam()) {
+    EXPECT_NE(GetBody(), kPrimaryResponse);
+  } else {
+    EXPECT_EQ(GetBody(), kPrimaryResponse);
+  }
+}
+
+// Parameter is true if the data reduction proxy holdback should be enabled.
+INSTANTIATE_TEST_SUITE_P(,
+                         DataReductionProxyWithHoldbackBrowsertest,
+                         ::testing::Values(false, true));
+
 class DataReductionProxyBrowsertestWithNetworkService
     : public DataReductionProxyBrowsertest {
  public:
@@ -840,7 +900,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataReductionProxyFallbackBrowsertest,
-                       DISABLED_ProxyBlockedOnAuthError) {
+                       DISABLE_ON_WIN_MAC_CHROMEOS(ProxyBlockedOnAuthError)) {
+  if (!IsNetworkServiceEnabled())
+    return;
   base::HistogramTester histogram_tester;
   net::EmbeddedTestServer test_server;
   test_server.RegisterRequestHandler(
@@ -859,7 +921,9 @@
 // Tests that if using data reduction proxy results in redirect loop, then
 // the proxy is bypassed, and the request is fetched directly.
 IN_PROC_BROWSER_TEST_F(DataReductionProxyFallbackBrowsertest,
-                       DISABLED_RedirectCycle) {
+                       DISABLE_ON_WIN_MAC_CHROMEOS(RedirectCycle)) {
+  if (!IsNetworkServiceEnabled())
+    return;
   base::HistogramTester histogram_tester;
   net::EmbeddedTestServer test_server;
   test_server.RegisterRequestHandler(
@@ -977,7 +1041,7 @@
 
 class DataReductionProxyWarmupURLBrowsertest
     : public ::testing::WithParamInterface<
-          std::tuple<ProxyServer_ProxyScheme, bool>>,
+          std::tuple<ProxyServer_ProxyScheme, bool, bool>>,
       public DataReductionProxyBrowsertestBase {
  public:
   DataReductionProxyWarmupURLBrowsertest()
@@ -987,6 +1051,10 @@
         secondary_server_(GetTestServerType()) {}
 
   void SetUpOnMainThread() override {
+    if (!std::get<2>(GetParam())) {
+      scoped_feature_list_.InitAndDisableFeature(
+          features::kDataReductionProxyDisableProxyFailedWarmup);
+    }
     primary_server_loop_ = std::make_unique<base::RunLoop>();
     primary_server_.RegisterRequestHandler(base::BindRepeating(
         &DataReductionProxyWarmupURLBrowsertest::WaitForWarmupRequest,
@@ -1054,30 +1122,66 @@
   std::unique_ptr<net::test_server::HttpResponse> WaitForWarmupRequest(
       base::RunLoop* run_loop,
       const net::test_server::HttpRequest& request) {
+    auto response = std::make_unique<net::test_server::BasicHttpResponse>();
     if (base::StartsWith(request.relative_url, "/e2e_probe",
                          base::CompareCase::SENSITIVE)) {
       run_loop->Quit();
+      response->set_content("content");
+      response->AddCustomHeader("via", via_header_);
+    } else if (base::StartsWith(request.relative_url, "/echoheader",
+                                base::CompareCase::SENSITIVE)) {
+      const auto chrome_proxy_header = request.headers.find("chrome-proxy");
+      if (chrome_proxy_header != request.headers.end()) {
+        response->set_content(chrome_proxy_header->second);
+        response->AddCustomHeader("chrome-proxy", "ofcl=1000");
+      }
     }
-    auto response = std::make_unique<net::test_server::BasicHttpResponse>();
-    response->set_content("content");
-    response->AddCustomHeader("via", via_header_);
     return response;
   }
 
   const std::string via_header_;
   net::EmbeddedTestServer primary_server_;
   net::EmbeddedTestServer secondary_server_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_P(DataReductionProxyWarmupURLBrowsertest,
-                       WarmupURLsFetchedForEachProxy) {
+IN_PROC_BROWSER_TEST_P(
+    DataReductionProxyWarmupURLBrowsertest,
+    DISABLE_ON_WIN_MAC_CHROMEOS(WarmupURLsFetchedForEachProxy)) {
+  if (!IsNetworkServiceEnabled())
+    return;
+  net::EmbeddedTestServer test_server;
+  test_server.RegisterRequestHandler(
+      base::BindRepeating(&BasicResponse, kDummyBody));
+  ASSERT_TRUE(test_server.Start());
+
+  bool is_warmup_fetch_successful = std::get<1>(GetParam());
+  bool disallow_proxy_failed_warmup_feature_enabled = std::get<2>(GetParam());
   primary_server_loop_->Run();
 
   SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
   RetryForHistogramUntilCountReached(&histogram_tester_, GetHistogramName(), 1);
 
   histogram_tester_.ExpectUniqueSample(GetHistogramName(),
-                                       std::get<1>(GetParam()), 1);
+                                       is_warmup_fetch_successful, 1);
+
+  base::RunLoop().RunUntilIdle();
+
+  // Navigate to some URL to see if the proxy is only used when warmup URL fetch
+  // was successful.
+  ui_test_utils::NavigateToURL(
+      browser(), GetURLWithMockHost(test_server, "/echoheader?Chrome-Proxy"));
+  std::string body = GetBody();
+  if (is_warmup_fetch_successful) {
+    EXPECT_THAT(body, HasSubstr(kSessionKey));
+  } else {
+    if (disallow_proxy_failed_warmup_feature_enabled) {
+      EXPECT_THAT(body, kDummyBody);
+    } else {
+      // When the feature is disabled, the proxy is still being used
+      EXPECT_THAT(body, HasSubstr(kSessionKey));
+    }
+  }
 }
 
 // First parameter indicate proxy scheme for proxies that are being tested.
@@ -1086,9 +1190,13 @@
 INSTANTIATE_TEST_SUITE_P(
     ,
     DataReductionProxyWarmupURLBrowsertest,
-    ::testing::Combine(testing::Values(ProxyServer_ProxyScheme_HTTP,
-                                       ProxyServer_ProxyScheme_HTTPS),
-                       ::testing::Bool()));
+    ::testing::Combine(
+        testing::Values(ProxyServer_ProxyScheme_HTTP,
+                        ProxyServer_ProxyScheme_HTTPS),
+        ::testing::Bool(),  // is_warmup_fetch_successful
+        ::testing::Bool()   // kDataReductionProxyDisallowProxyFailedWarmup
+                            // active
+        ));
 
 // Threadsafe log for recording a sequence of events as newline separated text.
 class EventLog {
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 63fa2ee..c9fec22d 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -1320,8 +1320,7 @@
   auto make_browser_request = [this](const GURL& url) {
     auto request = std::make_unique<network::ResourceRequest>();
     request->url = url;
-    request->resource_type =
-        static_cast<int>(content::ResourceType::kSubResource);
+    request->resource_type = content::ResourceType::kSubResource;
 
     auto* url_loader_factory =
         content::BrowserContext::GetDefaultStoragePartition(profile())
diff --git a/chrome/browser/extensions/extension_protocols_unittest.cc b/chrome/browser/extensions/extension_protocols_unittest.cc
index 7a259c1..81280cc 100644
--- a/chrome/browser/extensions/extension_protocols_unittest.cc
+++ b/chrome/browser/extensions/extension_protocols_unittest.cc
@@ -142,7 +142,7 @@
   request.request_initiator =
       url::Origin::Create(url);  // ensure initiator set.
   request.referrer_policy = content::Referrer::GetDefaultReferrerPolicy();
-  request.resource_type = static_cast<int>(resource_type);
+  request.resource_type = resource_type;
   request.is_main_frame = resource_type == content::ResourceType::kMainFrame;
   request.allow_download = true;
   return request;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 32d91c0..a1c3e5b 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -543,11 +543,6 @@
     "expiry_milestone": 76
   },
   {
-    "name": "disable-mtp-write-support",
-    // "owners": [ "your-team" ],
-    "expiry_milestone": 76
-  },
-  {
     "name": "disable-office-editing-component-app",
     // "owners": [ "your-team" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index cadbf0dc..5e65f8b 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3219,11 +3219,6 @@
 const char kAggressiveThresholds[] =
     "Aggressive tab and cache release strategy";
 
-const char kMtpWriteSupportName[] = "MTP write support";
-const char kMtpWriteSupportDescription[] =
-    "MTP write support in File System API (and file manager). In-place editing "
-    "operations are not supported.";
-
 const char kNetworkPortalNotificationName[] =
     "Notifications about captive portals";
 const char kNetworkPortalNotificationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 2b4caf4a6..29a17eb 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1948,9 +1948,6 @@
 extern const char kMojoImfName[];
 extern const char kMojoImfDescription[];
 
-extern const char kMtpWriteSupportName[];
-extern const char kMtpWriteSupportDescription[];
-
 extern const char kNetworkPortalNotificationName[];
 extern const char kNetworkPortalNotificationDescription[];
 
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index 93e9880..b93de67e 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -132,7 +132,7 @@
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied() override {
-    return service()->GetSyncTokenStatus().connection_status ==
+    return service()->GetSyncTokenStatusForDebugging().connection_status ==
            syncer::CONNECTION_OK;
   }
 
diff --git a/chrome/browser/offline_pages/offline_page_url_loader.cc b/chrome/browser/offline_pages/offline_page_url_loader.cc
index 4d2a9e7..81e8801 100644
--- a/chrome/browser/offline_pages/offline_page_url_loader.cc
+++ b/chrome/browser/offline_pages/offline_page_url_loader.cc
@@ -46,8 +46,7 @@
 
 bool ShouldCreateLoader(const network::ResourceRequest& resource_request) {
   // Ignore the requests not for the main frame.
-  if (resource_request.resource_type !=
-      static_cast<int>(content::ResourceType::kMainFrame))
+  if (resource_request.resource_type != content::ResourceType::kMainFrame)
     return false;
 
   // Ignore non-http/https requests.
diff --git a/chrome/browser/password_manager/password_accessory_metrics_util.h b/chrome/browser/password_manager/password_accessory_metrics_util.h
index e65267e..3158995f 100644
--- a/chrome/browser/password_manager/password_accessory_metrics_util.h
+++ b/chrome/browser/password_manager/password_accessory_metrics_util.h
@@ -11,8 +11,7 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused. Must be kept in sync with the enum
 // in enums.xml. A java IntDef@ is generated from this.
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class AccessoryBarContents {
   NO_CONTENTS = 0,   // Increased if none of the other buckets increases.
   ANY_CONTENTS = 1,  // Increased if least one of the other buckets increases.
@@ -26,8 +25,7 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused. Must be kept in sync with the enum
 // in enums.xml. A java IntDef@ is generated from this.
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class AccessorySheetTrigger {
   ANY_CLOSE = 0,     // Increased for every closure - manual or not.
   MANUAL_CLOSE = 1,  // Increased for every user-triggered closure.
@@ -39,8 +37,7 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused. Must be kept in sync with the enum
 // in enums.xml. A java IntDef@ is generated from this.
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class AccessoryTabType {
   ALL = 0,
   PASSWORDS = 1,
@@ -52,8 +49,7 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused. Must be kept in sync with the enum
 // in enums.xml. A java IntDef@ is generated from this.
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class AccessoryAction {
   GENERATE_PASSWORD_AUTOMATIC = 0,
   MANAGE_PASSWORDS = 1,
@@ -65,8 +61,7 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused. Must be kept in sync with the enum
 // in enums.xml. A java IntDef@ is generated from this.
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class AccessorySuggestionType {
   USERNAME = 0,
   PASSWORD = 1,
diff --git a/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc b/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
index 519d355..e0a2801 100644
--- a/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
+++ b/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
@@ -12,13 +12,19 @@
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/performance_manager.h"
 #include "chrome/browser/performance_manager/render_process_user_data.h"
+#include "content/public/browser/render_process_host.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 
 namespace {
 
 void BindProcessNode(
-    content::RenderProcessHost* render_process_host,
+    int render_process_host_id,
     resource_coordinator::mojom::ProcessCoordinationUnitRequest request) {
+  content::RenderProcessHost* render_process_host =
+      content::RenderProcessHost::FromID(render_process_host_id);
+  if (!render_process_host)
+    return;
+
   performance_manager::RenderProcessUserData* user_data =
       performance_manager::RenderProcessUserData::GetForRenderProcessHost(
           render_process_host);
@@ -47,8 +53,7 @@
         blink::AssociatedInterfaceRegistry* associated_registry,
         content::RenderProcessHost* render_process_host) {
   registry->AddInterface(
-      base::BindRepeating(&BindProcessNode,
-                          base::Unretained(render_process_host)),
+      base::BindRepeating(&BindProcessNode, render_process_host->GetID()),
       base::SequencedTaskRunnerHandle::Get());
 
   // Ideally this would strictly be a "CreateForRenderProcess", but when a
diff --git a/chrome/browser/permissions/chooser_context_base.cc b/chrome/browser/permissions/chooser_context_base.cc
index 5d3a831..b4b593c 100644
--- a/chrome/browser/permissions/chooser_context_base.cc
+++ b/chrome/browser/permissions/chooser_context_base.cc
@@ -79,7 +79,7 @@
 
   content_settings::SettingInfo info;
   base::Value setting =
-      GetWebsiteSetting(requesting_origin_url, embedding_origin_url, &info);
+      GetWebsiteSetting(requesting_origin, embedding_origin, &info);
 
   base::Value* objects = setting.FindListKey(kObjectListKey);
   if (!objects)
@@ -116,7 +116,7 @@
 
     content_settings::SettingInfo info;
     base::Value setting =
-        GetWebsiteSetting(requesting_origin_url, embedding_origin_url, &info);
+        GetWebsiteSetting(requesting_origin, embedding_origin, &info);
     base::Value* objects = setting.FindListKey(kObjectListKey);
     if (!objects)
       continue;
@@ -135,11 +135,10 @@
   return results;
 }
 
-void ChooserContextBase::GrantObjectPermission(const GURL& requesting_origin,
-                                               const GURL& embedding_origin,
-                                               base::Value object) {
-  DCHECK_EQ(requesting_origin, requesting_origin.GetOrigin());
-  DCHECK_EQ(embedding_origin, embedding_origin.GetOrigin());
+void ChooserContextBase::GrantObjectPermission(
+    const url::Origin& requesting_origin,
+    const url::Origin& embedding_origin,
+    base::Value object) {
   DCHECK(IsValidObject(object));
 
   base::Value setting =
@@ -158,11 +157,14 @@
   NotifyPermissionChanged();
 }
 
-void ChooserContextBase::RevokeObjectPermission(const GURL& requesting_origin,
-                                                const GURL& embedding_origin,
-                                                const base::Value& object) {
-  DCHECK_EQ(requesting_origin, requesting_origin.GetOrigin());
-  DCHECK_EQ(embedding_origin, embedding_origin.GetOrigin());
+void ChooserContextBase::RevokeObjectPermission(
+    const GURL& requesting_origin_url,
+    const GURL& embedding_origin_url,
+    const base::Value& object) {
+  const auto requesting_origin = url::Origin::Create(requesting_origin_url);
+  DCHECK_EQ(requesting_origin_url, requesting_origin.GetURL());
+  const auto embedding_origin = url::Origin::Create(embedding_origin_url);
+  DCHECK_EQ(embedding_origin_url, embedding_origin.GetURL());
   DCHECK(IsValidObject(object));
 
   base::Value setting =
@@ -177,7 +179,7 @@
     objects->GetList().erase(it);
 
   SetWebsiteSetting(requesting_origin, embedding_origin, std::move(setting));
-  NotifyPermissionRevoked(requesting_origin, embedding_origin);
+  NotifyPermissionRevoked(requesting_origin_url, embedding_origin_url);
 }
 
 void ChooserContextBase::NotifyPermissionChanged() {
@@ -197,22 +199,23 @@
 }
 
 base::Value ChooserContextBase::GetWebsiteSetting(
-    const GURL& requesting_origin,
-    const GURL& embedding_origin,
+    const url::Origin& requesting_origin,
+    const url::Origin& embedding_origin,
     content_settings::SettingInfo* info) {
   std::unique_ptr<base::Value> value =
       host_content_settings_map_->GetWebsiteSetting(
-          requesting_origin, embedding_origin, data_content_settings_type_,
-          std::string(), info);
+          requesting_origin.GetURL(), embedding_origin.GetURL(),
+          data_content_settings_type_, std::string(), info);
   if (value)
     return base::Value::FromUniquePtrValue(std::move(value));
   return base::Value(base::Value::Type::DICTIONARY);
 }
 
-void ChooserContextBase::SetWebsiteSetting(const GURL& requesting_origin,
-                                           const GURL& embedding_origin,
+void ChooserContextBase::SetWebsiteSetting(const url::Origin& requesting_origin,
+                                           const url::Origin& embedding_origin,
                                            base::Value value) {
   host_content_settings_map_->SetWebsiteSettingDefaultScope(
-      requesting_origin, embedding_origin, data_content_settings_type_,
-      std::string(), base::Value::ToUniquePtrValue(std::move(value)));
+      requesting_origin.GetURL(), embedding_origin.GetURL(),
+      data_content_settings_type_, std::string(),
+      base::Value::ToUniquePtrValue(std::move(value)));
 }
diff --git a/chrome/browser/permissions/chooser_context_base.h b/chrome/browser/permissions/chooser_context_base.h
index 098caf2..d0ff821f 100644
--- a/chrome/browser/permissions/chooser_context_base.h
+++ b/chrome/browser/permissions/chooser_context_base.h
@@ -93,8 +93,8 @@
 
   // Grants |requesting_origin| access to |object| when embedded within
   // |embedding_origin| by writing it into |host_content_settings_map_|.
-  void GrantObjectPermission(const GURL& requesting_origin,
-                             const GURL& embedding_origin,
+  void GrantObjectPermission(const url::Origin& requesting_origin,
+                             const url::Origin& embedding_origin,
                              base::Value object);
 
   // Revokes |requesting_origin|'s permission to access |object| when embedded
@@ -121,11 +121,11 @@
   base::ObserverList<PermissionObserver> permission_observer_list_;
 
  private:
-  base::Value GetWebsiteSetting(const GURL& requesting_origin,
-                                const GURL& embedding_origin,
+  base::Value GetWebsiteSetting(const url::Origin& requesting_origin,
+                                const url::Origin& embedding_origin,
                                 content_settings::SettingInfo* info);
-  void SetWebsiteSetting(const GURL& requesting_origin,
-                         const GURL& embedding_origin,
+  void SetWebsiteSetting(const url::Origin& requesting_origin,
+                         const url::Origin& embedding_origin,
                          base::Value value);
 
   HostContentSettingsMap* const host_content_settings_map_;
diff --git a/chrome/browser/permissions/chooser_context_base_unittest.cc b/chrome/browser/permissions/chooser_context_base_unittest.cc
index 89a396c..291baf3 100644
--- a/chrome/browser/permissions/chooser_context_base_unittest.cc
+++ b/chrome/browser/permissions/chooser_context_base_unittest.cc
@@ -37,8 +37,10 @@
 class ChooserContextBaseTest : public testing::Test {
  public:
   ChooserContextBaseTest()
-      : origin1_("https://google.com"),
-        origin2_("https://chromium.org"),
+      : url1_("https://google.com"),
+        url2_("https://chromium.org"),
+        origin1_(url::Origin::Create(url1_)),
+        origin2_(url::Origin::Create(url2_)),
         object1_(base::Value::Type::DICTIONARY),
         object2_(base::Value::Type::DICTIONARY) {
     object1_.SetStringKey(kRequiredKey1, "value1");
@@ -56,8 +58,10 @@
   TestingProfile profile_;
 
  protected:
-  GURL origin1_;
-  GURL origin2_;
+  const GURL url1_;
+  const GURL url2_;
+  const url::Origin origin1_;
+  const url::Origin origin2_;
   base::Value object1_;
   base::Value object2_;
 };
@@ -72,24 +76,24 @@
   context.GrantObjectPermission(origin1_, origin1_, object2_.Clone());
 
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects =
-      context.GetGrantedObjects(origin1_, origin1_);
+      context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(2u, objects.size());
   EXPECT_EQ(object1_, objects[0]->value);
   EXPECT_EQ(object2_, objects[1]->value);
 
   // Granting permission to one origin should not grant them to another.
-  objects = context.GetGrantedObjects(origin2_, origin2_);
+  objects = context.GetGrantedObjects(url2_, url2_);
   EXPECT_EQ(0u, objects.size());
 
   // Nor when the original origin is embedded in another.
-  objects = context.GetGrantedObjects(origin1_, origin2_);
+  objects = context.GetGrantedObjects(url1_, url2_);
   EXPECT_EQ(0u, objects.size());
 
   EXPECT_CALL(mock_observer, OnChooserObjectPermissionChanged(_, _)).Times(2);
-  EXPECT_CALL(mock_observer, OnPermissionRevoked(origin1_, origin1_)).Times(2);
-  context.RevokeObjectPermission(origin1_, origin1_, object1_);
-  context.RevokeObjectPermission(origin1_, origin1_, object2_);
-  objects = context.GetGrantedObjects(origin1_, origin1_);
+  EXPECT_CALL(mock_observer, OnPermissionRevoked(url1_, url1_)).Times(2);
+  context.RevokeObjectPermission(url1_, url1_, object1_);
+  context.RevokeObjectPermission(url1_, url1_, object2_);
+  objects = context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(0u, objects.size());
 }
 
@@ -103,14 +107,14 @@
   context.GrantObjectPermission(origin1_, origin1_, object1_.Clone());
 
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects =
-      context.GetGrantedObjects(origin1_, origin1_);
+      context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(1u, objects.size());
   EXPECT_EQ(object1_, objects[0]->value);
 
   EXPECT_CALL(mock_observer, OnChooserObjectPermissionChanged(_, _));
-  EXPECT_CALL(mock_observer, OnPermissionRevoked(origin1_, origin1_));
-  context.RevokeObjectPermission(origin1_, origin1_, object1_);
-  objects = context.GetGrantedObjects(origin1_, origin1_);
+  EXPECT_CALL(mock_observer, OnPermissionRevoked(url1_, url1_));
+  context.RevokeObjectPermission(url1_, url1_, object1_);
+  objects = context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(0u, objects.size());
 }
 
@@ -123,16 +127,16 @@
   context.GrantObjectPermission(origin1_, origin2_, object1_.Clone());
 
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects =
-      context.GetGrantedObjects(origin1_, origin2_);
+      context.GetGrantedObjects(url1_, url2_);
   EXPECT_EQ(1u, objects.size());
   EXPECT_EQ(object1_, objects[0]->value);
 
   // The embedding origin still does not have permission.
-  objects = context.GetGrantedObjects(origin2_, origin2_);
+  objects = context.GetGrantedObjects(url2_, url2_);
   EXPECT_EQ(0u, objects.size());
 
   // The requesting origin also doesn't have permission when not embedded.
-  objects = context.GetGrantedObjects(origin1_, origin1_);
+  objects = context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(0u, objects.size());
 }
 
@@ -151,14 +155,14 @@
   bool found_one = false;
   bool found_two = false;
   for (const auto& object : objects) {
-    if (object->requesting_origin == origin1_) {
+    if (object->requesting_origin == url1_) {
       EXPECT_FALSE(found_one);
-      EXPECT_EQ(origin1_, object->embedding_origin);
+      EXPECT_EQ(url1_, object->embedding_origin);
       EXPECT_EQ(object1_, objects[0]->value);
       found_one = true;
-    } else if (object->requesting_origin == origin2_) {
+    } else if (object->requesting_origin == url2_) {
       EXPECT_FALSE(found_two);
-      EXPECT_EQ(origin2_, object->embedding_origin);
+      EXPECT_EQ(url2_, object->embedding_origin);
       EXPECT_EQ(object2_, objects[1]->value);
       found_two = true;
     } else {
@@ -171,7 +175,7 @@
 
 TEST_F(ChooserContextBaseTest, GetGrantedObjectsWithGuardBlocked) {
   auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
-  map->SetContentSettingDefaultScope(origin1_, origin1_,
+  map->SetContentSettingDefaultScope(url1_, url1_,
                                      CONTENT_SETTINGS_TYPE_USB_GUARD,
                                      std::string(), CONTENT_SETTING_BLOCK);
 
@@ -184,18 +188,18 @@
   context.GrantObjectPermission(origin2_, origin2_, object2_.Clone());
 
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects1 =
-      context.GetGrantedObjects(origin1_, origin1_);
+      context.GetGrantedObjects(url1_, url1_);
   EXPECT_EQ(0u, objects1.size());
 
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects2 =
-      context.GetGrantedObjects(origin2_, origin2_);
+      context.GetGrantedObjects(url2_, url2_);
   ASSERT_EQ(1u, objects2.size());
   EXPECT_EQ(object2_, objects2[0]->value);
 }
 
 TEST_F(ChooserContextBaseTest, GetAllGrantedObjectsWithGuardBlocked) {
   auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
-  map->SetContentSettingDefaultScope(origin1_, origin1_,
+  map->SetContentSettingDefaultScope(url1_, url1_,
                                      CONTENT_SETTINGS_TYPE_USB_GUARD,
                                      std::string(), CONTENT_SETTING_BLOCK);
 
@@ -210,7 +214,7 @@
   std::vector<std::unique_ptr<ChooserContextBase::Object>> objects =
       context.GetAllGrantedObjects();
   ASSERT_EQ(1u, objects.size());
-  EXPECT_EQ(origin2_, objects[0]->requesting_origin);
-  EXPECT_EQ(origin2_, objects[0]->embedding_origin);
+  EXPECT_EQ(url2_, objects[0]->requesting_origin);
+  EXPECT_EQ(url2_, objects[0]->embedding_origin);
   EXPECT_EQ(object2_, objects[0]->value);
 }
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
index aa9c0ab..5332c08 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
@@ -24,7 +24,7 @@
 PluginResponseInterceptorURLLoaderThrottle::
     PluginResponseInterceptorURLLoaderThrottle(
         content::ResourceContext* resource_context,
-        int resource_type,
+        content::ResourceType resource_type,
         int frame_tree_node_id)
     : resource_context_(resource_context),
       resource_type_(resource_type),
@@ -108,8 +108,7 @@
   transferrable_loader->head = std::move(deep_copied_response->head);
   transferrable_loader->head.intercepted_by_plugin = true;
 
-  bool embedded =
-      resource_type_ != static_cast<int>(content::ResourceType::kMainFrame);
+  bool embedded = resource_type_ != content::ResourceType::kMainFrame;
   base::PostTaskWithTraits(
       FROM_HERE, {content::BrowserThread::UI},
       base::BindOnce(
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
index 897f8e4..b668bfe9 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "content/public/common/resource_type.h"
 #include "content/public/common/url_loader_throttle.h"
 
 namespace content {
@@ -27,7 +28,7 @@
  public:
   PluginResponseInterceptorURLLoaderThrottle(
       content::ResourceContext* resource_context,
-      int resource_type,
+      content::ResourceType resource_type,
       int frame_tree_node_id);
   ~PluginResponseInterceptorURLLoaderThrottle() override;
 
@@ -38,7 +39,7 @@
                            bool* defer) override;
 
   content::ResourceContext* const resource_context_;
-  const int resource_type_;
+  const content::ResourceType resource_type_;
   const int frame_tree_node_id_;
 
   DISALLOW_COPY_AND_ASSIGN(PluginResponseInterceptorURLLoaderThrottle);
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index ae7e585..7245f40a 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -609,16 +609,16 @@
     ash::prefs::kAccessibilityVirtualKeyboardEnabled,
     base::Value::Type::BOOLEAN },
   { key::kDeviceLoginScreenDefaultLargeCursorEnabled,
-    NULL,
+    nullptr,
     base::Value::Type::BOOLEAN },
   { key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
-    NULL,
+    nullptr,
     base::Value::Type::BOOLEAN },
   { key::kDeviceLoginScreenDefaultHighContrastEnabled,
-    NULL,
+    nullptr,
     base::Value::Type::BOOLEAN },
   { key::kDeviceLoginScreenDefaultVirtualKeyboardEnabled,
-    NULL,
+    nullptr,
     base::Value::Type::BOOLEAN },
   { key::kRebootAfterUpdate,
     prefs::kRebootAfterUpdate,
@@ -761,6 +761,15 @@
   { key::kDeviceUsbPowerShareEnabled,
     ash::prefs::kUsbPowerShareEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kKerberosEnabled,
+    prefs::kKerberosEnabled,
+    base::Value::Type::BOOLEAN },
+  { key::kKerberosRememberPasswordEnabled,
+    prefs::kKerberosRememberPasswordEnabled,
+    base::Value::Type::BOOLEAN },
+  { key::kKerberosAddAccountsAllowed,
+    prefs::kKerberosAddAccountsAllowed,
+    base::Value::Type::BOOLEAN },
 #endif  // defined(OS_CHROMEOS)
 
 // Metrics reporting is controlled by a platform specific policy for ChromeOS
@@ -1103,6 +1112,8 @@
   handlers->AddHandler(std::make_unique<ProxyPolicyHandler>());
   handlers->AddHandler(std::make_unique<URLBlacklistPolicyHandler>());
 
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
       key::kCertificateTransparencyEnforcementDisabledForUrls,
       certificate_transparency::prefs::kCTExcludedHosts, chrome_schema,
@@ -1140,8 +1151,8 @@
           key::kUnsafelyTreatInsecureOriginAsSecure, chrome_schema));
   handlers->AddHandler(std::make_unique<LegacyPoliciesDeprecatingPolicyHandler>(
       std::move(secure_origin_legacy_policy),
-      base::WrapUnique(new SecureOriginPolicyHandler(
-          key::kOverrideSecurityRestrictionsOnInsecureOrigin, chrome_schema))));
+      std::make_unique<SecureOriginPolicyHandler>(
+          key::kOverrideSecurityRestrictionsOnInsecureOrigin, chrome_schema)));
 #endif  // defined(OS_CHROMEOS) || defined(OS_ANDROID)
 
   handlers->AddHandler(std::make_unique<DeveloperToolsPolicyHandler>());
@@ -1192,6 +1203,8 @@
   handlers->AddHandler(
       std::make_unique<extensions::ExtensionSettingsPolicyHandler>(
           chrome_schema));
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
       key::kWebAppInstallForceList, prefs::kWebAppInstallForceList,
       chrome_schema, SCHEMA_STRICT,
@@ -1217,6 +1230,8 @@
   handlers->AddHandler(std::make_unique<DownloadDirPolicyHandler>());
   handlers->AddHandler(std::make_unique<LocalSyncPolicyHandler>());
 
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
       key::kRegisteredProtocolHandlers,
       prefs::kPolicyRegisteredProtocolHandlers, chrome_schema, SCHEMA_STRICT,
@@ -1230,14 +1245,16 @@
       key::kSafeBrowsingExtendedReportingOptInAllowed,
       prefs::kSafeBrowsingExtendedReportingOptInAllowed,
       base::Value::Type::BOOLEAN));
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   handlers->AddHandler(std::make_unique<LegacyPoliciesDeprecatingPolicyHandler>(
       std::move(sber_legacy_policy),
-      base::WrapUnique(new SimpleSchemaValidatingPolicyHandler(
+      std::make_unique<SimpleSchemaValidatingPolicyHandler>(
           key::kSafeBrowsingExtendedReportingEnabled,
           prefs::kSafeBrowsingScoutReportingEnabled, chrome_schema,
           SCHEMA_STRICT,
           SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
-          SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED))));
+          SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED)));
 
   // Handlers for policies with embedded JSON strings. These handlers are very
   // lenient - as long as the root value is of the right type, they only display
@@ -1372,9 +1389,9 @@
       ash::prefs::kPowerUserActivityScreenDimDelayFactor, 100, INT_MAX, true));
   handlers->AddHandler(std::make_unique<IntRangePolicyHandler>(
       key::kUptimeLimit, prefs::kUptimeLimit, 3600, INT_MAX, true));
-  handlers->AddHandler(base::WrapUnique(new IntRangePolicyHandler(
+  handlers->AddHandler(std::make_unique<IntRangePolicyHandler>(
       key::kDeviceLoginScreenDefaultScreenMagnifierType, nullptr,
-      chromeos::MAGNIFIER_DISABLED, chromeos::MAGNIFIER_FULL, false)));
+      chromeos::MAGNIFIER_DISABLED, chromeos::MAGNIFIER_FULL, false));
   // TODO(binjin): Remove LegacyPoliciesDeprecatingPolicyHandler for these two
   // policies once deprecation of legacy power management policies is done.
   // http://crbug.com/346229
@@ -1384,7 +1401,7 @@
           new PowerManagementIdleSettingsPolicyHandler(chrome_schema))));
   handlers->AddHandler(std::make_unique<LegacyPoliciesDeprecatingPolicyHandler>(
       std::move(screen_lock_legacy_policies),
-      base::WrapUnique(new ScreenLockDelayPolicyHandler(chrome_schema))));
+      std::make_unique<ScreenLockDelayPolicyHandler>(chrome_schema)));
   handlers->AddHandler(
       std::make_unique<ScreenBrightnessPercentPolicyHandler>(chrome_schema));
   handlers->AddHandler(
@@ -1397,19 +1414,23 @@
       key::kNativePrintersBulkConfiguration));
   handlers->AddHandler(std::make_unique<ExternalDataPolicyHandler>(
       key::kDeviceWilcoDtcConfiguration));
-  handlers->AddHandler(base::WrapUnique(new SimpleSchemaValidatingPolicyHandler(
-      key::kSessionLocales, NULL, chrome_schema, SCHEMA_STRICT,
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
+  handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
+      key::kSessionLocales, nullptr, chrome_schema, SCHEMA_STRICT,
       SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
-      SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED)));
+      SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED));
   handlers->AddHandler(
       std::make_unique<chromeos::KeyPermissionsPolicyHandler>(chrome_schema));
-  handlers->AddHandler(base::WrapUnique(new DefaultGeolocationPolicyHandler()));
+  handlers->AddHandler(std::make_unique<DefaultGeolocationPolicyHandler>());
   handlers->AddHandler(std::make_unique<extensions::ExtensionListPolicyHandler>(
       key::kNoteTakingAppsLockScreenWhitelist,
       prefs::kNoteTakingAppsLockScreenWhitelist, false /*allow_wildcards*/));
   handlers->AddHandler(
       std::make_unique<SecondaryGoogleAccountSigninPolicyHandler>());
   if (base::FeatureList::IsEnabled(features::kUsageTimeLimitPolicy)) {
+    // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+    // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
     handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
         key::kUsageTimeLimit, prefs::kUsageTimeLimit, chrome_schema,
         SCHEMA_STRICT,
@@ -1434,6 +1455,8 @@
   handlers->AddHandler(std::make_unique<PrintingDuplexDefaultPolicyHandler>());
   handlers->AddHandler(std::make_unique<PrintingPinDefaultPolicyHandler>());
   handlers->AddHandler(std::make_unique<PrintingSizeDefaultPolicyHandler>());
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
       key::kNetworkFileSharesPreconfiguredShares,
       prefs::kNetworkFileSharesPreconfiguredShares, chrome_schema,
@@ -1447,6 +1470,11 @@
       SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
   handlers->AddHandler(
       std::make_unique<EcryptfsMigrationStrategyPolicyHandler>());
+  handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
+      key::kKerberosAccounts, prefs::kKerberosAccounts, chrome_schema,
+      SCHEMA_ALLOW_UNKNOWN,
+      SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
+      SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
 #endif  // defined(OS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_PLUGINS)
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 777b4d3..73b10de 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -161,6 +161,7 @@
 #include "extensions/browser/extension_prefs.h"
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/crostini/crostini_share_path.h"
+#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_service.h"
 #include "chrome/browser/chromeos/settings/stats_reporting_controller.h"
 #include "chrome/browser/component_updater/metadata_table_chromeos.h"
@@ -572,6 +573,7 @@
   chromeos::EnableDebuggingScreenHandler::RegisterPrefs(registry);
   chromeos::FastTransitionObserver::RegisterPrefs(registry);
   chromeos::HIDDetectionScreenHandler::RegisterPrefs(registry);
+  chromeos::KerberosCredentialsManager::RegisterLocalStatePrefs(registry);
   chromeos::KioskAppManager::RegisterPrefs(registry);
   chromeos::language_prefs::RegisterPrefs(registry);
   chromeos::MultiProfileUserController::RegisterPrefs(registry);
@@ -803,6 +805,7 @@
   chromeos::CupsPrintersManager::RegisterProfilePrefs(registry);
   chromeos::first_run::RegisterProfilePrefs(registry);
   chromeos::file_system_provider::RegisterProfilePrefs(registry);
+  chromeos::KerberosCredentialsManager::RegisterProfilePrefs(registry);
   chromeos::KeyPermissions::RegisterProfilePrefs(registry);
   chromeos::multidevice_setup::MultiDeviceSetupService::RegisterProfilePrefs(
       registry);
diff --git a/chrome/browser/previews/previews_lite_page_url_loader_interceptor.cc b/chrome/browser/previews/previews_lite_page_url_loader_interceptor.cc
index 5d5126b..dddf43e 100644
--- a/chrome/browser/previews/previews_lite_page_url_loader_interceptor.cc
+++ b/chrome/browser/previews/previews_lite_page_url_loader_interceptor.cc
@@ -36,8 +36,7 @@
   if (!(resource_request.previews_state & content::LITE_PAGE_REDIRECT_ON))
     return false;
 
-  DCHECK_EQ(resource_request.resource_type,
-            static_cast<int>(content::ResourceType::kMainFrame));
+  DCHECK_EQ(resource_request.resource_type, content::ResourceType::kMainFrame);
   DCHECK(resource_request.url.SchemeIsHTTPOrHTTPS());
   DCHECK_EQ(resource_request.method, "GET");
 
diff --git a/chrome/browser/previews/previews_lite_page_url_loader_interceptor_unittest.cc b/chrome/browser/previews/previews_lite_page_url_loader_interceptor_unittest.cc
index 63810137c..4265e8b 100644
--- a/chrome/browser/previews/previews_lite_page_url_loader_interceptor_unittest.cc
+++ b/chrome/browser/previews/previews_lite_page_url_loader_interceptor_unittest.cc
@@ -85,7 +85,7 @@
 
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.method = "GET";
 
   SetFakeResponse(
@@ -133,7 +133,7 @@
   base::HistogramTester histogram_tester;
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.method = "GET";
   request.previews_state = content::LITE_PAGE_REDIRECT_ON;
   SetFakeResponse(
@@ -158,7 +158,7 @@
   base::HistogramTester histogram_tester;
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.method = "GET";
   request.previews_state = content::LITE_PAGE_REDIRECT_ON;
   SetFakeResponse(
@@ -184,7 +184,7 @@
   base::HistogramTester histogram_tester;
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.method = "GET";
   request.previews_state = content::LITE_PAGE_REDIRECT_ON;
   SetFakeResponse(
@@ -208,7 +208,7 @@
   base::HistogramTester histogram_tester;
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.method = "GET";
   request.previews_state = content::LITE_PAGE_REDIRECT_ON;
   SetFakeResponse(
diff --git a/chrome/browser/resources/chromeos/camera/src/css/main.css b/chrome/browser/resources/chromeos/camera/src/css/main.css
index 6716e21..b852569d 100644
--- a/chrome/browser/resources/chromeos/camera/src/css/main.css
+++ b/chrome/browser/resources/chromeos/camera/src/css/main.css
@@ -235,13 +235,13 @@
 }
 
 label.mode-item>span {
-  border-radius: 16px / 50%;
+  border-radius: 13px / 50%;
   color: white;
   display: inline-block;
   font-family: 'Roboto', sans-serif;
   font-size: 14px;
   font-weight: 500;
-  padding: 10px 15px;
+  padding: 8px 12px;
   text-shadow: 2px 3px 3px rgba(32, 33, 36, 0.3);
 }
 
@@ -532,7 +532,7 @@
   position: relative;
 }
 
-body:.w-letterbox.w-letterbox-l #preview-wrapper {
+body.w-letterbox.w-letterbox-l #preview-wrapper {
   left: 72px;
 }
 
@@ -540,12 +540,12 @@
   bottom: calc((var(--bottom-line) + (var(--big-icon) / 2)) + 12px);
 }
 
-body:not(.mode-switching).square-mode #preview-wrapper {
+body.square-preview #preview-wrapper {
   height: 0; /* Calculate at runtime. */
   width: 0; /* Calculate at runtime. */
 }
 
-body:not(.mode-switching).square-mode #preview-video {
+body.square-preview #preview-video {
   left: 0; /* Calculate at runtime. */
   position: absolute;
   top: 0; /* Calculate at runtime. */
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js
index 0a8b693..3fc3fef0 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js
@@ -29,16 +29,16 @@
    * @type {CSSStyleDeclaration}
    * @private
    */
-  this.squareViewport_ = cca.views.camera.Layout.cssStyle_(
-      'body:not(.mode-switching).square-mode #preview-wrapper');
+  this.squareViewport_ =
+      cca.views.camera.Layout.cssStyle_('body.square-preview #preview-wrapper');
 
   /**
    * CSS style of the video in square mode.
    * @type {CSSStyleDeclaration}
    * @private
    */
-  this.squareVideo_ = cca.views.camera.Layout.cssStyle_(
-      'body:not(.mode-switching).square-mode #preview-video');
+  this.squareVideo_ =
+      cca.views.camera.Layout.cssStyle_('body.square-preview #preview-video');
 
   // End of properties, seal the object.
   Object.seal(this);
@@ -76,13 +76,17 @@
   // as they are not updated immediately.
   var video = document.querySelector('#preview-video');
   if (video.videoHeight) {
-    var f = fullWindow ? Math.min : Math.max;
-    var scale = f(window.innerHeight / video.videoHeight,
-        window.innerWidth / video.videoWidth);
+    var scale = cca.state.get('square-mode') ?
+        Math.min(window.innerHeight, window.innerWidth) /
+            Math.min(video.videoHeight, video.videoWidth) :
+        Math.min(
+            window.innerHeight / video.videoHeight,
+            window.innerWidth / video.videoWidth);
     video.width = scale * video.videoWidth;
     video.height = scale * video.videoHeight;
   }
   var [viewportW, viewportH] = [video.width, video.height];
+  cca.state.set('square-preview', cca.state.get('square-mode'));
   if (cca.state.get('square-mode')) {
     viewportW = viewportH = Math.min(video.width, video.height);
     this.squareVideo_.setProperty('left', `${(viewportW - video.width) / 2}px`);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/preview.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/preview.js
index 8e5611a..b721614 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/preview.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/preview.js
@@ -219,9 +219,7 @@
     // TODO(yuli): Update min-width for resizing at portrait orientation.
     var inner = chrome.app.window.current().innerBounds;
     var innerW = inner.minWidth;
-    var innerH = cca.state.get('square-mode') ?
-        innerW :
-        Math.round(innerW / this.aspectRatio_);
+    var innerH = Math.round(innerW * 9 / 16);
 
     // Limit window resizing capability by setting min-height. Don't limit
     // max-height here as it may disable maximize/fullscreen capabilities.
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html
index f0cec91..63b6508b 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/main.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -54,6 +54,7 @@
                   data="../images/camera_focus_aim.svg"
                   tabindex="-1" hidden></object>
         </div>
+        <div class="centered-overlay" id="camera-mode"></div>
       </div>
       <div id="modes-group" class="buttons right-stripe">
         <label class="mode-item">
@@ -129,7 +130,6 @@
       <div class="centered-overlay">
         <div id="timer-tick-msg"></div>
       </div>
-      <div class="centered-overlay" id="camera-mode"></div>
     </div>
     <div id="settings">
       <div class="menu">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
index 33317f0..4756ccd 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
@@ -127,9 +127,7 @@
         $i18n{crostiniPageTitle}
       </a>
       <a href="/pluginVm" hidden="[[!showPluginVm]]">
-        <!-- TODO(crbug.com/950738): The placeholder iron-icon here is needed
-          for spacing. Replace this once we get the proper icon. -->
-        <iron-icon icon="cr:info"></iron-icon>
+        <iron-icon icon="settings:plugin-vm"></iron-icon>
         $i18n{pluginVmPageTitle}
       </a>
       <paper-button toggles id="advancedButton"
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html
index da18018..de6dda1 100644
--- a/chrome/browser/resources/settings/icons.html
+++ b/chrome/browser/resources/settings/icons.html
@@ -48,6 +48,9 @@
         <path d="M6.70994751,22.1802367 C3.77039152,20.9576222 1.88689678,18.4876617 1.82270453,14.1866283 C1.52620735,14.3410271 1.18877909,14.3669908 0.800057996,14.221322 C-0.312414045,13.804436 -0.0624529958,12.4120387 0.345560769,11.1705211 C0.68346303,10.142341 1.83735671,9.39181671 2.40240955,9.23479478 C3.71763772,4.05541221 6.80346772,0 12,0 C17.2584272,0 20.3654882,3.88805047 21.6436562,9.24850027 C22.2231374,9.43172978 23.3254781,10.1695473 23.6544392,11.1705211 C24.062453,12.4120387 24.312414,13.804436 23.199942,14.221322 C22.8112853,14.3669667 22.4739044,14.3410357 22.1774428,14.186705 C22.1189307,18.5169382 20.2342349,20.9750038 17.2936622,22.1879533 C17.3379726,22.2841737 17.3614392,22.3916932 17.3614392,22.5115654 C17.3614392,23.3336051 17.750632,24 14.8965517,24 C12.813813,24 12.4581871,23.5470722 12.4180882,23.0543665 C12.2796354,22.9647547 12.14026,22.8305157 12,22.8305157 C11.8594243,22.8305157 11.7197425,22.9755283 11.5809922,23.0650454 C11.536581,23.553597 11.171131,24 9.10344828,24 C6.24936798,24 6.63856075,23.3336051 6.63856075,22.5115654 C6.63856075,22.3884786 6.66330281,22.278416 6.70994751,22.1802367 Z M12,20.3378361 C17.4851654,20.3378361 19.4630542,17.934489 19.4630542,12.6147346 C19.4630542,8.20063746 17.6641739,4.14700996 14.6790451,3.47027327 C13.7222433,3.25336374 13.052482,5.61336212 12,5.61336212 C10.947518,5.61336212 10.1820765,3.25336374 9.32095491,3.47027327 C6.32316904,4.22539115 4.53694581,8.43392639 4.53694581,12.6147346 C4.53694581,17.6346061 6.51483457,20.3378361 12,20.3378361 Z M8.27586207,9.99377535 C7.59026721,9.99377535 7.03448276,9.42257974 7.03448276,8.71797424 C7.03448276,8.01336875 7.59026721,7.44217314 8.27586207,7.44217314 C8.96145693,7.44217314 9.51724138,8.01336875 9.51724138,8.71797424 C9.51724138,9.42257974 8.96145693,9.99377535 8.27586207,9.99377535 Z M15.7241379,9.99377535 C15.0385431,9.99377535 14.4827586,9.42257974 14.4827586,8.71797424 C14.4827586,8.01336875 15.0385431,7.44217314 15.7241379,7.44217314 C16.4097328,7.44217314 16.9655172,8.01336875 16.9655172,8.71797424 C16.9655172,9.42257974 16.4097328,9.99377535 15.7241379,9.99377535 Z M12.224615,10.6827627 L13.9283449,11.4510541 C14.2234366,11.5841248 14.3564393,11.9349546 14.2254148,12.2346546 C14.1996198,12.293657 14.1645229,12.3479919 14.1215061,12.39552 L12.4275305,14.2671455 C12.2090286,14.5085621 11.8392003,14.5243719 11.6014958,14.3024578 C11.5890079,14.2907994 11.5770255,14.2785946 11.5655826,14.265878 L9.87720766,12.3895636 C9.65939502,12.1475054 9.67603268,11.771949 9.91436891,11.5507349 C9.9604013,11.5080095 10.012868,11.4730393 10.0697797,11.4471502 L11.7484004,10.6835476 C11.8998356,10.6146599 12.0729604,10.6143745 12.224615,10.6827627 Z"></path>
       </g>
 
+      <!-- Plugin VM icon for Settings drawer -->
+      <g id="plugin-vm" fill="#5F6368" fill-rule="evenodd"><path transform="scale(1.2)" d="M7 12v4H4V4a1 1 0 0 1 1-1h8a3 3 0 0 1 3 3v3a3 3 0 0 1-3 3H7zm0-6v3h5a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1H7z"></path></g>
+
       <!-- Icons for MultiDevice Settings UI -->
       <g id="multidevice-better-together-suite" fill="#5F6368" fill-rule="nonzero"><path d="M17,1.01 L7,1 C5.9,1 5,1.9 5,3 L5,21 C5,22.1 5.9,23 7,23 L17,23 C18.1,23 19,22.1 19,21 L19,3 C19,1.9 18.1,1.01 17,1.01 Z M17,21 L7,21 L7,20 L17,20 L17,21 Z M17,18 L7,18 L7,6 L17,6 L17,18 Z M7,4 L7,3 L17,3 L17,4 L7,4 Z"></path></g>
       <g id="multidevice-smart-lock" fill="#9AA0A6" fill-rule="nonzero"><path d="M18,9 L17,9 L17,7 C17,4.24 14.76,2 12,2 C9.24,2 7,4.24 7,7 L7,9 L6,9 C4.9,9 4,9.9 4,11 L4,21 C4,22.1 4.9,23 6,23 L18,23 C19.1,23 20,22.1 20,21 L20,11 C20,9.9 19.1,9 18,9 Z M9,7 C9,5.34 10.34,4 12,4 C13.66,4 15,5.34 15,7 L15,9 L9,9 L9,7 Z M18,21 L6,21 L6,11 L18,11 L18,21 Z M12,18 C13.1,18 14,17.1 14,16 C14,14.9 13.1,14 12,14 C10.9,14 10,14.9 10,16 C10,17.1 10.9,18 12,18 Z"></path></g>
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html
index e5c162ee..63e6257 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.html
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -143,9 +143,7 @@
         $i18n{crostiniPageTitle}
       </a>
       <a href="/pluginVm" hidden="[[!showPluginVm]]">
-        <!-- TODO(crbug.com/950738): The placeholder iron-icon here is needed
-          for spacing. Replace this once we get the proper icon. -->
-        <iron-icon icon="cr:info"></iron-icon>
+        <iron-icon icon="settings:plugin-vm"></iron-icon>
         $i18n{pluginVmPageTitle}
       </a>
 </if>
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc
index 1c0e7142..2e1b61e5 100644
--- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc
@@ -140,7 +140,7 @@
   auto request = std::make_unique<network::ResourceRequest>();
   request->url = kTestURL;
   request->referrer = kTestReferrer;
-  request->resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request->resource_type = content::ResourceType::kMainFrame;
   request->is_main_frame = true;
   request->headers.SetHeader("X-Request-1", "Foo");
 
diff --git a/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc b/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
index 66b106f..09f9628 100644
--- a/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
@@ -90,7 +90,7 @@
   network::ResourceRequest request;
   request.url = kTestURL;
   request.referrer = kTestReferrer;
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.headers.SetHeader("X-Request-1", "Foo");
   bool defer = false;
   throttle->WillStartRequest(&request, &defer);
@@ -243,7 +243,7 @@
 
   network::ResourceRequest request;
   request.url = GURL("https://google.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kSubFrame);
+  request.resource_type = content::ResourceType::kSubFrame;
 
   bool defer = false;
   throttle->WillStartRequest(&request, &defer);
diff --git a/chrome/browser/sync/test/integration/sync_auth_test.cc b/chrome/browser/sync/test/integration/sync_auth_test.cc
index 216e50a..49d5c79 100644
--- a/chrome/browser/sync/test/integration/sync_auth_test.cc
+++ b/chrome/browser/sync/test/integration/sync_auth_test.cc
@@ -57,7 +57,9 @@
 
   // StatusChangeChecker implementation.
   bool IsExitConditionSatisfied() override {
-    return (service()->GetSyncTokenStatus().last_get_token_error.state() !=
+    return (service()
+                ->GetSyncTokenStatusForDebugging()
+                .last_get_token_error.state() !=
             GoogleServiceAuthError::NONE) ||
            UpdatedProgressMarkerChecker::IsExitConditionSatisfied();
   }
@@ -98,8 +100,9 @@
     // Run until the bookmark is committed or an auth error is encountered.
     TestForAuthError(GetSyncService(0)).Wait();
 
-    GoogleServiceAuthError oauth_error =
-        GetSyncService(0)->GetSyncTokenStatus().last_get_token_error;
+    GoogleServiceAuthError oauth_error = GetSyncService(0)
+                                             ->GetSyncTokenStatusForDebugging()
+                                             .last_get_token_error;
 
     return oauth_error.state() != GoogleServiceAuthError::NONE;
   }
diff --git a/chrome/browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc
index fd47be2..be2b2f2f 100644
--- a/chrome/browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc
@@ -2,6 +2,7 @@
 // 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 "chrome/browser/sync/test/integration/bookmarks_helper.h"
 #include "chrome/browser/sync/test/integration/encryption_helper.h"
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
@@ -90,8 +91,16 @@
   EXPECT_TRUE(WaitForBookmarksToMatchVerifier());
 }
 
+#if defined(OS_CHROMEOS)
+// https://crbug.com/956012
+#define MAYBE_SetPassphraseAndThenSetupSync \
+  DISABLED_SetPassphraseAndThenSetupSync
+#else
+#define MAYBE_SetPassphraseAndThenSetupSync SetPassphraseAndThenSetupSync
+#endif
+
 IN_PROC_BROWSER_TEST_F(TwoClientCustomPassphraseSyncTest,
-                       SetPassphraseAndThenSetupSync) {
+                       MAYBE_SetPassphraseAndThenSetupSync) {
   ASSERT_TRUE(SetupClients());
   ASSERT_TRUE(GetClient(kEncryptingClientId)->SetupSync());
 
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
index ba88eca7..e21a2fe7 100644
--- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -287,8 +287,12 @@
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 }
 
-// Flaky on TSAN: crbug.com/915219
 #if defined(THREAD_SANITIZER)
+// Flaky on TSAN: crbug.com/915219
+#define MAYBE_SetPassphraseAndThenSetupSync \
+  DISABLED_SetPassphraseAndThenSetupSync
+#elif defined(OS_CHROMEOS)
+// https://crbug.com/956012
 #define MAYBE_SetPassphraseAndThenSetupSync \
   DISABLED_SetPassphraseAndThenSetupSync
 #else
diff --git a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
index 298eb2d..3977276 100644
--- a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
+++ b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/ui/autofill/autofill_popup_controller.h"
 #include "chrome/browser/ui/autofill/autofill_popup_layout_model.h"
 #include "components/autofill/core/browser/suggestion.h"
-#include "jni/AutofillKeyboardAccessoryBridge_jni.h"
+#include "jni/AutofillKeyboardAccessoryViewBridge_jni.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -29,12 +29,12 @@
 AutofillKeyboardAccessoryView::AutofillKeyboardAccessoryView(
     AutofillPopupController* controller)
     : controller_(controller) {
-  java_object_.Reset(Java_AutofillKeyboardAccessoryBridge_create(
+  java_object_.Reset(Java_AutofillKeyboardAccessoryViewBridge_create(
       base::android::AttachCurrentThread()));
 }
 
 AutofillKeyboardAccessoryView::~AutofillKeyboardAccessoryView() {
-  Java_AutofillKeyboardAccessoryBridge_resetNativeViewPointer(
+  Java_AutofillKeyboardAccessoryViewBridge_resetNativeViewPointer(
       base::android::AttachCurrentThread(), java_object_);
 }
 
@@ -43,7 +43,7 @@
     bool should_limit_label_width) {
   ui::ViewAndroid* view_android = controller_->container_view();
   DCHECK(view_android);
-  Java_AutofillKeyboardAccessoryBridge_init(
+  Java_AutofillKeyboardAccessoryViewBridge_init(
       base::android::AttachCurrentThread(), java_object_,
       reinterpret_cast<intptr_t>(this),
       view_android->GetWindowAndroid()->GetJavaObject(),
@@ -51,14 +51,14 @@
 }
 
 void AutofillKeyboardAccessoryView::Hide() {
-  Java_AutofillKeyboardAccessoryBridge_dismiss(
+  Java_AutofillKeyboardAccessoryViewBridge_dismiss(
       base::android::AttachCurrentThread(), java_object_);
 }
 
 void AutofillKeyboardAccessoryView::Show() {
   JNIEnv* env = base::android::AttachCurrentThread();
   ScopedJavaLocalRef<jobjectArray> data_array =
-      Java_AutofillKeyboardAccessoryBridge_createAutofillSuggestionArray(
+      Java_AutofillKeyboardAccessoryViewBridge_createAutofillSuggestionArray(
           env, controller_->GetLineCount());
 
   size_t position = 0;
@@ -70,15 +70,15 @@
           controller_->layout_model().GetIconResourceID(suggestion.icon));
     }
 
-    Java_AutofillKeyboardAccessoryBridge_addToAutofillSuggestionArray(
+    Java_AutofillKeyboardAccessoryViewBridge_addToAutofillSuggestionArray(
         env, data_array, position++,
         ConvertUTF16ToJavaString(env, controller_->GetElidedValueAt(i)),
         ConvertUTF16ToJavaString(env, controller_->GetElidedLabelAt(i)),
         android_icon_id, suggestion.frontend_id,
         controller_->GetRemovalConfirmationText(i, nullptr, nullptr));
   }
-  Java_AutofillKeyboardAccessoryBridge_show(env, java_object_, data_array,
-                                            controller_->IsRTL());
+  Java_AutofillKeyboardAccessoryViewBridge_show(env, java_object_, data_array,
+                                                controller_->IsRTL());
 }
 
 void AutofillKeyboardAccessoryView::ConfirmDeletion(
@@ -87,7 +87,7 @@
     base::OnceClosure confirm_deletion) {
   JNIEnv* env = base::android::AttachCurrentThread();
   confirm_deletion_ = std::move(confirm_deletion);
-  Java_AutofillKeyboardAccessoryBridge_confirmDeletion(
+  Java_AutofillKeyboardAccessoryViewBridge_confirmDeletion(
       env, java_object_, ConvertUTF16ToJavaString(env, confirmation_title),
       ConvertUTF16ToJavaString(env, confirmation_body));
 }
diff --git a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h
index df5f953..df9eb51 100644
--- a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h
+++ b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h
@@ -31,7 +31,7 @@
 
   // Implementation of AutofillKeyboardAccessoryAdapter::AccessoryView.
   void Initialize(unsigned int animation_duration_millis,
-                  bool should_limit_label_width) override;
+                  bool limit_label_width) override;
   void Hide() override;
   void Show() override;
   void ConfirmDeletion(const base::string16& confirmation_title,
diff --git a/chrome/browser/ui/android/passwords/manual_filling_view_android.cc b/chrome/browser/ui/android/passwords/manual_filling_view_android.cc
index bff7a9c..ed05d00 100644
--- a/chrome/browser/ui/android/passwords/manual_filling_view_android.cc
+++ b/chrome/browser/ui/android/passwords/manual_filling_view_android.cc
@@ -22,7 +22,7 @@
 #include "chrome/browser/password_manager/password_accessory_controller.h"
 #include "components/autofill/core/browser/accessory_sheet_data.h"
 #include "components/autofill/core/common/password_form.h"
-#include "jni/ManualFillingBridge_jni.h"
+#include "jni/ManualFillingComponentBridge_jni.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android.h"
 #include "ui/gfx/android/java_bitmap.h"
@@ -40,15 +40,15 @@
   ui::ViewAndroid* view_android = controller_->container_view();
 
   DCHECK(view_android);
-  java_object_.Reset(Java_ManualFillingBridge_create(
+  java_object_.Reset(Java_ManualFillingComponentBridge_create(
       base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this),
       view_android->GetWindowAndroid()->GetJavaObject()));
 }
 
 ManualFillingViewAndroid::~ManualFillingViewAndroid() {
   DCHECK(!java_object_.is_null());
-  Java_ManualFillingBridge_destroy(base::android::AttachCurrentThread(),
-                                   java_object_);
+  Java_ManualFillingComponentBridge_destroy(
+      base::android::AttachCurrentThread(), java_object_);
   java_object_.Reset(nullptr);
 }
 
@@ -57,28 +57,28 @@
   DCHECK(!java_object_.is_null());
 
   JNIEnv* env = base::android::AttachCurrentThread();
-  Java_ManualFillingBridge_onItemsAvailable(
+  Java_ManualFillingComponentBridge_onItemsAvailable(
       env, java_object_, ConvertAccessorySheetDataToJavaObject(env, data));
 }
 
 void ManualFillingViewAndroid::CloseAccessorySheet() {
-  Java_ManualFillingBridge_closeAccessorySheet(
+  Java_ManualFillingComponentBridge_closeAccessorySheet(
       base::android::AttachCurrentThread(), java_object_);
 }
 
 void ManualFillingViewAndroid::SwapSheetWithKeyboard() {
-  Java_ManualFillingBridge_swapSheetWithKeyboard(
+  Java_ManualFillingComponentBridge_swapSheetWithKeyboard(
       base::android::AttachCurrentThread(), java_object_);
 }
 
 void ManualFillingViewAndroid::ShowWhenKeyboardIsVisible() {
-  Java_ManualFillingBridge_showWhenKeyboardIsVisible(
+  Java_ManualFillingComponentBridge_showWhenKeyboardIsVisible(
       base::android::AttachCurrentThread(), java_object_);
 }
 
 void ManualFillingViewAndroid::Hide() {
-  Java_ManualFillingBridge_hide(base::android::AttachCurrentThread(),
-                                java_object_);
+  Java_ManualFillingComponentBridge_hide(base::android::AttachCurrentThread(),
+                                         java_object_);
 }
 
 void ManualFillingViewAndroid::OnAutomaticGenerationStatusChanged(
@@ -87,8 +87,8 @@
     return;
 
   JNIEnv* env = base::android::AttachCurrentThread();
-  Java_ManualFillingBridge_onAutomaticGenerationStatusChanged(env, java_object_,
-                                                              available);
+  Java_ManualFillingComponentBridge_onAutomaticGenerationStatusChanged(
+      env, java_object_, available);
 }
 
 void ManualFillingViewAndroid::OnFaviconRequested(
@@ -141,16 +141,16 @@
     JNIEnv* env,
     const AccessorySheetData& tab_data) {
   ScopedJavaLocalRef<jobject> j_tab_data =
-      Java_ManualFillingBridge_createAccessorySheetData(
+      Java_ManualFillingComponentBridge_createAccessorySheetData(
           env, static_cast<int>(tab_data.get_sheet_type()),
           ConvertUTF16ToJavaString(env, tab_data.title()));
 
   for (const UserInfo& user_info : tab_data.user_info_list()) {
     ScopedJavaLocalRef<jobject> j_user_info =
-        Java_ManualFillingBridge_addUserInfoToAccessorySheetData(
+        Java_ManualFillingComponentBridge_addUserInfoToAccessorySheetData(
             env, java_object_, j_tab_data);
     for (const UserInfo::Field& field : user_info.fields()) {
-      Java_ManualFillingBridge_addFieldToUserInfo(
+      Java_ManualFillingComponentBridge_addFieldToUserInfo(
           env, java_object_, j_user_info,
           ConvertUTF16ToJavaString(env, field.display_text()),
           ConvertUTF16ToJavaString(env, field.a11y_description()),
@@ -159,7 +159,7 @@
   }
 
   for (const FooterCommand& footer_command : tab_data.footer_commands()) {
-    Java_ManualFillingBridge_addFooterCommandToAccessorySheetData(
+    Java_ManualFillingComponentBridge_addFooterCommandToAccessorySheetData(
         env, java_object_, j_tab_data,
         ConvertUTF16ToJavaString(env, footer_command.display_text()));
   }
@@ -167,7 +167,7 @@
 }
 
 // static
-void JNI_ManualFillingBridge_CachePasswordSheetDataForTesting(
+void JNI_ManualFillingComponentBridge_CachePasswordSheetDataForTesting(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& j_web_contents,
     const base::android::JavaParamRef<jobjectArray>& j_usernames,
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
index 5f4799c..9a2f158 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -989,6 +989,223 @@
   EXPECT_EQ(0U, bubble_content.media_menus.size());
 }
 
+// Regression test for https://crbug.com/955408
+// See also: ContentSettingImageModelTest.SensorAccessPermissionsChanged
+TEST_F(ContentSettingBubbleModelTest, SensorAccessPermissionsChanged) {
+  WebContentsTester::For(web_contents())
+      ->NavigateAndCommit(GURL("https://www.example.com"));
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents());
+  HostContentSettingsMap* settings_map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+
+  // Go from allow by default to block by default to allow by default.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS));
+    const auto& bubble_content = content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content.title,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content.message,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(bubble_content.radio_group.radio_items[0],
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_NO_ACTION));
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[1],
+        l10n_util::GetStringFUTF16(IDS_ALLOWED_SENSORS_BLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content.radio_group.default_item, 0);
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_bubble_model =
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS);
+    const auto& bubble_content_2 =
+        content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content_2.title,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content_2.message,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_MESSAGE));
+    EXPECT_EQ(bubble_content_2.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(
+        bubble_content_2.radio_group.radio_items[0],
+        l10n_util::GetStringFUTF16(IDS_BLOCKED_SENSORS_UNBLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content_2.radio_group.radio_items[1],
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_NO_ACTION));
+    EXPECT_EQ(bubble_content_2.radio_group.default_item, 1);
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_bubble_model =
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS);
+    const auto& bubble_content_3 =
+        content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content_3.title,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content_3.message,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content_3.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(bubble_content_3.radio_group.radio_items[0],
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_NO_ACTION));
+    EXPECT_EQ(
+        bubble_content_3.radio_group.radio_items[1],
+        l10n_util::GetStringFUTF16(IDS_ALLOWED_SENSORS_BLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content_3.radio_group.default_item, 0);
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+
+  // Go from block by default to allow by default to block by default.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS));
+    const auto& bubble_content = content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content.title,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content.message,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[0],
+        l10n_util::GetStringFUTF16(IDS_BLOCKED_SENSORS_UNBLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content.radio_group.radio_items[1],
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_NO_ACTION));
+    EXPECT_EQ(bubble_content.radio_group.default_item, 1);
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_bubble_model =
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS);
+    const auto& bubble_content_2 =
+        content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content_2.title,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content_2.message,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_MESSAGE));
+    EXPECT_EQ(bubble_content_2.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(bubble_content_2.radio_group.radio_items[0],
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_NO_ACTION));
+    EXPECT_EQ(
+        bubble_content_2.radio_group.radio_items[1],
+        l10n_util::GetStringFUTF16(IDS_ALLOWED_SENSORS_BLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content_2.radio_group.default_item, 0);
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_bubble_model =
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS);
+    const auto& bubble_content_3 =
+        content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content_3.title,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content_3.message,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content_3.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(
+        bubble_content_3.radio_group.radio_items[0],
+        l10n_util::GetStringFUTF16(IDS_BLOCKED_SENSORS_UNBLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content_3.radio_group.radio_items[1],
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_NO_ACTION));
+    EXPECT_EQ(bubble_content_3.radio_group.default_item, 1);
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+
+  // Block by default but allow a specific site.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    settings_map->SetContentSettingDefaultScope(
+        web_contents()->GetURL(), web_contents()->GetURL(),
+        CONTENT_SETTINGS_TYPE_SENSORS, std::string(), CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS));
+    const auto& bubble_content = content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content.title,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content.message,
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(bubble_content.radio_group.radio_items[0],
+              l10n_util::GetStringUTF16(IDS_ALLOWED_SENSORS_NO_ACTION));
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[1],
+        l10n_util::GetStringFUTF16(IDS_ALLOWED_SENSORS_BLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content.radio_group.default_item, 0);
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+  // Clear site-specific exceptions.
+  settings_map->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_SENSORS);
+
+  // Allow by default but block a specific site.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    settings_map->SetContentSettingDefaultScope(
+        web_contents()->GetURL(), web_contents()->GetURL(),
+        CONTENT_SETTINGS_TYPE_SENSORS, std::string(), CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), CONTENT_SETTINGS_TYPE_SENSORS));
+    const auto& bubble_content = content_setting_bubble_model->bubble_content();
+
+    EXPECT_EQ(bubble_content.title,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_TITLE));
+    EXPECT_EQ(bubble_content.message,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_MESSAGE));
+    ASSERT_EQ(bubble_content.radio_group.radio_items.size(), 2U);
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[0],
+        l10n_util::GetStringFUTF16(IDS_BLOCKED_SENSORS_UNBLOCK,
+                                   url_formatter::FormatUrlForSecurityDisplay(
+                                       web_contents()->GetURL())));
+    EXPECT_EQ(bubble_content.radio_group.radio_items[1],
+              l10n_util::GetStringUTF16(IDS_BLOCKED_SENSORS_NO_ACTION));
+    EXPECT_EQ(bubble_content.radio_group.default_item, 1);
+  }
+}
+
 TEST_F(ContentSettingBubbleModelTest, PopupBubbleModelListItems) {
   const GURL url("https://www.example.test/");
   WebContentsTester::For(web_contents())->NavigateAndCommit(url);
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index 16951d9..d156205 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -592,15 +592,14 @@
 
   // Do not show any indicator if sensors are allowed by default and they were
   // not blocked in this page.
-  if (!blocked && content_type() == CONTENT_SETTINGS_TYPE_SENSORS &&
-      map->GetDefaultContentSetting(content_type(), nullptr) ==
-          CONTENT_SETTING_ALLOW) {
+  if (!blocked && map->GetDefaultContentSetting(content_type(), nullptr) ==
+                      CONTENT_SETTING_ALLOW) {
     return false;
   }
 
-  set_icon(kSensorsIcon, allowed ? gfx::kNoneIcon : kBlockedBadgeIcon);
-  set_tooltip(l10n_util::GetStringUTF16(allowed ? IDS_SENSORS_ALLOWED_TOOLTIP
-                                                : IDS_SENSORS_BLOCKED_TOOLTIP));
+  set_icon(kSensorsIcon, !blocked ? gfx::kNoneIcon : kBlockedBadgeIcon);
+  set_tooltip(l10n_util::GetStringUTF16(
+      !blocked ? IDS_SENSORS_ALLOWED_TOOLTIP : IDS_SENSORS_BLOCKED_TOOLTIP));
   return true;
 }
 
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
index 14b7068..77e9cadc 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
@@ -19,6 +19,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/test_renderer_host.h"
+#include "content/public/test/web_contents_tester.h"
 #include "net/cookies/cookie_options.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -191,6 +192,125 @@
             l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
 }
 
+// Regression test for https://crbug.com/955408
+// See also: ContentSettingBubbleModelTest.SensorAccessPermissionsChanged
+TEST_F(ContentSettingImageModelTest, SensorAccessPermissionsChanged) {
+  TabSpecificContentSettings::CreateForWebContents(web_contents());
+  content::WebContentsTester::For(web_contents())
+      ->NavigateAndCommit(GURL("https://www.example.com"));
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents());
+  HostContentSettingsMap* settings_map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+
+  auto content_setting_image_model =
+      ContentSettingImageModel::CreateForContentType(
+          ContentSettingImageModel::ImageType::SENSORS);
+  EXPECT_FALSE(content_setting_image_model->is_visible());
+  EXPECT_TRUE(content_setting_image_model->get_tooltip().empty());
+
+  // Go from allow by default to block by default to allow by default.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    EXPECT_FALSE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(content_setting_image_model->get_tooltip().empty());
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    EXPECT_TRUE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(HasIcon(*content_setting_image_model));
+    EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
+    EXPECT_EQ(content_setting_image_model->get_tooltip(),
+              l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    // The icon and toolip remain set to the values above, but it is not a
+    // problem since the image model is not visible.
+    EXPECT_FALSE(content_setting_image_model->is_visible());
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+
+  // Go from block by default to allow by default to block by default.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    EXPECT_TRUE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(HasIcon(*content_setting_image_model));
+    EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
+    EXPECT_EQ(content_setting_image_model->get_tooltip(),
+              l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    // The icon and toolip remain set to the values above, but it is not a
+    // problem since the image model is not visible.
+    EXPECT_FALSE(content_setting_image_model->is_visible());
+
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+    EXPECT_TRUE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(HasIcon(*content_setting_image_model));
+    EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
+    EXPECT_EQ(content_setting_image_model->get_tooltip(),
+              l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+
+  // Block by default but allow a specific site.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_BLOCK);
+    settings_map->SetContentSettingDefaultScope(
+        web_contents()->GetURL(), web_contents()->GetURL(),
+        CONTENT_SETTINGS_TYPE_SENSORS, std::string(), CONTENT_SETTING_ALLOW);
+    content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+
+    EXPECT_TRUE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(HasIcon(*content_setting_image_model));
+    EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
+    EXPECT_EQ(content_setting_image_model->get_tooltip(),
+              l10n_util::GetStringUTF16(IDS_SENSORS_ALLOWED_TOOLTIP));
+  }
+
+  content_settings->ClearContentSettingsExceptForNavigationRelatedSettings();
+  // Clear site-specific exceptions.
+  settings_map->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_SENSORS);
+
+  // Allow by default but allow a specific site.
+  {
+    settings_map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_SENSORS,
+                                           CONTENT_SETTING_ALLOW);
+    settings_map->SetContentSettingDefaultScope(
+        web_contents()->GetURL(), web_contents()->GetURL(),
+        CONTENT_SETTINGS_TYPE_SENSORS, std::string(), CONTENT_SETTING_BLOCK);
+    content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_SENSORS);
+    content_setting_image_model->Update(web_contents());
+
+    EXPECT_TRUE(content_setting_image_model->is_visible());
+    EXPECT_TRUE(HasIcon(*content_setting_image_model));
+    EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
+    EXPECT_EQ(content_setting_image_model->get_tooltip(),
+              l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
+  }
+}
+
 // Regression test for http://crbug.com/161854.
 TEST_F(ContentSettingImageModelTest, NULLTabSpecificContentSettings) {
   auto content_setting_image_model =
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
index c60e77688..1a1c64d4 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
@@ -29,6 +29,7 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/management_policy.h"
+#include "extensions/browser/uninstall_reason.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
@@ -332,11 +333,12 @@
       ->UserMayModifySettings(GetExtension(), nullptr);
 }
 
-void HostedAppBrowserController::Uninstall(UninstallReason reason,
-                                           UninstallSource source) {
+void HostedAppBrowserController::Uninstall() {
   uninstall_dialog_ = ExtensionUninstallDialog::Create(
       browser()->profile(), browser()->window()->GetNativeWindow(), this);
-  uninstall_dialog_->ConfirmUninstall(GetExtension(), reason, source);
+  uninstall_dialog_->ConfirmUninstall(
+      GetExtension(), extensions::UNINSTALL_REASON_USER_INITIATED,
+      extensions::UNINSTALL_SOURCE_HOSTED_APP_MENU);
 }
 
 bool HostedAppBrowserController::IsInstalled() const {
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.h b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
index 3ec6c0c..d2cf8f136 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.h
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
@@ -89,7 +89,7 @@
 
   bool CanUninstall() const override;
 
-  void Uninstall(UninstallReason reason, UninstallSource source) override;
+  void Uninstall() override;
 
   // Returns whether the app is installed (uninstallation may complete within
   // the lifetime of HostedAppBrowserController).
diff --git a/chrome/browser/ui/extensions/hosted_app_menu_model.cc b/chrome/browser/ui/extensions/hosted_app_menu_model.cc
index 101d4b7..37707766 100644
--- a/chrome/browser/ui/extensions/hosted_app_menu_model.cc
+++ b/chrome/browser/ui/extensions/hosted_app_menu_model.cc
@@ -76,9 +76,7 @@
 
 void HostedAppMenuModel::ExecuteCommand(int command_id, int event_flags) {
   if (command_id == kUninstallAppCommandId) {
-    browser()->web_app_controller()->Uninstall(
-        extensions::UNINSTALL_REASON_USER_INITIATED,
-        extensions::UNINSTALL_SOURCE_HOSTED_APP_MENU);
+    browser()->web_app_controller()->Uninstall();
   } else {
     AppMenuModel::ExecuteCommand(command_id, event_flags);
   }
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view_browsertest.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view_browsertest.cc
index fe53b82..35d934d 100644
--- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view_browsertest.cc
+++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view_browsertest.cc
@@ -119,7 +119,7 @@
   // It waits for the location bar visibility to change rather than simply using
   // RunLoop::RunUntilIdle because in Mash, the fullscreen change takes place in
   // another process.
-  class FullscreenWaiter final : public views::ViewObserver {
+  class FullscreenWaiter final {
    public:
     enum class AwaitType {
       kOutOfFullscreen,
@@ -132,15 +132,16 @@
         : receiver_view_(receiver_view),
           await_type_(await_type),
           fullscreen_callback_(std::move(fullscreen_callback)) {
-      receiver_view_->location_bar_view()->AddObserver(this);
+      auto* location_bar_view = receiver_view_->location_bar_view();
+      subscription_ =
+          location_bar_view->AddVisibleChangedCallback(base::BindRepeating(
+              &FullscreenWaiter::OnViewVisibilityChanged,
+              base::Unretained(this), base::Unretained(location_bar_view)));
     }
-    ~FullscreenWaiter() final {
-      receiver_view_->location_bar_view()->RemoveObserver(this);
-    }
+    ~FullscreenWaiter() = default;
 
    private:
-    void OnViewVisibilityChanged(views::View* observed_view,
-                                 views::View* starting_view) override {
+    void OnViewVisibilityChanged(views::View* observed_view) {
       bool fullscreen = !observed_view->visible();
       EXPECT_EQ(fullscreen, receiver_view_->IsFullscreen());
       if (fullscreen == (await_type_ == AwaitType::kIntoFullscreen))
@@ -148,6 +149,7 @@
     }
 
     PresentationReceiverWindowView* const receiver_view_;
+    views::PropertyChangedSubscription subscription_;
     const AwaitType await_type_;
     base::OnceClosure fullscreen_callback_;
 
diff --git a/chrome/browser/ui/web_app_browser_controller.cc b/chrome/browser/ui/web_app_browser_controller.cc
index b8b6a042..1fe5117 100644
--- a/chrome/browser/ui/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_app_browser_controller.cc
@@ -81,8 +81,7 @@
   return false;
 }
 
-void WebAppBrowserController::Uninstall(extensions::UninstallReason reason,
-                                        extensions::UninstallSource source) {
+void WebAppBrowserController::Uninstall() {
   NOTREACHED();
   return;
 }
diff --git a/chrome/browser/ui/web_app_browser_controller.h b/chrome/browser/ui/web_app_browser_controller.h
index 35331008..d0a94d2f 100644
--- a/chrome/browser/ui/web_app_browser_controller.h
+++ b/chrome/browser/ui/web_app_browser_controller.h
@@ -10,9 +10,7 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
-#include "chrome/browser/extensions/extension_uninstall_dialog.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
-#include "chrome/browser/ui/web_app_browser_controller.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "third_party/skia/include/core/SkColor.h"
 
@@ -78,8 +76,7 @@
 
   virtual bool CanUninstall() const;
 
-  virtual void Uninstall(extensions::UninstallReason reason,
-                         extensions::UninstallSource source);
+  virtual void Uninstall();
 
   // Returns whether the app is installed (uninstallation may complete within
   // the lifetime of HostedAppBrowserController).
diff --git a/chrome/browser/usb/usb_chooser_context.cc b/chrome/browser/usb/usb_chooser_context.cc
index 5abc9e3..9fbd427 100644
--- a/chrome/browser/usb/usb_chooser_context.cc
+++ b/chrome/browser/usb/usb_chooser_context.cc
@@ -395,7 +395,7 @@
     const url::Origin& embedding_origin,
     const device::mojom::UsbDeviceInfo& device_info) {
   if (CanStorePersistentEntry(device_info)) {
-    GrantObjectPermission(requesting_origin.GetURL(), embedding_origin.GetURL(),
+    GrantObjectPermission(requesting_origin, embedding_origin,
                           DeviceInfoToValue(device_info));
   } else {
     ephemeral_devices_[std::make_pair(requesting_origin, embedding_origin)]
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h
index e0d947e..be7cccd 100644
--- a/chrome/browser/web_applications/components/install_finalizer.h
+++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -42,6 +42,7 @@
 
   virtual bool CanCreateOsShortcuts() const = 0;
   virtual void CreateOsShortcuts(const AppId& app_id,
+                                 bool add_to_desktop,
                                  CreateOsShortcutsCallback callback) = 0;
 
   virtual bool CanPinAppToShelf() const = 0;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
index 315ee4b..99356d9cf 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -113,9 +113,10 @@
 
 void BookmarkAppInstallFinalizer::CreateOsShortcuts(
     const web_app::AppId& app_id,
+    bool add_to_desktop,
     CreateOsShortcutsCallback callback) {
   const Extension* app = GetExtensionById(profile_, app_id);
-  BookmarkAppCreateOsShortcuts(profile_, app, true /* add_to_desktop */,
+  BookmarkAppCreateOsShortcuts(profile_, app, add_to_desktop,
                                std::move(callback));
 }
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
index cc8fab6..40a934ff 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
@@ -31,6 +31,7 @@
                        InstallFinalizedCallback callback) override;
   bool CanCreateOsShortcuts() const override;
   void CreateOsShortcuts(const web_app::AppId& app_id,
+                         bool add_to_desktop,
                          CreateOsShortcutsCallback callback) override;
   bool CanPinAppToShelf() const override;
   void PinAppToShelf(const web_app::AppId& app_id) override;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
index 99e109d..310f726 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
@@ -101,15 +101,44 @@
     ResultCallback result_callback,
     const web_app::AppId& app_id,
     web_app::InstallResultCode code) {
-  if (code == web_app::InstallResultCode::kSuccess) {
-    extension_ids_map_.Insert(install_options_.url, app_id,
-                              install_options_.install_source);
-    extension_ids_map_.SetIsPlaceholder(install_options_.url, is_placeholder);
-
-    std::move(result_callback)
-        .Run(Result(web_app::InstallResultCode::kSuccess, app_id));
-  } else {
+  if (code != web_app::InstallResultCode::kSuccess) {
     std::move(result_callback).Run(Result(code, base::nullopt));
+    return;
+  }
+
+  extension_ids_map_.Insert(install_options_.url, app_id,
+                            install_options_.install_source);
+  extension_ids_map_.SetIsPlaceholder(install_options_.url, is_placeholder);
+
+  auto success_closure =
+      base::BindOnce(std::move(result_callback),
+                     Result(web_app::InstallResultCode::kSuccess, app_id));
+
+  if (!is_placeholder) {
+    std::move(success_closure).Run();
+    return;
+  }
+
+  // Installation through InstallFinalizer doesn't create shortcuts so create
+  // them here.
+  if (install_options_.add_to_quick_launch_bar &&
+      install_finalizer_->CanPinAppToShelf()) {
+    install_finalizer_->PinAppToShelf(app_id);
+  }
+
+  // TODO(ortuno): Make adding a shortcut to the applications menu independent
+  // from adding a shortcut to desktop.
+  if (install_options_.add_to_applications_menu &&
+      install_finalizer_->CanCreateOsShortcuts()) {
+    install_finalizer_->CreateOsShortcuts(
+        app_id, install_options_.add_to_desktop,
+        base::BindOnce(
+            [](base::OnceClosure success_closure, bool shortcuts_created) {
+              // Even if the shortcuts failed to be created, we consider the
+              // installation successful since an app was created.
+              std::move(success_closure).Run();
+            },
+            std::move(success_closure)));
   }
 }
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
index 8df344e..19e7e5a 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -471,6 +471,7 @@
 
         EXPECT_TRUE(IsPlaceholderApp(profile(), app_url()));
 
+        EXPECT_EQ(1, install_finalizer()->num_create_os_shortcuts_calls());
         EXPECT_TRUE(install_finalizer()->finalized_policy_install());
         std::unique_ptr<WebApplicationInfo> web_app_info =
             install_finalizer()->web_app_info();
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.cc b/chrome/browser/web_applications/test/test_install_finalizer.cc
index 62c8ae8..1ae803d4 100644
--- a/chrome/browser/web_applications/test/test_install_finalizer.cc
+++ b/chrome/browser/web_applications/test/test_install_finalizer.cc
@@ -51,6 +51,7 @@
 
 void TestInstallFinalizer::CreateOsShortcuts(
     const AppId& app_id,
+    bool add_to_desktop,
     CreateOsShortcutsCallback callback) {
   ++num_create_os_shortcuts_calls_;
   base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.h b/chrome/browser/web_applications/test/test_install_finalizer.h
index 562fcc02..6910151 100644
--- a/chrome/browser/web_applications/test/test_install_finalizer.h
+++ b/chrome/browser/web_applications/test/test_install_finalizer.h
@@ -26,6 +26,7 @@
                        InstallFinalizedCallback callback) override;
   bool CanCreateOsShortcuts() const override;
   void CreateOsShortcuts(const AppId& app_id,
+                         bool add_to_desktop,
                          CreateOsShortcutsCallback callback) override;
   bool CanPinAppToShelf() const override;
   void PinAppToShelf(const AppId& app_id) override;
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc
index 707f794..e4c735c 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -105,6 +105,7 @@
 
 void WebAppInstallFinalizer::CreateOsShortcuts(
     const AppId& app_id,
+    bool add_to_desktop,
     CreateOsShortcutsCallback callback) {
   // TODO(loyso): Implement it.
   NOTIMPLEMENTED();
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h
index 221c231..b9bd908 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.h
+++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -31,6 +31,7 @@
                        InstallFinalizedCallback callback) override;
   bool CanCreateOsShortcuts() const override;
   void CreateOsShortcuts(const AppId& app_id,
+                         bool add_to_desktop,
                          CreateOsShortcutsCallback callback) override;
   bool CanPinAppToShelf() const override;
   void PinAppToShelf(const AppId& app_id) override;
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc
index ae78597..f146f1a 100644
--- a/chrome/browser/web_applications/web_app_install_task.cc
+++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -240,7 +240,7 @@
       &WebAppInstallTask::OnShortcutsCreated, weak_ptr_factory_.GetWeakPtr(),
       std::move(web_app_info), app_id);
   if (install_finalizer_->CanCreateOsShortcuts()) {
-    install_finalizer_->CreateOsShortcuts(app_id,
+    install_finalizer_->CreateOsShortcuts(app_id, /*add_to_dekstop=*/true,
                                           std::move(create_shortcuts_callback));
   } else {
     std::move(create_shortcuts_callback).Run(false /* created_shortcuts */);
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index abf524d..f9c260c 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -232,7 +232,7 @@
 
 // Enables or disables the ability to install PWAs from the omnibox.
 const base::Feature kDesktopPWAsOmniboxInstall{
-    "DesktopPWAsOmniboxInstall", base::FEATURE_DISABLED_BY_DEFAULT};
+    "DesktopPWAsOmniboxInstall", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Disables downloads of unsafe file types over HTTP.
 const base::Feature kDisallowUnsafeHttpDownloads{
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 91e5e82..69e0c5ac 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -920,6 +920,14 @@
 const char kDeviceWallpaperImageFilePath[] =
     "policy.device_wallpaper_image_file_path";
 
+// Boolean whether Kerberos daemon supports remembering passwords.
+const char kKerberosRememberPasswordEnabled[] =
+    "kerberos.remember_password_enabled";
+// Boolean whether users may add new Kerberos accounts.
+const char kKerberosAddAccountsAllowed[] = "kerberos.add_accounts_allowed";
+// Dictionary specifying a pre-set list of Kerberos accounts.
+const char kKerberosAccounts[] = "kerberos.accounts";
+
 #endif  // defined(OS_CHROMEOS)
 
 // A boolean pref set to true if a Home button to open the Home pages should be
@@ -1728,6 +1736,11 @@
 const char kNtlmV2Enabled[] = "auth.ntlm_v2_enabled";
 #endif  // defined(OS_POSIX)
 
+#if defined(OS_CHROMEOS)
+// Boolean whether Kerberos functionality is enabled.
+const char kKerberosEnabled[] = "kerberos.enabled";
+#endif
+
 // Boolean that specifies whether to enable revocation checking (best effort)
 // by default.
 const char kCertRevocationCheckingEnabled[] = "ssl.rev_checking.enabled";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index c9581b30..7c027cd 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -292,6 +292,9 @@
 extern const char kMostRecentlyUsedNetworkFileShareURL[];
 extern const char kParentAccessCodeConfig[];
 extern const char kDeviceWallpaperImageFilePath[];
+extern const char kKerberosRememberPasswordEnabled[];
+extern const char kKerberosAddAccountsAllowed[];
+extern const char kKerberosAccounts[];
 #endif  // defined(OS_CHROMEOS)
 extern const char kShowHomeButton[];
 extern const char kSpeechRecognitionFilterProfanities[];
@@ -700,6 +703,10 @@
 extern const char kNtlmV2Enabled[];
 #endif  // defined(OS_POSIX)
 
+#if defined(OS_CHROMEOS)
+extern const char kKerberosEnabled[];
+#endif
+
 extern const char kCertRevocationCheckingEnabled[];
 extern const char kCertRevocationCheckingRequiredLocalAnchors[];
 extern const char kSSLVersionMin[];
diff --git a/chrome/common/prerender_url_loader_throttle.cc b/chrome/common/prerender_url_loader_throttle.cc
index bf6e173..99489f7 100644
--- a/chrome/common/prerender_url_loader_throttle.cc
+++ b/chrome/common/prerender_url_loader_throttle.cc
@@ -99,8 +99,7 @@
     }
   }
 
-  if (request->resource_type !=
-          static_cast<int>(content::ResourceType::kMainFrame) &&
+  if (request->resource_type != content::ResourceType::kMainFrame &&
       !DoesSubresourceURLHaveValidScheme(request->url)) {
     // Destroying the prerender for unsupported scheme only for non-main
     // resource to allow chrome://crash to actually crash in the
@@ -116,8 +115,7 @@
   }
 
 #if defined(OS_ANDROID)
-  if (request->resource_type ==
-      static_cast<int>(content::ResourceType::kFavicon)) {
+  if (request->resource_type == content::ResourceType::kFavicon) {
     // Delay icon fetching until the contents are getting swapped in
     // to conserve network usage in mobile devices.
     *defer = true;
diff --git a/chrome/renderer/chromeos_merge_session_loader_throttle.cc b/chrome/renderer/chromeos_merge_session_loader_throttle.cc
index c7133f9..4e130bd 100644
--- a/chrome/renderer/chromeos_merge_session_loader_throttle.cc
+++ b/chrome/renderer/chromeos_merge_session_loader_throttle.cc
@@ -42,8 +42,7 @@
 void MergeSessionLoaderThrottle::WillStartRequest(
     network::ResourceRequest* request,
     bool* defer) {
-  is_xhr_ =
-      request->resource_type == static_cast<int>(content::ResourceType::kXhr);
+  is_xhr_ = request->resource_type == content::ResourceType::kXhr;
   if (is_xhr_ && request->url.SchemeIsHTTPOrHTTPS() &&
       MaybeDeferForMergeSession(
           request->url,
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.cc b/chrome/renderer/url_loader_throttle_provider_impl.cc
index 6605405..47766d0 100644
--- a/chrome/renderer/url_loader_throttle_provider_impl.cc
+++ b/chrome/renderer/url_loader_throttle_provider_impl.cc
@@ -177,8 +177,7 @@
   // Don't add them for frame requests.
   bool is_frame_resource = content::IsResourceTypeFrame(resource_type);
 
-  DCHECK(!is_frame_resource ||
-         type_ == content::URLLoaderThrottleProviderType::kFrame);
+  DCHECK(!is_frame_resource || IsTypeFrame());
 
   if (data_reduction_proxy_manager_) {
     throttles.push_back(
@@ -191,15 +190,28 @@
        base::FeatureList::IsEnabled(
            safe_browsing::kCheckByURLLoaderThrottle)) &&
       !is_frame_resource) {
-    if (safe_browsing_info_)
-      safe_browsing_.Bind(std::move(safe_browsing_info_));
+    if (safe_browsing_info_) {
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner =
+          base::ThreadTaskRunnerHandle::Get();
+      if (IsTypeFrame()) {
+        DCHECK(content::RenderThread::IsMainThread());
+        content::RenderFrame* render_frame =
+            content::RenderFrame::FromRoutingID(render_frame_id);
+        if (render_frame) {
+          task_runner =
+              render_frame->GetTaskRunner(blink::TaskType::kInternalDefault);
+        }
+      }
+      safe_browsing_.Bind(std::move(safe_browsing_info_),
+                          std::move(task_runner));
+    }
     throttles.push_back(
         std::make_unique<safe_browsing::RendererURLLoaderThrottle>(
             safe_browsing_.get(), render_frame_id));
   }
 
-  if (type_ == content::URLLoaderThrottleProviderType::kFrame &&
-      !is_frame_resource) {
+  if (IsTypeFrame() && !is_frame_resource) {
+    DCHECK(content::RenderThread::IsMainThread());
     content::RenderFrame* render_frame =
         content::RenderFrame::FromRoutingID(render_frame_id);
     auto* prerender_helper =
@@ -226,8 +238,7 @@
   }
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  if (network_service_enabled &&
-      type_ == content::URLLoaderThrottleProviderType::kFrame &&
+  if (network_service_enabled && IsTypeFrame() &&
       resource_type == content::ResourceType::kObject) {
     content::RenderFrame* render_frame =
         content::RenderFrame::FromRoutingID(render_frame_id);
@@ -278,3 +289,7 @@
     extension_throttle_manager_->SetOnline(is_online);
 #endif
 }
+
+bool URLLoaderThrottleProviderImpl::IsTypeFrame() const {
+  return type_ == content::URLLoaderThrottleProviderType::kFrame;
+}
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.h b/chrome/renderer/url_loader_throttle_provider_impl.h
index f58e461..8244d02 100644
--- a/chrome/renderer/url_loader_throttle_provider_impl.h
+++ b/chrome/renderer/url_loader_throttle_provider_impl.h
@@ -47,6 +47,11 @@
   // general use.
   URLLoaderThrottleProviderImpl(const URLLoaderThrottleProviderImpl& other);
 
+  // Reports whether the provider type is frame or not. When this is true, the
+  // member functions are called on the main thread. Otherwise, they are called
+  // on worker threads.
+  bool IsTypeFrame() const;
+
   content::URLLoaderThrottleProviderType type_;
   ChromeContentRendererClient* const chrome_content_renderer_client_;
 
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 8439165..1ebd9679 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -977,6 +977,55 @@
     ]
   },
 
+  "KerberosEnabled": {
+    "os": ["chromeos"],
+    "test_policy": { "KerberosEnabled": true },
+    "pref_mappings": [
+      { "pref": "kerberos.enabled",
+        "local_state": true
+      }
+    ]
+  },
+
+  "KerberosRememberPasswordEnabled": {
+    "os": ["chromeos"],
+    "test_policy": { "KerberosRememberPasswordEnabled": false },
+    "pref_mappings": [
+      { "pref": "kerberos.remember_password_enabled" }
+    ]
+  },
+
+  "KerberosAddAccountsAllowed": {
+    "os": ["chromeos"],
+    "test_policy": { "KerberosAddAccountsAllowed": false },
+    "pref_mappings": [
+      { "pref": "kerberos.add_accounts_allowed" }
+    ]
+  },
+
+  "KerberosAccounts": {
+    "os": ["chromeos"],
+    "test_policy": {
+      "KerberosAccounts": [
+        {
+          "principal": "user1@realm",
+          "password": "password1"
+        },
+        {
+          "principal": "user2@realm",
+          "remember_password": true,
+          "krb5conf": [
+            "line1",
+            "line2"
+          ]
+        }
+      ]
+    },
+    "pref_mappings": [
+      { "pref": "kerberos.accounts" }
+    ]
+  },
+
   "PromptForDownloadLocation": {
     "os": ["win", "linux", "mac", "chromeos"],
     "test_policy": { "PromptForDownloadLocation": false },
diff --git a/chromeos/audio/BUILD.gn b/chromeos/audio/BUILD.gn
index d57dfbd9..ccda487 100644
--- a/chromeos/audio/BUILD.gn
+++ b/chromeos/audio/BUILD.gn
@@ -14,6 +14,8 @@
     "//chromeos/dbus/audio",
     "//components/prefs",
     "//media/base:video_facing",
+    "//services/media_session/public/mojom",
+    "//services/service_manager/public/cpp:cpp",
   ]
   sources = [
     "audio_device.cc",
@@ -39,6 +41,9 @@
     "//chromeos/dbus/audio",
     "//components/prefs:test_support",
     "//media/base:video_facing",
+    "//services/media_session/public/mojom",
+    "//services/service_manager/public/cpp/test:test_support",
+    "//testing/gmock",
     "//testing/gtest",
   ]
   sources = [
diff --git a/chromeos/audio/DEPS b/chromeos/audio/DEPS
index 418afb0..65d34ae 100644
--- a/chromeos/audio/DEPS
+++ b/chromeos/audio/DEPS
@@ -7,4 +7,6 @@
   "+components/prefs",
   "+media",
   "+testing",
+  "+services/media_session/public",
+  "+services/service_manager/public",
 ]
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc
index 226342d..a9c960c 100644
--- a/chromeos/audio/cras_audio_handler.cc
+++ b/chromeos/audio/cras_audio_handler.cc
@@ -21,6 +21,9 @@
 #include "base/system/system_monitor.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/audio/audio_devices_pref_handler_stub.h"
+#include "services/media_session/public/mojom/constants.mojom.h"
+#include "services/media_session/public/mojom/media_controller.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 using std::max;
 using std::min;
@@ -95,8 +98,9 @@
 
 // static
 void CrasAudioHandler::Initialize(
+    service_manager::Connector* connector,
     scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler) {
-  g_cras_audio_handler = new CrasAudioHandler(audio_pref_handler);
+  g_cras_audio_handler = new CrasAudioHandler(connector, audio_pref_handler);
 }
 
 // static
@@ -104,7 +108,8 @@
   // Make sure CrasAudioClient has been initialized.
   if (!CrasAudioClient::Get())
     CrasAudioClient::InitializeFake();
-  CrasAudioHandler::Initialize(new AudioDevicesPrefHandlerStub());
+  CrasAudioHandler::Initialize(/*connector=*/nullptr,
+                               new AudioDevicesPrefHandlerStub());
 }
 
 // static
@@ -633,8 +638,9 @@
 }
 
 CrasAudioHandler::CrasAudioHandler(
+    service_manager::Connector* connector,
     scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler)
-    : audio_pref_handler_(audio_pref_handler) {
+    : connector_(connector), audio_pref_handler_(audio_pref_handler) {
   DCHECK(audio_pref_handler);
   DCHECK(CrasAudioClient::Get());
   CrasAudioClient::Get()->AddObserver(this);
@@ -1154,6 +1160,17 @@
   return found_active_device;
 }
 
+void CrasAudioHandler::PauseAllStreams() {
+  if (!connector_) {
+    LOG(ERROR) << "Failed to get connector";
+    return;
+  }
+  media_session::mojom::MediaControllerManagerPtr controller_manager_ptr;
+  connector_->BindInterface(media_session::mojom::kServiceName,
+                            mojo::MakeRequest(&controller_manager_ptr));
+  controller_manager_ptr->SuspendAllSessions();
+}
+
 void CrasAudioHandler::HandleNonHotplugNodesChange(
     bool is_input,
     const AudioDevicePriorityQueue& hotplug_nodes,
@@ -1175,8 +1192,14 @@
       }
 
       if (active_device_removed) {
+        // Pauses active streams when the active output device is
+        // removed.
+        if (!is_input)
+          PauseAllStreams();
+
         // Unplugged the current active device.
         SwitchToTopPriorityDevice(is_input);
+
         return;
       }
     }
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h
index 1603d6d..9dbd708 100644
--- a/chromeos/audio/cras_audio_handler.h
+++ b/chromeos/audio/cras_audio_handler.h
@@ -31,6 +31,10 @@
 class SingleThreadTaskRunner;
 }
 
+namespace service_manager {
+class Connector;
+}
+
 namespace chromeos {
 
 class AudioDevicesPrefHandler;
@@ -98,6 +102,7 @@
 
   // Sets the global instance. Must be called before any calls to Get().
   static void Initialize(
+      service_manager::Connector* connector,
       scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler);
 
   // Sets the global instance for testing.
@@ -278,6 +283,7 @@
 
  protected:
   explicit CrasAudioHandler(
+      service_manager::Connector* connector,
       scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler);
   ~CrasAudioHandler() override;
 
@@ -428,6 +434,9 @@
   // among the current |audio_devices_|.
   bool GetActiveDeviceFromUserPref(bool is_input, AudioDevice* device);
 
+  // Pauses all active streams.
+  void PauseAllStreams();
+
   // Handles either input or output device changes, specified by |is_input|.
   void HandleAudioDeviceChange(bool is_input,
                                const AudioDevicePriorityQueue& devices_pq,
@@ -498,6 +507,8 @@
   void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing);
   void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing);
 
+  service_manager::Connector* const connector_;
+
   scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler_;
   base::ObserverList<AudioObserver>::Unchecked observers_;
 
diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc
index 5b5405d..59c1499 100644
--- a/chromeos/audio/cras_audio_handler_unittest.cc
+++ b/chromeos/audio/cras_audio_handler_unittest.cc
@@ -23,11 +23,58 @@
 #include "chromeos/dbus/audio/audio_node.h"
 #include "chromeos/dbus/audio/fake_cras_audio_client.h"
 #include "media/base/video_facing.h"
+#include "services/media_session/public/mojom/constants.mojom.h"
+#include "services/media_session/public/mojom/media_controller.mojom-test-utils.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
+#include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/cpp/test/test_connector_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
 namespace {
 
+class FakeMediaSessionService
+    : public media_session::mojom::MediaControllerManagerInterceptorForTesting,
+      public service_manager::Service {
+ public:
+  explicit FakeMediaSessionService(
+      service_manager::mojom::ServiceRequest request)
+      : binding_(this, std::move(request)) {
+    binder_registry_.AddInterface(base::BindRepeating(
+        &FakeMediaSessionService::BindMediaControllerManagerRequest,
+        base::Unretained(this)));
+  }
+
+  MOCK_METHOD0(SuspendAllSessions, void());
+
+ private:
+  // service_manager::Service:
+  void OnConnect(const service_manager::BindSourceInfo& source,
+                 const std::string& interface_name,
+                 mojo::ScopedMessagePipeHandle interface_pipe) override {
+    binder_registry_.BindInterface(interface_name, std::move(interface_pipe));
+  }
+
+  // media_session::mojom::MediaControllerManagerInterceptorForTesting:
+  MediaControllerManager* GetForwardingInterface() override {
+    NOTREACHED();
+    return nullptr;
+  }
+
+  void BindMediaControllerManagerRequest(
+      media_session::mojom::MediaControllerManagerRequest request) {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+  service_manager::ServiceBinding binding_;
+  service_manager::BinderRegistry binder_registry_;
+  mojo::BindingSet<media_session::mojom::MediaControllerManager> bindings_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeMediaSessionService);
+};
+
 const uint64_t kInternalSpeakerId = 10001;
 const uint64_t kHeadphoneId = 10002;
 const uint64_t kInternalMicId = 10003;
@@ -266,6 +313,9 @@
   ~CrasAudioHandlerTest() override = default;
 
   void SetUp() override {
+    fake_service_ = std::make_unique<FakeMediaSessionService>(
+        connector_factory_.RegisterInstance(
+            media_session::mojom::kServiceName));
     system_monitor_.AddDevicesChangedObserver(&system_monitor_observer_);
     video_capture_manager_.reset(new FakeVideoCaptureManager);
   }
@@ -303,7 +353,8 @@
     CrasAudioClient::InitializeFake();
     fake_cras_audio_client()->SetAudioNodesForTesting(audio_nodes);
     audio_pref_handler_ = new AudioDevicesPrefHandlerStub();
-    CrasAudioHandler::Initialize(audio_pref_handler_);
+    CrasAudioHandler::Initialize(connector_factory_.GetDefaultConnector(),
+                                 audio_pref_handler_);
     cras_audio_handler_ = CrasAudioHandler::Get();
     test_observer_.reset(new TestObserver);
     cras_audio_handler_->AddAudioObserver(test_observer_.get());
@@ -335,7 +386,8 @@
     EXPECT_EQ(activate_by, activate_by_user);
 
     fake_cras_audio_client()->SetAudioNodesForTesting(audio_nodes);
-    CrasAudioHandler::Initialize(audio_pref_handler_);
+    CrasAudioHandler::Initialize(connector_factory_.GetDefaultConnector(),
+                                 audio_pref_handler_);
 
     cras_audio_handler_ = CrasAudioHandler::Get();
     test_observer_.reset(new TestObserver);
@@ -350,7 +402,8 @@
     fake_cras_audio_client()->SetAudioNodesForTesting(audio_nodes);
     fake_cras_audio_client()->SetActiveOutputNode(primary_active_node.id);
     audio_pref_handler_ = new AudioDevicesPrefHandlerStub();
-    CrasAudioHandler::Initialize(audio_pref_handler_);
+    CrasAudioHandler::Initialize(connector_factory_.GetDefaultConnector(),
+                                 audio_pref_handler_);
     cras_audio_handler_ = CrasAudioHandler::Get();
     test_observer_.reset(new TestObserver);
     cras_audio_handler_->AddAudioObserver(test_observer_.get());
@@ -437,7 +490,9 @@
   CrasAudioHandler* cras_audio_handler_ = nullptr;         // Not owned.
   std::unique_ptr<TestObserver> test_observer_;
   scoped_refptr<AudioDevicesPrefHandlerStub> audio_pref_handler_;
+  std::unique_ptr<FakeMediaSessionService> fake_service_;
   std::unique_ptr<FakeVideoCaptureManager> video_capture_manager_;
+  service_manager::TestConnectorFactory connector_factory_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(CrasAudioHandlerTest);
@@ -4175,4 +4230,45 @@
             cras_audio_handler_->GetPrimaryActiveOutputNode());
 }
 
+TEST_P(CrasAudioHandlerTest, SuspendAllSessionsForOutput) {
+  // Set up initial output audio devices, with internal speaker, headphone and
+  // USBHeadphone.
+  AudioNodeList audio_nodes =
+      GenerateAudioNodeList({kInternalSpeaker, kHeadphone, kUSBHeadphone1});
+  SetUpCrasAudioHandler(audio_nodes);
+
+  // Verify the headphone has been selected as the active output.
+  AudioDevice active_output;
+  EXPECT_TRUE(
+      cras_audio_handler_->GetPrimaryActiveOutputDevice(&active_output));
+  EXPECT_EQ(kHeadphone->id, active_output.id);
+  EXPECT_EQ(kHeadphone->id, cras_audio_handler_->GetPrimaryActiveOutputNode());
+
+  // Unplug USBHeadphone should not suspend media sessions.
+  EXPECT_CALL(*fake_service_.get(), SuspendAllSessions).Times(0);
+  audio_nodes = GenerateAudioNodeList({kInternalSpeaker, kHeadphone});
+  ChangeAudioNodes(audio_nodes);
+
+  // Unplug active output device should suspend all media sessions.
+  EXPECT_CALL(*fake_service_.get(), SuspendAllSessions).Times(1);
+  audio_nodes.clear();
+  audio_nodes.push_back(GenerateAudioNode(kInternalSpeaker));
+  ChangeAudioNodes(audio_nodes);
+}
+
+TEST_P(CrasAudioHandlerTest, SuspendAllSessionsForInput) {
+  // Set up initial input audio devices, with internal mic and mic jack.
+  AudioNodeList audio_nodes = GenerateAudioNodeList({kInternalMic, kMicJack});
+  SetUpCrasAudioHandler(audio_nodes);
+
+  // Verify the mic jack has been selected as the active input.
+  EXPECT_EQ(kMicJack->id, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+  // Unplug active input device should not suspend media sessions.
+  EXPECT_CALL(*fake_service_.get(), SuspendAllSessions).Times(0);
+  audio_nodes.clear();
+  audio_nodes.push_back(GenerateAudioNode(kInternalMic));
+  ChangeAudioNodes(audio_nodes);
+}
+
 }  // namespace chromeos
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 616026a6..f9e34fbd 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -179,6 +179,23 @@
       <message name="IDS_ASH_SHELF_APP_LIST_LAUNCHER_SYNCING_TITLE" desc="The title used for the Ash Launcher in the Shelf to indicate loading/syncinc apps.">
         Launcher (syncing apps...)
       </message>
+
+      <!-- Password expiry notifications -->
+      <message name="IDS_PASSWORD_HAS_EXPIRED_TITLE" desc="Title for a notification that tells the user their password has expired.">
+        Password has expired
+      </message>
+      <message name="IDS_PASSWORD_WILL_EXPIRE_TITLE" desc="Title for a notification that tells the user their password will soon expire.">
+        Password will soon expire
+      </message>
+      <message name="IDS_PASSWORD_EXPIRY_DAYS_BODY" desc="Message body for a notification that tells the user their password will expire in less than some number of days (where 0 days means it has expired).">
+        {NUM_DAYS, plural,
+         =0 {Your current password has expired!}
+         =1 {Your current password will expire in less than one day!}
+         other {Your current password will expire in less than # days!}}
+      </message>
+      <message name="IDS_PASSWORD_EXPIRY_CHOOSE_NEW_PASSWORD_LINK" desc="Added to the message body on a notification to explain that clicking the notification will open a dialog where a new password can be chosen.">
+        Click here to choose a new password
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_CHOOSE_NEW_PASSWORD_LINK.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_CHOOSE_NEW_PASSWORD_LINK.png.sha1
new file mode 100644
index 0000000..230f66f
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_CHOOSE_NEW_PASSWORD_LINK.png.sha1
@@ -0,0 +1 @@
+9d1f66e08d707cc3babe1c353f4417b650a71e10
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_DAYS_BODY.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_DAYS_BODY.png.sha1
new file mode 100644
index 0000000..e47cc33
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PASSWORD_EXPIRY_DAYS_BODY.png.sha1
@@ -0,0 +1 @@
+b366c7de23360f520bc22e2a4ca1b302235db07d
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PASSWORD_HAS_EXPIRED_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PASSWORD_HAS_EXPIRED_TITLE.png.sha1
new file mode 100644
index 0000000..f8ddd69
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PASSWORD_HAS_EXPIRED_TITLE.png.sha1
@@ -0,0 +1 @@
+e7ea394b117193e4506f11bb87d47e88dad64a97
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PASSWORD_WILL_EXPIRE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PASSWORD_WILL_EXPIRE_TITLE.png.sha1
new file mode 100644
index 0000000..6a2d8e0f
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PASSWORD_WILL_EXPIRE_TITLE.png.sha1
@@ -0,0 +1 @@
+54f9f5c62799b5a050152f23982b4eb275ee1e4c
\ No newline at end of file
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index 06ee0cc..6a53165 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -233,9 +233,6 @@
 // Disables requests for an enterprise machine certificate during attestation.
 const char kDisableMachineCertRequest[] = "disable-machine-cert-request";
 
-// Disables mtp write support.
-const char kDisableMtpWriteSupport[] = "disable-mtp-write-support";
-
 // Disables the multiple display layout UI.
 const char kDisableMultiDisplayLayout[] = "disable-multi-display-layout";
 
diff --git a/chromeos/constants/chromeos_switches.h b/chromeos/constants/chromeos_switches.h
index f60117e..3be55f3f 100644
--- a/chromeos/constants/chromeos_switches.h
+++ b/chromeos/constants/chromeos_switches.h
@@ -84,8 +84,6 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const char kDisableMachineCertRequest[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
-extern const char kDisableMtpWriteSupport[];
-COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const char kDisableMultiDisplayLayout[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kDisableNewZIPUnpacker[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
index f04ddd2..cc9e181 100644
--- a/chromeos/dbus/dbus_thread_manager.cc
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -28,7 +28,6 @@
 #include "chromeos/dbus/lorgnette_manager_client.h"
 #include "chromeos/dbus/runtime_probe_client.h"
 #include "chromeos/dbus/seneschal_client.h"
-#include "chromeos/dbus/shill/gsm_sms_client.h"
 #include "chromeos/dbus/shill/modem_messaging_client.h"
 #include "chromeos/dbus/shill/shill_clients.h"
 #include "chromeos/dbus/shill/shill_device_client.h"
@@ -183,10 +182,6 @@
   return ShillThirdPartyVpnDriverClient::Get();
 }
 
-GsmSMSClient* DBusThreadManager::GetGsmSMSClient() {
-  return GsmSMSClient::Get();
-}
-
 ImageBurnerClient* DBusThreadManager::GetImageBurnerClient() {
   return clients_browser_ ? clients_browser_->image_burner_client_.get()
                           : nullptr;
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h
index 8e56bbb..2945592 100644
--- a/chromeos/dbus/dbus_thread_manager.h
+++ b/chromeos/dbus/dbus_thread_manager.h
@@ -37,7 +37,6 @@
 class DebugDaemonClient;
 class DiagnosticsdClient;
 class EasyUnlockClient;
-class GsmSMSClient;
 class ImageBurnerClient;
 class ImageLoaderClient;
 class LorgnetteManagerClient;
@@ -137,7 +136,6 @@
 
   // DEPRECATED, DO NOT USE. The static getter for each of these classes should
   // be used instead. TODO(stevenjb): Remove. https://crbug.com/948390.
-  GsmSMSClient* GetGsmSMSClient();
   ModemMessagingClient* GetModemMessagingClient();
   SMSClient* GetSMSClient();
   ShillDeviceClient* GetShillDeviceClient();
diff --git a/chromeos/dbus/dbus_thread_manager_unittest.cc b/chromeos/dbus/dbus_thread_manager_unittest.cc
index 9898cbc..0502721 100644
--- a/chromeos/dbus/dbus_thread_manager_unittest.cc
+++ b/chromeos/dbus/dbus_thread_manager_unittest.cc
@@ -28,7 +28,6 @@
   EXPECT_TRUE(manager->GetCrosDisksClient());
   EXPECT_TRUE(manager->GetDebugDaemonClient());
   EXPECT_TRUE(manager->GetEasyUnlockClient());
-  EXPECT_TRUE(manager->GetGsmSMSClient());
   EXPECT_TRUE(manager->GetImageBurnerClient());
   EXPECT_TRUE(manager->GetLorgnetteManagerClient());
   EXPECT_TRUE(manager->GetModemMessagingClient());
@@ -53,7 +52,6 @@
   ASSERT_TRUE(manager);
 
   // Common clients were created.
-  EXPECT_TRUE(manager->GetGsmSMSClient());
   EXPECT_TRUE(manager->GetModemMessagingClient());
   EXPECT_TRUE(manager->GetShillDeviceClient());
   EXPECT_TRUE(manager->GetShillIPConfigClient());
@@ -87,7 +85,6 @@
   ASSERT_TRUE(manager);
 
   // Common clients were created.
-  EXPECT_TRUE(manager->GetGsmSMSClient());
   EXPECT_TRUE(manager->GetModemMessagingClient());
   EXPECT_TRUE(manager->GetShillDeviceClient());
   EXPECT_TRUE(manager->GetShillIPConfigClient());
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc
index cfc3e668..515e419 100644
--- a/chromeos/dbus/session_manager/fake_session_manager_client.cc
+++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -528,6 +528,16 @@
 
 void FakeSessionManagerClient::GetServerBackedStateKeys(
     StateKeysCallback callback) {
+  if (force_state_keys_missing_) {
+    // Need delay to prevent excessive warning output in tests caused by being
+    // retried in a tight loop.
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(std::move(callback), std::vector<std::string>()),
+        base::TimeDelta::FromSeconds(1));
+    return;
+  }
+
   if (policy_storage_ == PolicyStorageType::kOnDisk) {
     base::FilePath owner_key_path;
     CHECK(base::PathService::Get(dbus_paths::FILE_OWNER_KEY, &owner_key_path));
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.h b/chromeos/dbus/session_manager/fake_session_manager_client.h
index 8bfc57be..62028a40 100644
--- a/chromeos/dbus/session_manager/fake_session_manager_client.h
+++ b/chromeos/dbus/session_manager/fake_session_manager_client.h
@@ -230,6 +230,10 @@
 
   void set_low_disk(bool low_disk) { low_disk_ = low_disk; }
 
+  void set_force_state_keys_missing(bool force_state_keys_missing) {
+    force_state_keys_missing_ = force_state_keys_missing;
+  }
+
   const std::string& container_instance_id() const {
     return container_instance_id_;
   }
@@ -263,6 +267,7 @@
   int start_tpm_firmware_update_call_count_ = 0;
   std::string last_tpm_firmware_update_mode_;
   bool screen_is_locked_ = false;
+  bool force_state_keys_missing_ = false;
 
   bool arc_available_ = false;
   base::TimeTicks arc_start_time_;
diff --git a/chromeos/dbus/shill/BUILD.gn b/chromeos/dbus/shill/BUILD.gn
index 021cc42..fe4f8f2 100644
--- a/chromeos/dbus/shill/BUILD.gn
+++ b/chromeos/dbus/shill/BUILD.gn
@@ -17,8 +17,6 @@
   ]
 
   sources = [
-    "fake_gsm_sms_client.cc",
-    "fake_gsm_sms_client.h",
     "fake_modem_messaging_client.cc",
     "fake_modem_messaging_client.h",
     "fake_shill_device_client.cc",
@@ -35,8 +33,6 @@
     "fake_shill_third_party_vpn_driver_client.h",
     "fake_sms_client.cc",
     "fake_sms_client.h",
-    "gsm_sms_client.cc",
-    "gsm_sms_client.h",
     "modem_messaging_client.cc",
     "modem_messaging_client.h",
     "shill_client_helper.cc",
@@ -77,7 +73,6 @@
   ]
 
   sources = [
-    "gsm_sms_client_unittest.cc",
     "modem_messaging_client_unittest.cc",
     "shill_client_unittest_base.cc",
     "shill_client_unittest_base.h",
diff --git a/chromeos/dbus/shill/fake_gsm_sms_client.cc b/chromeos/dbus/shill/fake_gsm_sms_client.cc
deleted file mode 100644
index 77301505..0000000
--- a/chromeos/dbus/shill/fake_gsm_sms_client.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 2013 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 "chromeos/dbus/shill/fake_gsm_sms_client.h"
-
-#include <stdint.h>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/location.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chromeos/dbus/constants/dbus_switches.h"
-
-namespace chromeos {
-
-FakeGsmSMSClient::FakeGsmSMSClient()
-    : test_index_(-1),
-      sms_test_message_switch_present_(
-          base::CommandLine::ForCurrentProcess()->HasSwitch(
-              chromeos::switches::kSmsTestMessages)),
-      weak_ptr_factory_(this) {
-  test_messages_.push_back("Test Message 0");
-  test_messages_.push_back("Test Message 1");
-  test_messages_.push_back("Test a relatively long message 2");
-  test_messages_.push_back(
-      "Test a very, the quick brown fox jumped"
-      " over the lazy dog, long message 3");
-  test_messages_.push_back("Test Message 4");
-  test_messages_.push_back("Test Message 5");
-  test_messages_.push_back("Test Message 6");
-}
-
-FakeGsmSMSClient::~FakeGsmSMSClient() = default;
-
-void FakeGsmSMSClient::SetSmsReceivedHandler(
-    const std::string& service_name,
-    const dbus::ObjectPath& object_path,
-    const SmsReceivedHandler& handler) {
-  handler_ = handler;
-}
-
-void FakeGsmSMSClient::ResetSmsReceivedHandler(
-    const std::string& service_name,
-    const dbus::ObjectPath& object_path) {
-  handler_.Reset();
-}
-
-void FakeGsmSMSClient::Delete(const std::string& service_name,
-                              const dbus::ObjectPath& object_path,
-                              uint32_t index,
-                              VoidDBusMethodCallback callback) {
-  message_list_.Remove(index, nullptr);
-  std::move(callback).Run(true);
-}
-
-void FakeGsmSMSClient::Get(const std::string& service_name,
-                           const dbus::ObjectPath& object_path,
-                           uint32_t index,
-                           DBusMethodCallback<base::DictionaryValue> callback) {
-  base::DictionaryValue* dictionary = nullptr;
-  if (!message_list_.GetDictionary(index, &dictionary)) {
-    std::move(callback).Run(base::nullopt);
-    return;
-  }
-
-  // TODO(crbug.com/646113): Once migration is done, this can be simplified.
-  base::DictionaryValue copy;
-  copy.MergeDictionary(dictionary);
-  std::move(callback).Run(std::move(copy));
-}
-
-void FakeGsmSMSClient::List(const std::string& service_name,
-                            const dbus::ObjectPath& object_path,
-                            DBusMethodCallback<base::ListValue> callback) {
-  std::move(callback).Run(base::ListValue(message_list_.GetList()));
-}
-
-void FakeGsmSMSClient::RequestUpdate(const std::string& service_name,
-                                     const dbus::ObjectPath& object_path) {
-  if (!sms_test_message_switch_present_)
-    return;
-
-  if (test_index_ >= 0)
-    return;
-  test_index_ = 0;
-  // Call PushTestMessageChain asynchronously so that the handler_ callback
-  // does not get called from the update request.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&FakeGsmSMSClient::PushTestMessageChain,
-                                weak_ptr_factory_.GetWeakPtr()));
-}
-
-void FakeGsmSMSClient::PushTestMessageChain() {
-  if (PushTestMessage())
-    PushTestMessageDelayed();
-}
-
-void FakeGsmSMSClient::PushTestMessageDelayed() {
-  const int kSmsMessageDelaySeconds = 5;
-  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&FakeGsmSMSClient::PushTestMessageChain,
-                     weak_ptr_factory_.GetWeakPtr()),
-      base::TimeDelta::FromSeconds(kSmsMessageDelaySeconds));
-}
-
-bool FakeGsmSMSClient::PushTestMessage() {
-  if (test_index_ >= static_cast<int>(test_messages_.size()))
-    return false;
-  auto message = std::make_unique<base::DictionaryValue>();
-  message->SetString("number", "000-000-0000");
-  message->SetString("text", test_messages_[test_index_]);
-  message->SetInteger("index", test_index_);
-  int msg_index = message_list_.GetSize();
-  message_list_.Append(std::move(message));
-  if (!handler_.is_null())
-    handler_.Run(msg_index, true);
-  ++test_index_;
-  return true;
-}
-
-}  // namespace chromeos
diff --git a/chromeos/dbus/shill/fake_gsm_sms_client.h b/chromeos/dbus/shill/fake_gsm_sms_client.h
deleted file mode 100644
index 12873c1..0000000
--- a/chromeos/dbus/shill/fake_gsm_sms_client.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2013 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 CHROMEOS_DBUS_SHILL_FAKE_GSM_SMS_CLIENT_H_
-#define CHROMEOS_DBUS_SHILL_FAKE_GSM_SMS_CLIENT_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/values.h"
-#include "chromeos/dbus/shill/gsm_sms_client.h"
-#include "dbus/object_path.h"
-
-namespace chromeos {
-
-// A fake implementation of GsmSMSClient used for tests.
-class COMPONENT_EXPORT(SHILL_CLIENT) FakeGsmSMSClient : public GsmSMSClient {
- public:
-  FakeGsmSMSClient();
-  ~FakeGsmSMSClient() override;
-
-  // GsmSMSClient overrides
-  void SetSmsReceivedHandler(const std::string& service_name,
-                             const dbus::ObjectPath& object_path,
-                             const SmsReceivedHandler& handler) override;
-  void ResetSmsReceivedHandler(const std::string& service_name,
-                               const dbus::ObjectPath& object_path) override;
-  void Delete(const std::string& service_name,
-              const dbus::ObjectPath& object_path,
-              uint32_t index,
-              VoidDBusMethodCallback callback) override;
-  void Get(const std::string& service_name,
-           const dbus::ObjectPath& object_path,
-           uint32_t index,
-           DBusMethodCallback<base::DictionaryValue> callback) override;
-  void List(const std::string& service_name,
-            const dbus::ObjectPath& object_path,
-            DBusMethodCallback<base::ListValue> callback) override;
-  void RequestUpdate(const std::string& service_name,
-                     const dbus::ObjectPath& object_path) override;
-
- private:
-  void PushTestMessageChain();
-  void PushTestMessageDelayed();
-  bool PushTestMessage();
-
-  int test_index_;
-  std::vector<std::string> test_messages_;
-  base::ListValue message_list_;
-  SmsReceivedHandler handler_;
-
-  bool sms_test_message_switch_present_;
-
-  base::WeakPtrFactory<FakeGsmSMSClient> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeGsmSMSClient);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_DBUS_SHILL_FAKE_GSM_SMS_CLIENT_H_
diff --git a/chromeos/dbus/shill/gsm_sms_client.cc b/chromeos/dbus/shill/gsm_sms_client.cc
deleted file mode 100644
index 8d49a31..0000000
--- a/chromeos/dbus/shill/gsm_sms_client.cc
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (c) 2012 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 "chromeos/dbus/shill/gsm_sms_client.h"
-
-#include <stdint.h>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "chromeos/dbus/shill/fake_gsm_sms_client.h"
-#include "chromeos/dbus/shill/fake_sms_client.h"
-#include "dbus/bus.h"
-#include "dbus/message.h"
-#include "dbus/object_proxy.h"
-#include "dbus/values_util.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-namespace chromeos {
-
-namespace {
-
-GsmSMSClient* g_instance = nullptr;
-
-// A class actually making method calls for SMS services, used by
-// GsmSMSClientImpl.
-class SMSProxy {
- public:
-  typedef GsmSMSClient::SmsReceivedHandler SmsReceivedHandler;
-
-  SMSProxy(dbus::Bus* bus,
-           const std::string& service_name,
-           const dbus::ObjectPath& object_path)
-      : proxy_(bus->GetObjectProxy(service_name, object_path)),
-        weak_ptr_factory_(this) {
-    proxy_->ConnectToSignal(
-        modemmanager::kModemManagerSMSInterface,
-        modemmanager::kSMSReceivedSignal,
-        base::Bind(&SMSProxy::OnSmsReceived, weak_ptr_factory_.GetWeakPtr()),
-        base::BindOnce(&SMSProxy::OnSignalConnected,
-                       weak_ptr_factory_.GetWeakPtr()));
-  }
-
-  // Sets SmsReceived signal handler.
-  void SetSmsReceivedHandler(const SmsReceivedHandler& handler) {
-    DCHECK(sms_received_handler_.is_null());
-    sms_received_handler_ = handler;
-  }
-
-  // Resets SmsReceived signal handler.
-  void ResetSmsReceivedHandler() { sms_received_handler_.Reset(); }
-
-  // Calls Delete method.
-  void Delete(uint32_t index, VoidDBusMethodCallback callback) {
-    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
-                                 modemmanager::kSMSDeleteFunction);
-    dbus::MessageWriter writer(&method_call);
-    writer.AppendUint32(index);
-    proxy_->CallMethod(
-        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-        base::BindOnce(&SMSProxy::OnDelete, weak_ptr_factory_.GetWeakPtr(),
-                       std::move(callback)));
-  }
-
-  // Calls Get method.
-  void Get(uint32_t index, DBusMethodCallback<base::DictionaryValue> callback) {
-    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
-                                 modemmanager::kSMSGetFunction);
-    dbus::MessageWriter writer(&method_call);
-    writer.AppendUint32(index);
-    proxy_->CallMethod(
-        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-        base::BindOnce(&SMSProxy::OnGet, weak_ptr_factory_.GetWeakPtr(),
-                       std::move(callback)));
-  }
-
-  // Calls List method.
-  void List(DBusMethodCallback<base::ListValue> callback) {
-    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
-                                 modemmanager::kSMSListFunction);
-    proxy_->CallMethod(
-        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-        base::BindOnce(&SMSProxy::OnList, weak_ptr_factory_.GetWeakPtr(),
-                       std::move(callback)));
-  }
-
- private:
-  // Handles SmsReceived signal.
-  void OnSmsReceived(dbus::Signal* signal) {
-    uint32_t index = 0;
-    bool complete = false;
-    dbus::MessageReader reader(signal);
-    if (!reader.PopUint32(&index) || !reader.PopBool(&complete)) {
-      LOG(ERROR) << "Invalid signal: " << signal->ToString();
-      return;
-    }
-    if (!sms_received_handler_.is_null())
-      sms_received_handler_.Run(index, complete);
-  }
-
-  // Handles the result of signal connection setup.
-  void OnSignalConnected(const std::string& interface,
-                         const std::string& signal,
-                         bool succeeded) {
-    LOG_IF(ERROR, !succeeded)
-        << "Connect to " << interface << " " << signal << " failed.";
-  }
-
-  // Handles responses of Delete method calls.
-  void OnDelete(VoidDBusMethodCallback callback, dbus::Response* response) {
-    std::move(callback).Run(response);
-  }
-
-  // Handles responses of Get method calls.
-  void OnGet(DBusMethodCallback<base::DictionaryValue> callback,
-             dbus::Response* response) {
-    if (!response) {
-      std::move(callback).Run(base::nullopt);
-      return;
-    }
-    dbus::MessageReader reader(response);
-    auto value = base::DictionaryValue::From(dbus::PopDataAsValue(&reader));
-    if (!value) {
-      LOG(WARNING) << "Invalid response: " << response->ToString();
-      std::move(callback).Run(base::nullopt);
-      return;
-    }
-    std::move(callback).Run(std::move(*value));
-  }
-
-  // Handles responses of List method calls.
-  void OnList(DBusMethodCallback<base::ListValue> callback,
-              dbus::Response* response) {
-    if (!response) {
-      std::move(callback).Run(base::nullopt);
-      return;
-    }
-    dbus::MessageReader reader(response);
-    auto value = base::ListValue::From(dbus::PopDataAsValue(&reader));
-    if (!value) {
-      LOG(WARNING) << "Invalid response: " << response->ToString();
-      std::move(callback).Run(base::nullopt);
-      return;
-    }
-    std::move(callback).Run(std::move(*value));
-  }
-
-  dbus::ObjectProxy* proxy_;
-  SmsReceivedHandler sms_received_handler_;
-
-  // Note: This should remain the last member so it'll be destroyed and
-  // invalidate its weak pointers before any other members are destroyed.
-  base::WeakPtrFactory<SMSProxy> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(SMSProxy);
-};
-
-// The GsmSMSClient implementation.
-class GsmSMSClientImpl : public GsmSMSClient {
- public:
-  explicit GsmSMSClientImpl(dbus::Bus* bus) : bus_(bus) {}
-  ~GsmSMSClientImpl() override = default;
-
-  // GsmSMSClient override.
-  void SetSmsReceivedHandler(const std::string& service_name,
-                             const dbus::ObjectPath& object_path,
-                             const SmsReceivedHandler& handler) override {
-    GetProxy(service_name, object_path)->SetSmsReceivedHandler(handler);
-  }
-
-  // GsmSMSClient override.
-  void ResetSmsReceivedHandler(const std::string& service_name,
-                               const dbus::ObjectPath& object_path) override {
-    GetProxy(service_name, object_path)->ResetSmsReceivedHandler();
-  }
-
-  // GsmSMSClient override.
-  void Delete(const std::string& service_name,
-              const dbus::ObjectPath& object_path,
-              uint32_t index,
-              VoidDBusMethodCallback callback) override {
-    GetProxy(service_name, object_path)->Delete(index, std::move(callback));
-  }
-
-  // GsmSMSClient override.
-  void Get(const std::string& service_name,
-           const dbus::ObjectPath& object_path,
-           uint32_t index,
-           DBusMethodCallback<base::DictionaryValue> callback) override {
-    GetProxy(service_name, object_path)->Get(index, std::move(callback));
-  }
-
-  // GsmSMSClient override.
-  void List(const std::string& service_name,
-            const dbus::ObjectPath& object_path,
-            DBusMethodCallback<base::ListValue> callback) override {
-    GetProxy(service_name, object_path)->List(std::move(callback));
-  }
-
-  // GsmSMSClient override.
-  void RequestUpdate(const std::string& service_name,
-                     const dbus::ObjectPath& object_path) override {}
-
- private:
-  using ProxyMap =
-      std::map<std::pair<std::string, std::string>, std::unique_ptr<SMSProxy>>;
-
-  // Returns a SMSProxy for the given service name and object path.
-  SMSProxy* GetProxy(const std::string& service_name,
-                     const dbus::ObjectPath& object_path) {
-    const ProxyMap::key_type key(service_name, object_path.value());
-    ProxyMap::const_iterator it = proxies_.find(key);
-    if (it != proxies_.end())
-      return it->second.get();
-
-    // There is no proxy for the service_name and object_path, create it.
-    std::unique_ptr<SMSProxy> proxy(
-        new SMSProxy(bus_, service_name, object_path));
-    SMSProxy* proxy_ptr = proxy.get();
-    proxies_[key] = std::move(proxy);
-    return proxy_ptr;
-  }
-
-  dbus::Bus* bus_;
-  ProxyMap proxies_;
-
-  DISALLOW_COPY_AND_ASSIGN(GsmSMSClientImpl);
-};
-
-}  // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// GsmSMSClient
-
-GsmSMSClient::GsmSMSClient() {
-  DCHECK(!g_instance);
-  g_instance = this;
-}
-
-GsmSMSClient::~GsmSMSClient() {
-  DCHECK_EQ(this, g_instance);
-  g_instance = nullptr;
-}
-
-// static
-void GsmSMSClient::Initialize(dbus::Bus* bus) {
-  DCHECK(bus);
-  new GsmSMSClientImpl(bus);
-}
-
-// static
-void GsmSMSClient::InitializeFake() {
-  new FakeGsmSMSClient;
-}
-
-// static
-void GsmSMSClient::Shutdown() {
-  DCHECK(g_instance);
-  delete g_instance;
-}
-
-// static
-GsmSMSClient* GsmSMSClient::Get() {
-  return g_instance;
-}
-
-}  // namespace chromeos
diff --git a/chromeos/dbus/shill/gsm_sms_client.h b/chromeos/dbus/shill/gsm_sms_client.h
deleted file mode 100644
index 5d65a2a..0000000
--- a/chromeos/dbus/shill/gsm_sms_client.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2012 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 CHROMEOS_DBUS_SHILL_GSM_SMS_CLIENT_H_
-#define CHROMEOS_DBUS_SHILL_GSM_SMS_CLIENT_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "chromeos/dbus/dbus_method_call_status.h"
-
-namespace base {
-class DictionaryValue;
-class ListValue;
-}  // namespace base
-
-namespace dbus {
-class Bus;
-class ObjectPath;
-}  // namespace dbus
-
-namespace chromeos {
-
-// GsmSMSClient is used to communicate with the
-// org.freedesktop.ModemManager.Modem.Gsm.SMS service.
-// All methods should be called from the origin thread (UI thread) which
-// initializes the DBusThreadManager instance.
-class COMPONENT_EXPORT(SHILL_CLIENT) GsmSMSClient {
- public:
-  typedef base::Callback<void(uint32_t index, bool complete)>
-      SmsReceivedHandler;
-
-  // Creates and initializes the global instance. |bus| must not be null.
-  static void Initialize(dbus::Bus* bus);
-
-  // Creates the global instance with a fake implementation.
-  static void InitializeFake();
-
-  // Destroys the global instance which must have been initialized.
-  static void Shutdown();
-
-  // Returns the global instance if initialized. May return null.
-  static GsmSMSClient* Get();
-
-  // Sets SmsReceived signal handler.
-  virtual void SetSmsReceivedHandler(const std::string& service_name,
-                                     const dbus::ObjectPath& object_path,
-                                     const SmsReceivedHandler& handler) = 0;
-
-  // Resets SmsReceived signal handler.
-  virtual void ResetSmsReceivedHandler(const std::string& service_name,
-                                       const dbus::ObjectPath& object_path) = 0;
-
-  // Calls Delete method.  |callback| is called on method call completion.
-  virtual void Delete(const std::string& service_name,
-                      const dbus::ObjectPath& object_path,
-                      uint32_t index,
-                      VoidDBusMethodCallback callback) = 0;
-
-  // Calls Get method.  |callback| is called on method call completion.
-  virtual void Get(const std::string& service_name,
-                   const dbus::ObjectPath& object_path,
-                   uint32_t index,
-                   DBusMethodCallback<base::DictionaryValue> callback) = 0;
-
-  // Calls List method.  |callback| is called on method call completion.
-  virtual void List(const std::string& service_name,
-                    const dbus::ObjectPath& object_path,
-                    DBusMethodCallback<base::ListValue> callback) = 0;
-
-  // Requests a check for new messages. In shill this does nothing. The
-  // stub implementation uses it to generate a sequence of test messages.
-  virtual void RequestUpdate(const std::string& service_name,
-                             const dbus::ObjectPath& object_path) = 0;
-
- protected:
-  friend class GsmSMSClientTest;
-
-  // Initialize/Shutdown should be used instead.
-  GsmSMSClient();
-  virtual ~GsmSMSClient();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(GsmSMSClient);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_DBUS_SHILL_GSM_SMS_CLIENT_H_
diff --git a/chromeos/dbus/shill/gsm_sms_client_unittest.cc b/chromeos/dbus/shill/gsm_sms_client_unittest.cc
deleted file mode 100644
index 70b707f9..0000000
--- a/chromeos/dbus/shill/gsm_sms_client_unittest.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright (c) 2012 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 "chromeos/dbus/shill/gsm_sms_client.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/values.h"
-#include "dbus/message.h"
-#include "dbus/mock_bus.h"
-#include "dbus/mock_object_proxy.h"
-#include "dbus/object_path.h"
-#include "dbus/values_util.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-using ::testing::Return;
-
-namespace chromeos {
-
-namespace {
-
-// D-Bus service name used by test.
-const char kServiceName[] = "service.name";
-// D-Bus object path used by test.
-const char kObjectPath[] = "/object/path";
-
-// Keys of SMS dictionary.
-const char kNumberKey[] = "number";
-const char kTextKey[] = "text";
-
-// Example values of SMS dictionary.
-const char kExampleNumber[] = "00012345678";
-const char kExampleText[] = "Hello.";
-
-}  // namespace
-
-class GsmSMSClientTest : public testing::Test {
- public:
-  GsmSMSClientTest() : expected_index_(0), response_(NULL) {}
-
-  void SetUp() override {
-    // Create a mock bus.
-    dbus::Bus::Options options;
-    options.bus_type = dbus::Bus::SYSTEM;
-    mock_bus_ = new dbus::MockBus(options);
-
-    // Create a mock proxy.
-    mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), kServiceName,
-                                            dbus::ObjectPath(kObjectPath));
-
-    // Set an expectation so mock_proxy's ConnectToSignal() will use
-    // OnConnectToSignal() to run the callback.
-    EXPECT_CALL(*mock_proxy_.get(),
-                DoConnectToSignal(modemmanager::kModemManagerSMSInterface,
-                                  modemmanager::kSMSReceivedSignal, _, _))
-        .WillRepeatedly(Invoke(this, &GsmSMSClientTest::OnConnectToSignal));
-
-    // Set an expectation so mock_bus's GetObjectProxy() for the given
-    // service name and the object path will return mock_proxy_.
-    EXPECT_CALL(*mock_bus_.get(),
-                GetObjectProxy(kServiceName, dbus::ObjectPath(kObjectPath)))
-        .WillOnce(Return(mock_proxy_.get()));
-
-    // ShutdownAndBlock() will be called in TearDown().
-    EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return());
-
-    // Create a client with the mock bus.
-    GsmSMSClient::Initialize(mock_bus_.get());
-    client_ = GsmSMSClient::Get();
-  }
-
-  void TearDown() override {
-    mock_bus_->ShutdownAndBlock();
-    GsmSMSClient::Shutdown();
-  }
-
-  // Handles Delete method call.
-  void OnDelete(dbus::MethodCall* method_call,
-                int timeout_ms,
-                dbus::ObjectProxy::ResponseCallback* callback) {
-    EXPECT_EQ(modemmanager::kModemManagerSMSInterface,
-              method_call->GetInterface());
-    EXPECT_EQ(modemmanager::kSMSDeleteFunction, method_call->GetMember());
-    uint32_t index = 0;
-    dbus::MessageReader reader(method_call);
-    EXPECT_TRUE(reader.PopUint32(&index));
-    EXPECT_EQ(expected_index_, index);
-    EXPECT_FALSE(reader.HasMoreData());
-
-    message_loop_.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(*callback), response_));
-  }
-
-  // Handles Get method call.
-  void OnGet(dbus::MethodCall* method_call,
-             int timeout_ms,
-             dbus::ObjectProxy::ResponseCallback* callback) {
-    EXPECT_EQ(modemmanager::kModemManagerSMSInterface,
-              method_call->GetInterface());
-    EXPECT_EQ(modemmanager::kSMSGetFunction, method_call->GetMember());
-    uint32_t index = 0;
-    dbus::MessageReader reader(method_call);
-    EXPECT_TRUE(reader.PopUint32(&index));
-    EXPECT_EQ(expected_index_, index);
-    EXPECT_FALSE(reader.HasMoreData());
-
-    message_loop_.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(*callback), response_));
-  }
-
-  // Handles List method call.
-  void OnList(dbus::MethodCall* method_call,
-              int timeout_ms,
-              dbus::ObjectProxy::ResponseCallback* callback) {
-    EXPECT_EQ(modemmanager::kModemManagerSMSInterface,
-              method_call->GetInterface());
-    EXPECT_EQ(modemmanager::kSMSListFunction, method_call->GetMember());
-    dbus::MessageReader reader(method_call);
-    EXPECT_FALSE(reader.HasMoreData());
-
-    message_loop_.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(*callback), response_));
-  }
-
- protected:
-  GsmSMSClient* client_ = nullptr;  // Unowned convenience pointer.
-  // A message loop to emulate asynchronous behavior.
-  base::MessageLoop message_loop_;
-  // The mock bus.
-  scoped_refptr<dbus::MockBus> mock_bus_;
-  // The mock object proxy.
-  scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
-  // The SmsReceived signal handler given by the tested client.
-  dbus::ObjectProxy::SignalCallback sms_received_callback_;
-  // Expected argument for Delete and Get methods.
-  uint32_t expected_index_;
-  // Response returned by mock methods.
-  dbus::Response* response_;
-
- private:
-  // Used to implement the mock proxy.
-  void OnConnectToSignal(
-      const std::string& interface_name,
-      const std::string& signal_name,
-      const dbus::ObjectProxy::SignalCallback& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback* on_connected_callback) {
-    sms_received_callback_ = signal_callback;
-    const bool success = true;
-    message_loop_.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(*on_connected_callback),
-                                  interface_name, signal_name, success));
-  }
-};
-
-TEST_F(GsmSMSClientTest, SmsReceived) {
-  // Set expectations.
-  const uint32_t kIndex = 42;
-  const bool kComplete = true;
-
-  // Set handler.
-  int num_called = 0;
-  uint32_t index = 0;
-  bool completed = false;
-  client_->SetSmsReceivedHandler(
-      kServiceName, dbus::ObjectPath(kObjectPath),
-      base::BindRepeating(
-          [](int* num_called, uint32_t* index_out, bool* completed_out,
-             uint32_t index, bool completed) {
-            ++*num_called;
-            *index_out = index;
-            *completed_out = completed;
-          },
-          &num_called, &index, &completed));
-
-  // Run the message loop to run the signal connection result callback.
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(0, num_called);
-
-  // Send signal.
-  dbus::Signal signal(modemmanager::kModemManagerSMSInterface,
-                      modemmanager::kSMSReceivedSignal);
-  dbus::MessageWriter writer(&signal);
-  writer.AppendUint32(kIndex);
-  writer.AppendBool(kComplete);
-  ASSERT_FALSE(sms_received_callback_.is_null());
-  sms_received_callback_.Run(&signal);
-
-  EXPECT_EQ(1, num_called);
-  EXPECT_EQ(kIndex, index);
-  EXPECT_TRUE(completed);
-
-  // Reset handler.
-  client_->ResetSmsReceivedHandler(kServiceName, dbus::ObjectPath(kObjectPath));
-
-  // Send signal again.
-  sms_received_callback_.Run(&signal);
-  EXPECT_EQ(1, num_called);
-}
-
-TEST_F(GsmSMSClientTest, Delete) {
-  // Set expectations.
-  const uint32_t kIndex = 42;
-  expected_index_ = kIndex;
-  EXPECT_CALL(*mock_proxy_.get(), DoCallMethod(_, _, _))
-      .WillOnce(Invoke(this, &GsmSMSClientTest::OnDelete));
-
-  // Create response.
-  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
-  response_ = response.get();
-
-  // Call Delete.
-  base::Optional<bool> success;
-  client_->Delete(
-      kServiceName, dbus::ObjectPath(kObjectPath), kIndex,
-      base::BindOnce([](base::Optional<bool>* success_out,
-                        bool success) { success_out->emplace(success); },
-                     &success));
-
-  // Run the message loop.
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(true, success);
-}
-
-TEST_F(GsmSMSClientTest, Get) {
-  // Set expectations.
-  const uint32_t kIndex = 42;
-  expected_index_ = kIndex;
-  EXPECT_CALL(*mock_proxy_.get(), DoCallMethod(_, _, _))
-      .WillOnce(Invoke(this, &GsmSMSClientTest::OnGet));
-  // Create response.
-  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
-  dbus::MessageWriter writer(response.get());
-  dbus::MessageWriter array_writer(NULL);
-  writer.OpenArray("{sv}", &array_writer);
-  dbus::MessageWriter entry_writer(NULL);
-  array_writer.OpenDictEntry(&entry_writer);
-  entry_writer.AppendString(kNumberKey);
-  entry_writer.AppendVariantOfString(kExampleNumber);
-  array_writer.CloseContainer(&entry_writer);
-  array_writer.OpenDictEntry(&entry_writer);
-  entry_writer.AppendString(kTextKey);
-  entry_writer.AppendVariantOfString(kExampleText);
-  array_writer.CloseContainer(&entry_writer);
-  writer.CloseContainer(&array_writer);
-  response_ = response.get();
-
-  // Call Get.
-  base::Optional<base::DictionaryValue> result;
-  client_->Get(kServiceName, dbus::ObjectPath(kObjectPath), kIndex,
-               base::BindOnce(
-                   [](base::Optional<base::DictionaryValue>* result_out,
-                      base::Optional<base::DictionaryValue> result) {
-                     *result_out = std::move(result);
-                   },
-                   &result));
-
-  // Run the message loop.
-  base::RunLoop().RunUntilIdle();
-
-  // Verify the result.
-  base::DictionaryValue expected_result;
-  expected_result.SetKey(kNumberKey, base::Value(kExampleNumber));
-  expected_result.SetKey(kTextKey, base::Value(kExampleText));
-  EXPECT_EQ(expected_result, result);
-}
-
-TEST_F(GsmSMSClientTest, List) {
-  // Set expectations.
-  EXPECT_CALL(*mock_proxy_.get(), DoCallMethod(_, _, _))
-      .WillOnce(Invoke(this, &GsmSMSClientTest::OnList));
-  // Create response.
-  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
-  dbus::MessageWriter writer(response.get());
-  dbus::MessageWriter array_writer(NULL);
-  writer.OpenArray("a{sv}", &array_writer);
-  dbus::MessageWriter sub_array_writer(NULL);
-  array_writer.OpenArray("{sv}", &sub_array_writer);
-  dbus::MessageWriter entry_writer(NULL);
-  sub_array_writer.OpenDictEntry(&entry_writer);
-  entry_writer.AppendString(kNumberKey);
-  entry_writer.AppendVariantOfString(kExampleNumber);
-  sub_array_writer.CloseContainer(&entry_writer);
-  sub_array_writer.OpenDictEntry(&entry_writer);
-  entry_writer.AppendString(kTextKey);
-  entry_writer.AppendVariantOfString(kExampleText);
-  sub_array_writer.CloseContainer(&entry_writer);
-  array_writer.CloseContainer(&sub_array_writer);
-  writer.CloseContainer(&array_writer);
-  response_ = response.get();
-
-  // Call List.
-  base::Optional<base::ListValue> result;
-  client_->List(kServiceName, dbus::ObjectPath(kObjectPath),
-                base::BindOnce(
-                    [](base::Optional<base::ListValue>* result_out,
-                       base::Optional<base::ListValue> result) {
-                      *result_out = std::move(result);
-                    },
-                    &result));
-
-  // Run the message loop.
-  base::RunLoop().RunUntilIdle();
-
-  // Create expected result.
-  base::ListValue expected_result;
-  auto sms = std::make_unique<base::DictionaryValue>();
-  sms->SetKey(kNumberKey, base::Value(kExampleNumber));
-  sms->SetKey(kTextKey, base::Value(kExampleText));
-  expected_result.Append(std::move(sms));
-  EXPECT_EQ(expected_result, result);
-}
-
-}  // namespace chromeos
diff --git a/chromeos/dbus/shill/shill_clients.cc b/chromeos/dbus/shill/shill_clients.cc
index 2b8318b5..3308b560 100644
--- a/chromeos/dbus/shill/shill_clients.cc
+++ b/chromeos/dbus/shill/shill_clients.cc
@@ -4,7 +4,6 @@
 
 #include "chromeos/dbus/shill/shill_clients.h"
 
-#include "chromeos/dbus/shill/gsm_sms_client.h"
 #include "chromeos/dbus/shill/modem_messaging_client.h"
 #include "chromeos/dbus/shill/shill_device_client.h"
 #include "chromeos/dbus/shill/shill_ipconfig_client.h"
@@ -23,7 +22,6 @@
     return InitializeFakes();
 #endif
   DCHECK(system_bus);
-  GsmSMSClient::Initialize(system_bus);
   ModemMessagingClient::Initialize(system_bus);
   SMSClient::Initialize(system_bus);
   ShillDeviceClient::Initialize(system_bus);
@@ -35,7 +33,6 @@
 }
 
 void InitializeFakes() {
-  GsmSMSClient::InitializeFake();
   ModemMessagingClient::InitializeFake();
   SMSClient::InitializeFake();
   ShillDeviceClient::InitializeFake();
@@ -57,7 +54,6 @@
   ShillDeviceClient::Shutdown();
   SMSClient::Shutdown();
   ModemMessagingClient::Shutdown();
-  GsmSMSClient::Shutdown();
 }
 
 }  // namespace shill_clients
diff --git a/chromeos/network/network_sms_handler.cc b/chromeos/network/network_sms_handler.cc
index 7ec3656..9bb05a5 100644
--- a/chromeos/network/network_sms_handler.cc
+++ b/chromeos/network/network_sms_handler.cc
@@ -15,7 +15,6 @@
 #include "base/containers/circular_deque.h"
 #include "base/macros.h"
 #include "base/values.h"
-#include "chromeos/dbus/shill/gsm_sms_client.h"
 #include "chromeos/dbus/shill/modem_messaging_client.h"
 #include "chromeos/dbus/shill/shill_device_client.h"
 #include "chromeos/dbus/shill/shill_manager_client.h"
@@ -25,9 +24,6 @@
 
 namespace {
 
-// Not exposed/exported:
-const char kIndexKey[] = "index";
-
 // Maximum number of messages stored for RequestUpdate(true).
 const size_t kMaxReceivedMessages = 100;
 
@@ -48,139 +44,6 @@
   virtual void RequestUpdate() = 0;
 };
 
-class NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler
-    : public NetworkSmsHandler::NetworkSmsDeviceHandler {
- public:
-  ModemManagerNetworkSmsDeviceHandler(NetworkSmsHandler* host,
-                                      const std::string& service_name,
-                                      const dbus::ObjectPath& object_path);
-
-  void RequestUpdate() override;
-
- private:
-  void ListCallback(base::Optional<base::ListValue> message_list);
-  void SmsReceivedCallback(uint32_t index, bool complete);
-  void GetCallback(uint32_t index,
-                   base::Optional<base::DictionaryValue> dictionary);
-  void DeleteMessages();
-  void DeleteCallback(bool success);
-  void MessageReceived(const base::DictionaryValue& dictionary);
-
-  NetworkSmsHandler* host_;
-  std::string service_name_;
-  dbus::ObjectPath object_path_;
-  bool deleting_messages_;
-  std::vector<uint32_t> delete_queue_;
-  base::WeakPtrFactory<ModemManagerNetworkSmsDeviceHandler> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ModemManagerNetworkSmsDeviceHandler);
-};
-
-NetworkSmsHandler::
-ModemManagerNetworkSmsDeviceHandler::ModemManagerNetworkSmsDeviceHandler(
-    NetworkSmsHandler* host,
-    const std::string& service_name,
-    const dbus::ObjectPath& object_path)
-    : host_(host),
-      service_name_(service_name),
-      object_path_(object_path),
-      deleting_messages_(false),
-      weak_ptr_factory_(this) {
-  // Set the handler for received Sms messaages.
-  GsmSMSClient::Get()->SetSmsReceivedHandler(
-      service_name_, object_path_,
-      base::Bind(&ModemManagerNetworkSmsDeviceHandler::SmsReceivedCallback,
-                 weak_ptr_factory_.GetWeakPtr()));
-
-  // List the existing messages.
-  GsmSMSClient::Get()->List(
-      service_name_, object_path_,
-      base::BindOnce(
-          &NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::ListCallback,
-          weak_ptr_factory_.GetWeakPtr()));
-}
-
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::RequestUpdate() {
-  GsmSMSClient::Get()->RequestUpdate(service_name_, object_path_);
-}
-
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::ListCallback(
-    base::Optional<base::ListValue> message_list) {
-  if (!message_list.has_value())
-    return;
-
-  // This receives all messages, so clear any pending deletes.
-  delete_queue_.clear();
-  for (const auto& entry : message_list.value()) {
-    const base::DictionaryValue* message = nullptr;
-    if (entry.GetAsDictionary(&message))
-      continue;
-    MessageReceived(*message);
-    double index = 0;
-    if (message->GetDoubleWithoutPathExpansion(kIndexKey, &index))
-      delete_queue_.push_back(static_cast<uint32_t>(index));
-  }
-  DeleteMessages();
-}
-
-// Messages must be deleted one at a time, since we can not guarantee
-// the order the deletion will be executed in. Delete messages from
-// the back of the list so that the indices are valid.
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::DeleteMessages() {
-  if (delete_queue_.empty()) {
-    deleting_messages_ = false;
-    return;
-  }
-  deleting_messages_ = true;
-  uint32_t index = delete_queue_.back();
-  delete_queue_.pop_back();
-  GsmSMSClient::Get()->Delete(
-      service_name_, object_path_, index,
-      base::BindOnce(&NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::
-                         DeleteCallback,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::DeleteCallback(
-    bool success) {
-  if (!success)
-    return;
-  DeleteMessages();
-}
-
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::
-    SmsReceivedCallback(uint32_t index, bool complete) {
-  // Only handle complete messages.
-  if (!complete)
-    return;
-  GsmSMSClient::Get()->Get(
-      service_name_, object_path_, index,
-      base::BindOnce(
-          &NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::GetCallback,
-          weak_ptr_factory_.GetWeakPtr(), index));
-}
-
-void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::GetCallback(
-    uint32_t index,
-    base::Optional<base::DictionaryValue> dictionary) {
-  if (!dictionary.has_value())
-    return;
-
-  MessageReceived(dictionary.value());
-  delete_queue_.push_back(index);
-  if (!deleting_messages_)
-    DeleteMessages();
-}
-
-void NetworkSmsHandler::
-ModemManagerNetworkSmsDeviceHandler::MessageReceived(
-    const base::DictionaryValue& dictionary) {
-  // The keys of the ModemManager.Modem.Gsm.SMS interface match the
-  // exported keys, so the dictionary used as a notification argument
-  // unchanged.
-  host_->MessageReceived(dictionary);
-}
-
 class NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler
     : public NetworkSmsHandler::NetworkSmsDeviceHandler {
  public:
@@ -489,10 +352,6 @@
     device_handlers_.push_back(
         std::make_unique<ModemManager1NetworkSmsDeviceHandler>(
             this, service_name, object_path));
-  } else {
-    device_handlers_.push_back(
-        std::make_unique<ModemManagerNetworkSmsDeviceHandler>(
-            this, service_name, object_path));
   }
 }
 
diff --git a/chromeos/network/network_sms_handler_unittest.cc b/chromeos/network/network_sms_handler_unittest.cc
index b1dd9b0..e9dc5d5b 100644
--- a/chromeos/network/network_sms_handler_unittest.cc
+++ b/chromeos/network/network_sms_handler_unittest.cc
@@ -71,7 +71,7 @@
                            "stub_cellular_device2");
 
     // This relies on the stub dbus implementations for ShillManagerClient,
-    // ShillDeviceClient, GsmSMSClient, ModemMessagingClient and SMSClient.
+    // ShillDeviceClient, ModemMessagingClient and SMSClient.
     // Initialize a sms handler. The stub dbus clients will not send the
     // first test message until RequestUpdate has been called.
     network_sms_handler_.reset(new NetworkSmsHandler());
diff --git a/components/autofill/core/browser/accessory_sheet_data.h b/components/autofill/core/browser/accessory_sheet_data.h
index 384079b8..4f4824a 100644
--- a/components/autofill/core/browser/accessory_sheet_data.h
+++ b/components/autofill/core/browser/accessory_sheet_data.h
@@ -87,8 +87,7 @@
   base::string16 display_text_;
 };
 
-// GENERATED_JAVA_ENUM_PACKAGE: (
-//   org.chromium.chrome.browser.autofill.keyboard_accessory)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.keyboard_accessory
 enum class FallbackSheetType {
   // Indicates the data type to which an AccessorySheetData object corresponds.
   PASSWORD,
diff --git a/components/crash/android/crash_keys_android.cc b/components/crash/android/crash_keys_android.cc
index 6a341cd..1e85b5c 100644
--- a/components/crash/android/crash_keys_android.cc
+++ b/components/crash/android/crash_keys_android.cc
@@ -21,6 +21,7 @@
       {"application_status", JavaCrashKey::Tag::kArray},
       {"installed_modules", JavaCrashKey::Tag::kArray},
       {"emulated_modules", JavaCrashKey::Tag::kArray},
+      {"dynamic_module_dex_name", JavaCrashKey::Tag::kArray},
   };
   static_assert(
       base::size(crash_keys) == static_cast<size_t>(CrashKeyIndex::NUM_KEYS),
diff --git a/components/crash/android/crash_keys_android.h b/components/crash/android/crash_keys_android.h
index 2b5764a..5e2838ee 100644
--- a/components/crash/android/crash_keys_android.h
+++ b/components/crash/android/crash_keys_android.h
@@ -16,6 +16,7 @@
   APPLICATION_STATUS,
   INSTALLED_MODULES,
   EMULATED_MODULES,
+  DYNAMIC_MODULE_DEX_NAME,
   NUM_KEYS
 };
 
diff --git a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
index cda626f..2eed3953 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
@@ -22,8 +22,9 @@
  * The crash keys will only be included in browser process crash reports.
  */
 public class CrashKeys {
-    private static final String[] KEYS = new String[] {"loaded_dynamic_module",
-            "active_dynamic_module", "application_status", "installed_modules", "emulated_modules"};
+    private static final String[] KEYS =
+            new String[] {"loaded_dynamic_module", "active_dynamic_module", "application_status",
+                    "installed_modules", "emulated_modules", "dynamic_module_dex_name"};
 
     private final AtomicReferenceArray<String> mValues = new AtomicReferenceArray<>(KEYS.length);
 
diff --git a/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle.cc b/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle.cc
index 206011b..9bc77ddc 100644
--- a/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle.cc
+++ b/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle.cc
@@ -49,8 +49,7 @@
   url_chain_.clear();
   url_chain_.push_back(request->url);
   request_method_ = request->method;
-  is_main_frame_ = request->resource_type ==
-                   static_cast<int>(content::ResourceType::kMainFrame);
+  is_main_frame_ = request->resource_type == content::ResourceType::kMainFrame;
   final_load_flags_ = request->load_flags;
 
   MaybeSetAcceptTransformHeader(
@@ -58,7 +57,7 @@
       request->previews_state, &request->custom_proxy_pre_cache_headers);
   request->custom_proxy_post_cache_headers = post_cache_headers_;
 
-  if (request->resource_type == static_cast<int>(content::ResourceType::kMedia))
+  if (request->resource_type == content::ResourceType::kMedia)
     request->custom_proxy_use_alternate_proxy_list = true;
 }
 
diff --git a/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle_unittest.cc b/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle_unittest.cc
index 0d2cc10..6c565913 100644
--- a/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle_unittest.cc
+++ b/components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle_unittest.cc
@@ -122,7 +122,7 @@
                                                manager.get());
   network::ResourceRequest request;
   request.url = GURL("http://example.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMedia);
+  request.resource_type = content::ResourceType::kMedia;
   bool defer = false;
 
   throttle.WillStartRequest(&request, &defer);
@@ -141,7 +141,7 @@
                                                manager.get());
   network::ResourceRequest request;
   request.url = GURL("http://example.com");
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.previews_state = content::SERVER_LITE_PAGE_ON;
   bool defer = false;
 
@@ -178,7 +178,7 @@
   DataReductionProxyURLLoaderThrottle throttle((net::HttpRequestHeaders()),
                                                manager.get());
   network::ResourceRequest request;
-  request.resource_type = static_cast<int>(content::ResourceType::kMedia);
+  request.resource_type = content::ResourceType::kMedia;
   request.url = GURL("http://example.com");
   bool defer = false;
 
@@ -192,7 +192,7 @@
   DataReductionProxyURLLoaderThrottle throttle((net::HttpRequestHeaders()),
                                                manager.get());
   network::ResourceRequest request;
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.url = GURL("http://example.com");
   bool defer = false;
 
@@ -212,7 +212,7 @@
   throttle.set_delegate(&delegate);
 
   network::ResourceRequest request;
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.url = GURL("http://example.com/");
   bool defer = false;
 
@@ -272,7 +272,7 @@
   throttle.set_delegate(&delegate);
 
   network::ResourceRequest request;
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.url = GURL("http://example.com/");
   bool defer = false;
 
@@ -305,7 +305,7 @@
   throttle.set_delegate(&delegate);
 
   network::ResourceRequest request;
-  request.resource_type = static_cast<int>(content::ResourceType::kMainFrame);
+  request.resource_type = content::ResourceType::kMainFrame;
   request.url = GURL("http://www.example.com/");
   bool defer = false;
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.cc
index d59972d1..654875e 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.cc
@@ -30,6 +30,8 @@
     const NetworkPropertiesManager& network_properties_manager,
     const std::vector<DataReductionProxyServer>& proxies_for_http) {
   DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(!params::IsIncludedInHoldbackFieldTrial() || proxies_for_http.empty());
+
   net::ProxyConfig config =
       CreateProxyConfig(false /* probe_url_config */,
                         network_properties_manager, proxies_for_http);
@@ -43,6 +45,7 @@
     const NetworkPropertiesManager& network_properties_manager,
     const std::vector<DataReductionProxyServer>& proxies_for_http) const {
   DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(!params::IsIncludedInHoldbackFieldTrial() || proxies_for_http.empty());
 
   net::ProxyConfig config;
   DCHECK(config.proxy_rules().proxies_for_http.IsEmpty());
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
index 7edf0480..bccf224 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
@@ -25,6 +25,7 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/browser/network_properties_manager.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_bypass_protocol.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
@@ -161,7 +162,7 @@
   config_->InitializeOnIOThread(
       url_loader_factory,
       base::BindRepeating(&DataReductionProxyIOData::CreateCustomProxyConfig,
-                          base::Unretained(this)),
+                          base::Unretained(this), true),
       network_properties_manager_.get());
   bypass_stats_->InitializeOnIOThread();
   proxy_delegate_->InitializeOnIOThread(this);
@@ -378,14 +379,24 @@
 
 network::mojom::CustomProxyConfigPtr
 DataReductionProxyIOData::CreateCustomProxyConfig(
+    bool is_warmup_url,
     const std::vector<DataReductionProxyServer>& proxies_for_http) const {
   auto config = network::mojom::CustomProxyConfig::New();
-  config->rules =
-      configurator_
-          ->CreateProxyConfig(true /* probe_url_config */,
-                              config_->GetNetworkPropertiesManager(),
-                              proxies_for_http)
-          .proxy_rules();
+  if (params::IsIncludedInHoldbackFieldTrial()) {
+    config->rules =
+        configurator_
+            ->CreateProxyConfig(is_warmup_url,
+                                config_->GetNetworkPropertiesManager(),
+                                std::vector<DataReductionProxyServer>())
+            .proxy_rules();
+  } else {
+    config->rules =
+        configurator_
+            ->CreateProxyConfig(is_warmup_url,
+                                config_->GetNetworkPropertiesManager(),
+                                proxies_for_http)
+            .proxy_rules();
+  }
 
   net::EffectiveConnectionType type = GetEffectiveConnectionType();
   if (type > net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) {
@@ -408,8 +419,10 @@
   if (!proxy_config_client_)
     return;
 
-  proxy_config_client_->OnCustomProxyConfigUpdated(
-      CreateCustomProxyConfig(config_->GetProxiesForHttp()));
+  proxy_config_client_->OnCustomProxyConfigUpdated(CreateCustomProxyConfig(
+      !base::FeatureList::IsEnabled(
+          features::kDataReductionProxyDisableProxyFailedWarmup),
+      config_->GetProxiesForHttp()));
 }
 
 void DataReductionProxyIOData::UpdateThrottleConfig() {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
index 6ff0c35..a26230a9 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
@@ -257,6 +257,7 @@
   // Creates a config using |proxies_for_http| that can be sent to the
   // NetworkContext.
   network::mojom::CustomProxyConfigPtr CreateCustomProxyConfig(
+      bool is_warmup_url,
       const std::vector<DataReductionProxyServer>& proxies_for_http) const;
 
   // Called when the list of proxies changes.
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
index 67a939a..6fb8ad2 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -660,12 +660,14 @@
                                            request.method())) {
     return false;
   }
-  net::ProxyConfig proxy_config =
-      data_reduction_proxy_config_->ProxyConfigIgnoringHoldback();
-  net::ProxyInfo data_reduction_proxy_info;
-  return util::ApplyProxyConfigToProxyInfo(proxy_config, proxy_retry_info,
-                                           request.url(),
-                                           &data_reduction_proxy_info);
+  // Deprecated non network-service code. If in proxy holdback group, assume
+  // that the URL was eligible for proxying if and only if it has scheme "http".
+  // This code should be removed once network service is enabled by default, and
+  // is necessary only to prevent DCHECKs from triggering in tests.
+  DCHECK(params::IsIncludedInHoldbackFieldTrial());
+  return data_reduction_proxy_config_->enabled_by_user_and_reachable() &&
+         request.url().SchemeIsHTTPOrHTTPS() &&
+         !request.url().SchemeIsCryptographic();
 }
 
 void DataReductionProxyNetworkDelegate::MaybeAddChromeProxyECTHeader(
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
index 7791b8b..e1b3fa9 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
@@ -31,6 +31,12 @@
 const base::Feature kDogfood{"DataReductionProxyDogfood",
                              base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, the usage of data reduction proxy is disabled for HTTP URLs.
+// Does not affect the state of save-data header or other
+// features that may depend on data saver being enabled.
+const base::Feature kDataReductionProxyHoldback{
+    "DataReductionProxyHoldback", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables data reduction proxy when network service is enabled.
 const base::Feature kDataReductionProxyEnabledWithNetworkService{
     "DataReductionProxyEnabledWithNetworkService",
@@ -49,5 +55,11 @@
     "DataReductionProxyPopulatePreviewsPageIDToPingback",
     base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables not allowing proxies that fail warmup url fetch, to custom proxy
+// config updates when network service is enabled.
+const base::Feature kDataReductionProxyDisableProxyFailedWarmup{
+    "DataReductionProxyDisableProxyFailedWarmup",
+    base::FEATURE_ENABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.h
index 66612bde..b7b98e0 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.h
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.h
@@ -13,10 +13,12 @@
 extern const base::Feature kDataReductionProxyDecidesTransform;
 extern const base::Feature kDataReductionProxyLowMemoryDevicePromo;
 extern const base::Feature kDogfood;
+extern const base::Feature kDataReductionProxyHoldback;
 extern const base::Feature kDataReductionProxyEnabledWithNetworkService;
 extern const base::Feature kDataSaverUseOnDeviceSafeBrowsing;
 extern const base::Feature kDataReductionProxyBlockOnBadGatewayResponse;
 extern const base::Feature kDataReductionProxyPopulatePreviewsPageIDToPingback;
+extern const base::Feature kDataReductionProxyDisableProxyFailedWarmup;
 
 }  // namespace features
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
index c309efe..08662bc 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
@@ -104,7 +104,12 @@
 }
 
 bool IsIncludedInHoldbackFieldTrial() {
-  return IsIncludedInFieldTrial("DataCompressionProxyHoldback");
+  // For now, DRP can be disabled using either the field trial or the feature.
+  // New server configs should use the feature capability.
+  // TODO(tbansal): Remove the field trial code.
+  return base::FeatureList::IsEnabled(
+             data_reduction_proxy::features::kDataReductionProxyHoldback) ||
+         IsIncludedInFieldTrial("DataCompressionProxyHoldback");
 }
 
 bool IsIncludedInSecureProxyHoldbackFieldTrial() {
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc
index 0c148279..f722895f8 100644
--- a/components/policy/core/browser/configuration_policy_handler.cc
+++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -193,7 +193,6 @@
   return true;
 }
 
-
 // StringMappingListPolicyHandler implementation -----------------------------
 
 StringMappingListPolicyHandler::MappingEntry::MappingEntry(
@@ -261,8 +260,7 @@
         output->Append(std::move(mapped_value));
     } else {
       if (errors) {
-        errors->AddError(policy_name(),
-                         entry - list_value->begin(),
+        errors->AddError(policy_name(), entry - list_value->begin(),
                          IDS_POLICY_OUT_OF_RANGE_ERROR);
       }
     }
@@ -307,7 +305,6 @@
     prefs->SetInteger(pref_path_, value_in_range);
 }
 
-
 // IntPercentageToDoublePolicyHandler implementation ---------------------------
 
 IntPercentageToDoublePolicyHandler::IntPercentageToDoublePolicyHandler(
@@ -332,7 +329,6 @@
     prefs->SetDouble(pref_path_, static_cast<double>(percentage) / 100.);
 }
 
-
 // SimplePolicyHandler implementation ------------------------------------------
 
 SimplePolicyHandler::SimplePolicyHandler(const char* policy_name,
@@ -352,7 +348,6 @@
     prefs->SetValue(pref_path_, value->Clone());
 }
 
-
 // SchemaValidatingPolicyHandler implementation --------------------------------
 
 SchemaValidatingPolicyHandler::SchemaValidatingPolicyHandler(
@@ -584,6 +579,8 @@
   std::string error_path;
   const Schema json_string_schema =
       IsListSchema() ? schema_.GetItems() : schema_;
+  // TODO(https://crbug.com/953615): Consider switching from SCHEMA_STRICT to
+  // SCHEMA_ALLOW_UNKNOWN for all schema validating policy handlers.
   bool validated = json_string_schema.Validate(*parsed_value, SCHEMA_STRICT,
                                                &error_path, &schema_error);
   if (errors && !schema_error.empty())
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index c86bdc1..772a8ceec 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -402,6 +402,18 @@
       ],
     },
     {
+      'name': 'Kerberos',
+      'type': 'group',
+      'caption': '''Kerberos''',
+      'desc': '''Policies related to Kerberos authentication.''',
+      'policies': [
+        'KerberosEnabled',
+        'KerberosRememberPasswordEnabled',
+        'KerberosAddAccountsAllowed',
+        'KerberosAccounts',
+      ],
+    },
+    {
       'name': 'Extensions',
       'type': 'group',
       'caption': '''Extensions''',
@@ -15426,7 +15438,7 @@
       },
       'example_value': 'sometoken',
       'id': 543,
-      'caption': '''Provide users with Quick Fix Build.''',
+      'caption': '''Provide users with Quick Fix Build''',
       'desc': '''This policy controls whether or not the device should be updated to a Quick Fix Build.
 
       If policy value is set to a token that maps to a Quick Fix Build, the device will be updated to the corresponding Quick Fix Build if the update is not blocked by another policy.
@@ -15446,7 +15458,7 @@
       },
       'example_value': True,
       'id': 545,
-      'caption': '''Enables a page for in-session change of password for SAML users.''',
+      'caption': '''Enables a page for in-session change of password for SAML users''',
       'desc': '''Enables a page at chrome://password-change that lets SAML users change their SAML passwords while in-session, which ensures that the SAML password and the device lockscreen password are kept in-sync.
 
       This policy also enables notifications that warn SAML users if their SAML passwords are soon to expire so that they can deal with this immediately by doing an in-session password change.
@@ -15727,6 +15739,143 @@
       'caption': '''Set custom schedule to check for updates''',
       'desc': '''Allows setting a custom schedule to check for updates. This applies to all users, and to all interfaces on the device. Once set, the device will check for updates according to the schedule. The policy must be removed to cancel any more scheduled update checks.'''
     },
+    {
+      'name': 'KerberosEnabled',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:75-'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'features': {
+        'dynamic_refresh': False,
+        'per_profile': False,
+      },
+      'future': True,
+      'example_value': True,
+      'id': 557,
+      'caption': '''Enable Kerberos functionality''',
+      'tags': ['website-sharing'],
+      'desc': '''Controls whether the Kerberos functionality is enabled. Kerberos is an authentication protocol that can be used to authenticate to web apps and file shares.
+
+          If this policy is enabled, Kerberos functionality is enabled. Kerberos accounts can be added either through the 'Configure Kerberos accounts' policy or through the Kerberos Accounts settings in the People settings page.
+
+          If this policy disabled or not set, the Kerberos Accounts settings are disabled. No Kerberos accounts can be added and Kerberos authentication cannot be used. All existing Kerberos accounts are deleted, all stored passwords are deleted.''',
+    },
+    {
+      'name': 'KerberosRememberPasswordEnabled',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:75-'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'future': True,
+      'example_value': True,
+      'id': 558,
+      'caption': '''Enable 'Remember password' feature''',
+      'tags': ['website-sharing'],
+      'desc': '''Controls whether the 'Remember password' feature is enabled in the Kerberos authentication dialog. Passwords are stored encryped on disk, only accessible to the Kerberos system daemon and during a user session.
+
+          If this policy is enabled or not set, users can decide whether Kerberos passwords are remembered, so that they do not have to be entered again. Kerberos tickets are automatically fetched unless additional authentication is required (two-factor authentication).
+
+          If this policy is disabled, passwords are never remembered and all previously stored passwords are removed. Users have to enter their password every time they need to authenticate with the Kerberos system. Depending on server settings, this usually happens between every 8 hours to several months.''',
+    },
+    {
+      'name': 'KerberosAddAccountsAllowed',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:75-'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'future': True,
+      'example_value': True,
+      'id': 559,
+      'caption': '''Users can add Kerberos accounts''',
+      'tags': ['website-sharing'],
+      'desc': '''Controls whether users may add Kerberos accounts.
+
+          If this policy is enabled or not set, users may add Kerberos accounts via the Kerberos Accounts settings in the People settings page. Users have full control over accounts they added and may modify or remove them.
+
+          If this policy is disabled, users may not add Kerberos accounts. Accounts can only be added via the 'Configure Kerberos accounts' policy. This is an effective way to lock down accounts.''',
+    },
+    {
+      'name': 'KerberosAccounts',
+      'type': 'dict',
+      'schema': {
+        'type': 'array',
+        'items': {
+          'type': 'object',
+          'properties': {
+            'principal': {
+              'description': '''User principal 'user@realm'. The placeholder ${{LOGIN_ID}} is replaced by the username 'user'. The placeholder ${{LOGIN_EMAIL}} is replaced by the full principal 'user@realm'.''',
+              'type': 'string',
+            },
+            'password': {
+              'description': '''Kerberos password. The placeholder ${{PASSWORD}} is replaced by the login password.''',
+              'type': 'string',
+            },
+            'remember_password': {
+              'description': '''Whether to remember the Kerberos password. Ignored if the password is specified.''',
+              'type': 'boolean',
+            },
+            'krb5conf': {
+              'description': '''Kerberos configuration (one line per array item), see https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html.''',
+              'type': 'array',
+              'items': {
+                'type': 'string',
+              },
+            },
+          },
+        },
+      },
+      'supported_on': ['chrome_os:75-'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'future': True,
+      'example_value': [
+        {
+          "principal":"${{LOGIN_EMAIL}}",
+          "password":"${{PASSWORD}}"
+        },
+        {
+          "principal":"user1@REALM.COM",
+          "remember_password": True
+        },
+        {
+          "principal":"user2@REALM.COM",
+          "password":"p4zzw0rd!",
+          "krb5conf":[
+            "[libdefaults]",
+            "  default_tgs_enctypes = aes256-cts-hmac-sha1-96",
+            "  default_tkt_enctypes = aes256-cts-hmac-sha1-96",
+            "  permitted_enctypes = aes256-cts-hmac-sha1-96",
+            "  default_realm = REALM.COM",
+            "",
+            "[realms]",
+            "  REALM.COM = {",
+            "    kdc = us-west.realm.com",
+            "    master_kdc = us-west.realm.com",
+            "    kpasswd_server = us-west.realm.com",
+            "  }"
+          ]
+        }
+      ],
+      'id': 560,
+      'caption': '''Configure Kerberos accounts''',
+      'tags': ['website-sharing'],
+      'desc': '''Adds prefilled Kerberos accounts. If the Kerberos credentials match the login credentials, an account can be configured to reuse the login credentials by specifying '${{LOGIN_EMAIL}}' and '${{PASSWORD}}' for principal and password, respectively, so that the Kerberos ticket can be retrieved automatically unless two-factor authentication is configured. Users cannot modify accounts added via this policy.
+
+          If this policy is enabled, the list of accounts defined by the policy is added to the Kerberos Accounts settings.
+
+          If this policy is disabled or not set, no accounts are added to the Kerberos Accounts settings and all accounts previously added with this policy are removed. Users may still add accounts manually if the 'Users can add Kerberos accounts' policy is enabled.''',
+    },
   ],
 
   'messages': {
@@ -15892,5 +16041,5 @@
   },
   'placeholders': [],
   'deleted_policy_ids': [412],
-  'highest_id_currently_used':  556
+  'highest_id_currently_used':  560
 }
diff --git a/components/safe_browsing/browser/base_parallel_resource_throttle.cc b/components/safe_browsing/browser/base_parallel_resource_throttle.cc
index 2aca54a..2f06d0c 100644
--- a/components/safe_browsing/browser/base_parallel_resource_throttle.cc
+++ b/components/safe_browsing/browser/base_parallel_resource_throttle.cc
@@ -116,7 +116,7 @@
                                  : request_->extra_request_headers();
 
   resource_request.load_flags = request_->load_flags();
-  resource_request.resource_type = static_cast<int>(resource_type_);
+  resource_request.resource_type = resource_type_;
 
   content::ResourceRequestInfo* info =
       content::ResourceRequestInfo::ForRequest(request_);
diff --git a/components/search_engines/template_url_fetcher.cc b/components/search_engines/template_url_fetcher.cc
index d136273..a807c011 100644
--- a/components/search_engines/template_url_fetcher.cc
+++ b/components/search_engines/template_url_fetcher.cc
@@ -111,7 +111,8 @@
   resource_request->url = osdd_url;
   resource_request->request_initiator = initiator;
   resource_request->render_frame_id = render_frame_id;
-  resource_request->resource_type = resource_type;
+  resource_request->resource_type =
+      static_cast<network::ResourceType>(resource_type);
   resource_request->load_flags = net::LOAD_DO_NOT_SAVE_COOKIES;
   simple_url_loader_ = network::SimpleURLLoader::Create(
       std::move(resource_request), kTrafficAnnotation);
diff --git a/components/signin/core/browser/android/BUILD.gn b/components/signin/core/browser/android/BUILD.gn
index 497cd55..52d54b2 100644
--- a/components/signin/core/browser/android/BUILD.gn
+++ b/components/signin/core/browser/android/BUILD.gn
@@ -24,6 +24,7 @@
     "//net/android:net_java",
     "//third_party/android_deps:android_support_v4_java",
     "//third_party/android_deps:com_android_support_support_annotations_java",
+    "//ui/android:ui_java",
   ]
 
   java_files = [
@@ -46,6 +47,7 @@
     "java/src/org/chromium/components/signin/OAuth2TokenService.java",
     "java/src/org/chromium/components/signin/ObservableValue.java",
     "java/src/org/chromium/components/signin/ProfileDataSource.java",
+    "java/src/org/chromium/components/signin/SigninActivityMonitor.java",
     "java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java",
   ]
 
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/ConsistencyCookieManager.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/ConsistencyCookieManager.java
index 3fdb3acc..56185c9 100644
--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/ConsistencyCookieManager.java
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/ConsistencyCookieManager.java
@@ -18,15 +18,17 @@
 public class ConsistencyCookieManager implements ObservableValue.Observer {
     private final long mNativeConsistencyCookieManager;
     private final AccountManagerFacade mAccountManagerFacade;
+    private final SigninActivityMonitor mSigninActivityMonitor;
     private boolean mIsUpdatePending;
 
     private ConsistencyCookieManager(long nativeConsistencyCookieManager) {
         ThreadUtils.assertOnUiThread();
         mNativeConsistencyCookieManager = nativeConsistencyCookieManager;
         mAccountManagerFacade = AccountManagerFacade.get();
+        mSigninActivityMonitor = SigninActivityMonitor.get();
 
         mAccountManagerFacade.isUpdatePending().addObserver(this);
-        // TODO(https://crbug.com/949562): Observe ongoing sign-in activities.
+        mSigninActivityMonitor.hasOngoingActivity().addObserver(this);
 
         mIsUpdatePending = calculateIsUpdatePending();
     }
@@ -41,8 +43,8 @@
     }
 
     private boolean calculateIsUpdatePending() {
-        // TODO(https://crbug.com/949562): Check for ongoing sign-in activities.
-        return mAccountManagerFacade.isUpdatePending().get();
+        return mAccountManagerFacade.isUpdatePending().get()
+                || mSigninActivityMonitor.hasOngoingActivity().get();
     }
 
     @CalledByNative
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SigninActivityMonitor.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SigninActivityMonitor.java
new file mode 100644
index 0000000..761b3f2
--- /dev/null
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SigninActivityMonitor.java
@@ -0,0 +1,67 @@
+// Copyright 2019 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.
+
+package org.chromium.components.signin;
+
+import android.annotation.SuppressLint;
+import android.support.annotation.MainThread;
+
+import org.chromium.base.ThreadUtils;
+
+/**
+ * Monitors external activities started from sign-in flows (for example, activity to add an account
+ * to the device). Activities have to be launched using {@link #startSigninActivity}.
+ */
+public class SigninActivityMonitor {
+    @SuppressLint("StaticFieldLeak")
+    private static SigninActivityMonitor sInstance;
+
+    private int mActivityCounter;
+    private MutableObservableValue<Boolean> mHasOngoingActivity =
+            new MutableObservableValue<>(false);
+
+    private SigninActivityMonitor() {}
+
+    /**
+     * Returns a singleton instance of the SigninActivityMonitor.
+     */
+    @MainThread
+    public static SigninActivityMonitor get() {
+        ThreadUtils.assertOnUiThread();
+        if (sInstance == null) {
+            sInstance = new SigninActivityMonitor();
+        }
+        return sInstance;
+    }
+
+    /**
+     * Returns whether there are any ongoing sign-in activities.
+     */
+    public ObservableValue<Boolean> hasOngoingActivity() {
+        return mHasOngoingActivity;
+    }
+
+    // TODO(https://crbug.com/953765): Make this private.
+    /**
+     * Should be invoked when a signin activity is started.
+     */
+    public void activityStarted() {
+        assert mActivityCounter >= 0;
+
+        ++mActivityCounter;
+        if (mActivityCounter == 1) mHasOngoingActivity.set(true);
+    }
+
+    // TODO(https://crbug.com/953765): Make this private.
+    /**
+     * Should be invoked when a signin activity is finished. There should be a strict parity between
+     * {@link #activityStarted()} and {@link #activityFinished()} calls.
+     */
+    public void activityFinished() {
+        assert mActivityCounter > 0;
+
+        --mActivityCounter;
+        if (mActivityCounter == 0) mHasOngoingActivity.set(false);
+    }
+}
diff --git a/components/signin/core/browser/identity_manager_wrapper.cc b/components/signin/core/browser/identity_manager_wrapper.cc
index fdc17e1..2025ebc 100644
--- a/components/signin/core/browser/identity_manager_wrapper.cc
+++ b/components/signin/core/browser/identity_manager_wrapper.cc
@@ -29,7 +29,3 @@
                                 std::move(accounts_mutator),
                                 std::move(accounts_cookie_mutator),
                                 std::move(diagnostics_provider)) {}
-
-void IdentityManagerWrapper::Shutdown() {
-  IdentityManager::Shutdown();
-}
diff --git a/components/signin/core/browser/identity_manager_wrapper.h b/components/signin/core/browser/identity_manager_wrapper.h
index c7d9958c..b1c0324 100644
--- a/components/signin/core/browser/identity_manager_wrapper.h
+++ b/components/signin/core/browser/identity_manager_wrapper.h
@@ -37,9 +37,6 @@
       std::unique_ptr<identity::AccountsMutator> accounts_mutator,
       std::unique_ptr<identity::AccountsCookieMutator> accounts_cookie_mutator,
       std::unique_ptr<identity::DiagnosticsProvider> diagnostics_provider);
-
-  // KeyedService overrides.
-  void Shutdown() override;
 };
 
 #endif  // COMPONENTS_SIGNIN_CORE_BROWSER_IDENTITY_MANAGER_WRAPPER_H_
diff --git a/components/sync/driver/about_sync_util.cc b/components/sync/driver/about_sync_util.cc
index e256d78..6c55c6e 100644
--- a/components/sync/driver/about_sync_util.cc
+++ b/components/sync/driver/about_sync_util.cc
@@ -457,7 +457,8 @@
       service->QueryDetailedSyncStatusForDebugging(&full_status);
   const SyncCycleSnapshot& snapshot =
       service->GetLastCycleSnapshotForDebugging();
-  const SyncTokenStatus& token_status = service->GetSyncTokenStatus();
+  const SyncTokenStatus& token_status =
+      service->GetSyncTokenStatusForDebugging();
 
   // Version Info.
   // |client_version| was already set above.
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc
index c50f8e0..d6290e1 100644
--- a/components/sync/driver/fake_sync_service.cc
+++ b/components/sync/driver/fake_sync_service.cc
@@ -100,7 +100,8 @@
 
 void FakeSyncService::ReadyForStartChanged(ModelType type) {}
 
-syncer::SyncTokenStatus FakeSyncService::GetSyncTokenStatus() const {
+syncer::SyncTokenStatus FakeSyncService::GetSyncTokenStatusForDebugging()
+    const {
   return syncer::SyncTokenStatus();
 }
 
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h
index 87d0dd9..d37a01ab 100644
--- a/components/sync/driver/fake_sync_service.h
+++ b/components/sync/driver/fake_sync_service.h
@@ -48,7 +48,7 @@
   bool RequiresClientUpgrade() const override;
   UserShare* GetUserShare() const override;
   void ReadyForStartChanged(syncer::ModelType type) override;
-  SyncTokenStatus GetSyncTokenStatus() const override;
+  SyncTokenStatus GetSyncTokenStatusForDebugging() const override;
   bool QueryDetailedSyncStatusForDebugging(SyncStatus* result) const override;
   base::Time GetLastSyncedTimeForDebugging() const override;
   SyncCycleSnapshot GetLastCycleSnapshotForDebugging() const override;
diff --git a/components/sync/driver/mock_sync_service.h b/components/sync/driver/mock_sync_service.h
index b09ac30..55042672 100644
--- a/components/sync/driver/mock_sync_service.h
+++ b/components/sync/driver/mock_sync_service.h
@@ -61,7 +61,7 @@
 
   MOCK_CONST_METHOD0(GetUserShare, UserShare*());
 
-  MOCK_CONST_METHOD0(GetSyncTokenStatus, SyncTokenStatus());
+  MOCK_CONST_METHOD0(GetSyncTokenStatusForDebugging, SyncTokenStatus());
   MOCK_CONST_METHOD1(QueryDetailedSyncStatusForDebugging,
                      bool(SyncStatus* result));
   MOCK_CONST_METHOD0(GetLastSyncedTimeForDebugging, base::Time());
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 7c7daae9..a031a5c 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -1759,7 +1759,7 @@
   return auth_manager_->access_token();
 }
 
-SyncTokenStatus ProfileSyncService::GetSyncTokenStatus() const {
+SyncTokenStatus ProfileSyncService::GetSyncTokenStatusForDebugging() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->GetSyncTokenStatus();
 }
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h
index 3df5ee2..eb371806 100644
--- a/components/sync/driver/profile_sync_service.h
+++ b/components/sync/driver/profile_sync_service.h
@@ -139,7 +139,7 @@
   void RemoveObserver(SyncServiceObserver* observer) override;
   bool HasObserver(const SyncServiceObserver* observer) const override;
   UserShare* GetUserShare() const override;
-  SyncTokenStatus GetSyncTokenStatus() const override;
+  SyncTokenStatus GetSyncTokenStatusForDebugging() const override;
   bool QueryDetailedSyncStatusForDebugging(SyncStatus* result) const override;
   base::Time GetLastSyncedTimeForDebugging() const override;
   SyncCycleSnapshot GetLastCycleSnapshotForDebugging() const override;
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc
index 9dab61b..05c9c12b 100644
--- a/components/sync/driver/profile_sync_service_unittest.cc
+++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -557,7 +557,7 @@
   InitializeForNthSync();
 
   // Initial status.
-  SyncTokenStatus token_status = service()->GetSyncTokenStatus();
+  SyncTokenStatus token_status = service()->GetSyncTokenStatusForDebugging();
   ASSERT_EQ(CONNECTION_NOT_ATTEMPTED, token_status.connection_status);
   ASSERT_TRUE(token_status.connection_status_update_time.is_null());
   ASSERT_FALSE(token_status.token_request_time.is_null());
@@ -568,7 +568,7 @@
   base::RunLoop().RunUntilIdle();
 
   // Now we should have an access token.
-  token_status = service()->GetSyncTokenStatus();
+  token_status = service()->GetSyncTokenStatusForDebugging();
   EXPECT_TRUE(token_status.connection_status_update_time.is_null());
   EXPECT_FALSE(token_status.token_request_time.is_null());
   EXPECT_FALSE(token_status.token_receive_time.is_null());
@@ -582,7 +582,7 @@
 
   // This should get reflected in the status, and we should have dropped the
   // invalid access token.
-  token_status = service()->GetSyncTokenStatus();
+  token_status = service()->GetSyncTokenStatusForDebugging();
   EXPECT_EQ(CONNECTION_AUTH_ERROR, token_status.connection_status);
   EXPECT_FALSE(token_status.connection_status_update_time.is_null());
   EXPECT_FALSE(token_status.token_request_time.is_null());
@@ -594,7 +594,7 @@
 
   // Simulate successful connection.
   service()->OnConnectionStatusChange(CONNECTION_OK);
-  token_status = service()->GetSyncTokenStatus();
+  token_status = service()->GetSyncTokenStatusForDebugging();
   EXPECT_EQ(CONNECTION_OK, token_status.connection_status);
 }
 
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h
index fd057a3..d069124 100644
--- a/components/sync/driver/sync_service.h
+++ b/components/sync/driver/sync_service.h
@@ -375,9 +375,7 @@
 
   // Returns the state of the access token and token request, for display in
   // internals UI.
-  // TODO(crbug.com/953272): This method should also be marked as "ForDebugging"
-  // but it's currently still used by non-debugging UKM code.
-  virtual SyncTokenStatus GetSyncTokenStatus() const = 0;
+  virtual SyncTokenStatus GetSyncTokenStatusForDebugging() const = 0;
 
   // Initializes a struct of status indicators with data from the engine.
   // Returns false if the engine was not available for querying; in that case
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc
index 7a7663cd..ebae705 100644
--- a/components/sync/driver/test_sync_service.cc
+++ b/components/sync/driver/test_sync_service.cc
@@ -203,7 +203,7 @@
   return nullptr;
 }
 
-SyncTokenStatus TestSyncService::GetSyncTokenStatus() const {
+SyncTokenStatus TestSyncService::GetSyncTokenStatusForDebugging() const {
   SyncTokenStatus token;
 
   if (GetAuthError().state() != GoogleServiceAuthError::NONE) {
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h
index cfcf77ff..8a1e8873 100644
--- a/components/sync/driver/test_sync_service.h
+++ b/components/sync/driver/test_sync_service.h
@@ -80,7 +80,7 @@
 
   UserShare* GetUserShare() const override;
 
-  SyncTokenStatus GetSyncTokenStatus() const override;
+  SyncTokenStatus GetSyncTokenStatusForDebugging() const override;
   bool QueryDetailedSyncStatusForDebugging(SyncStatus* result) const override;
   base::Time GetLastSyncedTimeForDebugging() const override;
   SyncCycleSnapshot GetLastCycleSnapshotForDebugging() const override;
diff --git a/components/ukm/BUILD.gn b/components/ukm/BUILD.gn
index 13a06c8..3a51608 100644
--- a/components/ukm/BUILD.gn
+++ b/components/ukm/BUILD.gn
@@ -56,6 +56,7 @@
     "//base",
     "//components/history/core/browser",
     "//components/sync",
+    "//google_apis",
   ]
 
   public_deps = [
diff --git a/components/ukm/observers/DEPS b/components/ukm/observers/DEPS
index a8ed862..8dbe4775 100644
--- a/components/ukm/observers/DEPS
+++ b/components/ukm/observers/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "+components/history/core/browser",
   "+components/sync",
+  "+google_apis",
 ]
diff --git a/components/ukm/observers/sync_disable_observer.cc b/components/ukm/observers/sync_disable_observer.cc
index 724d71c..f379e83 100644
--- a/components/ukm/observers/sync_disable_observer.cc
+++ b/components/ukm/observers/sync_disable_observer.cc
@@ -10,11 +10,10 @@
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
-#include "components/sync/driver/sync_token_status.h"
 #include "components/sync/driver/sync_user_settings.h"
-#include "components/sync/engine/connection_status.h"
 #include "components/unified_consent/feature.h"
 #include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
+#include "google_apis/gaia/google_service_auth_error.h"
 
 using unified_consent::UrlKeyedDataCollectionConsentHelper;
 
@@ -80,7 +79,6 @@
 SyncDisableObserver::SyncState SyncDisableObserver::GetSyncState(
     syncer::SyncService* sync_service,
     UrlKeyedDataCollectionConsentHelper* consent_helper) {
-  syncer::SyncTokenStatus status = sync_service->GetSyncTokenStatus();
   SyncState state;
 
   // For the following two settings, we want them to match the state of a user
@@ -107,11 +105,19 @@
 
   state.initialized = sync_service->IsEngineInitialized();
 
-  // We use CONNECTION_OK here as an auth error can be used in the sync
-  // paused state. Therefore we need to be more direct and check CONNECTION_OK
-  // as opposed to using something like IsSyncFeatureActive().
-  state.connected = !base::FeatureList::IsEnabled(kUkmCheckAuthErrorFeature) ||
-                    status.connection_status == syncer::CONNECTION_OK;
+  // Reasoning for the individual checks:
+  // - IsSyncFeatureActive() makes sure Sync is enabled and initialized.
+  // - HasCompletedSyncCycle() makes sure Sync has actually talked to the
+  //   server. Without this, it's possible that there is some auth issue that we
+  //   just haven't detected yet.
+  // - Finally, GetAuthError() makes sure Sync is not in an auth error state. In
+  //   particular, this includes the "Sync paused" state (which is implemented
+  //   as an auth error).
+  state.connected =
+      !base::FeatureList::IsEnabled(kUkmCheckAuthErrorFeature) ||
+      (sync_service->IsSyncFeatureActive() &&
+       sync_service->HasCompletedSyncCycle() &&
+       sync_service->GetAuthError() == GoogleServiceAuthError::AuthErrorNone());
 
   state.passphrase_protected =
       state.initialized &&
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc
index b81afa8..bc39911 100644
--- a/components/ukm/observers/sync_disable_observer_unittest.cc
+++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/observer_list.h"
 #include "components/sync/driver/sync_token_status.h"
 #include "components/sync/driver/test_sync_service.h"
-#include "components/sync/engine/connection_status.h"
+#include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "components/unified_consent/feature.h"
 #include "components/unified_consent/pref_names.h"
@@ -24,21 +24,36 @@
 
 class MockSyncService : public syncer::TestSyncService {
  public:
-  MockSyncService() { SetTransportState(TransportState::INITIALIZING); }
+  MockSyncService() {
+    SetTransportState(TransportState::INITIALIZING);
+    SetLastCycleSnapshot(syncer::SyncCycleSnapshot());
+  }
   ~MockSyncService() override { Shutdown(); }
 
-  void SetStatus(bool has_passphrase, bool history_enabled) {
-    SetTransportState(TransportState::ACTIVE);
+  void SetStatus(bool has_passphrase, bool history_enabled, bool active) {
+    SetTransportState(active ? TransportState::ACTIVE
+                             : TransportState::INITIALIZING);
     SetIsUsingSecondaryPassphrase(has_passphrase);
     SetPreferredDataTypes(
         history_enabled
             ? syncer::ModelTypeSet(syncer::HISTORY_DELETE_DIRECTIVES)
             : syncer::ModelTypeSet());
+
+    // It doesn't matter what exactly we set here, it's only relevant that the
+    // SyncCycleSnapshot is initialized at all.
+    SetLastCycleSnapshot(syncer::SyncCycleSnapshot(
+        syncer::ModelNeutralState(), syncer::ProgressMarkerMap(), false, 0, 0,
+        0, true, 0, base::Time::Now(), base::Time::Now(),
+        std::vector<int>(syncer::ModelType::NUM_ENTRIES, 0),
+        std::vector<int>(syncer::ModelType::NUM_ENTRIES, 0),
+        sync_pb::SyncEnums::UNKNOWN_ORIGIN, base::TimeDelta::FromMinutes(1),
+        false));
+
     NotifyObserversOfStateChanged();
   }
 
-  void SetConnectionStatus(syncer::ConnectionStatus status) {
-    connection_status_ = status;
+  void SetAuthError(GoogleServiceAuthError::State error_state) {
+    syncer::TestSyncService::SetAuthError(GoogleServiceAuthError(error_state));
     NotifyObserversOfStateChanged();
   }
 
@@ -48,12 +63,6 @@
     }
   }
 
-  void NotifyObserversOfStateChanged() {
-    for (auto& observer : observers_) {
-      observer.OnStateChanged(this);
-    }
-  }
-
  private:
   // syncer::TestSyncService:
   void AddObserver(syncer::SyncServiceObserver* observer) override {
@@ -62,13 +71,12 @@
   void RemoveObserver(syncer::SyncServiceObserver* observer) override {
     observers_.RemoveObserver(observer);
   }
-  syncer::SyncTokenStatus GetSyncTokenStatus() const override {
-    syncer::SyncTokenStatus status;
-    status.connection_status = connection_status_;
-    return status;
-  }
 
-  syncer::ConnectionStatus connection_status_ = syncer::CONNECTION_OK;
+  void NotifyObserversOfStateChanged() {
+    for (auto& observer : observers_) {
+      observer.OnStateChanged(this);
+    }
+  }
 
   // The list of observers of the SyncService state.
   base::ObserverList<syncer::SyncServiceObserver>::Unchecked observers_;
@@ -133,12 +141,24 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
+TEST_F(SyncDisableObserverTest, NotActive) {
+  MockSyncService sync;
+  sync.SetStatus(false, true, false);
+  sync_preferences::TestingPrefServiceSyncable prefs;
+  RegisterUrlKeyedAnonymizedDataCollectionPref(prefs);
+  TestSyncDisableObserver observer;
+  observer.ObserveServiceForSyncDisables(&sync, &prefs);
+  EXPECT_FALSE(observer.SyncStateAllowsUkm());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
 TEST_F(SyncDisableObserverTest, OneEnabled_UnifiedConsentDisabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync;
-  sync.SetStatus(false, true);
+  sync.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync, nullptr);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
   EXPECT_TRUE(observer.ResetNotified());
@@ -155,7 +175,7 @@
   for (bool has_passphrase : {true, false}) {
     for (bool history_enabled : {true, false}) {
       TestSyncDisableObserver observer;
-      sync.SetStatus(has_passphrase, history_enabled);
+      sync.SetStatus(has_passphrase, history_enabled, /*active=*/true);
       observer.ObserveServiceForSyncDisables(&sync, &prefs);
       EXPECT_TRUE(observer.SyncStateAllowsUkm());
       EXPECT_TRUE(observer.ResetNotified());
@@ -168,7 +188,7 @@
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kDisabled);
   MockSyncService sync;
-  sync.SetStatus(true, true);
+  sync.SetStatus(true, true, true);
   TestSyncDisableObserver observer;
   observer.ObserveServiceForSyncDisables(&sync, nullptr);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
@@ -181,7 +201,7 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync;
-  sync.SetStatus(false, false);
+  sync.SetStatus(false, false, true);
   observer.ObserveServiceForSyncDisables(&sync, nullptr);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
   EXPECT_FALSE(observer.ResetNotified());
@@ -193,12 +213,12 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync;
-  sync.SetStatus(false, true);
+  sync.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync, nullptr);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
-  sync.SetConnectionStatus(syncer::CONNECTION_AUTH_ERROR);
+  sync.SetAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
-  sync.SetConnectionStatus(syncer::CONNECTION_OK);
+  sync.SetAuthError(GoogleServiceAuthError::NONE);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
 }
 
@@ -207,10 +227,10 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync1;
-  sync1.SetStatus(false, false);
+  sync1.SetStatus(false, false, true);
   observer.ObserveServiceForSyncDisables(&sync1, nullptr);
   MockSyncService sync2;
-  sync2.SetStatus(false, true);
+  sync2.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync2, nullptr);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
   EXPECT_FALSE(observer.ResetNotified());
@@ -222,12 +242,12 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync1;
-  sync1.SetStatus(false, true);
+  sync1.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync1, nullptr);
   EXPECT_TRUE(observer.ResetNotified());
 
   MockSyncService sync2;
-  sync2.SetStatus(false, false);
+  sync2.SetStatus(false, false, true);
   observer.ObserveServiceForSyncDisables(&sync2, nullptr);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
   EXPECT_TRUE(observer.ResetNotified());
@@ -263,11 +283,11 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync1;
-  sync1.SetStatus(false, true);
+  sync1.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync1, nullptr);
   EXPECT_TRUE(observer.ResetNotified());
   MockSyncService sync2;
-  sync2.SetStatus(false, true);
+  sync2.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync2, nullptr);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
   EXPECT_FALSE(observer.ResetNotified());
@@ -304,7 +324,7 @@
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
   EXPECT_FALSE(observer.ResetNotified());
   EXPECT_FALSE(observer.ResetPurged());
-  sync.SetStatus(false, true);
+  sync.SetStatus(false, true, true);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
   EXPECT_TRUE(observer.ResetNotified());
   EXPECT_FALSE(observer.ResetPurged());
@@ -340,12 +360,12 @@
       UnifiedConsentFeatureState::kDisabled);
   TestSyncDisableObserver observer;
   MockSyncService sync;
-  sync.SetStatus(false, true);
+  sync.SetStatus(false, true, true);
   observer.ObserveServiceForSyncDisables(&sync, nullptr);
   EXPECT_TRUE(observer.SyncStateAllowsUkm());
   EXPECT_TRUE(observer.ResetNotified());
   EXPECT_FALSE(observer.ResetPurged());
-  sync.SetStatus(false, false);
+  sync.SetStatus(false, false, true);
   EXPECT_FALSE(observer.SyncStateAllowsUkm());
   EXPECT_TRUE(observer.ResetNotified());
   EXPECT_TRUE(observer.ResetPurged());
diff --git a/components/unified_consent/feature.cc b/components/unified_consent/feature.cc
index 898e709..cb99cbd 100644
--- a/components/unified_consent/feature.cc
+++ b/components/unified_consent/feature.cc
@@ -11,11 +11,10 @@
 // base::Feature definition.
 const base::Feature kUnifiedConsent {
   "UnifiedConsent",
-#if defined(OS_LINUX) || defined(OS_WIN) || \
-    (defined(OS_MACOSX) && !defined(OS_IOS))
-      base::FEATURE_ENABLED_BY_DEFAULT
-#else
+#if defined(OS_CHROMEOS) || defined(OS_IOS) || defined(OS_ANDROID)
       base::FEATURE_DISABLED_BY_DEFAULT
+#else
+      base::FEATURE_ENABLED_BY_DEFAULT
 #endif
 };
 
diff --git a/components/unified_consent/feature_unittest.cc b/components/unified_consent/feature_unittest.cc
index 8be70c7..d6342e40 100644
--- a/components/unified_consent/feature_unittest.cc
+++ b/components/unified_consent/feature_unittest.cc
@@ -12,15 +12,39 @@
 namespace unified_consent {
 
 TEST(UnifiedConsentFeatureTest, FeatureState) {
-#if defined(OS_LINUX) || defined(OS_WIN) || \
-    (defined(OS_MACOSX) && !defined(OS_IOS))
-  // Unified consent is enabled by default.
-  EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
-#else
+// Linux platforms
+#if defined(OS_ANDROID)
   // Unified consent is disabled by default.
   EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
 #endif
 
+#if defined(OS_CHROMEOS)
+  // Unified consent is disabled by default.
+  EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
+#endif
+
+#if defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+  // Unified consent is enabled by default.
+  EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
+#endif
+
+// Apple platforms
+#if defined(OS_IOS)
+  // Unified consent is disabled by default.
+  EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
+#endif
+
+#if defined(OS_MACOSX) && !defined(OS_IOS)
+  // Unified consent is enabled by default.
+  EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
+#endif
+
+// Windows
+#if defined(OS_WIN)
+  // Unified consent is enabled by default.
+  EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
+#endif
+
   {
     ScopedUnifiedConsent scoped_disabled(UnifiedConsentFeatureState::kDisabled);
     EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
diff --git a/components/viz/common/gpu/DEPS b/components/viz/common/gpu/DEPS
index f310bed2..dcd56b3 100644
--- a/components/viz/common/gpu/DEPS
+++ b/components/viz/common/gpu/DEPS
@@ -8,4 +8,5 @@
   "+gpu/vulkan",
   "+third_party/khronos/GLES2/gl2.h",
   "+third_party/skia/include/gpu",
+  "+third_party/vulkan/include",
 ]
diff --git a/components/viz/common/gpu/vulkan_context_provider.h b/components/viz/common/gpu/vulkan_context_provider.h
index 0c658f09..604207f 100644
--- a/components/viz/common/gpu/vulkan_context_provider.h
+++ b/components/viz/common/gpu/vulkan_context_provider.h
@@ -5,8 +5,12 @@
 #ifndef COMPONENTS_VIZ_COMMON_GPU_VULKAN_CONTEXT_PROVIDER_H_
 #define COMPONENTS_VIZ_COMMON_GPU_VULKAN_CONTEXT_PROVIDER_H_
 
+#include <vector>
+
+#include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "components/viz/common/viz_vulkan_context_provider_export.h"
+#include "third_party/vulkan/include/vulkan/vulkan.h"
 
 class GrContext;
 class GrVkSecondaryCBDrawContext;
@@ -25,8 +29,19 @@
   virtual gpu::VulkanImplementation* GetVulkanImplementation() = 0;
   virtual gpu::VulkanDeviceQueue* GetDeviceQueue() = 0;
   virtual GrContext* GetGrContext() = 0;
+
+  // Get the current SecondaryCBDrawContext for the default render target.
   virtual GrVkSecondaryCBDrawContext* GetGrSecondaryCBDrawContext() = 0;
 
+  // Enqueue semaphores which will be submitted with GrSecondaryCB to device
+  // queue for signalling.
+  virtual void EnqueueSecondaryCBSemaphores(
+      std::vector<VkSemaphore> semaphores) = 0;
+
+  // Enqueue task which will be executed after the GrSecondaryCB and post submit
+  // semphores are submitted.
+  virtual void EnqueueSecondaryCBPostSubmitTask(base::OnceClosure closure) = 0;
+
  protected:
   friend class base::RefCountedThreadSafe<VulkanContextProvider>;
   virtual ~VulkanContextProvider() {}
diff --git a/components/viz/common/gpu/vulkan_in_process_context_provider.cc b/components/viz/common/gpu/vulkan_in_process_context_provider.cc
index d82a635..d84063f2 100644
--- a/components/viz/common/gpu/vulkan_in_process_context_provider.cc
+++ b/components/viz/common/gpu/vulkan_in_process_context_provider.cc
@@ -114,6 +114,16 @@
   return nullptr;
 }
 
+void VulkanInProcessContextProvider::EnqueueSecondaryCBSemaphores(
+    std::vector<VkSemaphore> semaphores) {
+  NOTREACHED();
+}
+
+void VulkanInProcessContextProvider::EnqueueSecondaryCBPostSubmitTask(
+    base::OnceClosure closure) {
+  NOTREACHED();
+}
+
 VulkanInProcessContextProvider::VulkanInProcessContextProvider(
     gpu::VulkanImplementation* vulkan_implementation)
     : vulkan_implementation_(vulkan_implementation) {}
diff --git a/components/viz/common/gpu/vulkan_in_process_context_provider.h b/components/viz/common/gpu/vulkan_in_process_context_provider.h
index 4fb12fcf..a906f8f 100644
--- a/components/viz/common/gpu/vulkan_in_process_context_provider.h
+++ b/components/viz/common/gpu/vulkan_in_process_context_provider.h
@@ -35,6 +35,9 @@
   gpu::VulkanDeviceQueue* GetDeviceQueue() override;
   GrContext* GetGrContext() override;
   GrVkSecondaryCBDrawContext* GetGrSecondaryCBDrawContext() override;
+  void EnqueueSecondaryCBSemaphores(
+      std::vector<VkSemaphore> semaphores) override;
+  void EnqueueSecondaryCBPostSubmitTask(base::OnceClosure closure) override;
 
  protected:
   explicit VulkanInProcessContextProvider(
diff --git a/components/viz/service/display/display.h b/components/viz/service/display/display.h
index 12b9d79..8301440 100644
--- a/components/viz/service/display/display.h
+++ b/components/viz/service/display/display.h
@@ -81,9 +81,14 @@
 
   // TODO(cblume, crbug.com/900973): |enable_shared_images| is a temporary
   // solution that unblocks us until SharedImages are threadsafe in WebView.
+#if defined(ANDROID)
+  static constexpr bool kEnableSharedImages = false;
+#else
+  static constexpr bool kEnableSharedImages = true;
+#endif
   void Initialize(DisplayClient* client,
                   SurfaceManager* surface_manager,
-                  bool enable_shared_images = false);
+                  bool enable_shared_images = kEnableSharedImages);
 
   void AddObserver(DisplayObserver* observer);
   void RemoveObserver(DisplayObserver* observer);
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index 258f683..a3e5665 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -1749,12 +1749,16 @@
                 &params->content_device_transform);
 
   // saveLayer automatically respects the clip when it is restored, and
-  // automatically reads beyond the clip for its backdrop filtered content.
+  // automatically reads beyond the clip for any pixel-moving filtered content.
   // However, since Chromium does not want image-filtered content (ex. blurs) to
   // be clipped to the visible_rect of the RPDQ, configure the clip to be the
   // expanded bounds that encloses the entire filtered content.
-  SkRect bounds = gfx::RectToSkRect(rpdq_params.filter_bounds);
-  current_canvas_->clipRect(bounds, paint.isAntiAlias());
+  //
+  // We could have instead passed the unadjusted visible_rect as the bounds
+  // pointer to the SaveLayerRec below, but that would not properly account for
+  // the backdrop_filter_bounds that needs to also be filtered.
+  current_canvas_->clipRect(gfx::RectToSkRect(rpdq_params.filter_bounds),
+                            paint.isAntiAlias());
 
   // Add the image filter to the restoration paint.
   if (rpdq_params.image_filter) {
@@ -1768,7 +1772,7 @@
     layer_flags |= SkCanvas::kInitWithPrevious_SaveLayerFlag;
   }
   current_canvas_->saveLayer(
-      SkCanvas::SaveLayerRec(&bounds, &paint, rpdq_params.backdrop_filter.get(),
+      SkCanvas::SaveLayerRec(nullptr, &paint, rpdq_params.backdrop_filter.get(),
                              rpdq_params.mask_image.get(),
                              &rpdq_params.mask_to_quad_matrix, layer_flags));
 
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
index 4fd16fa..99befa4e 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
@@ -31,6 +31,7 @@
 #include "gpu/vulkan/buildflags.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
 #include "third_party/skia/include/core/SkYUVAIndex.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/gl/color_space_utils.h"
 #include "ui/gl/gl_bindings.h"
@@ -210,9 +211,8 @@
 SkCanvas* SkiaOutputSurfaceImplNonDDL::BeginPaintCurrentFrame() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK_EQ(current_render_pass_id_, 0u);
-  DCHECK_EQ(order_num_, 0u);
-  order_num_ = sync_point_order_data_->GenerateUnprocessedOrderNumber();
-  sync_point_order_data_->BeginProcessingOrderNumber(order_num_);
+  DCHECK(!scoped_gpu_task_);
+  scoped_gpu_task_.emplace(sync_point_order_data_.get());
 
   if (shared_context_state_->GrContextIsVulkan()) {
 #if BUILDFLAG(ENABLE_VULKAN)
@@ -233,8 +233,8 @@
       Reshape(reshape_surface_size_, reshape_device_scale_factor_,
               reshape_color_space_, reshape_has_alpha_, reshape_use_stencil_);
     }
-
-    return sk_surface_->getCanvas();
+    sk_current_surface_ = sk_surface_.get();
+    return sk_current_surface_->getCanvas();
   }
 }
 
@@ -248,16 +248,17 @@
       image_context = MakeSkImageFromSharedImage(metadata);
     if (image_context) {
       if (!image_context->representation_is_being_accessed) {
-        // TODO(penghuang): create gather read access semaphores and call skia
-        // flush() with them. https://crbug.com/944194
+        std::vector<GrBackendSemaphore> begin_semaphores;
         auto promise_image_texture =
-            image_context->representation->BeginReadAccess();
+            image_context->representation->BeginReadAccess(
+                &begin_semaphores, &pending_semaphores_);
         // The image has been created and cached. It is too late to tell skia
         // the backing of the cached image is not accessible right now, so crash
         // for now.
         // TODO(penghuang): find a way to notify skia.
         CHECK(promise_image_texture);
         image_context->representation_is_being_accessed = true;
+        WaitSemaphores(std::move(begin_semaphores));
       }
       images_in_current_paint_.push_back(image_context.get());
     }
@@ -348,9 +349,6 @@
     const std::vector<ResourceId>& ids) {
   if (ids.empty())
     return;
-  DCHECK_EQ(order_num_, 0u);
-  order_num_ = sync_point_order_data_->GenerateUnprocessedOrderNumber();
-  sync_point_order_data_->BeginProcessingOrderNumber(order_num_);
   for (auto id : ids) {
     auto it = promise_image_cache_.find(id);
     if (it == promise_image_cache_.end())
@@ -358,8 +356,6 @@
     it->second->image = nullptr;
     promise_image_cache_.erase(it);
   }
-  sync_point_order_data_->FinishProcessingOrderNumber(order_num_);
-  order_num_ = 0u;
 }
 
 void SkiaOutputSurfaceImplNonDDL::SkiaSwapBuffers(OutputSurfaceFrame frame) {
@@ -380,9 +376,8 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // Make sure there is no unsubmitted PaintFrame or PaintRenderPass.
   DCHECK_EQ(current_render_pass_id_, 0u);
-  DCHECK_EQ(order_num_, 0u);
-  order_num_ = sync_point_order_data_->GenerateUnprocessedOrderNumber();
-  sync_point_order_data_->BeginProcessingOrderNumber(order_num_);
+  DCHECK(!scoped_gpu_task_);
+  scoped_gpu_task_.emplace(sync_point_order_data_.get());
   current_render_pass_id_ = id;
   auto& sk_surface = offscreen_sk_surfaces_[id];
 
@@ -395,53 +390,63 @@
     sk_surface =
         SkSurface::MakeRenderTarget(gr_context(), SkBudgeted::kNo, image_info);
   }
-  return sk_surface->getCanvas();
+
+  sk_current_surface_ = sk_surface.get();
+  return sk_current_surface_->getCanvas();
 }
 
 gpu::SyncToken SkiaOutputSurfaceImplNonDDL::SubmitPaint() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  if (current_render_pass_id_ == 0) {
-    if (shared_context_state_->GrContextIsVulkan()) {
-#if BUILDFLAG(ENABLE_VULKAN)
-      DCHECK(draw_context_);
-      draw_context_->flush();
-      draw_context_ = nullptr;
-#else
-      NOTREACHED();
-#endif
-    } else {
-      sk_surface_->flush();
-    }
-  } else {
-    offscreen_sk_surfaces_[current_render_pass_id_]->flush();
-  }
-
-  for (auto* image_context : images_in_current_paint_) {
-    if (!image_context->representation_is_being_accessed)
-      continue;
-    // TODO(penghuang): create end read access semaphores and call
-    // EndReadAccess() with them. https://crbug.com/944194
-    DCHECK(image_context->representation);
-    image_context->representation->EndReadAccess();
-    image_context->representation_is_being_accessed = false;
-  }
-
-  images_in_current_paint_.clear();
-
+  // To make sure sync_token is valid, we need make sure we are processing a gpu
+  // task.
+  DCHECK(scoped_gpu_task_);
   gpu::SyncToken sync_token(
       gpu::CommandBufferNamespace::VIZ_SKIA_OUTPUT_SURFACE_NON_DDL,
       sync_point_client_state_->command_buffer_id(), ++sync_fence_release_);
   sync_token.SetVerifyFlush();
-  sync_point_client_state_->ReleaseFenceSync(sync_fence_release_);
-  if (shared_context_state_->GrContextIsGL()) {
-    DCHECK(mailbox_manager_->UsesSync());
-    mailbox_manager_->PushTextureUpdates(sync_token);
+
+  if (!sk_current_surface_) {
+#if BUILDFLAG(ENABLE_VULKAN)
+    DCHECK(shared_context_state_->GrContextIsVulkan());
+    DCHECK(draw_context_);
+    draw_context_->flush();
+    draw_context_ = nullptr;
+    // Enqueue vk_semaphores which will be signalled when SecondaryCB is
+    // executed and finished.
+    std::vector<VkSemaphore> vk_semaphores;
+    vk_semaphores.reserve(pending_semaphores_.size());
+    for (const auto& semaphore : pending_semaphores_) {
+      DCHECK(semaphore.vkSemaphore() != VK_NULL_HANDLE);
+      vk_semaphores.push_back(semaphore.vkSemaphore());
+    }
+    pending_semaphores_.clear();
+    auto* vk_context_provider = shared_context_state_->vk_context_provider();
+    vk_context_provider->EnqueueSecondaryCBSemaphores(std::move(vk_semaphores));
+    // Enqueue FinishPaint which will be executed when the SecondaryCB is
+    // submitted and all enqueued semaphores have been submitted for signalling.
+    // WebView will not destroy OutputSurface when DrawVk is pending
+    // (PostDrawVK is not called), so it is safe to use base::Unretaied() here.
+    vk_context_provider->EnqueueSecondaryCBPostSubmitTask(
+        base::BindOnce(&SkiaOutputSurfaceImplNonDDL::FinishPaint,
+                       base::Unretained(this), sync_fence_release_));
+    return sync_token;
+#else
+    NOTREACHED();
+    return gpu::SyncToken();
+#endif
   }
-  DCHECK_NE(order_num_, 0u);
-  sync_point_order_data_->FinishProcessingOrderNumber(order_num_);
-  order_num_ = 0u;
-  current_render_pass_id_ = 0;
+
+  auto access = current_render_pass_id_ == 0
+                    ? SkSurface::BackendSurfaceAccess::kPresent
+                    : SkSurface::BackendSurfaceAccess::kNoAccess;
+  auto result = sk_current_surface_->flush(access, SkSurface::kNone_FlushFlags,
+                                           pending_semaphores_.size(),
+                                           pending_semaphores_.data());
+  DCHECK_EQ(result, GrSemaphoresSubmitted::kYes);
+  pending_semaphores_.clear();
+  sk_current_surface_ = nullptr;
+
+  FinishPaint(sync_fence_release_);
   return sync_token;
 }
 
@@ -521,16 +526,17 @@
     return nullptr;
   }
 
-  // TODO(penghuang): create gather read access semaphores and call skia flush()
-  // with them. https://crbug.com/944194
+  std::vector<GrBackendSemaphore> begin_semaphores;
   image_context->promise_image_texture =
-      image_context->representation->BeginReadAccess();
+      image_context->representation->BeginReadAccess(&begin_semaphores,
+                                                     &pending_semaphores_);
   if (!image_context->promise_image_texture) {
     DLOG(ERROR)
         << "Failed to make the SkImage - SharedImage begin access failed.";
     return nullptr;
   }
   image_context->representation_is_being_accessed = true;
+  WaitSemaphores(std::move(begin_semaphores));
 
   SkColorType color_type = ResourceFormatToClosestSkColorType(
       true /* gpu_compositing */, metadata.resource_format);
@@ -572,6 +578,30 @@
                                   metadata.resource_format, backend_texture);
 }
 
+void SkiaOutputSurfaceImplNonDDL::FinishPaint(uint64_t sync_fence_release) {
+  DCHECK(scoped_gpu_task_);
+  for (auto* image_context : images_in_current_paint_) {
+    if (!image_context->representation_is_being_accessed)
+      continue;
+    DCHECK(image_context->representation);
+    image_context->representation->EndReadAccess();
+    image_context->representation_is_being_accessed = false;
+  }
+  images_in_current_paint_.clear();
+
+  if (shared_context_state_->GrContextIsGL()) {
+    DCHECK(mailbox_manager_->UsesSync());
+    gpu::SyncToken sync_token(
+        gpu::CommandBufferNamespace::VIZ_SKIA_OUTPUT_SURFACE_NON_DDL,
+        sync_point_client_state_->command_buffer_id(), sync_fence_release);
+    sync_token.SetVerifyFlush();
+    mailbox_manager_->PushTextureUpdates(sync_token);
+  }
+  sync_point_client_state_->ReleaseFenceSync(sync_fence_release);
+  scoped_gpu_task_.reset();
+  current_render_pass_id_ = 0;
+}
+
 void SkiaOutputSurfaceImplNonDDL::BufferPresented(
     const gfx::PresentationFeedback& feedback) {
   client_->DidReceivePresentationFeedback(feedback);
@@ -583,4 +613,33 @@
     observer.OnContextLost();
 }
 
+void SkiaOutputSurfaceImplNonDDL::WaitSemaphores(
+    std::vector<GrBackendSemaphore> semaphores) {
+  if (semaphores.empty())
+    return;
+#if BUILDFLAG(ENABLE_VULKAN)
+  DCHECK(sk_current_surface_ || draw_context_);
+  auto result =
+      sk_current_surface_
+          ? sk_current_surface_->wait(semaphores.size(), semaphores.data())
+          : draw_context_->wait(semaphores.size(), semaphores.data());
+#else
+  DCHECK(sk_current_surface_);
+  auto result = sk_current_surface_->wait(semaphores.size(), semaphores.data());
+#endif
+
+  DCHECK(result);
+}
+
+SkiaOutputSurfaceImplNonDDL::ScopedGpuTask::ScopedGpuTask(
+    gpu::SyncPointOrderData* sync_point_order_data)
+    : sync_point_order_data_(sync_point_order_data),
+      order_num_(sync_point_order_data_->GenerateUnprocessedOrderNumber()) {
+  sync_point_order_data_->BeginProcessingOrderNumber(order_num_);
+}
+
+SkiaOutputSurfaceImplNonDDL::ScopedGpuTask::~ScopedGpuTask() {
+  sync_point_order_data_->FinishProcessingOrderNumber(order_num_);
+}
+
 }  // namespace viz
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
index 166fd63d..9b4375e 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/optional.h"
 #include "base/threading/thread_checker.h"
 #include "components/viz/service/display/skia_output_surface.h"
 #include "components/viz/service/viz_service_export.h"
@@ -116,6 +117,18 @@
   void ReleaseCachedResources(const std::vector<ResourceId>& ids) override;
 
  private:
+  class ScopedGpuTask {
+   public:
+    explicit ScopedGpuTask(gpu::SyncPointOrderData* sync_point_order_data);
+    ~ScopedGpuTask();
+
+   private:
+    gpu::SyncPointOrderData* const sync_point_order_data_;
+    const uint32_t order_num_;
+
+    DISALLOW_COPY_AND_ASSIGN(ScopedGpuTask);
+  };
+
   GrContext* gr_context() { return shared_context_state_->gr_context(); }
 
   bool WaitSyncToken(const gpu::SyncToken& sync_token);
@@ -123,9 +136,10 @@
       const ResourceMetadata& metadata);
   bool GetGrBackendTexture(const ResourceMetadata& metadata,
                            GrBackendTexture* backend_texture);
-
+  void FinishPaint(uint64_t sync_fence_release);
   void BufferPresented(const gfx::PresentationFeedback& feedback);
   void ContextLost();
+  void WaitSemaphores(std::vector<GrBackendSemaphore> semaphores);
 
   uint64_t sync_fence_release_ = 0;
 
@@ -137,7 +151,7 @@
   scoped_refptr<gpu::SyncPointOrderData> sync_point_order_data_;
   scoped_refptr<gpu::SyncPointClientState> sync_point_client_state_;
   const bool need_swapbuffers_ack_;
-  uint32_t order_num_ = 0u;
+  base::Optional<ScopedGpuTask> scoped_gpu_task_;
 
   OutputSurfaceClient* client_ = nullptr;
 
@@ -162,6 +176,8 @@
   GrVkSecondaryCBDrawContext* draw_context_ = nullptr;
 #endif
 
+  SkSurface* sk_current_surface_ = nullptr;
+
   // Offscreen SkSurfaces for render passes.
   base::flat_map<RenderPassId, sk_sp<SkSurface>> offscreen_sk_surfaces_;
 
@@ -172,6 +188,9 @@
   // Images for current frame or render pass.
   std::vector<ImageContext*> images_in_current_paint_;
 
+  // Semaphores which need to be signalled for the current paint.
+  std::vector<GrBackendSemaphore> pending_semaphores_;
+
   THREAD_CHECKER(thread_checker_);
 
   base::WeakPtrFactory<SkiaOutputSurfaceImplNonDDL> weak_ptr_factory_;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index f29fff45..d35f5d9 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -42,6 +42,7 @@
 #include "gpu/vulkan/buildflags.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkPixelRef.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
 #include "third_party/skia/include/private/SkDeferredDisplayList.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/skia_util.h"
@@ -73,9 +74,12 @@
   ScopedPromiseImageAccess(SkiaOutputSurfaceImplOnGpu* impl_on_gpu,
                            std::vector<ImageContext*> image_contexts)
       : impl_on_gpu_(impl_on_gpu), image_contexts_(std::move(image_contexts)) {
+    begin_semaphores_.reserve(image_contexts_.size());
+    end_semaphores_.reserve(image_contexts_.size());
     // TODO(penghuang): gather begin read access semaphores from shared images.
     // https://crbug.com/944194
-    impl_on_gpu_->BeginAccessImages(image_contexts_);
+    impl_on_gpu_->BeginAccessImages(image_contexts_, &begin_semaphores_,
+                                    &end_semaphores_);
   }
 
   ~ScopedPromiseImageAccess() {
@@ -84,9 +88,17 @@
     impl_on_gpu_->EndAccessImages(image_contexts_);
   }
 
+  std::vector<GrBackendSemaphore>& begin_semaphores() {
+    return begin_semaphores_;
+  }
+
+  std::vector<GrBackendSemaphore>& end_semaphores() { return end_semaphores_; }
+
  private:
   SkiaOutputSurfaceImplOnGpu* const impl_on_gpu_;
   std::vector<ImageContext*> image_contexts_;
+  std::vector<GrBackendSemaphore> begin_semaphores_;
+  std::vector<GrBackendSemaphore> end_semaphores_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedPromiseImageAccess);
 };
@@ -417,8 +429,23 @@
     }
     ScopedPromiseImageAccess scoped_promise_image_access(
         this, std::move(image_contexts));
+    auto wait_result = output_sk_surface()->wait(
+        scoped_promise_image_access.begin_semaphores().size(),
+        scoped_promise_image_access.begin_semaphores().data());
+    DCHECK(wait_result);
     output_sk_surface()->draw(ddl.get());
-    gr_context()->flush();
+    GrFlushInfo flush_info = {
+        .fFlags = kNone_GrFlushFlags,
+        .fNumSemaphores = scoped_promise_image_access.end_semaphores().size(),
+        .fSignalSemaphores =
+            scoped_promise_image_access.end_semaphores().data(),
+    };
+    // TODO(penghuang): flush output_sk_surface() with kPresent.
+    if (gr_context()->flush(flush_info) != GrSemaphoresSubmitted::kYes) {
+      // TODO(penghuang): handle vulkan device lost.
+      DLOG(ERROR) << "GrContext::flush() failed.";
+      return;
+    }
   }
 
   // Note that the ScopedCacheUse for GrShaderCache is scoped until the
@@ -493,8 +520,6 @@
 
   auto& offscreen = offscreen_surfaces_[id];
   SkSurfaceCharacterization characterization;
-  // TODO(penghuang): Using characterization != ddl->characterization(), when
-  // the SkSurfaceCharacterization::operator!= is implemented in Skia.
   if (!offscreen.surface() ||
       !offscreen.surface()->characterize(&characterization) ||
       characterization != ddl->characterization()) {
@@ -508,8 +533,23 @@
       cache_use.emplace(gr_shader_cache_, gpu::kInProcessCommandBufferClientId);
     ScopedPromiseImageAccess scoped_promise_image_access(
         this, std::move(image_contexts));
+    auto wait_result = offscreen.surface()->wait(
+        scoped_promise_image_access.begin_semaphores().size(),
+        scoped_promise_image_access.begin_semaphores().data());
+    DCHECK(wait_result);
     offscreen.surface()->draw(ddl.get());
-    gr_context()->flush();
+    GrFlushInfo flush_info = {
+        .fFlags = kNone_GrFlushFlags,
+        .fNumSemaphores = scoped_promise_image_access.end_semaphores().size(),
+        .fSignalSemaphores =
+            scoped_promise_image_access.end_semaphores().data(),
+    };
+    // TODO(penghuang): flush offscreen.surface() only.
+    if (gr_context()->flush(flush_info) != GrSemaphoresSubmitted::kYes) {
+      // TODO(penghuang): handle vulkan device lost.
+      DLOG(ERROR) << "GrContext::flush() failed.";
+      return;
+    }
   }
   ReleaseFenceSyncAndPushTextureUpdates(sync_fence_release);
 }
@@ -718,7 +758,9 @@
 }
 
 void SkiaOutputSurfaceImplOnGpu::BeginAccessImages(
-    const std::vector<ImageContext*>& image_contexts) {
+    const std::vector<ImageContext*>& image_contexts,
+    std::vector<GrBackendSemaphore>* begin_semaphores,
+    std::vector<GrBackendSemaphore>* end_semaphores) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   for (auto* context : image_contexts) {
     // Skip the context if it has been processed.
@@ -752,8 +794,8 @@
         if (context->representation) {
           // TODO(penghuang): create gather read access semaphores and call
           // skia flush() with them. https://crbug.com/944194
-          auto promise_image_texture =
-              context->representation->BeginReadAccess();
+          auto promise_image_texture = context->representation->BeginReadAccess(
+              begin_semaphores, end_semaphores);
           // The image has been fulfilled and cached. It is too late to tell
           // skia the backing of the cached image is not accessible right now,
           // so crash for now.
@@ -785,8 +827,8 @@
       context->representation = std::move(representation);
       // TODO(penghuang): create gather read access semaphores and call
       // skia flush() with them. https://crbug.com/944194
-      context->promise_image_texture =
-          context->representation->BeginReadAccess();
+      context->promise_image_texture = context->representation->BeginReadAccess(
+          begin_semaphores, end_semaphores);
       if (!context->promise_image_texture) {
         DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage "
                        "begin read access failed..";
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
index d50aa266..9318f1c 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -29,6 +29,7 @@
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/latency/latency_tracker.h"
 
+class GrBackendSemaphore;
 class SkDeferredDisplayList;
 
 namespace base {
@@ -138,7 +139,9 @@
                   const gfx::ColorSpace& color_space,
                   std::unique_ptr<CopyOutputRequest> request);
 
-  void BeginAccessImages(const std::vector<ImageContext*>& image_contexts);
+  void BeginAccessImages(const std::vector<ImageContext*>& image_contexts,
+                         std::vector<GrBackendSemaphore>* begin_semaphores,
+                         std::vector<GrBackendSemaphore>* end_semaphores);
   void EndAccessImages(const std::vector<ImageContext*>& image_contexts);
 
   sk_sp<GrContextThreadSafeProxy> GetGrContextThreadSafeProxy();
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 4198b41c..47f776b 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1280,6 +1280,8 @@
     "message_port_provider.cc",
     "mime_registry_impl.cc",
     "mime_registry_impl.h",
+    "navigation_subresource_loader_params.cc",
+    "navigation_subresource_loader_params.h",
     "net/browser_online_state_observer.cc",
     "net/browser_online_state_observer.h",
     "net/network_errors_listing_ui.cc",
diff --git a/content/browser/android/content_url_loader_factory.cc b/content/browser/android/content_url_loader_factory.cc
index 7e76f4c..1ac1dde1 100644
--- a/content/browser/android/content_url_loader_factory.cc
+++ b/content/browser/android/content_url_loader_factory.cc
@@ -73,8 +73,7 @@
   out_mime_type->clear();
 
   std::string intent_type_header;
-  if ((request.resource_type ==
-       static_cast<int>(content::ResourceType::kMainFrame)) &&
+  if ((request.resource_type == content::ResourceType::kMainFrame) &&
       request.headers.GetHeader("X-Chrome-intent-type", &intent_type_header)) {
     *out_mime_type = intent_type_header;
   }
diff --git a/content/browser/appcache/appcache_request_handler.cc b/content/browser/appcache/appcache_request_handler.cc
index da91341..023b98c 100644
--- a/content/browser/appcache/appcache_request_handler.cc
+++ b/content/browser/appcache/appcache_request_handler.cc
@@ -19,7 +19,7 @@
 #include "content/browser/appcache/appcache_url_loader_job.h"
 #include "content/browser/appcache/appcache_url_loader_request.h"
 #include "content/browser/appcache/appcache_url_request_job.h"
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_job.h"
 #include "services/network/public/cpp/features.h"
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index 97fd3ee9..71887b71 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -785,19 +785,10 @@
 
   const GURL url1("http://foo1");
 
-  controller.LoadURL(
-      url1, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
-  FrameHostMsg_DidCommitProvisionalLoad_Params params;
-  params.nav_entry_id = controller.GetPendingEntry()->GetUniqueID();
-  params.did_create_new_entry = true;
-  params.url = url1;
-  params.transition = ui::PAGE_TRANSITION_TYPED;
-  params.method = "POST";
-  params.post_id = 123;
-  params.page_state =
-      PageState::CreateForTesting(url1, false, nullptr, nullptr);
-  main_test_rfh()->PrepareForCommit();
-  main_test_rfh()->SendNavigateWithParams(&params, false);
+  auto navigation1 =
+      NavigationSimulatorImpl::CreateBrowserInitiated(url1, contents());
+  navigation1->SetIsPostWithId(123);
+  navigation1->Commit();
 
   // The post data should be visible.
   NavigationEntry* entry = controller.GetVisibleEntry();
@@ -805,19 +796,17 @@
   EXPECT_TRUE(entry->GetHasPostData());
   EXPECT_EQ(entry->GetPostID(), 123);
 
-  controller.LoadURL(
-      url1, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
-  main_test_rfh()->PrepareForCommit();
-  main_test_rfh()->SendNavigateWithTransition(
-      controller.GetPendingEntry()->GetUniqueID(),
-      false, url1, ui::PAGE_TRANSITION_TYPED);
+  auto navigation2 =
+      NavigationSimulatorImpl::CreateBrowserInitiated(url1, contents());
+  navigation2->set_did_create_new_entry(false);
+  navigation2->Commit();
 
   // We should not have produced a new session history entry.
   ASSERT_EQ(controller.GetVisibleEntry(), entry);
 
   // The post data should have been cleared due to the GET.
   EXPECT_FALSE(entry->GetHasPostData());
-  EXPECT_EQ(entry->GetPostID(), 0);
+  EXPECT_EQ(entry->GetPostID(), -1);
 }
 
 // Tests loading a URL but discarding it before the load commits.
@@ -1468,6 +1457,7 @@
 
   // Fake a commit response.
   navigation->set_should_replace_current_entry(true);
+  navigation->Commit();
 
   // Certain values that are only used for pending entries get reset after
   // commit.
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h
index 312172f..c365ac9 100644
--- a/content/browser/frame_host/navigation_request.h
+++ b/content/browser/frame_host/navigation_request.h
@@ -17,11 +17,11 @@
 #include "content/browser/frame_host/navigation_throttle_runner.h"
 #include "content/browser/initiator_csp_context.h"
 #include "content/browser/loader/navigation_url_loader_delegate.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/common/content_export.h"
 #include "content/common/frame_message_enums.h"
 #include "content/common/navigation_params.h"
 #include "content/common/navigation_params.mojom.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/public/browser/navigation_throttle.h"
 #include "content/public/browser/navigation_type.h"
 #include "content/public/browser/render_process_host_observer.h"
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 3932774..7be0d3ea 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -74,6 +74,7 @@
 #include "content/browser/media/media_interface_proxy.h"
 #include "content/browser/media/session/media_session_service_impl.h"
 #include "content/browser/media/webaudio/audio_context_manager_impl.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/payments/payment_app_context_impl.h"
 #include "content/browser/permissions/permission_controller_impl.h"
 #include "content/browser/permissions/permission_service_context.h"
@@ -118,7 +119,6 @@
 #include "content/common/input/input_handler.mojom.h"
 #include "content/common/inter_process_time_ticks_converter.h"
 #include "content/common/navigation_params.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/common/render_message_filter.mojom.h"
 #include "content/common/renderer.mojom.h"
 #include "content/common/swapped_out_messages.h"
diff --git a/content/browser/loader/navigation_loader_interceptor.cc b/content/browser/loader/navigation_loader_interceptor.cc
index 2b02b49d..421aefd 100644
--- a/content/browser/loader/navigation_loader_interceptor.cc
+++ b/content/browser/loader/navigation_loader_interceptor.cc
@@ -4,7 +4,7 @@
 
 #include "content/browser/loader/navigation_loader_interceptor.h"
 
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 
 namespace content {
 
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 0010982..d385b57d 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -34,6 +34,7 @@
 #include "content/browser/loader/prefetch_url_loader_service.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/loader/resource_request_info_impl.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/resource_context_impl.h"
 #include "content/browser/service_worker/service_worker_navigation_handle.h"
 #include "content/browser/service_worker/service_worker_navigation_handle_core.h"
@@ -49,7 +50,6 @@
 #include "content/browser/webui/url_data_manager_backend.h"
 #include "content/browser/webui/web_ui_url_loader_factory_internal.h"
 #include "content/common/mime_sniffing_throttle.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/common/net/record_load_histograms.h"
 #include "content/common/throttling_url_loader.h"
 #include "content/public/browser/browser_context.h"
@@ -217,9 +217,9 @@
   new_request->headers.AddHeadersFromString(
       request_info->begin_params->headers);
 
-  new_request->resource_type =
-      static_cast<int>(request_info->is_main_frame ? ResourceType::kMainFrame
-                                                   : ResourceType::kSubFrame);
+  new_request->resource_type = request_info->is_main_frame
+                                   ? ResourceType::kMainFrame
+                                   : ResourceType::kSubFrame;
   if (request_info->is_main_frame)
     new_request->update_first_party_url_on_redirect = true;
 
@@ -890,8 +890,7 @@
         bool handled = GetContentClient()->browser()->HandleExternalProtocol(
             resource_request_->url, web_contents_getter_,
             ChildProcessHost::kInvalidUniqueID, navigation_ui_data_.get(),
-            resource_request_->resource_type ==
-                static_cast<int>(ResourceType::kMainFrame),
+            resource_request_->resource_type == ResourceType::kMainFrame,
             static_cast<ui::PageTransition>(resource_request_->transition_type),
             resource_request_->has_user_gesture, resource_request_->method,
             resource_request_->headers, &proxied_factory_request_,
@@ -949,9 +948,8 @@
       }
     }
     url_chain_.push_back(resource_request_->url);
-    *out_options =
-        GetURLLoaderOptions(resource_request_->resource_type ==
-                            static_cast<int>(ResourceType::kMainFrame));
+    *out_options = GetURLLoaderOptions(resource_request_->resource_type ==
+                                       ResourceType::kMainFrame);
     return factory;
   }
 
diff --git a/content/browser/loader/prefetch_url_loader_service.cc b/content/browser/loader/prefetch_url_loader_service.cc
index e590369d..35ad671 100644
--- a/content/browser/loader/prefetch_url_loader_service.cc
+++ b/content/browser/loader/prefetch_url_loader_service.cc
@@ -89,8 +89,7 @@
     scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
     base::RepeatingCallback<int(void)> frame_tree_node_id_getter) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(static_cast<int>(ResourceType::kPrefetch),
-            resource_request.resource_type);
+  DCHECK_EQ(ResourceType::kPrefetch, resource_request.resource_type);
   DCHECK(resource_context_);
 
   if (prefetch_load_callback_for_testing_)
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 86b891f..27f7edf2 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -915,7 +915,7 @@
       &request_context);
 
   // All PREFETCH requests should be GETs, but be defensive about it.
-  if (request_data.resource_type == static_cast<int>(ResourceType::kPrefetch) &&
+  if (request_data.resource_type == ResourceType::kPrefetch &&
       request_data.method != "GET") {
     AbortRequestBeforeItStarts(requester_info->filter(), request_id,
                                std::move(url_loader_client));
@@ -1103,7 +1103,7 @@
           url_loader_options);
 
   // Prefetches outlive their child process.
-  if (request_data.resource_type == static_cast<int>(ResourceType::kPrefetch)) {
+  if (request_data.resource_type == ResourceType::kPrefetch) {
     auto detachable_handler = std::make_unique<DetachableResourceHandler>(
         request,
         base::TimeDelta::FromMilliseconds(kDefaultDetachableCancelDelayMs),
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 1cbb887..f45b1d7 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -107,7 +107,7 @@
   request.referrer_policy = Referrer::GetDefaultReferrerPolicy();
   request.load_flags = 0;
   request.plugin_child_id = -1;
-  request.resource_type = static_cast<int>(type);
+  request.resource_type = type;
   request.appcache_host_id = blink::mojom::kAppCacheNoHostId;
   request.should_reset_appcache = false;
   request.render_frame_id = 0;
diff --git a/content/browser/loader/resource_message_filter.cc b/content/browser/loader/resource_message_filter.cc
index 585999c..47f695e8 100644
--- a/content/browser/loader/resource_message_filter.cc
+++ b/content/browser/loader/resource_message_filter.cc
@@ -120,7 +120,7 @@
     return;
   }
 
-  if (url_request.resource_type == static_cast<int>(ResourceType::kPrefetch) &&
+  if (url_request.resource_type == ResourceType::kPrefetch &&
       prefetch_url_loader_service_) {
     prefetch_url_loader_service_->CreateLoaderAndStart(
         std::move(request), routing_id, request_id, options, url_request,
diff --git a/content/browser/loader/url_loader_factory_impl_unittest.cc b/content/browser/loader/url_loader_factory_impl_unittest.cc
index f929416..aa84285 100644
--- a/content/browser/loader/url_loader_factory_impl_unittest.cc
+++ b/content/browser/loader/url_loader_factory_impl_unittest.cc
@@ -148,7 +148,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   factory_->CreateLoaderAndStart(
@@ -225,7 +225,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   factory_->CreateLoaderAndStart(
@@ -255,7 +255,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   factory_->CreateLoaderAndStart(
@@ -283,7 +283,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   ASSERT_FALSE(request.url.is_valid());
@@ -314,7 +314,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   factory_->CreateLoaderAndStart(
@@ -346,7 +346,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   request.report_raw_headers = true;
@@ -408,7 +408,7 @@
   // |resource_type| can't be a frame type. It is because when PlzNavigate is
   // enabled, the url scheme of frame type requests from the renderer process
   // must be blob scheme.
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   // Need to set same-site |request_initiator| for non main frame type request.
   request.request_initiator = url::Origin::Create(request.url);
   factory_->CreateLoaderAndStart(
diff --git a/content/common/navigation_subresource_loader_params.cc b/content/browser/navigation_subresource_loader_params.cc
similarity index 92%
rename from content/common/navigation_subresource_loader_params.cc
rename to content/browser/navigation_subresource_loader_params.cc
index 279d0559..fb7bef75 100644
--- a/content/common/navigation_subresource_loader_params.cc
+++ b/content/browser/navigation_subresource_loader_params.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 
 namespace content {
 
diff --git a/content/common/navigation_subresource_loader_params.h b/content/browser/navigation_subresource_loader_params.h
similarity index 90%
rename from content/common/navigation_subresource_loader_params.h
rename to content/browser/navigation_subresource_loader_params.h
index 66486a5d..7e20d0e 100644
--- a/content/common/navigation_subresource_loader_params.h
+++ b/content/browser/navigation_subresource_loader_params.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_COMMON_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
-#define CONTENT_COMMON_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
+#ifndef CONTENT_BROWSER_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
+#define CONTENT_BROWSER_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
 
 #include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
@@ -45,4 +45,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_COMMON_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
+#endif  // CONTENT_BROWSER_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 6546420..7c80fcfe 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -109,6 +109,7 @@
 #include "content/browser/media/media_internals.h"
 #include "content/browser/media/midi_host.h"
 #include "content/browser/mime_registry_impl.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/payments/payment_manager.h"
 #include "content/browser/permissions/permission_service_context.h"
 #include "content/browser/permissions/permission_service_impl.h"
@@ -145,7 +146,6 @@
 #include "content/common/in_process_child_thread_params.h"
 #include "content/common/media/aec_dump_messages.h"
 #include "content/common/media/peer_connection_tracker_messages.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/common/resource_messages.h"
 #include "content/common/service_manager/child_connection.h"
 #include "content/common/service_manager/service_manager_connection_impl.h"
diff --git a/content/browser/resources/media/webrtc_internals.html b/content/browser/resources/media/webrtc_internals.html
index 39434b9..76a818fe 100644
--- a/content/browser/resources/media/webrtc_internals.html
+++ b/content/browser/resources/media/webrtc_internals.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html i18n-values="dir:textdirection;lang:language">
+<html>
   <head>
     <meta charset="utf-8">
     <title>WebRTC Internals</title>
@@ -8,7 +8,7 @@
     <script src="webrtc_internals.js"></script>
   </head>
   <body>
-    <p id='content-root'>
+    <p id="content-root">
     </p>
   </body>
 </html>
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 94540e16..c321cdd 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -145,7 +145,7 @@
   request.request_initiator = url::Origin();
   request.load_flags = 0;
   request.plugin_child_id = -1;
-  request.resource_type = static_cast<int>(ResourceType::kXhr);
+  request.resource_type = ResourceType::kXhr;
   request.appcache_host_id = blink::mojom::kAppCacheNoHostId;
   request.should_reset_appcache = false;
   request.is_main_frame = true;
diff --git a/content/browser/service_worker/service_worker_cache_writer.cc b/content/browser/service_worker/service_worker_cache_writer.cc
index 8e7e9f7..1935f81 100644
--- a/content/browser/service_worker/service_worker_cache_writer.cc
+++ b/content/browser/service_worker/service_worker_cache_writer.cc
@@ -597,8 +597,15 @@
 
 int ServiceWorkerCacheWriter::WriteInfo(
     scoped_refptr<HttpResponseInfoIOBuffer> response_info) {
-  if (write_observer_)
-    write_observer_->WillWriteInfo(response_info);
+  if (!write_observer_)
+    return WriteInfoToResponseWriter(std::move(response_info));
+
+  int result = write_observer_->WillWriteInfo(response_info);
+  if (result != net::OK) {
+    DCHECK_NE(result, net::ERR_IO_PENDING);
+    state_ = STATE_DONE;
+    return result;
+  }
 
   return WriteInfoToResponseWriter(std::move(response_info));
 }
diff --git a/content/browser/service_worker/service_worker_cache_writer.h b/content/browser/service_worker/service_worker_cache_writer.h
index f4cb33f0..d0b74fb8 100644
--- a/content/browser/service_worker/service_worker_cache_writer.h
+++ b/content/browser/service_worker/service_worker_cache_writer.h
@@ -45,7 +45,8 @@
   class WriteObserver {
    public:
     // Called before response info is written to storage.
-    virtual void WillWriteInfo(
+    // Returns net::OK if success. Other values are treated as errors.
+    virtual int WillWriteInfo(
         scoped_refptr<HttpResponseInfoIOBuffer> response_info) = 0;
 
     // Called before response data is written to storage.
diff --git a/content/browser/service_worker/service_worker_cache_writer_unittest.cc b/content/browser/service_worker/service_worker_cache_writer_unittest.cc
index df86394..665db01 100644
--- a/content/browser/service_worker/service_worker_cache_writer_unittest.cc
+++ b/content/browser/service_worker/service_worker_cache_writer_unittest.cc
@@ -30,9 +30,10 @@
   MockServiceWorkerCacheWriterObserver() : data_length_(0), result_(net::OK) {}
   ~MockServiceWorkerCacheWriterObserver() {}
 
-  void WillWriteInfo(
+  int WillWriteInfo(
       scoped_refptr<HttpResponseInfoIOBuffer> response_info) override {
     response_info_ = std::move(response_info);
+    return net::OK;
   }
 
   int WillWriteData(scoped_refptr<net::IOBuffer> data,
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 7ca2858c..58fdd117 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -10,12 +10,12 @@
 #include "base/bind.h"
 #include "base/trace_event/trace_event.h"
 #include "components/offline_pages/buildflags/buildflags.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/browser/service_worker/service_worker_navigation_loader.h"
 #include "content/browser/service_worker/service_worker_provider_host.h"
 #include "content/browser/service_worker/service_worker_registration.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index f14302d..1035113a 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -69,7 +69,7 @@
     ServiceWorkerNavigationLoader* MaybeCreateLoader() {
       network::ResourceRequest resource_request;
       resource_request.url = request_->url();
-      resource_request.resource_type = static_cast<int>(resource_type_);
+      resource_request.resource_type = resource_type_;
       resource_request.headers = request()->extra_request_headers();
       handler_->MaybeCreateLoader(resource_request, nullptr,
                                   base::DoNothing(), base::DoNothing());
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 5f8b5f3..3659fed 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -663,8 +663,7 @@
     return false;
 
   network::ResourceRequest resource_request(original_request);
-  resource_request.resource_type =
-      static_cast<int>(ResourceType::kNavigationPreload);
+  resource_request.resource_type = ResourceType::kNavigationPreload;
   resource_request.skip_service_worker = true;
   resource_request.do_not_prompt_for_login = true;
 
diff --git a/content/browser/service_worker/service_worker_navigation_loader.cc b/content/browser/service_worker/service_worker_navigation_loader.cc
index b7584fad..ae21a92 100644
--- a/content/browser/service_worker/service_worker_navigation_loader.cc
+++ b/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -536,8 +536,7 @@
   DCHECK(!completion_time_.is_null());
 
   // We only record these metrics for top-level navigation.
-  if (resource_request_.resource_type !=
-      static_cast<int>(ResourceType::kMainFrame))
+  if (resource_request_.resource_type != ResourceType::kMainFrame)
     return;
 
   // |fetch_event_timing_| is recorded in renderer so we can get reasonable
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index c8eeedf..b63abb9d 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -478,7 +478,7 @@
 
 // End of URLLoaderClient ------------------------------------------------------
 
-void ServiceWorkerNewScriptLoader::WillWriteInfo(
+int ServiceWorkerNewScriptLoader::WillWriteInfo(
     scoped_refptr<HttpResponseInfoIOBuffer> response_info) {
   DCHECK_EQ(type_, Type::kResume);
   DCHECK(response_info);
@@ -492,6 +492,22 @@
   ServiceWorkerUtils::SendHttpResponseInfoToClient(
       info, original_options_, request_start_, base::TimeTicks::Now(),
       response_info->response_data_size, client_.get());
+
+  mojo::ScopedDataPipeConsumerHandle client_consumer;
+  if (mojo::CreateDataPipe(nullptr, &client_producer_, &client_consumer) !=
+      MOJO_RESULT_OK) {
+    // Reports error to cache writer and finally the loader would process this
+    // failure in OnCacheWriterResumed()
+    return net::ERR_INSUFFICIENT_RESOURCES;
+  }
+
+  // Pass the consumer handle to the client.
+  client_->OnStartLoadingResponseBody(std::move(client_consumer));
+  client_producer_watcher_.Watch(
+      client_producer_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
+      base::BindRepeating(&ServiceWorkerNewScriptLoader::OnClientWritable,
+                          weak_factory_.GetWeakPtr()));
+  return net::OK;
 }
 
 void ServiceWorkerNewScriptLoader::OnClientWritable(MojoResult) {
@@ -539,28 +555,12 @@
     base::OnceCallback<void(net::Error)> callback) {
   DCHECK_EQ(type_, Type::kResume);
   DCHECK(!write_observer_complete_callback_);
+  DCHECK(client_producer_);
+
   data_to_send_ = std::move(data);
   data_length_ = length;
   bytes_sent_to_client_ = 0;
   write_observer_complete_callback_ = std::move(callback);
-
-  // Send a data pipe to the client if it's the first call of WillWriteData().
-  if (!client_producer_) {
-    mojo::ScopedDataPipeConsumerHandle client_consumer;
-    if (mojo::CreateDataPipe(nullptr, &client_producer_, &client_consumer) !=
-        MOJO_RESULT_OK) {
-      // Report error to cache writer and finally the loader would process this
-      // failure in OnCacheWriterResumed().
-      return net::ERR_INSUFFICIENT_RESOURCES;
-    }
-
-    // Pass the consumer handle for responding with the response to the client.
-    client_->OnStartLoadingResponseBody(std::move(client_consumer));
-    client_producer_watcher_.Watch(
-        client_producer_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
-        base::BindRepeating(&ServiceWorkerNewScriptLoader::OnClientWritable,
-                            weak_factory_.GetWeakPtr()));
-  }
   client_producer_watcher_.ArmOrNotify();
   return net::ERR_IO_PENDING;
 }
diff --git a/content/browser/service_worker/service_worker_new_script_loader.h b/content/browser/service_worker/service_worker_new_script_loader.h
index 424cd8e..741c9035 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.h
+++ b/content/browser/service_worker/service_worker_new_script_loader.h
@@ -157,7 +157,7 @@
 
   // Implements ServiceWorkerCacheWriter::WriteObserver.
   // These two methods are only used for resume loaders.
-  void WillWriteInfo(
+  int WillWriteInfo(
       scoped_refptr<HttpResponseInfoIOBuffer> response_info) override;
   int WillWriteData(scoped_refptr<net::IOBuffer> data,
                     int length,
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 152efa9..6a3f4f8 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -244,9 +244,9 @@
     network::ResourceRequest request;
     request.url = url;
     request.method = "GET";
-    request.resource_type = static_cast<int>((url == version_->script_url())
-                                                 ? ResourceType::kServiceWorker
-                                                 : ResourceType::kScript);
+    request.resource_type = (url == version_->script_url())
+                                ? ResourceType::kServiceWorker
+                                : ResourceType::kScript;
 
     *out_client = std::make_unique<network::TestURLLoaderClient>();
     if (type == ServiceWorkerNewScriptLoader::Type::kResume) {
@@ -920,17 +920,13 @@
   }
 
   // Verify the received response.
-  void CheckReceivedResponse(bool has_body, const std::string& expected_body) {
+  void CheckReceivedResponse(const std::string& expected_body) {
     EXPECT_TRUE(client_->has_received_response());
-    EXPECT_EQ(has_body, client_->response_body().is_valid());
+    EXPECT_TRUE(client_->response_body().is_valid());
 
     // The response should also be stored in the storage.
     EXPECT_TRUE(ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse(
-        LookupResourceId(kScriptURL), context()->storage(),
-        has_body ? expected_body : ""));
-
-    if (!has_body)
-      return;
+        LookupResourceId(kScriptURL), context()->storage(), expected_body));
 
     std::string response;
     EXPECT_TRUE(mojo::BlockingCopyToString(client_->response_body_release(),
@@ -980,7 +976,7 @@
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
   // The client should have received the response.
-  CheckReceivedResponse(true, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader when the script data block in the middle is
@@ -1012,7 +1008,7 @@
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
   // The client should have received the response.
-  CheckReceivedResponse(true, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader when the last script data block is different.
@@ -1039,7 +1035,7 @@
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
   // The client should have received the response.
-  CheckReceivedResponse(true, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader when the last script data block is different and
@@ -1064,7 +1060,7 @@
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
   // The client should have received the response.
-  CheckReceivedResponse(true, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader when the new script has more data appended.
@@ -1095,7 +1091,7 @@
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
   // The client should have received the response.
-  CheckReceivedResponse(true, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader when the script changed to have no body.
@@ -1117,7 +1113,7 @@
 
   EXPECT_EQ(net::OK, client_->completion_status().error_code);
 
-  CheckReceivedResponse(false, kNewData);
+  CheckReceivedResponse(kNewData);
 }
 
 // Tests resume type loader could report error when the resumed network
diff --git a/content/browser/service_worker/service_worker_request_handler.cc b/content/browser/service_worker/service_worker_request_handler.cc
index 95c9697f..acde0ae 100644
--- a/content/browser/service_worker/service_worker_request_handler.cc
+++ b/content/browser/service_worker/service_worker_request_handler.cc
@@ -93,11 +93,9 @@
     const network::ResourceRequest& resource_request,
     ServiceWorkerProviderHost* host) {
   DCHECK(host);
-  DCHECK(resource_request.resource_type ==
-             static_cast<int>(ResourceType::kWorker) ||
-         resource_request.resource_type ==
-             static_cast<int>(ResourceType::kSharedWorker))
-      << resource_request.resource_type;
+  DCHECK(resource_request.resource_type == ResourceType::kWorker ||
+         resource_request.resource_type == ResourceType::kSharedWorker)
+      << static_cast<int>(resource_request.resource_type);
 
   // Create the handler even for insecure HTTP since it's used in the
   // case of redirect to HTTPS.
@@ -112,7 +110,7 @@
       resource_request.fetch_redirect_mode, resource_request.fetch_integrity,
       resource_request.keepalive,
       static_cast<ResourceType>(resource_request.resource_type),
-      resource_request.resource_type == static_cast<int>(ResourceType::kWorker)
+      resource_request.resource_type == ResourceType::kWorker
           ? blink::mojom::RequestContextType::WORKER
           : blink::mojom::RequestContextType::SHARED_WORKER,
       resource_request.fetch_frame_type, resource_request.request_body,
diff --git a/content/browser/service_worker/service_worker_script_loader_factory.cc b/content/browser/service_worker/service_worker_script_loader_factory.cc
index 41214ad0..3744c3e 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -171,14 +171,13 @@
 
   // Handle only the service worker main script (ResourceType::kServiceWorker)
   // or importScripts() (ResourceType::kScript).
-  if (resource_request.resource_type !=
-          static_cast<int>(ResourceType::kServiceWorker) &&
-      resource_request.resource_type !=
-          static_cast<int>(ResourceType::kScript)) {
+  if (resource_request.resource_type != ResourceType::kServiceWorker &&
+      resource_request.resource_type != ResourceType::kScript) {
     static auto* key = base::debug::AllocateCrashKeyString(
         "swslf_bad_type", base::debug::CrashKeySize::Size32);
     base::debug::SetCrashKeyString(
-        key, base::NumberToString(resource_request.resource_type));
+        key,
+        base::NumberToString(static_cast<int>(resource_request.resource_type)));
     mojo::ReportBadMessage("SWSLF_BAD_RESOURCE_TYPE");
     return false;
   }
diff --git a/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc b/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
index 0f0ddcd..be215b4 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
@@ -114,8 +114,7 @@
     network::mojom::URLLoaderPtr loader;
     network::ResourceRequest resource_request;
     resource_request.url = scope_;
-    resource_request.resource_type =
-        static_cast<int>(ResourceType::kServiceWorker);
+    resource_request.resource_type = ResourceType::kServiceWorker;
     factory_->CreateLoaderAndStart(
         mojo::MakeRequest(&loader), 0 /* routing_id */, 0 /* request_id */,
         network::mojom::kURLLoadOptionNone, resource_request,
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker.cc b/content/browser/service_worker/service_worker_single_script_update_checker.cc
index 41f86214..48edae4 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker.cc
@@ -82,8 +82,8 @@
       weak_factory_(this) {
   network::ResourceRequest resource_request;
   resource_request.url = url;
-  resource_request.resource_type = static_cast<int>(
-      is_main_script ? ResourceType::kServiceWorker : ResourceType::kScript);
+  resource_request.resource_type =
+      is_main_script ? ResourceType::kServiceWorker : ResourceType::kScript;
   resource_request.do_not_prompt_for_login = true;
   if (is_main_script)
     resource_request.headers.SetHeader("Service-Worker", "script");
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher.cc b/content/browser/web_package/signed_exchange_cert_fetcher.cc
index b6ee73bd..1f5fd87 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher.cc
@@ -112,8 +112,7 @@
   // |request_initiator| is used for cookie checks, but cert requests don't use
   // cookies. So just set an opaque Origin.
   resource_request_->request_initiator = url::Origin();
-  resource_request_->resource_type =
-      static_cast<int>(ResourceType::kSubResource);
+  resource_request_->resource_type = ResourceType::kSubResource;
   // Cert requests should not send credential informartion, because the default
   // credentials mode of Fetch is "omit".
   resource_request_->load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA |
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
index 8153505..ecb579c 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
@@ -262,7 +262,7 @@
   ASSERT_TRUE(mock_loader_factory_.client_ptr());
   ASSERT_TRUE(mock_loader_factory_.url_request());
   EXPECT_EQ(url_, mock_loader_factory_.url_request()->url);
-  EXPECT_EQ(static_cast<int>(ResourceType::kSubResource),
+  EXPECT_EQ(ResourceType::kSubResource,
             mock_loader_factory_.url_request()->resource_type);
   EXPECT_EQ(net::LOAD_DO_NOT_SEND_AUTH_DATA | net::LOAD_DO_NOT_SAVE_COOKIES |
                 net::LOAD_DO_NOT_SEND_COOKIES,
@@ -320,7 +320,7 @@
 
   ASSERT_TRUE(mock_loader_factory_.url_request());
   EXPECT_EQ(url_, mock_loader_factory_.url_request()->url);
-  EXPECT_EQ(static_cast<int>(ResourceType::kSubResource),
+  EXPECT_EQ(ResourceType::kSubResource,
             mock_loader_factory_.url_request()->resource_type);
   EXPECT_EQ(net::LOAD_DO_NOT_SEND_AUTH_DATA | net::LOAD_DO_NOT_SAVE_COOKIES |
                 net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DISABLE_CACHE |
diff --git a/content/browser/web_package/signed_exchange_validity_pinger.cc b/content/browser/web_package/signed_exchange_validity_pinger.cc
index f6cfef6..16859ff 100644
--- a/content/browser/web_package/signed_exchange_validity_pinger.cc
+++ b/content/browser/web_package/signed_exchange_validity_pinger.cc
@@ -87,8 +87,7 @@
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->url = validity_url;
   resource_request->method = "HEAD";
-  resource_request->resource_type =
-      static_cast<int>(ResourceType::kSubResource);
+  resource_request->resource_type = ResourceType::kSubResource;
   // Set empty origin as the initiator and attach no cookies.
   resource_request->request_initiator = url::Origin();
   resource_request->allow_credentials = false;
diff --git a/content/browser/worker_host/shared_worker_host_unittest.cc b/content/browser/worker_host/shared_worker_host_unittest.cc
index 92e2738..8f4c1b3 100644
--- a/content/browser/worker_host/shared_worker_host_unittest.cc
+++ b/content/browser/worker_host/shared_worker_host_unittest.cc
@@ -11,12 +11,12 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "content/browser/appcache/chrome_appcache_service.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/worker_host/mock_shared_worker.h"
 #include "content/browser/worker_host/shared_worker_connector_impl.h"
 #include "content/browser/worker_host/shared_worker_instance.h"
 #include "content/browser/worker_host/shared_worker_service_impl.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/content/browser/worker_host/worker_script_fetch_initiator.cc b/content/browser/worker_host/worker_script_fetch_initiator.cc
index 58e2c08..74239566 100644
--- a/content/browser/worker_host/worker_script_fetch_initiator.cc
+++ b/content/browser/worker_host/worker_script_fetch_initiator.cc
@@ -15,6 +15,7 @@
 #include "content/browser/appcache/appcache_navigation_handle_core.h"
 #include "content/browser/data_url_loader_factory.h"
 #include "content/browser/file_url_loader_factory.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/browser/url_loader_factory_getter.h"
@@ -23,7 +24,6 @@
 #include "content/browser/worker_host/worker_script_loader.h"
 #include "content/browser/worker_host/worker_script_loader_factory.h"
 #include "content/common/content_constants_internal.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -96,7 +96,7 @@
     resource_request->url = script_url;
     resource_request->site_for_cookies = script_url;
     resource_request->request_initiator = request_initiator;
-    resource_request->resource_type = static_cast<int>(resource_type);
+    resource_request->resource_type = resource_type;
 
     AddAdditionalRequestHeaders(resource_request.get(), browser_context);
   }
diff --git a/content/browser/worker_host/worker_script_fetcher.h b/content/browser/worker_host/worker_script_fetcher.h
index 19dc520d..b82fa6c 100644
--- a/content/browser/worker_host/worker_script_fetcher.h
+++ b/content/browser/worker_host/worker_script_fetcher.h
@@ -7,7 +7,7 @@
 
 #include "base/callback.h"
 #include "base/optional.h"
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/url_request/redirect_info.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
diff --git a/content/browser/worker_host/worker_script_loader.h b/content/browser/worker_host/worker_script_loader.h
index 2117687..6cdb60b 100644
--- a/content/browser/worker_host/worker_script_loader.h
+++ b/content/browser/worker_host/worker_script_loader.h
@@ -12,7 +12,7 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/common/single_request_url_loader_factory.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
diff --git a/content/browser/worker_host/worker_script_loader_factory.cc b/content/browser/worker_host/worker_script_loader_factory.cc
index b74841f4..b72291a 100644
--- a/content/browser/worker_host/worker_script_loader_factory.cc
+++ b/content/browser/worker_host/worker_script_loader_factory.cc
@@ -61,10 +61,8 @@
   if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
     // Handle only the main script. Import scripts (ResourceType::kScript)
     // should go to the network loader or controller.
-    if (resource_request.resource_type !=
-            static_cast<int>(ResourceType::kWorker) &&
-        resource_request.resource_type !=
-            static_cast<int>(ResourceType::kSharedWorker)) {
+    if (resource_request.resource_type != ResourceType::kWorker &&
+        resource_request.resource_type != ResourceType::kSharedWorker) {
       mojo::ReportBadMessage(
           "WorkerScriptLoaderFactory should only get requests for worker "
           "scripts");
@@ -76,11 +74,9 @@
       return;
     }
   }
-  DCHECK(resource_request.resource_type ==
-             static_cast<int>(ResourceType::kWorker) ||
-         resource_request.resource_type ==
-             static_cast<int>(ResourceType::kSharedWorker))
-      << resource_request.resource_type;
+  DCHECK(resource_request.resource_type == ResourceType::kWorker ||
+         resource_request.resource_type == ResourceType::kSharedWorker)
+      << static_cast<int>(resource_request.resource_type);
   DCHECK(!script_loader_);
 
   // Create a WorkerScriptLoader to load the script.
diff --git a/content/browser/worker_host/worker_script_loader_factory.h b/content/browser/worker_host/worker_script_loader_factory.h
index 27a53af..61b3165 100644
--- a/content/browser/worker_host/worker_script_loader_factory.h
+++ b/content/browser/worker_host/worker_script_loader_factory.h
@@ -6,7 +6,7 @@
 #define CONTENT_BROWSER_WORKER_HOST_WORKER_SCRIPT_LOADER_FACTORY_H_
 
 #include "base/macros.h"
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 
 namespace network {
diff --git a/content/browser/worker_host/worker_script_loader_factory_unittest.cc b/content/browser/worker_host/worker_script_loader_factory_unittest.cc
index 51746d5..f298cafa 100644
--- a/content/browser/worker_host/worker_script_loader_factory_unittest.cc
+++ b/content/browser/worker_host/worker_script_loader_factory_unittest.cc
@@ -120,8 +120,7 @@
     network::mojom::URLLoaderPtr loader;
     network::ResourceRequest resource_request;
     resource_request.url = url;
-    resource_request.resource_type =
-        static_cast<int>(ResourceType::kSharedWorker);
+    resource_request.resource_type = ResourceType::kSharedWorker;
     factory->CreateLoaderAndStart(
         mojo::MakeRequest(&loader), 0 /* routing_id */, 0 /* request_id */,
         network::mojom::kURLLoadOptionNone, resource_request,
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 080d08c..05784fc 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -188,8 +188,6 @@
     "navigation_gesture.h",
     "navigation_params.cc",
     "navigation_params.h",
-    "navigation_subresource_loader_params.cc",
-    "navigation_subresource_loader_params.h",
     "net/record_load_histograms.cc",
     "net/record_load_histograms.h",
     "net/url_request_service_worker_data.cc",
diff --git a/content/common/service_worker/service_worker_loader_helpers.cc b/content/common/service_worker/service_worker_loader_helpers.cc
index 892d1abb..7001578 100644
--- a/content/common/service_worker/service_worker_loader_helpers.cc
+++ b/content/common/service_worker/service_worker_loader_helpers.cc
@@ -122,8 +122,7 @@
   // If the request is a MAIN_FRAME request, the first-party URL gets
   // updated on redirects.
   const net::URLRequest::FirstPartyURLPolicy first_party_url_policy =
-      original_request.resource_type ==
-              static_cast<int>(ResourceType::kMainFrame)
+      original_request.resource_type == ResourceType::kMainFrame
           ? net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT
           : net::URLRequest::NEVER_CHANGE_FIRST_PARTY_URL;
   return net::RedirectInfo::ComputeRedirectInfo(
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index da96b06..32be461c 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -327,6 +327,7 @@
   ]
   public_deps = [
     "//content:export",
+    "//services/network/public/cpp",
   ]
 }
 
diff --git a/content/public/common/referrer.cc b/content/public/common/referrer.cc
index d1128fc..1c22b85 100644
--- a/content/public/common/referrer.cc
+++ b/content/public/common/referrer.cc
@@ -33,8 +33,9 @@
     sanitized_referrer.policy = network::mojom::ReferrerPolicy::kNever;
   }
 
-  if (!request.SchemeIsHTTPOrHTTPS() ||
-      !sanitized_referrer.url.SchemeIsValidForReferrer()) {
+  bool is_web_scheme = request.SchemeIsHTTPOrHTTPS() || request.IsAboutBlank();
+
+  if (!is_web_scheme || !sanitized_referrer.url.SchemeIsValidForReferrer()) {
     sanitized_referrer.url = GURL();
     return sanitized_referrer;
   }
diff --git a/content/public/common/resource_type.h b/content/public/common/resource_type.h
index 24084d75d..e4e684d 100644
--- a/content/public/common/resource_type.h
+++ b/content/public/common/resource_type.h
@@ -5,12 +5,15 @@
 #ifndef CONTENT_PUBLIC_COMMON_RESOURCE_TYPE_H_
 #define CONTENT_PUBLIC_COMMON_RESOURCE_TYPE_H_
 
-#include "content/common/content_export.h"
+#include <stdint.h>
 
-namespace content {
+#include "content/common/content_export.h"
+#include "services/network/public/cpp/resource_type.h"
+
+namespace network {
 
 // Used in histograms; explicitly assign each type and do not re-use old values.
-enum class ResourceType {
+enum class ResourceType : int32_t {
   kMainFrame = 0,           // top level page
   kSubFrame = 1,            // frame or iframe
   kStylesheet = 2,          // a CSS stylesheet
@@ -33,6 +36,12 @@
   kMaxValue = kNavigationPreload,
 };
 
+}  // namespace network
+
+namespace content {
+
+using ResourceType = network::ResourceType;
+
 CONTENT_EXPORT bool IsResourceTypeFrame(ResourceType type);
 
 }  // namespace content
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 3b3080e9..e28ddae 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -114,8 +114,6 @@
     "history_entry.h",
     "history_serialization.cc",
     "history_serialization.h",
-    "image_capture/image_capture_frame_grabber.cc",
-    "image_capture/image_capture_frame_grabber.h",
     "image_downloader/image_downloader_base.cc",
     "image_downloader/image_downloader_base.h",
     "image_downloader/image_downloader_impl.cc",
diff --git a/content/renderer/fetchers/resource_fetcher_impl.cc b/content/renderer/fetchers/resource_fetcher_impl.cc
index 50fda83..f5bda17 100644
--- a/content/renderer/fetchers/resource_fetcher_impl.cc
+++ b/content/renderer/fetchers/resource_fetcher_impl.cc
@@ -320,8 +320,7 @@
     SetHeader(kAccessControlAllowOriginHeader,
               blink::WebSecurityOrigin::CreateUnique().ToString().Ascii());
   }
-  request_.resource_type =
-      static_cast<int>(RequestContextToResourceType(request_context));
+  request_.resource_type = RequestContextToResourceType(request_context);
 
   client_ = std::make_unique<ClientImpl>(
       this, std::move(callback), maximum_download_size,
diff --git a/content/renderer/image_capture/DEPS b/content/renderer/image_capture/DEPS
deleted file mode 100644
index 1c7383f..0000000
--- a/content/renderer/image_capture/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+third_party/libyuv",
-  '+third_party/skia',
-]
diff --git a/content/renderer/image_capture/OWNERS b/content/renderer/image_capture/OWNERS
deleted file mode 100644
index ab8e7ba..0000000
--- a/content/renderer/image_capture/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-reillyg@chromium.org
-
-# Original (legacy) owner.
-mcasas@chromium.org
-
-# COMPONENT: Blink>ImageCapture
-# TEAM: webrtc-dev@chromium.org
diff --git a/content/renderer/image_capture/image_capture_frame_grabber.h b/content/renderer/image_capture/image_capture_frame_grabber.h
deleted file mode 100644
index fe2263e..0000000
--- a/content/renderer/image_capture/image_capture_frame_grabber.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 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 CONTENT_RENDERER_IMAGE_CAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
-#define CONTENT_RENDERER_IMAGE_CAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "content/common/content_export.h"
-#include "third_party/blink/public/platform/scoped_web_callbacks.h"
-#include "third_party/blink/public/platform/web_image_capture_frame_grabber.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_sink.h"
-
-namespace blink {
-class WebMediaStreamTrack;
-}
-
-namespace content {
-
-// This class grabs Video Frames from a given Media Stream Video Track, binding
-// a method of an ephemeral SingleShotFrameHandler every time grabFrame() is
-// called. This method receives an incoming media::VideoFrame on a background
-// thread and converts it into the appropriate SkBitmap which is sent back to
-// OnSkBitmap(). This class is single threaded throughout.
-class CONTENT_EXPORT ImageCaptureFrameGrabber final
-    : public blink::WebImageCaptureFrameGrabber,
-      public blink::MediaStreamVideoSink {
- public:
-  using SkImageDeliverCB = base::Callback<void(sk_sp<SkImage>)>;
-
-  ImageCaptureFrameGrabber();
-  ~ImageCaptureFrameGrabber() override;
-
-  // blink::WebImageCaptureFrameGrabber implementation.
-  void GrabFrame(
-      blink::WebMediaStreamTrack* track,
-      std::unique_ptr<blink::WebImageCaptureGrabFrameCallbacks> callbacks,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
-
- private:
-  // Internal class to receive, convert and forward one frame.
-  class SingleShotFrameHandler;
-
-  void OnSkImage(blink::ScopedWebCallbacks<
-                     blink::WebImageCaptureGrabFrameCallbacks> callbacks,
-                 sk_sp<SkImage> image);
-
-  // Flag to indicate that there is a frame grabbing in progress.
-  bool frame_grab_in_progress_;
-
-  base::ThreadChecker thread_checker_;
-  base::WeakPtrFactory<ImageCaptureFrameGrabber> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ImageCaptureFrameGrabber);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_IMAGE_CAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
diff --git a/content/renderer/loader/child_url_loader_factory_bundle.cc b/content/renderer/loader/child_url_loader_factory_bundle.cc
index 337d720..fc405b2f 100644
--- a/content/renderer/loader/child_url_loader_factory_bundle.cc
+++ b/content/renderer/loader/child_url_loader_factory_bundle.cc
@@ -221,7 +221,7 @@
   // special prefetch handling.
   // TODO(horo): Move this routing logic to network service, when we will have
   // the special prefetch handling in network service.
-  if ((request.resource_type == static_cast<int>(ResourceType::kPrefetch)) &&
+  if ((request.resource_type == ResourceType::kPrefetch) &&
       prefetch_loader_factory_) {
     prefetch_loader_factory_->CreateLoaderAndStart(
         std::move(loader), routing_id, request_id, options, request,
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc
index 3d9d92ac..3a460c50 100644
--- a/content/renderer/loader/resource_dispatcher.cc
+++ b/content/renderer/loader/resource_dispatcher.cc
@@ -503,7 +503,7 @@
   CheckSchemeForReferrerPolicy(*request);
 
 #if defined(OS_ANDROID)
-  if (request->resource_type != static_cast<int>(ResourceType::kMainFrame) &&
+  if (request->resource_type != ResourceType::kMainFrame &&
       request->has_user_gesture) {
     NotifyUpdateUserGestureCarryoverInfo(request->render_frame_id);
   }
@@ -528,10 +528,9 @@
   pending_request->previews_state = request->previews_state;
 
   if (override_url_loader) {
-    DCHECK(request->resource_type == static_cast<int>(ResourceType::kWorker) ||
-           request->resource_type ==
-               static_cast<int>(ResourceType::kSharedWorker))
-        << request->resource_type;
+    DCHECK(request->resource_type == ResourceType::kWorker ||
+           request->resource_type == ResourceType::kSharedWorker)
+        << static_cast<int>(request->resource_type);
 
     // Redirect checks are handled by NavigationURLLoaderImpl, so it's safe to
     // pass true for |bypass_redirect_checks|.
diff --git a/content/renderer/loader/resource_dispatcher_unittest.cc b/content/renderer/loader/resource_dispatcher_unittest.cc
index e937c1c..4dcc332 100644
--- a/content/renderer/loader/resource_dispatcher_unittest.cc
+++ b/content/renderer/loader/resource_dispatcher_unittest.cc
@@ -118,7 +118,7 @@
     request->url = GURL(kTestPageUrl);
     request->site_for_cookies = GURL(kTestPageUrl);
     request->referrer_policy = Referrer::GetDefaultReferrerPolicy();
-    request->resource_type = static_cast<int>(ResourceType::kSubResource);
+    request->resource_type = ResourceType::kSubResource;
     request->priority = net::LOW;
     request->fetch_request_mode = network::mojom::FetchRequestMode::kNoCors;
     request->fetch_frame_type = network::mojom::RequestContextFrameType::kNone;
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index 49db8a6..62f98fb 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -656,18 +656,14 @@
 
   resource_request->referrer_policy =
       Referrer::ReferrerPolicyForUrlRequest(request.GetReferrerPolicy());
-  resource_request->resource_type =
-      static_cast<int>(WebURLRequestToResourceType(request));
+  resource_request->resource_type = WebURLRequestToResourceType(request);
 
   resource_request->headers = GetWebURLRequestHeaders(request);
-  if (resource_request->resource_type ==
-      static_cast<int>(ResourceType::kStylesheet)) {
+  if (resource_request->resource_type == ResourceType::kStylesheet) {
     resource_request->headers.SetHeader(network::kAcceptHeader,
                                         kStylesheetAcceptHeader);
-  } else if (resource_request->resource_type ==
-                 static_cast<int>(ResourceType::kFavicon) ||
-             resource_request->resource_type ==
-                 static_cast<int>(ResourceType::kImage)) {
+  } else if (resource_request->resource_type == ResourceType::kFavicon ||
+             resource_request->resource_type == ResourceType::kImage) {
     resource_request->headers.SetHeader(network::kAcceptHeader,
                                         kImageAcceptHeader);
   } else {
@@ -691,10 +687,8 @@
         WebString(request.GetPurposeHeader()).Utf8());
   }
 
-  if (resource_request->resource_type ==
-          static_cast<int>(ResourceType::kPrefetch) ||
-      resource_request->resource_type ==
-          static_cast<int>(ResourceType::kFavicon)) {
+  if (resource_request->resource_type == ResourceType::kPrefetch ||
+      resource_request->resource_type == ResourceType::kFavicon) {
     resource_request->do_not_prompt_for_login = true;
   }
 
@@ -767,8 +761,8 @@
   if (request.IsDownloadToNetworkCacheOnly()) {
     peer = std::make_unique<SinkPeer>(this);
   } else {
-    const bool discard_body = (resource_request->resource_type ==
-                               static_cast<int>(ResourceType::kPrefetch));
+    const bool discard_body =
+        (resource_request->resource_type == ResourceType::kPrefetch);
     peer =
         std::make_unique<WebURLLoaderImpl::RequestPeerImpl>(this, discard_body);
   }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 3d94c35..e964aa2 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -6504,29 +6504,39 @@
     for (auto& observer : observers_)
       observer.DidStartNavigation(url, info->navigation_type);
 
-    // Navigations which require network request should be sent to the browser.
-    if (!use_archive && IsURLHandledByNetworkStack(url)) {
-      BeginNavigationInternal(std::move(info));
-      return;
-    }
-
-    // First navigaiton in a frame to an empty document must be handled
+    // First navigation in a frame to an empty document must be handled
     // synchronously.
-    if (WebDocumentLoader::WillLoadUrlAsEmpty(url) &&
-        !frame_->HasCommittedFirstRealLoad()) {
+    bool is_first_real_empty_document_navigation =
+        WebDocumentLoader::WillLoadUrlAsEmpty(url) &&
+        !frame_->HasCommittedFirstRealLoad();
+
+    if (is_first_real_empty_document_navigation) {
       CommitSyncNavigation(std::move(info));
       return;
     }
 
-    // Everything else (does not require networking, not an empty document)
-    // will be committed asynchronously in the renderer.
-    if (!frame_->CreatePlaceholderDocumentLoader(*info, BuildDocumentState()))
+    // Navigation to about:srcdoc or to an MHTML archive don't need to consult
+    // the browser. The document content is already available in the renderer
+    // process.
+    // TODO(arthursonzogni): Remove this. Everything should use the default code
+    // path and be driven by the browser process.
+    if (use_archive || url == content::kAboutSrcDocURL) {
+      if (!frame_->CreatePlaceholderDocumentLoader(*info, BuildDocumentState()))
+        return;
+      // Only the first navigation in a frame to an empty document must be
+      // handled synchronously, the others are required to happen
+      // asynchronously. So a PostTask is used.
+      sync_navigation_callback_.Reset(
+          base::BindOnce(&RenderFrameImpl::CommitSyncNavigation,
+                         weak_factory_.GetWeakPtr(), base::Passed(&info)));
+      frame_->GetTaskRunner(blink::TaskType::kInternalLoading)
+          ->PostTask(FROM_HERE, sync_navigation_callback_.callback());
       return;
-    sync_navigation_callback_.Reset(
-        base::BindOnce(&RenderFrameImpl::CommitSyncNavigation,
-                       weak_factory_.GetWeakPtr(), base::Passed(&info)));
-    frame_->GetTaskRunner(blink::TaskType::kInternalLoading)
-        ->PostTask(FROM_HERE, sync_navigation_callback_.callback());
+    }
+
+    // Everything else is handled asynchronously by the browser process through
+    // BeginNavigation.
+    BeginNavigationInternal(std::move(info));
     return;
   }
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 4613ce47..f4895d3 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1762,6 +1762,11 @@
 
   RenderFrameMediaPlaybackOptions renderer_media_playback_options_;
 
+  // Used by renderer initiated navigations not driven by the browser process:
+  // - navigation to about:srcdoc.
+  // - navigation using an MHTML archive.
+  // TODO(arthursonzogni): Remove this. Everything should use the default code
+  // path and be driven by the browser process.
   base::CancelableOnceCallback<void()> sync_navigation_callback_;
 
   class MHTMLBodyLoaderClient;
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 2c754dc..0f74d3d4 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -97,6 +97,7 @@
 #include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/range/range.h"
 #include "ui/native_theme/native_theme_features.h"
+#include "url/url_constants.h"
 
 #if defined(OS_ANDROID)
 #include "third_party/blink/public/platform/web_coalesced_input_event.h"
@@ -887,15 +888,19 @@
 TEST_F(AlwaysForkingRenderViewTest, BeginNavigationDoesNotForkEmptyUrl) {
   GURL example_url("http://example.com");
   GURL empty_url("");
-  GURL blank_url("about:blank");
 
   LoadHTMLWithUrlOverride("<body></body", example_url.spec().c_str());
   EXPECT_EQ(example_url,
             GURL(frame()->GetWebFrame()->GetDocumentLoader()->GetUrl()));
 
   // Empty url should never fork.
+  blink::WebURLRequest request(empty_url);
+  request.SetFetchRequestMode(network::mojom::FetchRequestMode::kNavigate);
+  request.SetFetchRedirectMode(network::mojom::FetchRedirectMode::kManual);
+  request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL);
+  request.SetRequestorOrigin(blink::WebSecurityOrigin::Create(example_url));
   auto navigation_info = std::make_unique<blink::WebNavigationInfo>();
-  navigation_info->url_request = blink::WebURLRequest(empty_url);
+  navigation_info->url_request = request;
   navigation_info->frame_type =
       network::mojom::RequestContextFrameType::kTopLevel;
   navigation_info->navigation_policy = blink::kWebNavigationPolicyCurrentTab;
@@ -906,15 +911,20 @@
 
 TEST_F(AlwaysForkingRenderViewTest, BeginNavigationDoesNotForkAboutBlank) {
   GURL example_url("http://example.com");
-  GURL blank_url("about:blank");
+  GURL blank_url(url::kAboutBlankURL);
 
   LoadHTMLWithUrlOverride("<body></body", example_url.spec().c_str());
   EXPECT_EQ(example_url,
             GURL(frame()->GetWebFrame()->GetDocumentLoader()->GetUrl()));
 
-  // About blank should never fork.
+  // about:blank should never fork.
+  blink::WebURLRequest request(blank_url);
+  request.SetFetchRequestMode(network::mojom::FetchRequestMode::kNavigate);
+  request.SetFetchRedirectMode(network::mojom::FetchRedirectMode::kManual);
+  request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL);
+  request.SetRequestorOrigin(blink::WebSecurityOrigin::Create(example_url));
   auto navigation_info = std::make_unique<blink::WebNavigationInfo>();
-  navigation_info->url_request = blink::WebURLRequest(blank_url);
+  navigation_info->url_request = request;
   navigation_info->frame_type =
       network::mojom::RequestContextFrameType::kTopLevel;
   navigation_info->navigation_policy = blink::kWebNavigationPolicyCurrentTab;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 3027321..812c9b4 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -46,7 +46,6 @@
 #include "content/renderer/dom_storage/local_storage_namespace.h"
 #include "content/renderer/dom_storage/session_web_storage_namespace_impl.h"
 #include "content/renderer/dom_storage/webstoragenamespace_impl.h"
-#include "content/renderer/image_capture/image_capture_frame_grabber.h"
 #include "content/renderer/loader/child_url_loader_factory_bundle.h"
 #include "content/renderer/loader/code_cache_loader_impl.h"
 #include "content/renderer/loader/resource_dispatcher.h"
@@ -131,7 +130,6 @@
 using blink::WebBlobRegistry;
 using blink::WebCanvasCaptureHandler;
 using blink::WebDatabaseObserver;
-using blink::WebImageCaptureFrameGrabber;
 using blink::WebMediaPlayer;
 using blink::WebMediaRecorderHandler;
 using blink::WebMediaStream;
@@ -821,13 +819,6 @@
 
 //------------------------------------------------------------------------------
 
-std::unique_ptr<WebImageCaptureFrameGrabber>
-RendererBlinkPlatformImpl::CreateImageCaptureFrameGrabber() {
-  return std::make_unique<ImageCaptureFrameGrabber>();
-}
-
-//------------------------------------------------------------------------------
-
 std::unique_ptr<webrtc::RtpCapabilities>
 RendererBlinkPlatformImpl::GetRtpSenderCapabilities(
     const blink::WebString& kind) {
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 629362d..752d0929 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -174,8 +174,6 @@
       blink::WebMediaStream* web_media_stream,
       blink::WebMediaPlayer* web_media_player,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
-  std::unique_ptr<blink::WebImageCaptureFrameGrabber>
-  CreateImageCaptureFrameGrabber() override;
   std::unique_ptr<webrtc::RtpCapabilities> GetRtpSenderCapabilities(
       const blink::WebString& kind) override;
   std::unique_ptr<webrtc::RtpCapabilities> GetRtpReceiverCapabilities(
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
index 96f859aa..12e899b 100644
--- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc
+++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -278,7 +278,7 @@
                     const GURL& url) {
     network::ResourceRequest request;
     request.url = url;
-    request.resource_type = static_cast<int>(ResourceType::kSubResource);
+    request.resource_type = ResourceType::kSubResource;
     network::mojom::URLLoaderPtr loader;
     network::TestURLLoaderClient loader_client;
     factory->CreateLoaderAndStart(
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 9b2a016..8396c0e0 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -555,7 +555,7 @@
     network::ResourceRequest request;
     request.url = url;
     request.method = "GET";
-    request.resource_type = static_cast<int>(ResourceType::kSubResource);
+    request.resource_type = ResourceType::kSubResource;
     return request;
   }
 
diff --git a/content/shell/renderer/web_test/blink_test_runner.cc b/content/shell/renderer/web_test/blink_test_runner.cc
index 86c728a..255ef3d 100644
--- a/content/shell/renderer/web_test/blink_test_runner.cc
+++ b/content/shell/renderer/web_test/blink_test_runner.cc
@@ -815,7 +815,13 @@
   // Navigating to about:blank will make sure that no new loads are initiated
   // by the renderer.
   waiting_for_reset_ = true;
-  main_frame->StartNavigation(WebURLRequest(GURL(url::kAboutBlankURL)));
+
+  auto request = blink::WebURLRequest(GURL(url::kAboutBlankURL));
+  request.SetFetchRequestMode(network::mojom::FetchRequestMode::kNavigate);
+  request.SetFetchRedirectMode(network::mojom::FetchRedirectMode::kManual);
+  request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL);
+  request.SetRequestorOrigin(blink::WebSecurityOrigin::CreateUniqueOpaque());
+  main_frame->StartNavigation(request);
 }
 
 void BlinkTestRunner::OnTestFinishedInSecondaryRenderer() {
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index 12143551..5c8f007 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -349,6 +349,11 @@
 
 NavigationSimulatorImpl::~NavigationSimulatorImpl() {}
 
+void NavigationSimulatorImpl::SetIsPostWithId(int64_t post_id) {
+  post_id_ = post_id;
+  SetMethod("POST");
+}
+
 void NavigationSimulatorImpl::InitializeFromStartedRequest(
     NavigationRequest* request) {
   CHECK(request);
@@ -907,8 +912,13 @@
       web_contents_->GetController().LoadURLWithParams(*load_url_params_);
       load_url_params_ = nullptr;
     } else {
-      web_contents_->GetController().LoadURL(navigation_url_, referrer_,
-                                             transition_, std::string());
+      NavigationController::LoadURLParams load_url_params(navigation_url_);
+      load_url_params.referrer = referrer_;
+      load_url_params.transition_type = transition_;
+      if (initial_method_ == "POST")
+        load_url_params.load_type = NavigationController::LOAD_TYPE_HTTP_POST;
+
+      web_contents_->GetController().LoadURLWithParams(load_url_params);
     }
   }
 
@@ -1240,6 +1250,7 @@
   params->navigation_token = request_
                                  ? request_->commit_params().navigation_token
                                  : base::UnguessableToken::Create();
+  params->post_id = post_id_;
 
   if (intended_as_new_entry_.has_value())
     params->intended_as_new_entry = intended_as_new_entry_.value();
diff --git a/content/test/navigation_simulator_impl.h b/content/test/navigation_simulator_impl.h
index 489d195..598558c 100644
--- a/content/test/navigation_simulator_impl.h
+++ b/content/test/navigation_simulator_impl.h
@@ -151,6 +151,8 @@
 
   void set_origin(const url::Origin& origin) { origin_ = origin; }
 
+  void SetIsPostWithId(int64_t post_id);
+
  private:
   NavigationSimulatorImpl(const GURL& original_url,
                           bool browser_initiated,
@@ -277,6 +279,7 @@
   base::Optional<net::SSLInfo> ssl_info_;
   base::Optional<PageState> page_state_;
   base::Optional<url::Origin> origin_;
+  int64_t post_id_ = -1;
 
   bool auto_advance_ = true;
   bool drop_swap_out_ack_ = false;
diff --git a/content/test/test_navigation_url_loader.cc b/content/test/test_navigation_url_loader.cc
index 3dfa41b..7a26247b 100644
--- a/content/test/test_navigation_url_loader.cc
+++ b/content/test/test_navigation_url_loader.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "content/browser/loader/navigation_url_loader_delegate.h"
-#include "content/common/navigation_subresource_loader_params.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/public/browser/global_request_id.h"
 #include "content/public/browser/navigation_data.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc
index bd19d5e8..647d412 100644
--- a/content/test/test_navigation_url_loader_delegate.cc
+++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -5,8 +5,8 @@
 #include "content/test/test_navigation_url_loader_delegate.h"
 
 #include "base/run_loop.h"
+#include "content/browser/navigation_subresource_loader_params.h"
 #include "content/common/navigation_params.h"
-#include "content/common/navigation_subresource_loader_params.h"
 #include "content/public/browser/global_request_id.h"
 #include "content/public/browser/navigation_data.h"
 #include "services/network/public/cpp/resource_response.h"
diff --git a/extensions/browser/api/web_request/web_request_info.cc b/extensions/browser/api/web_request/web_request_info.cc
index d3ec4efa..a664ca9 100644
--- a/extensions/browser/api/web_request/web_request_info.cc
+++ b/extensions/browser/api/web_request/web_request_info.cc
@@ -276,7 +276,7 @@
       render_process_id = url_loader->GetProcessId();
       frame_id = url_loader->GetRenderFrameId();
     }
-    type = static_cast<content::ResourceType>(url_loader->GetResourceType());
+    type = url_loader->GetResourceType();
   } else {
     // There may be basic process and frame info associated with the request
     // even when |info| is null. Attempt to grab it as a last ditch effort. If
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc
index 862c82c..deb1d6a 100644
--- a/extensions/shell/browser/shell_browser_main_parts.cc
+++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -199,6 +199,7 @@
 
 #if defined(OS_CHROMEOS)
   chromeos::CrasAudioHandler::Initialize(
+      content::ServiceManagerConnection::GetForProcess()->GetConnector(),
       new chromeos::AudioDevicesPrefHandlerImpl(local_state_.get()));
   audio_controller_.reset(new ShellAudioController());
 #endif
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.cc b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
index d8b662fd..213046a 100644
--- a/gpu/command_buffer/service/external_vk_image_skia_representation.cc
+++ b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
@@ -56,8 +56,10 @@
   access_mode_ = kNone;
 }
 
-sk_sp<SkPromiseImageTexture>
-ExternalVkImageSkiaRepresentation::BeginReadAccess() {
+sk_sp<SkPromiseImageTexture> ExternalVkImageSkiaRepresentation::BeginReadAccess(
+    std::vector<GrBackendSemaphore>* begin_semaphores,
+    std::vector<GrBackendSemaphore>* end_semaphores) {
+  // TODO(penghuang): provide begin and end semaphores.
   DCHECK_EQ(access_mode_, kNone) << "Previous access hasn't ended yet";
   DCHECK(!surface_);
 
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.h b/gpu/command_buffer/service/external_vk_image_skia_representation.h
index 516766f..228b493 100644
--- a/gpu/command_buffer/service/external_vk_image_skia_representation.h
+++ b/gpu/command_buffer/service/external_vk_image_skia_representation.h
@@ -28,7 +28,9 @@
       int final_msaa_count,
       const SkSurfaceProps& surface_props) override;
   void EndWriteAccess(sk_sp<SkSurface> surface) override;
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override;
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override;
   void EndReadAccess() override;
 
  private:
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
index accb2a48..b394c8d31 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -120,26 +120,14 @@
   VulkanFenceHelper* fence_helper =
       context_provider->GetDeviceQueue()->GetFenceHelper();
 
-  // Create a vk semaphore which can be exported.
-  VkExportSemaphoreCreateInfo export_info;
-  export_info.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO;
-  export_info.pNext = nullptr;
-  export_info.handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
-
-  VkSemaphore vk_semaphore;
-  VkSemaphoreCreateInfo sem_info;
-  sem_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
-  sem_info.pNext = &export_info;
-  sem_info.flags = 0;
-  VkResult result =
-      vkCreateSemaphore(vk_device, &sem_info, nullptr, &vk_semaphore);
-  if (result != VK_SUCCESS) {
-    LOG(ERROR) << "vkCreateSemaphore failed";
+  VkSemaphore vk_semaphore =
+      context_provider->GetVulkanImplementation()->CreateExternalSemaphore(
+          vk_device);
+  if (vk_semaphore == VK_NULL_HANDLE)
     return;
-  }
 
   VkFence vk_fence;
-  result = fence_helper->GetFence(&vk_fence);
+  auto result = fence_helper->GetFence(&vk_fence);
   if (result != VK_SUCCESS) {
     LOG(ERROR) << "Failed to create fence.";
     vkDestroySemaphore(vk_device, vk_semaphore, nullptr);
@@ -433,7 +421,9 @@
     EndWriteAccessInternal();
   }
 
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override {
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override {
     DCHECK_EQ(mode_, RepresentationAccessMode::kNone);
     CheckContext();
 
@@ -560,28 +550,67 @@
     EndWriteAccessInternal();
   }
 
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override {
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override {
+    DCHECK(begin_semaphores);
+    DCHECK(end_semaphores);
     DCHECK_EQ(mode_, RepresentationAccessMode::kNone);
+    DCHECK(end_access_semaphore_ == VK_NULL_HANDLE);
 
     // Synchronise the read access with the writes.
     base::ScopedFD sync_fd;
     if (!ahb_backing()->BeginRead(this, &sync_fd))
       return nullptr;
 
-    mode_ = RepresentationAccessMode::kRead;
+    VkSemaphore begin_access_semaphore = VK_NULL_HANDLE;
+    if (sync_fd.is_valid()) {
+      begin_access_semaphore = vk_implementation()->ImportSemaphoreHandle(
+          vk_device(),
+          SemaphoreHandle(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
+                          std::move(sync_fd)));
+      if (begin_access_semaphore == VK_NULL_HANDLE)
+        return nullptr;
+    }
 
+    end_access_semaphore_ =
+        vk_implementation()->CreateExternalSemaphore(vk_device());
+
+    if (end_access_semaphore_ == VK_NULL_HANDLE) {
+      if (begin_access_semaphore != VK_NULL_HANDLE) {
+        vkDestroySemaphore(vk_device(), begin_access_semaphore,
+                           nullptr /* pAllocator */);
+      }
+      return nullptr;
+    }
+
+    if (begin_access_semaphore != VK_NULL_HANDLE) {
+      begin_semaphores->emplace_back();
+      begin_semaphores->back().initVulkan(begin_access_semaphore);
+    }
+    end_semaphores->emplace_back();
+    end_semaphores->back().initVulkan(end_access_semaphore_);
+
+    mode_ = RepresentationAccessMode::kRead;
     return promise_texture_;
   }
 
   void EndReadAccess() override {
     DCHECK_EQ(mode_, RepresentationAccessMode::kRead);
     DCHECK(!surface_);
+    DCHECK(end_access_semaphore_ != VK_NULL_HANDLE);
 
-    base::ScopedFD sync_fd;
-    EndVulkanAccess(context_state_->vk_context_provider(), &sync_fd);
-    // pass this sync fd to the backing.
+    SemaphoreHandle semaphore_handle = vk_implementation()->GetSemaphoreHandle(
+        vk_device(), end_access_semaphore_);
+    auto sync_fd = semaphore_handle.TakeHandle();
     ahb_backing()->EndRead(this, std::move(sync_fd));
 
+    VulkanFenceHelper* fence_helper = context_state_->vk_context_provider()
+                                          ->GetDeviceQueue()
+                                          ->GetFenceHelper();
+    fence_helper->EnqueueSemaphoreCleanupForSubmittedWork(
+        end_access_semaphore_);
+    end_access_semaphore_ = VK_NULL_HANDLE;
     mode_ = RepresentationAccessMode::kNone;
   }
 
@@ -629,6 +658,7 @@
   RepresentationAccessMode mode_ = RepresentationAccessMode::kNone;
   SkSurface* surface_ = nullptr;
   scoped_refptr<SharedContextState> context_state_;
+  VkSemaphore end_access_semaphore_ = VK_NULL_HANDLE;
 };
 
 SharedImageBackingAHB::SharedImageBackingAHB(
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
index 24cac23..e067c3c4 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -22,6 +22,7 @@
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
 #include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gl/gl_bindings.h"
@@ -126,7 +127,12 @@
   EXPECT_EQ(gl_legacy_shared_image.size().width(), surface->width());
   EXPECT_EQ(gl_legacy_shared_image.size().height(), surface->height());
   skia_representation->EndWriteAccess(std::move(surface));
-  auto promise_texture = skia_representation->BeginReadAccess();
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  auto promise_texture =
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores);
+  EXPECT_EQ(0u, begin_semaphores.size());
+  EXPECT_EQ(0u, end_semaphores.size());
   EXPECT_TRUE(promise_texture);
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
@@ -187,7 +193,12 @@
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
       mailbox, context_state_.get());
   EXPECT_TRUE(skia_representation);
-  auto promise_texture = skia_representation->BeginReadAccess();
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  auto promise_texture =
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores);
+  EXPECT_EQ(0u, begin_semaphores.size());
+  EXPECT_EQ(0u, end_semaphores.size());
   EXPECT_TRUE(promise_texture);
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
@@ -320,8 +331,17 @@
   auto skia_representation2 = shared_image_representation_factory_->ProduceSkia(
       gl_legacy_shared_image.mailbox(), context_state_.get());
 
-  EXPECT_TRUE(skia_representation->BeginReadAccess());
-  EXPECT_TRUE(skia_representation2->BeginReadAccess());
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  EXPECT_TRUE(
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores));
+  EXPECT_EQ(0u, begin_semaphores.size());
+  EXPECT_EQ(0u, end_semaphores.size());
+
+  EXPECT_TRUE(skia_representation2->BeginReadAccess(&begin_semaphores,
+                                                    &end_semaphores));
+  EXPECT_EQ(0u, begin_semaphores.size());
+  EXPECT_EQ(0u, end_semaphores.size());
 
   skia_representation2->EndReadAccess();
   skia_representation2.reset();
@@ -342,8 +362,22 @@
 
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
       gl_legacy_shared_image.mailbox(), context_state_.get());
-  EXPECT_TRUE(skia_representation->BeginReadAccess());
-  EXPECT_FALSE(skia_representation->BeginReadAccess());
+  {
+    std::vector<GrBackendSemaphore> begin_semaphores;
+    std::vector<GrBackendSemaphore> end_semaphores;
+    EXPECT_TRUE(skia_representation->BeginReadAccess(&begin_semaphores,
+                                                     &end_semaphores));
+    EXPECT_EQ(0u, begin_semaphores.size());
+    EXPECT_EQ(0u, end_semaphores.size());
+  }
+  {
+    std::vector<GrBackendSemaphore> begin_semaphores;
+    std::vector<GrBackendSemaphore> end_semaphores;
+    EXPECT_FALSE(skia_representation->BeginReadAccess(&begin_semaphores,
+                                                      &end_semaphores));
+    EXPECT_EQ(0u, begin_semaphores.size());
+    EXPECT_EQ(0u, end_semaphores.size());
+  }
 
   skia_representation->EndReadAccess();
   skia_representation.reset();
@@ -361,7 +395,11 @@
 
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
       gl_legacy_shared_image.mailbox(), context_state_.get());
-  EXPECT_TRUE(skia_representation->BeginReadAccess());
+
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  EXPECT_TRUE(
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores));
 
   EXPECT_FALSE(skia_representation->BeginWriteAccess(
       0, SkSurfaceProps(0, kUnknown_SkPixelGeometry)));
@@ -385,7 +423,12 @@
   auto surface = skia_representation->BeginWriteAccess(
       0, SkSurfaceProps(0, kUnknown_SkPixelGeometry));
 
-  EXPECT_FALSE(skia_representation->BeginReadAccess());
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  EXPECT_FALSE(
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores));
+  EXPECT_EQ(0u, begin_semaphores.size());
+  EXPECT_EQ(0u, end_semaphores.size());
 
   skia_representation->EndWriteAccess(std::move(surface));
   skia_representation.reset();
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
index 9daf649..41fa7cd 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
@@ -313,7 +313,9 @@
     write_surface_ = nullptr;
   }
 
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override {
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override {
     CheckContext();
     static_cast<SharedImageBackingWithReadAccess*>(backing())
         ->BeginReadAccess();
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
index e84928e..9a2991b 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
@@ -25,6 +25,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
 #include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "ui/gfx/buffer_format_util.h"
 #include "ui/gfx/color_space.h"
@@ -186,8 +187,13 @@
   EXPECT_EQ(size.width(), surface->width());
   EXPECT_EQ(size.height(), surface->height());
   skia_representation->EndWriteAccess(std::move(surface));
-  auto promise_texture = skia_representation->BeginReadAccess();
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  auto promise_texture =
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores);
   EXPECT_TRUE(promise_texture);
+  EXPECT_TRUE(begin_semaphores.empty());
+  EXPECT_TRUE(end_semaphores.empty());
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
     EXPECT_TRUE(backend_texture.isValid());
@@ -285,8 +291,13 @@
   EXPECT_EQ(size.width(), surface->width());
   EXPECT_EQ(size.height(), surface->height());
   skia_representation->EndWriteAccess(std::move(surface));
-  auto promise_texture = skia_representation->BeginReadAccess();
+  std::vector<GrBackendSemaphore> begin_semaphores;
+  std::vector<GrBackendSemaphore> end_semaphores;
+  auto promise_texture =
+      skia_representation->BeginReadAccess(&begin_semaphores, &end_semaphores);
   EXPECT_TRUE(promise_texture);
+  EXPECT_TRUE(begin_semaphores.empty());
+  EXPECT_TRUE(end_semaphores.empty());
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
     EXPECT_TRUE(backend_texture.isValid());
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
index d25459d..c1f76508 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
@@ -174,7 +174,9 @@
     }
   }
 
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override {
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override {
     return promise_texture_;
   }
 
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
index e18b139..e601e42 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
@@ -141,7 +141,7 @@
   EXPECT_EQ(size.width(), surface->width());
   EXPECT_EQ(size.height(), surface->height());
   skia_representation->EndWriteAccess(std::move(surface));
-  auto promise_texture = skia_representation->BeginReadAccess();
+  auto promise_texture = skia_representation->BeginReadAccess(nullptr, nullptr);
   EXPECT_TRUE(promise_texture);
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
@@ -202,7 +202,7 @@
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
       mailbox, context_state_);
   EXPECT_TRUE(skia_representation);
-  auto promise_texture = skia_representation->BeginReadAccess();
+  auto promise_texture = skia_representation->BeginReadAccess(nullptr, nullptr);
   EXPECT_TRUE(promise_texture);
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
@@ -312,7 +312,7 @@
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
       mailbox, context_state_);
   EXPECT_TRUE(skia_representation);
-  auto promise_texture = skia_representation->BeginReadAccess();
+  auto promise_texture = skia_representation->BeginReadAccess(nullptr, nullptr);
   EXPECT_TRUE(promise_texture);
   if (promise_texture) {
     GrBackendTexture backend_texture = promise_texture->backendTexture();
diff --git a/gpu/command_buffer/service/shared_image_representation.h b/gpu/command_buffer/service/shared_image_representation.h
index b9d81ac..c230c681 100644
--- a/gpu/command_buffer/service/shared_image_representation.h
+++ b/gpu/command_buffer/service/shared_image_representation.h
@@ -154,7 +154,16 @@
       int final_msaa_count,
       const SkSurfaceProps& surface_props) = 0;
   virtual void EndWriteAccess(sk_sp<SkSurface> surface) = 0;
-  virtual sk_sp<SkPromiseImageTexture> BeginReadAccess() = 0;
+  // Begin the read access. The implementations should insert semaphores into
+  // begin_semaphores vector which client will wait on before reading the
+  // backing. The ownership of begin_semaphores will be passed to client.
+  // The implementations should also insert semaphores into end_semaphores,
+  // client must submit them with drawing operations which use the backing.
+  // The ownership of end_semaphores are not passed to client. And client must
+  // submit the end_semaphores before calling EndReadAccess().
+  virtual sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) = 0;
   virtual void EndReadAccess() = 0;
 };
 
diff --git a/gpu/command_buffer/service/wrapped_sk_image.cc b/gpu/command_buffer/service/wrapped_sk_image.cc
index 2529841..5b70067 100644
--- a/gpu/command_buffer/service/wrapped_sk_image.cc
+++ b/gpu/command_buffer/service/wrapped_sk_image.cc
@@ -209,7 +209,9 @@
     write_surface_ = nullptr;
   }
 
-  sk_sp<SkPromiseImageTexture> BeginReadAccess() override {
+  sk_sp<SkPromiseImageTexture> BeginReadAccess(
+      std::vector<GrBackendSemaphore>* begin_semaphores,
+      std::vector<GrBackendSemaphore>* end_semaphores) override {
     return wrapped_sk_image()->promise_texture();
   }
 
diff --git a/gpu/vulkan/vulkan_util.cc b/gpu/vulkan/vulkan_util.cc
index 645377c..797d78e 100644
--- a/gpu/vulkan/vulkan_util.cc
+++ b/gpu/vulkan/vulkan_util.cc
@@ -8,20 +8,27 @@
 
 namespace gpu {
 
-bool SubmitSignalVkSemaphore(VkQueue vk_queue,
-                             VkSemaphore vk_semaphore,
-                             VkFence vk_fence) {
+bool SubmitSignalVkSemaphores(VkQueue vk_queue,
+                              const base::span<VkSemaphore>& vk_semaphores,
+                              VkFence vk_fence) {
   // Structure specifying a queue submit operation.
   VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO};
-  submit_info.signalSemaphoreCount = 1;
-  submit_info.pSignalSemaphores = &vk_semaphore;
+  submit_info.signalSemaphoreCount = vk_semaphores.size();
+  submit_info.pSignalSemaphores = vk_semaphores.data();
   const unsigned int submit_count = 1;
   return vkQueueSubmit(vk_queue, submit_count, &submit_info, vk_fence) ==
          VK_SUCCESS;
 }
 
+bool SubmitSignalVkSemaphore(VkQueue vk_queue,
+                             VkSemaphore vk_semaphore,
+                             VkFence vk_fence) {
+  return SubmitSignalVkSemaphores(
+      vk_queue, base::span<VkSemaphore>(&vk_semaphore, 1), vk_fence);
+}
+
 bool SubmitWaitVkSemaphores(VkQueue vk_queue,
-                            const std::vector<VkSemaphore>& vk_semaphores,
+                            const base::span<VkSemaphore>& vk_semaphores,
                             VkFence vk_fence) {
   DCHECK(!vk_semaphores.empty());
   // Structure specifying a queue submit operation.
@@ -36,7 +43,8 @@
 bool SubmitWaitVkSemaphore(VkQueue vk_queue,
                            VkSemaphore vk_semaphore,
                            VkFence vk_fence) {
-  return SubmitWaitVkSemaphores(vk_queue, {vk_semaphore}, vk_fence);
+  return SubmitWaitVkSemaphores(
+      vk_queue, base::span<VkSemaphore>(&vk_semaphore, 1), vk_fence);
 }
 
 VkSemaphore CreateExternalVkSemaphore(
diff --git a/gpu/vulkan/vulkan_util.h b/gpu/vulkan/vulkan_util.h
index 91bd763..cd85653 100644
--- a/gpu/vulkan/vulkan_util.h
+++ b/gpu/vulkan/vulkan_util.h
@@ -12,10 +12,19 @@
 #include <memory>
 #include <vector>
 
+#include "base/containers/span.h"
 #include "gpu/vulkan/vulkan_export.h"
 
 namespace gpu {
 
+// Submits semaphores to be signaled to the vulkan queue. Semaphores are
+// signaled once this submission is executed. vk_fence is an optional handle
+// to fence to be signaled once this submission completes execution.
+VULKAN_EXPORT bool SubmitSignalVkSemaphores(
+    VkQueue vk_queue,
+    const base::span<VkSemaphore>& vk_semaphore,
+    VkFence vk_fence = VK_NULL_HANDLE);
+
 // Submits a semaphore to be signaled to the vulkan queue. Semaphore is
 // signaled once this submission is executed. vk_fence is an optional handle
 // to fence to be signaled once this submission completes execution.
@@ -28,7 +37,7 @@
 // handle to fence to be signaled once this submission completes execution.
 VULKAN_EXPORT bool SubmitWaitVkSemaphores(
     VkQueue vk_queue,
-    const std::vector<VkSemaphore>& vk_semaphores,
+    const base::span<VkSemaphore>& vk_semaphores,
     VkFence vk_fence = VK_NULL_HANDLE);
 
 // Submits a semaphore to be waited upon to the vulkan queue. Semaphore is
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b6db214..355e07b1 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -229,7 +229,7 @@
         Suggest  Password...
       </message>
       <message name="IDS_IOS_SUGGESTED_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
-        Chrome Suggested Password: <ph name="SUGGESTED_PASSWORD">$1<ex>Ax#f4gH*k7</ex></ph>
+        Chrome Suggested Password:
       </message>
       <message name="IDS_IOS_SUGGESTED_PASSWORD_HINT" desc="Text shown alongside a suggested password to tell user that generated passwords are recorded by chrome. [Length: unlimited] [iOS only]">
         Chrome will remember this password for you. You don't have to remember it.
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index d156649f..5c7a204 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -146,6 +146,9 @@
 // Tracks field when current password was generated.
 @property(nonatomic, copy) NSString* passwordGeneratedIdentifier;
 
+// Tracks current potential generated password until accepted or rejected.
+@property(nonatomic, copy) NSString* generatedPotentialPassword;
+
 @end
 
 @interface PasswordController ()<FormSuggestionProvider, PasswordFormFiller>
@@ -737,14 +740,19 @@
       _passwordGenerationHelper->GeneratePassword([self lastCommittedURL], 0, 0,
                                                   0, nullptr);
 
-  NSString* title = GetNSStringF(IDS_IOS_SUGGESTED_PASSWORD, generatedPassword);
-  NSString* message = GetNSString(IDS_IOS_SUGGESTED_PASSWORD_HINT);
+  self.generatedPotentialPassword = SysUTF16ToNSString(generatedPassword);
+
+  [[NSNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(updateGeneratePasswordStrings:)
+             name:UIContentSizeCategoryDidChangeNotification
+           object:nil];
 
   // TODO(crbug.com/886583): add eg tests
   self.actionSheetCoordinator = [[ActionSheetCoordinator alloc]
       initWithBaseViewController:self.baseViewController
-                           title:title
-                         message:message
+                           title:@""
+                         message:@""
                             rect:self.baseViewController.view.frame
                             view:self.baseViewController.view];
   self.actionSheetCoordinator.popoverArrowDirection = 0;
@@ -752,16 +760,20 @@
       IsIPadIdiom() ? UIAlertControllerStyleAlert
                     : UIAlertControllerStyleActionSheet;
 
-  NSString* nsPassword = SysUTF16ToNSString(generatedPassword);
+  // Set attributed text.
+  [self updateGeneratePasswordStrings:self];
 
   __weak PasswordController* weakSelf = self;
+
   [self.actionSheetCoordinator
       addItemWithTitle:GetNSString(IDS_IOS_USE_SUGGESTED_PASSWORD)
                 action:^{
                   [weakSelf
                       injectGeneratedPasswordForFormName:formName
-                                       generatedPassword:nsPassword
+                                       generatedPassword:
+                                           weakSelf.generatedPotentialPassword
                                        completionHandler:completionHandler];
+                  [weakSelf generatePasswordPopupDismissed];
                 }
                  style:UIAlertActionStyleDefault];
 
@@ -769,12 +781,51 @@
                                          action:^{
                                            if (completionHandler)
                                              completionHandler(NO);
+                                           [weakSelf
+                                               generatePasswordPopupDismissed];
                                          }
                                           style:UIAlertActionStyleCancel];
 
+  // Set 'suggest' as preferred action, as per UX.
+  self.actionSheetCoordinator.alertController.preferredAction =
+      self.actionSheetCoordinator.alertController.actions[0];
+
   [self.actionSheetCoordinator start];
 }
 
+- (void)generatePasswordPopupDismissed {
+  [self.actionSheetCoordinator stop];
+  self.actionSheetCoordinator = nil;
+  [[NSNotificationCenter defaultCenter] removeObserver:self];
+  self.generatedPotentialPassword = nil;
+}
+
+- (void)updateGeneratePasswordStrings:(id)sender {
+  NSString* title = [NSString
+      stringWithFormat:@"%@\n%@\n ", GetNSString(IDS_IOS_SUGGESTED_PASSWORD),
+                       self.generatedPotentialPassword];
+  self.actionSheetCoordinator.attributedTitle =
+      [[NSMutableAttributedString alloc]
+          initWithString:title
+              attributes:@{
+                NSFontAttributeName :
+                    [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]
+              }];
+
+  NSString* message = GetNSString(IDS_IOS_SUGGESTED_PASSWORD_HINT);
+  self.actionSheetCoordinator.attributedMessage =
+      [[NSMutableAttributedString alloc]
+          initWithString:message
+              attributes:@{
+                NSFontAttributeName :
+                    [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]
+              }];
+
+  // TODO(crbug.com/886583): find a way to make action sheet coordinator
+  // responsible for font size changes.
+  [self.actionSheetCoordinator updateAttributedText];
+}
+
 - (void)injectGeneratedPasswordForFormName:(NSString*)formName
                          generatedPassword:(NSString*)generatedPassword
                          completionHandler:(void (^)(BOOL))completionHandler {
diff --git a/ios/chrome/browser/ui/OWNERS b/ios/chrome/browser/ui/OWNERS
index 1ccf6c3c..4a49369 100644
--- a/ios/chrome/browser/ui/OWNERS
+++ b/ios/chrome/browser/ui/OWNERS
@@ -4,5 +4,8 @@
 marq@chromium.org
 rohitrao@chromium.org
 
+# Only for adding and removing flags.
+per-file ui_feature_flags.*=*
+
 # TEAM: ios-directory-owners@chromium.org
 # OS: iOS
diff --git a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h
index db734f2..7105bd5 100644
--- a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h
+++ b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h
@@ -43,6 +43,16 @@
 // UIAlertControllerStyleActionSheet.
 @property(nonatomic, assign) UIAlertControllerStyle alertStyle;
 
+// Allows replacing title with an attributed string. |updateAttributedText| must
+// be called afterward.
+@property(nonatomic, copy) NSAttributedString* attributedTitle;
+// Allows replacing message with an attributed string. |updateAttributedText|
+// must be called afterward.
+@property(nonatomic, copy) NSAttributedString* attributedMessage;
+
+// Updates text based on current |attributedTitle| and |attributedMessage|.
+- (void)updateAttributedText;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_ALERT_COORDINATOR_ACTION_SHEET_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm
index 20dd3d1..595d8c5 100644
--- a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm
+++ b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm
@@ -93,4 +93,15 @@
   return alert;
 }
 
+- (void)updateAttributedText {
+  // Use setValue to access unexposed attributed strings for title and message.
+  if (self.attributedTitle) {
+    [self.alertController setValue:_attributedTitle forKey:@"attributedTitle"];
+  }
+  if (self.attributedMessage) {
+    [self.alertController setValue:_attributedMessage
+                            forKey:@"attributedMessage"];
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/alert_view_controller/BUILD.gn b/ios/chrome/browser/ui/alert_view_controller/BUILD.gn
index 7f360bb..63c1efe 100644
--- a/ios/chrome/browser/ui/alert_view_controller/BUILD.gn
+++ b/ios/chrome/browser/ui/alert_view_controller/BUILD.gn
@@ -8,6 +8,8 @@
     "alert_view_controller.mm",
   ]
   deps = [
+    "//ios/chrome/browser/ui/elements",
+    "//ios/chrome/browser/ui/util",
     "//ios/chrome/common/ui_util",
   ]
   libs = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h
index 556b21c..ced29fa3 100644
--- a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h
+++ b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h
@@ -15,8 +15,12 @@
 // The title for this action.
 @property(nonatomic, readonly) NSString* title;
 
+// The style for this action. Matches UIAlertAction style.
+@property(nonatomic, readonly) UIAlertActionStyle style;
+
 // Initializes an action with |title| and |handler|.
 + (instancetype)actionWithTitle:(NSString*)title
+                          style:(UIAlertActionStyle)style
                         handler:(void (^)(AlertAction* action))handler;
 
 @end
diff --git a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm
index a67f3629..3231933 100644
--- a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm
+++ b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
 
+#import "ios/chrome/browser/ui/elements/gray_highlight_button.h"
+#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -22,7 +24,7 @@
 constexpr float kShadowOpacity = 0.12;
 
 // Properties of the alert view.
-constexpr CGFloat kCornerRadius = 12;
+constexpr CGFloat kCornerRadius = 14;
 constexpr CGFloat kMinimumWidth = 30;
 constexpr CGFloat kMinimumHeight = 30;
 constexpr CGFloat kMinimumMargin = 4;
@@ -36,12 +38,21 @@
 constexpr CGFloat kMessageInsetLeading = 20;
 constexpr CGFloat kMessageInsetBottom = 20;
 constexpr CGFloat kMessageInsetTrailing = 20;
+constexpr CGFloat kButtonInsetTop = 20;
+constexpr CGFloat kButtonInsetLeading = 20;
+constexpr CGFloat kButtonInsetBottom = 20;
+constexpr CGFloat kButtonInsetTrailing = 20;
+
+// Colors for the action buttons.
+constexpr int kButtonTextDefaultColor = 0x0579ff;
+constexpr int kButtonTextDestructiveColor = 0xdf322f;
 
 }  // namespace
 
 @interface AlertAction ()
 
 @property(nonatomic, readwrite) NSString* title;
+@property(nonatomic, readwrite) UIAlertActionStyle style;
 
 // The unique identifier for the actions created.
 @property(nonatomic) NSInteger uniqueIdentifier;
@@ -54,12 +65,14 @@
 @implementation AlertAction
 
 + (instancetype)actionWithTitle:(NSString*)title
+                          style:(UIAlertActionStyle)style
                         handler:(void (^)(AlertAction* action))handler {
   AlertAction* action = [[AlertAction alloc] init];
   static NSInteger actionIdentifier = 0;
   action.uniqueIdentifier = ++actionIdentifier;
   action.title = title;
   action.handler = handler;
+  action.style = style;
   return action;
 }
 
@@ -102,6 +115,7 @@
       [[UIColor blackColor] colorWithAlphaComponent:kBackgroundAlpha];
 
   self.contentView = [[UIView alloc] init];
+  self.contentView.clipsToBounds = YES;
   self.contentView.backgroundColor = [UIColor whiteColor];
   self.contentView.layer.cornerRadius = kCornerRadius;
   self.contentView.layer.shadowOffset =
@@ -194,23 +208,53 @@
 
   self.buttonAlertActionsDictionary = [[NSMutableDictionary alloc] init];
   for (AlertAction* action in self.actions) {
-    UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
+    GrayHighlightButton* button = [[GrayHighlightButton alloc] init];
+    UIFont* font = nil;
+    UIColor* textColor = nil;
+    if (action.style == UIAlertActionStyleDefault) {
+      font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
+      textColor = UIColorFromRGB(kButtonTextDefaultColor);
+    } else if (action.style == UIAlertActionStyleCancel) {
+      font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
+      textColor = UIColorFromRGB(kButtonTextDefaultColor);
+    } else {  // Style is UIAlertActionStyleDestructive
+      font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
+      textColor = UIColorFromRGB(kButtonTextDestructiveColor);
+    }
+    [button.titleLabel setFont:font];
+    [button setTitleColor:textColor forState:UIControlStateNormal];
     [button setTitle:action.title forState:UIControlStateNormal];
+
     button.contentHorizontalAlignment =
         UIControlContentHorizontalAlignmentCenter;
     [button addTarget:self
                   action:@selector(didSelectActionForButton:)
         forControlEvents:UIControlEventTouchUpInside];
     button.translatesAutoresizingMaskIntoConstraints = NO;
-    [self.contentView addSubview:button];
+    button.contentEdgeInsets =
+        UIEdgeInsetsMake(kButtonInsetTop, kButtonInsetLeading,
+                         kButtonInsetBottom, kButtonInsetTrailing);
 
-    [NSLayoutConstraint activateConstraints:@[
-      [button.trailingAnchor
-          constraintEqualToAnchor:self.contentView.trailingAnchor],
-      [button.leadingAnchor
-          constraintEqualToAnchor:self.contentView.leadingAnchor],
-    ]];
-    [stackView addArrangedSubview:button];
+    UIView* hairline = [[UIView alloc] init];
+    hairline.backgroundColor = [UIColor lightGrayColor];
+    hairline.translatesAutoresizingMaskIntoConstraints = NO;
+
+    UIView* buttonContainer = [[UIView alloc] init];
+    [buttonContainer addSubview:button];
+    [buttonContainer addSubview:hairline];
+    buttonContainer.translatesAutoresizingMaskIntoConstraints = NO;
+    [stackView addArrangedSubview:buttonContainer];
+
+    CGFloat pixelHeight = 1.0 / [UIScreen mainScreen].scale;
+    [hairline.heightAnchor constraintEqualToConstant:pixelHeight].active = YES;
+    AddSameConstraintsToSides(
+        hairline, buttonContainer,
+        (LayoutSides::kTrailing | LayoutSides::kTop | LayoutSides::kLeading));
+
+    AddSameConstraints(button, buttonContainer);
+    AddSameConstraintsToSides(buttonContainer, self.contentView,
+                              LayoutSides::kTrailing | LayoutSides::kLeading);
+
     button.tag = action.uniqueIdentifier;
     self.buttonAlertActionsDictionary[@(action.uniqueIdentifier)] = action;
   }
diff --git a/ios/chrome/browser/ui/collection_view/collection_view_controller_test.h b/ios/chrome/browser/ui/collection_view/collection_view_controller_test.h
index 48c3c20..00c997a 100644
--- a/ios/chrome/browser/ui/collection_view/collection_view_controller_test.h
+++ b/ios/chrome/browser/ui/collection_view/collection_view_controller_test.h
@@ -71,6 +71,14 @@
   // items in a dedicated section.
   void CheckSectionFooterWithId(int expected_text_id, int section);
 
+  // Verifies that the text cell at |item| in |section| has a text property
+  // which matches |expected_title|.
+  void CheckTextCellText(NSString* expected_text, int section, int item);
+
+  // Verifies that the text cell at |item| in |section| has a text property
+  // which matches the l10n string for |expected_title_id|.
+  void CheckTextCellTextWithId(int expected_text_id, int section, int item);
+
   // Verifies that the text cell at |item| in |section| has a title which
   // matches |expected_title|.
   void CheckTextCellTitle(NSString* expected_title, int section, int item);
diff --git a/ios/chrome/browser/ui/collection_view/collection_view_controller_test.mm b/ios/chrome/browser/ui/collection_view/collection_view_controller_test.mm
index f04cdc70..1902958 100644
--- a/ios/chrome/browser/ui/collection_view/collection_view_controller_test.mm
+++ b/ios/chrome/browser/ui/collection_view/collection_view_controller_test.mm
@@ -114,6 +114,20 @@
   return CheckSectionFooter(l10n_util::GetNSString(expected_text_id), section);
 }
 
+void CollectionViewControllerTest::CheckTextCellText(NSString* expected_text,
+                                                     int section,
+                                                     int item) {
+  id cell = GetCollectionViewItem(section, item);
+  ASSERT_TRUE([cell respondsToSelector:@selector(text)]);
+  EXPECT_NSEQ(expected_text, [cell text]);
+}
+
+void CollectionViewControllerTest::CheckTextCellTextWithId(int expected_text_id,
+                                                           int section,
+                                                           int item) {
+  CheckTextCellText(l10n_util::GetNSString(expected_text_id), section, item);
+}
+
 void CollectionViewControllerTest::CheckTextCellTitle(NSString* expected_title,
                                                       int section,
                                                       int item) {
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn
index 149eb7f..82327f0 100644
--- a/ios/chrome/browser/ui/elements/BUILD.gn
+++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -7,6 +7,8 @@
   sources = [
     "extended_touch_target_button.h",
     "extended_touch_target_button.mm",
+    "gray_highlight_button.h",
+    "gray_highlight_button.mm",
     "selector_coordinator.h",
     "selector_coordinator.mm",
     "selector_picker_presentation_controller.h",
diff --git a/ios/chrome/browser/ui/elements/gray_highlight_button.h b/ios/chrome/browser/ui/elements/gray_highlight_button.h
new file mode 100644
index 0000000..7fe81c6b
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/gray_highlight_button.h
@@ -0,0 +1,15 @@
+// Copyright 2019 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 IOS_CHROME_BROWSER_UI_ELEMENTS_GRAY_HIGHLIGHT_BUTTON_H_
+#define IOS_CHROME_BROWSER_UI_ELEMENTS_GRAY_HIGHLIGHT_BUTTON_H_
+
+#import <UIKit/UIKit.h>
+
+// A button that makes its background light gray when highlighted and clear
+// when not. Also its text is not dimmed.
+@interface GrayHighlightButton : UIButton
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_ELEMENTS_GRAY_HIGHLIGHT_BUTTON_H_
diff --git a/ios/chrome/browser/ui/elements/gray_highlight_button.mm b/ios/chrome/browser/ui/elements/gray_highlight_button.mm
new file mode 100644
index 0000000..c929124
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/gray_highlight_button.mm
@@ -0,0 +1,22 @@
+// Copyright 2019 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 "ios/chrome/browser/ui/elements/gray_highlight_button.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation GrayHighlightButton
+
+- (void)setHighlighted:(BOOL)highlighted {
+  [super setHighlighted:highlighted];
+  if (highlighted) {
+    self.backgroundColor = [UIColor colorWithWhite:235.0 / 255.0 alpha:1.0];
+  } else {
+    self.backgroundColor = [UIColor clearColor];
+  }
+}
+
+@end
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index d4f2a9f..5636601c 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -92,6 +92,7 @@
     "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/bookmarks:bookmarks_utils",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/favicon",
     "//ios/chrome/browser/net",
     "//ios/chrome/browser/prerender",
     "//ios/chrome/browser/search_engines",
@@ -106,6 +107,7 @@
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
+    "//ios/chrome/common/favicon",
     "//ios/public/provider/chrome/browser",
     "//ios/third_party/material_roboto_font_loader_ios",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
index 3a37d25..6b329447 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
@@ -11,6 +11,7 @@
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
 #import "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/load_query_commands.h"
 #import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
@@ -72,6 +73,8 @@
   self.mediator = [[OmniboxMediator alloc] init];
   self.mediator.templateURLService =
       ios::TemplateURLServiceFactory::GetForBrowserState(self.browserState);
+  self.mediator.faviconLoader =
+      IOSChromeFaviconLoaderFactory::GetForBrowserState(self.browserState);
   self.mediator.consumer = self.viewController;
 
   DCHECK(self.editController);
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_mediator.h b/ios/chrome/browser/ui/omnibox/omnibox_mediator.h
index 61e0f9b..2e06142 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_mediator.h
+++ b/ios/chrome/browser/ui/omnibox/omnibox_mediator.h
@@ -10,6 +10,7 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_left_image_consumer.h"
 
 @protocol OmniboxConsumer;
+class FaviconLoader;
 class TemplateURLService;
 
 // A mediator object that updates the omnibox according to the model changes.
@@ -23,6 +24,9 @@
 // object and may be nil.
 @property(nonatomic, weak) id<OmniboxConsumer> consumer;
 
+// The favicon loader.
+@property(nonatomic, assign) FaviconLoader* faviconLoader;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_mediator.mm b/ios/chrome/browser/ui/omnibox/omnibox_mediator.mm
index aed5006..603de15b 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_mediator.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_mediator.mm
@@ -5,21 +5,31 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_mediator.h"
 
 #include "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/favicon/favicon_loader.h"
 #import "ios/chrome/browser/search_engines/search_engine_observer_bridge.h"
 #import "ios/chrome/browser/search_engines/search_engines_util.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_consumer.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_util.h"
+#include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
+#import "ios/chrome/common/favicon/favicon_attributes.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+namespace {
+const CGFloat kOmniboxIconSize = 20;
+}  // namespace
+
 @interface OmniboxMediator () <SearchEngineObserving>
 
 // Whether the current default search engine supports search-by-image.
 @property(nonatomic, assign) BOOL searchEngineSupportsSearchByImage;
 
+// The latest URL used to fetch the favicon.
+@property(nonatomic, assign) GURL latestFaviconURL;
+
 @end
 
 @implementation OmniboxMediator {
@@ -78,6 +88,34 @@
   UIImage* image = GetOmniboxSuggestionIconForAutocompleteMatchType(
       matchType, /* is_starred */ false);
   [self.consumer updateAutocompleteIcon:image];
+
+  if (!base::FeatureList::IsEnabled(kNewOmniboxPopupLayout)) {
+    return;
+  }
+
+  // Can't load favicons without a favicon loader.
+  DCHECK(self.faviconLoader);
+
+  // Remember the last request URL to avoid showing favicons for past requests.
+  self.latestFaviconURL = faviconURL;
+  // Download the favicon.
+  __weak OmniboxMediator* weakSelf = self;
+  // The code below mimics that in OmniboxPopupMediator.
+  FaviconAttributes* cachedAttributes = self.faviconLoader->FaviconForPageUrl(
+      faviconURL, kOmniboxIconSize, kOmniboxIconSize,
+      /*fallback_to_google_server=*/YES, ^(FaviconAttributes* attributes) {
+        // If the favicon isn't default, and this is still the latest request,
+        // use it.
+        if (attributes.faviconImage && !attributes.usesDefaultImage &&
+            weakSelf.latestFaviconURL == faviconURL)
+          [weakSelf.consumer updateAutocompleteIcon:attributes.faviconImage];
+      });
+
+  // Only use cached attributes when they are a non-default icon. Never show
+  // monograms or default globe icon.
+  if (cachedAttributes.faviconImage && !cachedAttributes.usesDefaultImage) {
+    [self.consumer updateAutocompleteIcon:cachedAttributes.faviconImage];
+  }
 }
 
 @end
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
index 507456ee..05286bb0 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
@@ -13,12 +13,19 @@
 class ChromeBrowserState;
 }  // namespace ios
 
+@class ClearBrowsingDataManager;
+
 // CollectionView for clearing browsing data (including history,
 // cookies, caches, passwords, and autofill).
 @interface ClearBrowsingDataCollectionViewController
     : SettingsRootCollectionViewController <ClearBrowsingDataConsumer>
 
+// "Default" convenience initializer that Users should in general make use of.
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState;
+
+// Designated initializer to allow dependency injection (in tests).
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
+                             manager:(ClearBrowsingDataManager*)manager
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initWithLayout:(UICollectionViewLayout*)layout
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
index ba45c3c0..22e7f2b7b 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
@@ -72,6 +72,14 @@
 #pragma mark Initialization
 
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState {
+  ClearBrowsingDataManager* manager = [[ClearBrowsingDataManager alloc]
+      initWithBrowserState:browserState
+                  listType:ClearBrowsingDataListType::kListTypeCollectionView];
+  return [self initWithBrowserState:browserState manager:manager];
+}
+
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
+                             manager:(ClearBrowsingDataManager*)manager {
   DCHECK(browserState);
   UICollectionViewLayout* layout = [[MDCCollectionViewFlowLayout alloc] init];
   self = [super initWithLayout:layout
@@ -80,10 +88,7 @@
     self.accessibilityTraits |= UIAccessibilityTraitButton;
 
     _browserState = browserState;
-    _dataManager = [[ClearBrowsingDataManager alloc]
-        initWithBrowserState:browserState
-                    listType:ClearBrowsingDataListType::
-                                 kListTypeCollectionView];
+    _dataManager = manager;
     _dataManager.linkDelegate = self;
     _dataManager.consumer = self;
 
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller_unittest.mm
index 999be38..97d72af 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller_unittest.mm
@@ -20,12 +20,15 @@
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 #include "ios/chrome/browser/browsing_data/cache_counter.h"
+#include "ios/chrome/browser/browsing_data/fake_browsing_data_remover.h"
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/prefs/browser_prefs.h"
 #include "ios/chrome/browser/signin/identity_test_environment_chrome_browser_state_adaptor.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h"
 #import "ios/chrome/browser/ui/settings/cells/settings_text_item.h"
+#import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h"
+#import "ios/chrome/browser/ui/settings/clear_browsing_data/fake_browsing_data_counter_wrapper_producer.h"
 #import "ios/chrome/common/string_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
@@ -78,6 +81,8 @@
 
     test_sync_service_ = static_cast<syncer::TestSyncService*>(
         ProfileSyncServiceFactory::GetForBrowserState(browser_state_.get()));
+
+    remover_ = std::make_unique<FakeBrowsingDataRemover>();
   }
 
   std::unique_ptr<sync_preferences::PrefServiceSyncable> CreatePrefService() {
@@ -91,8 +96,16 @@
   }
 
   CollectionViewController* InstantiateController() override {
+    ClearBrowsingDataManager* manager = [[ClearBrowsingDataManager alloc]
+                      initWithBrowserState:browser_state_.get()
+                                  listType:ClearBrowsingDataListType::
+                                               kListTypeCollectionView
+                       browsingDataRemover:remover_.get()
+        browsingDataCounterWrapperProducer:
+            [[FakeBrowsingDataCounterWrapperProducer alloc] init]];
     return [[ClearBrowsingDataCollectionViewController alloc]
-        initWithBrowserState:browser_state_.get()];
+        initWithBrowserState:browser_state_.get()
+                     manager:manager];
   }
 
   void SelectItem(int item, int section) {
@@ -111,6 +124,7 @@
   std::unique_ptr<IdentityTestEnvironmentChromeBrowserStateAdaptor>
       identity_test_env_adaptor_;
   syncer::TestSyncService* test_sync_service_;
+  std::unique_ptr<BrowsingDataRemover> remover_;
 };
 
 // Tests ClearBrowsingDataCollectionViewControllerTest is set up with all
@@ -126,23 +140,22 @@
     section_offset = 1;
   }
 
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_BROWSING_HISTORY, 0 + section_offset,
-                           0);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_BROWSING_HISTORY, 0 + section_offset,
+                          0);
   CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
                      0 + section_offset, 0);
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_COOKIES, 0 + section_offset, 1);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_COOKIES, 0 + section_offset, 1);
   CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
                      0 + section_offset, 1);
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_CACHE, 0 + section_offset, 2);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_CACHE, 0 + section_offset, 2);
   CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
                      0 + section_offset, 2);
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_SAVED_PASSWORDS, 0 + section_offset,
-                           3);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_SAVED_PASSWORDS, 0 + section_offset, 3);
   CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0 + section_offset, 3);
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_AUTOFILL, 0 + section_offset, 4);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_AUTOFILL, 0 + section_offset, 4);
   CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0 + section_offset, 4);
 
-  CheckTextCellTitleWithId(IDS_IOS_CLEAR_BUTTON, 1 + section_offset, 0);
+  CheckTextCellTextWithId(IDS_IOS_CLEAR_BUTTON, 1 + section_offset, 0);
 
   CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA,
                            2 + section_offset);
@@ -169,7 +182,8 @@
   EXPECT_EQ(1, NumberOfItemsInSection(1 + section_offset));
 
   EXPECT_EQ(1, NumberOfItemsInSection(2 + section_offset));
-  CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT, 2);
+  CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT,
+                           2 + section_offset);
 
   EXPECT_EQ(1, NumberOfItemsInSection(3 + section_offset));
   CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA,
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
index 32efca6e3..96ae66e 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
@@ -75,9 +75,9 @@
                 TimeRangeSelectorTableViewControllerDelegate>
 
 // The manager's consumer.
-@property(nonatomic, assign) id<ClearBrowsingDataConsumer> consumer;
+@property(nonatomic, weak) id<ClearBrowsingDataConsumer> consumer;
 // Reference to the LinkDelegate for CollectionViewFooterItem.
-@property(nonatomic, strong) id<CollectionViewFooterLinkDelegate> linkDelegate;
+@property(nonatomic, weak) id<CollectionViewFooterLinkDelegate> linkDelegate;
 
 // Default init method. |browserState| can't be nil and
 // |listType| determines what kind of items to populate model with.
diff --git a/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm b/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm
index 9876650..ff7c15d 100644
--- a/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm
@@ -42,6 +42,8 @@
 
 const CGFloat kTableViewSeparatorLeadingInset = 56;
 const CGFloat kTableViewSeparatorTrailingInset = 16;
+const int kFaviconDesiredSizeInPoint = 32;
+const int kFaviconMinSizeInPoint = 16;
 constexpr base::TimeDelta kMaxVisitAge = base::TimeDelta::FromDays(2);
 const size_t kMaxcustomSearchEngines = 3;
 const char kUmaSelectDefaultSearchEngine[] =
@@ -232,7 +234,7 @@
     FaviconAttributes* cachedAttributes = nil;
     if (item.type == ItemTypePrepopulatedEngine) {
       cachedAttributes = _faviconLoader->FaviconForPageUrl(
-          engineItem.URL, kFaviconPreferredSize, kFaviconMinSize,
+          engineItem.URL, kFaviconDesiredSizeInPoint, kFaviconMinSizeInPoint,
           /*fallback_to_google_server=*/YES, ^(FaviconAttributes* attributes) {
             // Only set favicon if the cell hasn't been reused.
             if (urlCell.cellUniqueIdentifier == engineItem.uniqueIdentifier) {
@@ -242,7 +244,7 @@
           });
     } else {
       cachedAttributes = _faviconLoader->FaviconForIconUrl(
-          engineItem.URL, kFaviconPreferredSize, kFaviconMinSize,
+          engineItem.URL, kFaviconDesiredSizeInPoint, kFaviconMinSizeInPoint,
           ^(FaviconAttributes* attributes) {
             // Only set favicon if the cell hasn't been reused.
             if (urlCell.cellUniqueIdentifier == engineItem.uniqueIdentifier) {
diff --git a/ios/showcase/alert/sc_alert_coordinator.mm b/ios/showcase/alert/sc_alert_coordinator.mm
index b7f85f71..b171c7d 100644
--- a/ios/showcase/alert/sc_alert_coordinator.mm
+++ b/ios/showcase/alert/sc_alert_coordinator.mm
@@ -12,6 +12,7 @@
 
 @interface SCAlertCoordinator ()
 @property(nonatomic, strong) UIViewController* containerViewController;
+@property(nonatomic, strong) UISwitch* blockAlertSwitch;
 @end
 
 @implementation SCAlertCoordinator
@@ -50,17 +51,31 @@
                  action:@selector(showHTTPAuth)
        forControlEvents:UIControlEventTouchUpInside];
 
-  UIStackView* stack = [[UIStackView alloc] initWithArrangedSubviews:@[
-    alertButton, promptButton, confirmButton, authButton
+  UILabel* blockAlertsLabel = [[UILabel alloc] init];
+  blockAlertsLabel.text = @"Show \"Block Alerts Button\"";
+
+  self.blockAlertSwitch = [[UISwitch alloc] init];
+
+  UIStackView* switchStack = [[UIStackView alloc]
+      initWithArrangedSubviews:@[ self.blockAlertSwitch, blockAlertsLabel ]];
+  switchStack.axis = UILayoutConstraintAxisHorizontal;
+  switchStack.spacing = 16;
+  switchStack.translatesAutoresizingMaskIntoConstraints = NO;
+
+  UIStackView* verticalStack = [[UIStackView alloc] initWithArrangedSubviews:@[
+    alertButton, promptButton, confirmButton, authButton, switchStack
   ]];
-  stack.axis = UILayoutConstraintAxisVertical;
-  stack.spacing = 30;
-  stack.translatesAutoresizingMaskIntoConstraints = NO;
-  [containerView addSubview:stack];
+  verticalStack.axis = UILayoutConstraintAxisVertical;
+  verticalStack.spacing = 30;
+  verticalStack.translatesAutoresizingMaskIntoConstraints = NO;
+  verticalStack.distribution = UIStackViewDistributionFillEqually;
+  [containerView addSubview:verticalStack];
 
   [NSLayoutConstraint activateConstraints:@[
-    [stack.centerXAnchor constraintEqualToAnchor:containerView.centerXAnchor],
-    [stack.centerYAnchor constraintEqualToAnchor:containerView.centerYAnchor],
+    [verticalStack.centerXAnchor
+        constraintEqualToAnchor:containerView.centerXAnchor],
+    [verticalStack.centerYAnchor
+        constraintEqualToAnchor:containerView.centerYAnchor],
   ]];
   [self.baseViewController pushViewController:self.containerViewController
                                      animated:YES];
@@ -73,6 +88,7 @@
   __weak __typeof(self) weakSelf = self;
   AlertAction* action =
       [AlertAction actionWithTitle:@"OK"
+                             style:UIAlertActionStyleDefault
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -92,6 +108,7 @@
   __weak __typeof(self) weakSelf = self;
   AlertAction* OKAction =
       [AlertAction actionWithTitle:@"OK"
+                             style:UIAlertActionStyleDefault
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -100,6 +117,7 @@
   [alert addAction:OKAction];
   AlertAction* cancelAction =
       [AlertAction actionWithTitle:@"Cancel"
+                             style:UIAlertActionStyleCancel
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -116,6 +134,7 @@
   __weak __typeof(self) weakSelf = self;
   AlertAction* OKAction =
       [AlertAction actionWithTitle:@"OK"
+                             style:UIAlertActionStyleDefault
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -124,6 +143,7 @@
   [alert addAction:OKAction];
   AlertAction* cancelAction =
       [AlertAction actionWithTitle:@"Cancel"
+                             style:UIAlertActionStyleCancel
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -148,6 +168,7 @@
   __weak __typeof(self) weakSelf = self;
   AlertAction* OKAction =
       [AlertAction actionWithTitle:@"Sign In"
+                             style:UIAlertActionStyleDefault
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -156,6 +177,7 @@
   [alert addAction:OKAction];
   AlertAction* cancelAction =
       [AlertAction actionWithTitle:@"Cancel"
+                             style:UIAlertActionStyleCancel
                            handler:^(AlertAction* action) {
                              [weakSelf.containerViewController
                                  dismissViewControllerAnimated:YES
@@ -166,6 +188,18 @@
 }
 
 - (void)presentAlertViewController:(AlertViewController*)alertViewController {
+  if (self.blockAlertSwitch.isOn) {
+    __weak __typeof(self) weakSelf = self;
+    AlertAction* blockAction =
+        [AlertAction actionWithTitle:@"Block Dialogs"
+                               style:UIAlertActionStyleDestructive
+                             handler:^(AlertAction* action) {
+                               [weakSelf.containerViewController
+                                   dismissViewControllerAnimated:YES
+                                                      completion:nil];
+                             }];
+    [alertViewController addAction:blockAction];
+  }
   alertViewController.modalTransitionStyle =
       UIModalTransitionStyleCrossDissolve;
   alertViewController.modalPresentationStyle =
diff --git a/media/audio/audio_manager_unittest.cc b/media/audio/audio_manager_unittest.cc
index 27cb93f..1001112 100644
--- a/media/audio/audio_manager_unittest.cc
+++ b/media/audio/audio_manager_unittest.cc
@@ -268,7 +268,8 @@
     chromeos::CrasAudioClient::InitializeFake();
     chromeos::FakeCrasAudioClient::Get()->SetAudioNodesForTesting(audio_nodes);
     audio_pref_handler_ = new chromeos::AudioDevicesPrefHandlerStub();
-    chromeos::CrasAudioHandler::Initialize(audio_pref_handler_);
+    chromeos::CrasAudioHandler::Initialize(/*connector=*/nullptr,
+                                           audio_pref_handler_);
     cras_audio_handler_ = chromeos::CrasAudioHandler::Get();
     base::RunLoop().RunUntilIdle();
   }
diff --git a/media/base/video_types.h b/media/base/video_types.h
index 8803f60..af74e68 100644
--- a/media/base/video_types.h
+++ b/media/base/video_types.h
@@ -18,6 +18,9 @@
 // http://www.fourcc.org/rgb.php and http://www.fourcc.org/yuv.php
 // Logged to UMA, so never reuse values. Leave gaps if necessary.
 // Ordered as planar, semi-planar, YUV-packed, and RGB formats.
+// When a VideoFrame is backed by native textures, VideoPixelFormat describes
+// how those textures should be sampled and combined to produce the final
+// pixels.
 enum VideoPixelFormat {
   PIXEL_FORMAT_UNKNOWN = 0,  // Unknown or unspecified format value.
   PIXEL_FORMAT_I420 =
@@ -38,10 +41,12 @@
       8,  // 16bpp interleaved 2x1 U, 1x1 Y, 2x1 V, 1x1 Y samples.
   PIXEL_FORMAT_YUY2 =
       9,  // 16bpp interleaved 1x1 Y, 2x1 U, 1x1 Y, 2x1 V samples.
-  PIXEL_FORMAT_ARGB = 10,   // 32bpp ARGB, 1 plane.
-  PIXEL_FORMAT_XRGB = 11,   // 24bpp XRGB, 1 plane.
-  PIXEL_FORMAT_RGB24 = 12,  // 24bpp BGR, 1 plane.
-  PIXEL_FORMAT_RGB32 = 13,  // 32bpp BGRA, 1 plane.
+  PIXEL_FORMAT_ARGB = 10,   // 32bpp BGRA (byte-order), 1 plane.
+  PIXEL_FORMAT_XRGB = 11,   // 24bpp BGRX (byte-order), 1 plane.
+  PIXEL_FORMAT_RGB24 = 12,  // 24bpp BGR (byte-order), 1 plane.
+  // TODO(crbug.com/953128): Deprecate PIXEL_FORMAT_RGB32 in favor of
+  // PIXEL_FORMAT_ARGB.
+  PIXEL_FORMAT_RGB32 = 13,  // 32bpp BGRA (byte-order), 1 plane.
   PIXEL_FORMAT_MJPEG = 14,  // MJPEG compressed.
   // MediaTek proprietary format. MT21 is similar to NV21 except the memory
   // layout and pixel layout (swizzles). 12bpp with Y plane followed by a 2x2
@@ -69,8 +74,8 @@
   /* PIXEL_FORMAT_Y8 = 25, Deprecated */
   PIXEL_FORMAT_Y16 = 26,  // single 16bpp plane.
 
-  PIXEL_FORMAT_ABGR = 27,  // 32bpp RGBA, 1 plane.
-  PIXEL_FORMAT_XBGR = 28,  // 24bpp RGB, 1 plane.
+  PIXEL_FORMAT_ABGR = 27,  // 32bpp RGBA (byte-order), 1 plane.
+  PIXEL_FORMAT_XBGR = 28,  // 24bpp RGBX (byte-order), 1 plane.
 
   PIXEL_FORMAT_P016LE = 29,  // 24bpp NV12, 16 bits per channel
 
diff --git a/net/http/http_auth.cc b/net/http/http_auth.cc
index 7aa3b609..b0e4390 100644
--- a/net/http/http_auth.cc
+++ b/net/http/http_auth.cc
@@ -67,6 +67,7 @@
     std::string* challenge_used) {
   DCHECK(handler);
   DCHECK(challenge_used);
+
   challenge_used->clear();
   HttpAuth::Scheme current_scheme = handler->auth_scheme();
   if (disabled_schemes.find(current_scheme) != disabled_schemes.end())
@@ -78,11 +79,12 @@
   HttpAuth::AuthorizationResult authorization_result =
       HttpAuth::AUTHORIZATION_RESULT_INVALID;
   while (response_headers.EnumerateHeader(&iter, header_name, &challenge)) {
-    HttpAuthChallengeTokenizer props(challenge.begin(), challenge.end());
-    if (!base::LowerCaseEqualsASCII(props.scheme(),
-                                    current_scheme_name.c_str()))
+    HttpAuthChallengeTokenizer challenge_tokens(challenge.begin(),
+                                                challenge.end());
+    if (!base::LowerCaseEqualsASCII(challenge_tokens.scheme(),
+                                    current_scheme_name))
       continue;
-    authorization_result = handler->HandleAnotherChallenge(&props);
+    authorization_result = handler->HandleAnotherChallenge(&challenge_tokens);
     if (authorization_result != HttpAuth::AUTHORIZATION_RESULT_INVALID) {
       *challenge_used = challenge;
       return authorization_result;
diff --git a/services/identity/public/cpp/identity_manager.cc b/services/identity/public/cpp/identity_manager.cc
index 5f01575..789c2d4 100644
--- a/services/identity/public/cpp/identity_manager.cc
+++ b/services/identity/public/cpp/identity_manager.cc
@@ -69,6 +69,11 @@
 }
 
 IdentityManager::~IdentityManager() {
+  account_fetcher_service_->Shutdown();
+  gaia_cookie_manager_service_->Shutdown();
+  token_service_->Shutdown();
+  account_tracker_service_->Shutdown();
+
   signin_manager_->ClearObserver();
   token_service_->RemoveObserver(this);
   token_service_->RemoveDiagnosticsObserver(this);
@@ -410,13 +415,6 @@
   diagnostics_observer_list_.RemoveObserver(observer);
 }
 
-void IdentityManager::Shutdown() {
-  account_fetcher_service_->Shutdown();
-  gaia_cookie_manager_service_->Shutdown();
-  token_service_->Shutdown();
-  account_tracker_service_->Shutdown();
-}
-
 SigninManagerBase* IdentityManager::GetSigninManager() {
   return signin_manager_.get();
 }
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h
index 0d207e6c..cf5ad58 100644
--- a/services/identity/public/cpp/identity_manager.h
+++ b/services/identity/public/cpp/identity_manager.h
@@ -474,9 +474,6 @@
   void AddDiagnosticsObserver(DiagnosticsObserver* observer);
   void RemoveDiagnosticsObserver(DiagnosticsObserver* observer);
 
-  // Shut down IdentityManager and its owned dependencies.
-  void Shutdown();
-
  private:
   // These test helpers need to use some of the private methods below.
   friend CoreAccountInfo SetPrimaryAccount(IdentityManager* identity_manager,
diff --git a/services/identity/public/cpp/identity_manager_unittest.cc b/services/identity/public/cpp/identity_manager_unittest.cc
index bd8b333e..aa3d2e97 100644
--- a/services/identity/public/cpp/identity_manager_unittest.cc
+++ b/services/identity/public/cpp/identity_manager_unittest.cc
@@ -219,7 +219,6 @@
   }
 
   ~IdentityManagerTest() override {
-    identity_manager_->Shutdown();
     signin_client_.Shutdown();
   }
 
@@ -273,9 +272,6 @@
     // trigger a DCHECK because there are still living observers.
     identity_manager_observer_.reset();
     identity_manager_diagnostics_observer_.reset();
-    if (identity_manager_) {
-      identity_manager_->Shutdown();
-    }
     identity_manager_.reset();
 
     auto token_service =
diff --git a/services/identity/public/cpp/identity_test_environment.cc b/services/identity/public/cpp/identity_test_environment.cc
index e88a08e..2923eb2 100644
--- a/services/identity/public/cpp/identity_test_environment.cc
+++ b/services/identity/public/cpp/identity_test_environment.cc
@@ -253,12 +253,6 @@
   // Remove the Observer that IdentityTestEnvironment added during its
   // initialization.
   identity_manager()->RemoveDiagnosticsObserver(this);
-
-  // Call shutdown only if we own the IdentityManager.
-  // It is the owner's responsibility to call Shutdown.
-  if (owned_identity_manager_) {
-    owned_identity_manager_->Shutdown();
-  }
 }
 
 IdentityManager* IdentityTestEnvironment::identity_manager() {
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index 702e927f..a94d526 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -129,6 +129,7 @@
     "resource_response.h",
     "resource_response_info.cc",
     "resource_response_info.h",
+    "resource_type.h",
     "url_loader_completion_status.cc",
     "url_loader_completion_status.h",
     "url_request_mojom_traits.cc",
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
index eff0e42..861cd9e 100644
--- a/services/network/public/cpp/resource_request.h
+++ b/services/network/public/cpp/resource_request.h
@@ -16,6 +16,7 @@
 #include "net/http/http_request_headers.h"
 #include "net/url_request/url_request.h"
 #include "services/network/public/cpp/resource_request_body.h"
+#include "services/network/public/cpp/resource_type.h"
 #include "services/network/public/mojom/cors.mojom-shared.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-shared.h"
@@ -51,7 +52,7 @@
   int load_flags = 0;
   bool allow_credentials = true;
   int plugin_child_id = -1;
-  int resource_type = 0;
+  ResourceType resource_type = {};
   net::RequestPriority priority = net::IDLE;
   int appcache_host_id = 0;
   bool should_reset_appcache = false;
diff --git a/services/network/public/cpp/resource_type.h b/services/network/public/cpp/resource_type.h
new file mode 100644
index 0000000..739679a
--- /dev/null
+++ b/services/network/public/cpp/resource_type.h
@@ -0,0 +1,19 @@
+// Copyright 2019 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 SERVICES_NETWORK_PUBLIC_CPP_RESOURCE_TYPE_H_
+#define SERVICES_NETWORK_PUBLIC_CPP_RESOURCE_TYPE_H_
+
+#include <stdint.h>
+
+namespace network {
+
+// Network service embedders should provide a full definition for ResourceType;
+// network service doesn't use this at all and just passes it through as an
+// opaque value.
+enum class ResourceType : int32_t;
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_PUBLIC_CPP_RESOURCE_TYPE_H_
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc
index c5377f9f..aacdcb91 100644
--- a/services/network/public/cpp/url_request_mojom_traits.cc
+++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -188,7 +188,7 @@
   out->load_flags = data.load_flags();
   out->allow_credentials = data.allow_credentials();
   out->plugin_child_id = data.plugin_child_id();
-  out->resource_type = data.resource_type();
+  out->resource_type = static_cast<network::ResourceType>(data.resource_type());
   out->appcache_host_id = data.appcache_host_id();
   out->should_reset_appcache = data.should_reset_appcache();
   out->is_external_request = data.is_external_request();
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h
index f133b27..359c865 100644
--- a/services/network/public/cpp/url_request_mojom_traits.h
+++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -99,7 +99,7 @@
     return request.plugin_child_id;
   }
   static int32_t resource_type(const network::ResourceRequest& request) {
-    return request.resource_type;
+    return static_cast<int32_t>(request.resource_type);
   }
   static net::RequestPriority priority(
       const network::ResourceRequest& request) {
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
index fa1ff52..071903dd 100644
--- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc
+++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -61,7 +61,7 @@
   original.load_flags = 3;
   original.allow_credentials = true;
   original.plugin_child_id = 5;
-  original.resource_type = 2;
+  original.resource_type = static_cast<ResourceType>(2);
   original.priority = net::IDLE;
   original.appcache_host_id = 3;
   original.should_reset_appcache = true;
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index fa936ce..b86a856 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -392,7 +392,8 @@
                             std::make_unique<UnownedPointer>(this));
 
   is_nocors_corb_excluded_request_ =
-      resource_type_ == factory_params_->corb_excluded_resource_type &&
+      static_cast<int>(resource_type_) ==
+          factory_params_->corb_excluded_resource_type &&
       request.fetch_request_mode == mojom::FetchRequestMode::kNoCors &&
       CrossOriginReadBlocking::ShouldAllowForPlugin(
           factory_params_->process_id);
@@ -773,7 +774,7 @@
   network_service_client_->OnAuthRequired(
       factory_params_->process_id, render_frame_id_, request_id_,
       url_request_->url(), url_request_->site_for_cookies(),
-      first_auth_attempt_, auth_info, resource_type_, head,
+      first_auth_attempt_, auth_info, static_cast<int>(resource_type_), head,
       std::move(auth_challenge_responder));
 
   first_auth_attempt_ = false;
@@ -820,7 +821,7 @@
   }
   network_service_client_->OnSSLCertificateError(
       factory_params_->process_id, render_frame_id_, request_id_,
-      resource_type_, url_request_->url(), ssl_info, fatal,
+      static_cast<int>(resource_type_), url_request_->url(), ssl_info, fatal,
       base::Bind(&URLLoader::OnSSLCertificateErrorResponse,
                  weak_ptr_factory_.GetWeakPtr(), ssl_info));
 }
@@ -1139,7 +1140,7 @@
   report_raw_headers_ = want_raw_headers_ && allow;
 }
 
-uint32_t URLLoader::GetResourceType() const {
+ResourceType URLLoader::GetResourceType() const {
   return resource_type_;
 }
 
@@ -1431,7 +1432,8 @@
   // Tell the real URLLoaderClient that the response has been completed.
   bool should_report_corb_blocking =
       corb_analyzer_->ShouldReportBlockedResponse();
-  if (resource_type_ == factory_params_->corb_detachable_resource_type) {
+  if (static_cast<int>(resource_type_) ==
+      factory_params_->corb_detachable_resource_type) {
     // TODO(lukasza): https://crbug.com/827633#c5: Consider passing net::ERR_OK
     // instead.  net::ERR_ABORTED was chosen for consistency with the old CORB
     // implementation that used to go through DetachableResourceHandler.
@@ -1444,7 +1446,8 @@
   // If the factory is asking to complete requests of this type, then we need to
   // continue processing the response to make sure the network cache is
   // populated.  Otherwise we can cancel the request.
-  if (resource_type_ == factory_params_->corb_detachable_resource_type) {
+  if (static_cast<int>(resource_type_) ==
+      factory_params_->corb_detachable_resource_type) {
     // Discard any remaining callbacks or data by rerouting the pipes to
     // EmptyURLLoaderClient (deleting |self_ptr| when the URL request
     // completes).
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
index 2bf69e8..03164600 100644
--- a/services/network/url_loader.h
+++ b/services/network/url_loader.h
@@ -26,6 +26,7 @@
 #include "services/network/cross_origin_read_blocking.h"
 #include "services/network/initiator_lock_compatibility.h"
 #include "services/network/keepalive_statistics_recorder.h"
+#include "services/network/public/cpp/resource_type.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
@@ -114,9 +115,10 @@
 
   net::LoadState GetLoadStateForTesting() const;
 
+  // TODO(dcheng): These should also be ints.
   uint32_t GetRenderFrameId() const;
   uint32_t GetProcessId() const;
-  uint32_t GetResourceType() const;
+  ResourceType GetResourceType() const;
 
   // Whether this URLLoader should allow sending/setting cookies for requests
   // with |url| and |site_for_cookies|. This decision is based on the options
@@ -230,7 +232,7 @@
   DeleteCallback delete_callback_;
 
   int32_t options_;
-  int resource_type_;
+  ResourceType resource_type_;
   bool is_load_timing_enabled_;
 
   // URLLoaderFactory is guaranteed to outlive URLLoader, so it is safe to
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index e42fc3c..41756d8d 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -2666,7 +2666,7 @@
 // This simulates plugins without universal access, like PNaCl. These make
 // cross-origin fetches with CORS, and we expect CORB to block them.
 TEST_F(URLLoaderTest, CorbEffectiveWithCors) {
-  int kResourceType = 1;
+  ResourceType kResourceType = static_cast<ResourceType>(1);
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/hello.html"));
   request.resource_type = kResourceType;
@@ -2677,7 +2677,7 @@
   mojom::URLLoaderPtr loader;
   std::unique_ptr<URLLoader> url_loader;
   mojom::URLLoaderFactoryParams params;
-  params.corb_excluded_resource_type = kResourceType;
+  params.corb_excluded_resource_type = static_cast<int>(kResourceType);
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
@@ -2702,7 +2702,7 @@
 // This simulates plugins with universal access, like Flash. These can make
 // cross-origin requests that are not subject to CORB.
 TEST_F(URLLoaderTest, CorbExcludedWithNoCors) {
-  int kResourceType = 1;
+  ResourceType kResourceType = static_cast<ResourceType>(1);
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/hello.html"));
   request.resource_type = kResourceType;
@@ -2713,7 +2713,7 @@
   mojom::URLLoaderPtr loader;
   std::unique_ptr<URLLoader> url_loader;
   mojom::URLLoaderFactoryParams params;
-  params.corb_excluded_resource_type = kResourceType;
+  params.corb_excluded_resource_type = static_cast<int>(kResourceType);
   params.process_id = 123;
   CrossOriginReadBlocking::AddExceptionForPlugin(123);
   url_loader = std::make_unique<URLLoader>(
@@ -2742,7 +2742,7 @@
 // process via CrossOriginReadBlocking::AddExceptionForPlugin).  We should still
 // apply CORB in this case.
 TEST_F(URLLoaderTest, CorbEffectiveWithNoCorsWhenNoActualPlugin) {
-  int kResourceType = 1;
+  ResourceType kResourceType = static_cast<ResourceType>(1);
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/hello.html"));
   request.resource_type = kResourceType;
@@ -2753,7 +2753,7 @@
   mojom::URLLoaderPtr loader;
   std::unique_ptr<URLLoader> url_loader;
   mojom::URLLoaderFactoryParams params;
-  params.corb_excluded_resource_type = kResourceType;
+  params.corb_excluded_resource_type = static_cast<int>(kResourceType);
   params.process_id = 234;
   // No call to CrossOriginReadBlocking::AddExceptionForPlugin(123) - this is
   // what we primarily want to cover in this test.
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index f880df7..4debb14 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -56,7 +56,7 @@
   defines = [
     "SK_HAS_PNG_LIBRARY",
     "SK_HAS_WEBP_LIBRARY",
-    "SK_USER_CONFIG_HEADER=\"config/SkUserConfig.h\"",
+    "SK_USER_CONFIG_HEADER=\"" + rebase_path("config/SkUserConfig.h") + "\"",
   ]
 
   if (!is_ios) {
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index ba4e0f5c..168afde3e 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -1148,6 +1148,9 @@
         "test": "junit_unit_tests"
       },
       {
+        "test": "keyboard_accessory_junit_tests"
+      },
+      {
         "test": "media_base_junit_tests"
       },
       {
@@ -21831,6 +21834,9 @@
         "test": "junit_unit_tests"
       },
       {
+        "test": "keyboard_accessory_junit_tests"
+      },
+      {
         "test": "media_base_junit_tests"
       },
       {
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 4098ac15..7cde0fd 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -5869,6 +5869,9 @@
         "test": "junit_unit_tests"
       },
       {
+        "test": "keyboard_accessory_junit_tests"
+      },
+      {
         "test": "media_base_junit_tests"
       },
       {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 2ff759b..5a59532f 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -3916,7 +3916,8 @@
             {
               "os": "Ubuntu-14.04"
             }
-          ]
+          ],
+          "shards": 2
         },
         "test": "content_browsertests"
       },
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 16a634f4..5eaa03f 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1344,6 +1344,10 @@
     "label": "//testing/android/junit:junit_unit_tests",
     "type": "junit_test",
   },
+  "keyboard_accessory_junit_tests": {
+    "label": "//chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests",
+    "type": "junit_test",
+  },
   "keyboard_unittests": {
     "label": "//ui/keyboard:keyboard_unittests",
     "type": "windowed_test_launcher",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py
index eb736f2e..0ccad19 100755
--- a/testing/buildbot/manage.py
+++ b/testing/buildbot/manage.py
@@ -130,6 +130,7 @@
   'content_junit_tests',
   'device_junit_tests',
   'junit_unit_tests',
+  'keyboard_accessory_junit_tests',
   'media_router_e2e_tests',
   'media_router_junit_tests',
   'media_router_perf_tests',
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index f1a5e08..ec81eee 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -421,6 +421,11 @@
           '--disable-features=WebRTC-H264WithOpenH264FFmpeg',
         ],
       },
+      'Linux ASan Tests (sandboxed)': {
+        'swarming': {
+          'shards': 2, # https://crbug.com/955853
+        },
+      },
     },
   },
   'content_shell_crash_test': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index e2b9e82..4110338 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2257,6 +2257,7 @@
       'content_junit_tests': {},
       'device_junit_tests': {},
       'junit_unit_tests': {},
+      'keyboard_accessory_junit_tests': {},
       'media_base_junit_tests': {},
       'media_router_junit_tests': {},
       'net_junit_tests': {},
diff --git a/third_party/blink/perf_tests/websocket/.gitignore b/third_party/blink/perf_tests/websocket/.gitignore
new file mode 100644
index 0000000..b512c09d
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/third_party/blink/perf_tests/websocket/package-lock.json b/third_party/blink/perf_tests/websocket/package-lock.json
new file mode 100644
index 0000000..b2bce12
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/package-lock.json
@@ -0,0 +1,21 @@
+{
+  "name": "ws-speed-test",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+    },
+    "ws": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+      "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    }
+  }
+}
diff --git a/third_party/blink/perf_tests/websocket/package.json b/third_party/blink/perf_tests/websocket/package.json
new file mode 100644
index 0000000..8bc2e39a
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "ws-speed-test",
+  "version": "0.1.0",
+  "dependencies": {
+    "ws": "^5.2.2"
+  }
+}
diff --git a/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html b/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html
new file mode 100644
index 0000000..3641c5c
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../resources/runner.js"></script>
+</head>
+<body>
+<script>
+// To run this perf test, you need to run the web socket server:
+// $ cd third_party/blink/perf_tests/websocket
+// $ npm install
+// $ npm start
+// $ python ../../../../tools/perf/run_benchmark run blink_perf --browser=canary --test-path=websocket\receive-arraybuffer-1MBx100.html
+
+async function runTestCase() {
+  const ws = new WebSocket("ws://127.0.0.1:8001/");
+  ws.binaryType = "arraybuffer";
+  const onOpen = new Promise(resolve => {
+    ws.onopen = () => {
+      PerfTestRunner.addRunTestStartMarker();
+      resolve(PerfTestRunner.now());
+    };
+  });
+  const onClose = new Promise(resolve => {
+    ws.onclose = () => {
+      PerfTestRunner.addRunTestEndMarker();
+      resolve(PerfTestRunner.now());
+    }
+  });
+  const [openTime, closeTime] = await Promise.all([onOpen, onClose]);
+  PerfTestRunner.measureValueAsync(closeTime - openTime);
+}
+
+let isDone = false;
+PerfTestRunner.startMeasureValuesAsync({
+  description: "Measure performance of receiving 1MB array 100 times.",
+  unit: 'ms',
+  done: function () {
+    isDone = true;
+  },
+  run: async function() {
+    while (!isDone) await runTestCase();
+  },
+  iterationCount: 6,
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/perf_tests/websocket/server.js b/third_party/blink/perf_tests/websocket/server.js
new file mode 100644
index 0000000..75caac5
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/server.js
@@ -0,0 +1,18 @@
+const ws = require('ws')
+const ws_server = new ws.Server({ host: '0.0.0.0', port: 8001 });
+const getNow = () => {
+  const date = new Date();
+  return date.toLocaleTimeString() + "." + date.getMilliseconds();
+};
+console.log(getNow() + " WebSocket server started.");
+const arrayBuf = 1000*1000; // 1MB
+const totalIter = 100;
+ws_server.on('connection', function(ws_socket) {
+  console.log(getNow() + " Connection established.");
+  const data = new ArrayBuffer(arrayBuf);
+  for (let i = 0; i < totalIter; i++) {
+    ws_socket.send(data, {binary: true});
+  }
+  ws_socket.close();
+  console.log(getNow() + " Connection closed.");
+});
\ No newline at end of file
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 4ed3289..252b48ad 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -264,7 +264,6 @@
     "platform/web_http_load_info.h",
     "platform/web_icon_sizes_parser.h",
     "platform/web_image.h",
-    "platform/web_image_capture_frame_grabber.h",
     "platform/web_image_generator.h",
     "platform/web_inband_text_track.h",
     "platform/web_inband_text_track_client.h",
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 198d664..8947562 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -110,7 +110,6 @@
 class WebDatabaseObserver;
 class WebDedicatedWorker;
 class WebGraphicsContext3DProvider;
-class WebImageCaptureFrameGrabber;
 class WebLocalFrame;
 class WebMediaCapabilitiesClient;
 class WebMediaPlayer;
@@ -654,11 +653,6 @@
       WebMediaPlayer*,
       scoped_refptr<base::SingleThreadTaskRunner>) {}
 
-  // Creates a WebImageCaptureFrameGrabber to take a snapshot of a Video Tracks.
-  // May return null if the functionality is not available.
-  virtual std::unique_ptr<WebImageCaptureFrameGrabber>
-  CreateImageCaptureFrameGrabber();
-
   // Returns the most optimistic view of the capabilities of the system for
   // sending or receiving media of the given kind ("audio" or "video").
   virtual std::unique_ptr<webrtc::RtpCapabilities> GetRtpSenderCapabilities(
diff --git a/third_party/blink/public/platform/web_image_capture_frame_grabber.h b/third_party/blink/public/platform/web_image_capture_frame_grabber.h
deleted file mode 100644
index f95108e0..0000000
--- a/third_party/blink/public/platform/web_image_capture_frame_grabber.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 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 THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMAGE_CAPTURE_FRAME_GRABBER_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMAGE_CAPTURE_FRAME_GRABBER_H_
-
-#include <memory>
-
-#include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/platform/web_callbacks.h"
-#include "third_party/blink/public/platform/web_common.h"
-#include "third_party/skia/include/core/SkRefCnt.h"
-
-class SkImage;
-
-namespace blink {
-
-class WebMediaStreamTrack;
-
-using WebImageCaptureGrabFrameCallbacks = WebCallbacks<sk_sp<SkImage>, void>;
-
-// Platform interface of an ImageCapture class for GrabFrame() calls.
-class WebImageCaptureFrameGrabber {
- public:
-  virtual ~WebImageCaptureFrameGrabber() = default;
-
-  virtual void GrabFrame(
-      WebMediaStreamTrack*,
-      std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner) = 0;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMAGE_CAPTURE_FRAME_GRABBER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
index cfa7e4e..0b6fd06 100644
--- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
@@ -130,6 +130,13 @@
                                      script_state_->GetContext());
   }
 
+  {
+    ScriptState::Scope scope(script_state_);
+    // This detaches v8::MicrotaskQueue pointer from v8::Context, so that we can
+    // destroy EventLoop safely.
+    script_state_->GetContext()->DetachGlobal();
+  }
+
   script_state_->DisposePerContextData();
   script_state_->DissociateContext();
 }
diff --git a/third_party/blink/renderer/core/animation/length_list_property_functions.cc b/third_party/blink/renderer/core/animation/length_list_property_functions.cc
index 8f0e68e..2a21804 100644
--- a/third_party/blink/renderer/core/animation/length_list_property_functions.cc
+++ b/third_party/blink/renderer/core/animation/length_list_property_functions.cc
@@ -135,7 +135,7 @@
   switch (property.PropertyID()) {
     case CSSPropertyID::kStrokeDasharray: {
       if (style.StrokeDashArray())
-        result.AppendVector(style.StrokeDashArray()->GetVector());
+        result.AppendVector(style.StrokeDashArray()->data);
       return true;
     }
 
@@ -205,10 +205,9 @@
                                                 Vector<Length>&& length_list) {
   switch (property.PropertyID()) {
     case CSSPropertyID::kStrokeDasharray:
-      style.SetStrokeDashArray(
-          length_list.IsEmpty()
-              ? nullptr
-              : RefVector<Length>::Create(std::move(length_list)));
+      style.SetStrokeDashArray(length_list.IsEmpty()
+                                   ? nullptr
+                                   : new SVGDashArray(std::move(length_list)));
       return;
 
     case CSSPropertyID::kObjectPosition:
diff --git a/third_party/blink/renderer/core/clipboard/data_object_item.cc b/third_party/blink/renderer/core/clipboard/data_object_item.cc
index ff792028..432afd272 100644
--- a/third_party/blink/renderer/core/clipboard/data_object_item.cc
+++ b/third_party/blink/renderer/core/clipboard/data_object_item.cc
@@ -135,8 +135,7 @@
 
   DCHECK_EQ(source_, kClipboardSource);
   if (GetType() == kMimeTypeImagePng) {
-    SkBitmap image = SystemClipboard::GetInstance().ReadImage(
-        mojom::ClipboardBuffer::kStandard);
+    SkBitmap image = SystemClipboard::GetInstance().ReadImage();
     std::vector<unsigned char> png_data;
     if (gfx::PNGCodec::FastEncodeBGRASkBitmap(image, false, &png_data)) {
       auto data = std::make_unique<BlobData>();
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.cc b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
index d567e47b..88aba4b 100644
--- a/third_party/blink/renderer/core/clipboard/system_clipboard.cc
+++ b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
@@ -88,14 +88,8 @@
 }
 
 String SystemClipboard::ReadPlainText() {
-  return ReadPlainText(buffer_);
-}
-
-String SystemClipboard::ReadPlainText(mojom::ClipboardBuffer buffer) {
-  if (!IsValidBufferType(buffer))
-    return String();
   String text;
-  clipboard_->ReadText(buffer, &text);
+  clipboard_->ReadText(mojom::ClipboardBuffer::kStandard, &text);
   return text;
 }
 
@@ -152,10 +146,9 @@
   return rtf;
 }
 
-SkBitmap SystemClipboard::ReadImage(mojom::ClipboardBuffer buffer) {
+SkBitmap SystemClipboard::ReadImage() {
   SkBitmap image;
-  if (IsValidBufferType(buffer))
-    clipboard_->ReadImage(buffer, &image);
+  clipboard_->ReadImage(mojom::ClipboardBuffer::kStandard, &image);
   return image;
 }
 
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.h b/third_party/blink/renderer/core/clipboard/system_clipboard.h
index bb48891..cf9f481 100644
--- a/third_party/blink/renderer/core/clipboard/system_clipboard.h
+++ b/third_party/blink/renderer/core/clipboard/system_clipboard.h
@@ -36,7 +36,6 @@
   Vector<String> ReadAvailableTypes();
 
   String ReadPlainText();
-  String ReadPlainText(mojom::ClipboardBuffer buffer);
   void WritePlainText(const String&, SmartReplaceOption = kCannotSmartReplace);
 
   // If no data is read, an empty string will be returned and all out parameters
@@ -53,7 +52,7 @@
 
   String ReadRTF();
 
-  SkBitmap ReadImage(mojom::ClipboardBuffer);
+  SkBitmap ReadImage();
 
   // Write the image and its associated tag (bookmark/HTML types).
   void WriteImageWithTag(Image*, const KURL&, const String& title);
diff --git a/third_party/blink/renderer/core/css/css_image_generator_value.cc b/third_party/blink/renderer/core/css/css_image_generator_value.cc
index 2c0580a..c2227e8 100644
--- a/third_party/blink/renderer/core/css/css_image_generator_value.cc
+++ b/third_party/blink/renderer/core/css/css_image_generator_value.cc
@@ -45,33 +45,26 @@
   GeneratedImageMap::const_iterator image_iter = images_.find(size);
   if (image_iter == images_.end())
     return nullptr;
-  return image_iter->second.get();
+  return image_iter->value.get();
 }
 
 void GeneratedImageCache::PutImage(const FloatSize& size,
                                    scoped_refptr<Image> image) {
   DCHECK(!size.IsEmpty());
-  images_.insert(
-      std::pair<FloatSize, scoped_refptr<Image>>(size, std::move(image)));
+  images_.insert(size, std::move(image));
 }
 
 void GeneratedImageCache::AddSize(const FloatSize& size) {
   DCHECK(!size.IsEmpty());
-  ImageSizeCountMap::iterator size_entry = sizes_.find(size);
-  if (size_entry == sizes_.end())
-    sizes_.insert(std::pair<FloatSize, unsigned>(size, 1));
-  else
-    size_entry->second++;
+  sizes_.insert(size);
 }
 
 void GeneratedImageCache::RemoveSize(const FloatSize& size) {
   DCHECK(!size.IsEmpty());
   SECURITY_DCHECK(sizes_.find(size) != sizes_.end());
-  unsigned& count = sizes_[size];
-  count--;
-  if (count == 0) {
+  bool fully_erased = sizes_.erase(size);
+  if (fully_erased) {
     DCHECK(images_.find(size) != images_.end());
-    sizes_.erase(sizes_.find(size));
     images_.erase(images_.find(size));
   }
 }
diff --git a/third_party/blink/renderer/core/css/css_image_generator_value.h b/third_party/blink/renderer/core/css/css_image_generator_value.h
index a4eba49..55597af 100644
--- a/third_party/blink/renderer/core/css/css_image_generator_value.h
+++ b/third_party/blink/renderer/core/css/css_image_generator_value.h
@@ -43,24 +43,11 @@
 class ComputedStyle;
 class ImageResourceObserver;
 
-struct FloatSizeCompare {
-  bool operator()(const FloatSize& lhs, const FloatSize& rhs) const {
-    if (lhs.Width() < rhs.Width())
-      return true;
-    if (lhs.Width() > rhs.Width())
-      return false;
-    return lhs.Height() < rhs.Height();
-  }
-};
-
-// Use std::map because the WTF versions require a hashing function, while
-// the stl maps require a weak comparison operator that can be defined for
-// FloatSize. These maps do not contain many objects because we do not expect
-// any particular CSSGeneratedImageValue to have clients at many different
+// These maps do not contain many objects because we do not expect any
+// particular CSSGeneratedImageValue to have clients at many different
 // sizes at any given time.
-using ImageSizeCountMap = std::map<FloatSize, unsigned, FloatSizeCompare>;
-using GeneratedImageMap =
-    std::map<FloatSize, scoped_refptr<Image>, FloatSizeCompare>;
+using ImageSizeCountMap = HashCountedSet<FloatSize>;
+using GeneratedImageMap = HashMap<FloatSize, scoped_refptr<Image>>;
 
 class GeneratedImageCache {
   DISALLOW_NEW();
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
index d92a9f8..3463c419 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -1896,11 +1896,11 @@
 CSSValue* ComputedStyleUtils::StrokeDashArrayToCSSValueList(
     const SVGDashArray& dashes,
     const ComputedStyle& style) {
-  if (dashes.IsEmpty())
+  if (dashes.data.IsEmpty())
     return CSSIdentifierValue::Create(CSSValueID::kNone);
 
   CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (const Length& dash_length : dashes.GetVector()) {
+  for (const Length& dash_length : dashes.data) {
     list->Append(*ZoomAdjustedPixelValueForLength(dash_length, style));
   }
 
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index 44e6585..66d73d2 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -1336,10 +1336,11 @@
   if (!dashes)
     return SVGComputedStyle::InitialStrokeDashArray();
 
-  scoped_refptr<SVGDashArray> array = SVGDashArray::Create();
+  scoped_refptr<SVGDashArray> array = new SVGDashArray();
+
   wtf_size_t length = dashes->length();
   for (wtf_size_t i = 0; i < length; ++i) {
-    array->push_back(
+    array->data.push_back(
         ConvertLength(state, To<CSSPrimitiveValue>(dashes->Item(i))));
   }
 
diff --git a/third_party/blink/renderer/core/frame/mhtml_archive_test.cc b/third_party/blink/renderer/core/frame/mhtml_archive_test.cc
index 03adaec..0a4f0f48 100644
--- a/third_party/blink/renderer/core/frame/mhtml_archive_test.cc
+++ b/third_party/blink/renderer/core/frame/mhtml_archive_test.cc
@@ -43,6 +43,7 @@
 #include "third_party/blink/renderer/platform/testing/url_test_helpers.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"
+#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
 using blink::mojom::MHTMLLoadResult;
@@ -106,39 +107,43 @@
     AddResource("http://www.test.com/ol-dot.png", "image/png", "ol-dot.png");
   }
 
-  std::map<std::string, std::string> ExtractHeaders(LineReader& line_reader) {
+  HashMap<String, String> ExtractHeaders(LineReader& line_reader) {
     // Read the data per line until reaching the empty line.
-    std::map<std::string, std::string> mhtml_headers;
-    std::string line;
+    HashMap<String, String> mhtml_headers;
+    String line;
     line_reader.GetNextLine(&line);
     while (line.length()) {
+      StringBuilder builder;
+      builder.Append(line);
+
       // Peek next line to see if it starts with soft line break. If yes, append
       // to current line.
-      std::string next_line;
+      String next_line;
       while (true) {
         line_reader.GetNextLine(&next_line);
         if (next_line.length() > 1 &&
             (next_line[0] == ' ' || next_line[0] == '\t')) {
-          line += &(next_line.at(1));
+          builder.Append(next_line, 1, next_line.length() - 1);
           continue;
         }
         break;
       }
 
-      std::string::size_type pos = line.find(':');
-      if (pos == std::string::npos)
+      line = builder.ToString();
+      wtf_size_t pos = line.Find(":");
+      if (pos == kNotFound)
         continue;
-      std::string key = line.substr(0, pos);
-      std::string value = line.substr(pos + 2);
-      mhtml_headers.emplace(key, value);
+      String key = line.Substring(0, pos);
+      String value = line.Substring(pos + 2);
+      mhtml_headers.insert(key, value);
 
       line = next_line;
     }
     return mhtml_headers;
   }
 
-  std::map<std::string, std::string> ExtractMHTMLHeaders() {
-    LineReader line_reader(std::string(mhtml_data_.data(), mhtml_data_.size()));
+  HashMap<String, String> ExtractMHTMLHeaders() {
+    LineReader line_reader(String(mhtml_data_.data(), mhtml_data_.size()));
     return ExtractHeaders(line_reader);
   }
 
@@ -220,15 +225,15 @@
   Serialize(ToKURL(kURL), String::FromUTF8(kTitle), "text/html",
             MHTMLArchive::kUseDefaultEncoding);
 
-  std::map<std::string, std::string> mhtml_headers = ExtractMHTMLHeaders();
+  HashMap<String, String> mhtml_headers = ExtractMHTMLHeaders();
 
-  EXPECT_EQ("<Saved by Blink>", mhtml_headers["From"]);
-  EXPECT_FALSE(mhtml_headers["Date"].empty());
+  EXPECT_EQ("<Saved by Blink>", mhtml_headers.find("From")->value);
+  EXPECT_FALSE(mhtml_headers.find("Date")->value.IsEmpty());
   EXPECT_EQ(
       "multipart/related;type=\"text/html\";boundary=\"boundary-example\"",
-      mhtml_headers["Content-Type"]);
-  EXPECT_EQ("abc", mhtml_headers["Subject"]);
-  EXPECT_EQ(kURL, mhtml_headers["Snapshot-Content-Location"]);
+      mhtml_headers.find("Content-Type")->value);
+  EXPECT_EQ("abc", mhtml_headers.find("Subject")->value);
+  EXPECT_EQ(kURL, mhtml_headers.find("Snapshot-Content-Location")->value);
 }
 
 TEST_F(MHTMLArchiveTest,
@@ -239,16 +244,16 @@
   Serialize(ToKURL(kURL), String::FromUTF8(kTitle), "text/html",
             MHTMLArchive::kUseDefaultEncoding);
 
-  std::map<std::string, std::string> mhtml_headers = ExtractMHTMLHeaders();
+  HashMap<String, String> mhtml_headers = ExtractMHTMLHeaders();
 
-  EXPECT_EQ("<Saved by Blink>", mhtml_headers["From"]);
-  EXPECT_FALSE(mhtml_headers["Date"].empty());
+  EXPECT_EQ("<Saved by Blink>", mhtml_headers.find("From")->value);
+  EXPECT_FALSE(mhtml_headers.find("Date")->value.IsEmpty());
   EXPECT_EQ(
       "multipart/related;type=\"text/html\";boundary=\"boundary-example\"",
-      mhtml_headers["Content-Type"]);
+      mhtml_headers.find("Content-Type")->value);
   EXPECT_EQ("=?utf-8?Q?abc=20=09=3D=E2=98=9D=F0=9F=8F=BB?=",
-            mhtml_headers["Subject"]);
-  EXPECT_EQ(kURL, mhtml_headers["Snapshot-Content-Location"]);
+            mhtml_headers.find("Subject")->value);
+  EXPECT_EQ(kURL, mhtml_headers.find("Snapshot-Content-Location")->value);
 }
 
 TEST_F(MHTMLArchiveTest,
@@ -262,21 +267,21 @@
   Serialize(ToKURL(kURL), String::FromUTF8(kTitle), "text/html",
             MHTMLArchive::kUseDefaultEncoding);
 
-  std::map<std::string, std::string> mhtml_headers = ExtractMHTMLHeaders();
+  HashMap<String, String> mhtml_headers = ExtractMHTMLHeaders();
 
-  EXPECT_EQ("<Saved by Blink>", mhtml_headers["From"]);
-  EXPECT_FALSE(mhtml_headers["Date"].empty());
+  EXPECT_EQ("<Saved by Blink>", mhtml_headers.find("From")->value);
+  EXPECT_FALSE(mhtml_headers.find("Date")->value.IsEmpty());
   EXPECT_EQ(
       "multipart/related;type=\"text/html\";boundary=\"boundary-example\"",
-      mhtml_headers["Content-Type"]);
+      mhtml_headers.find("Content-Type")->value);
   EXPECT_EQ(
       "=?utf-8?Q?012345678901234567890123456789"
       "012345678901234567890123456789012?="
       "=?utf-8?Q?345678901234567890123456789"
       "0123456789=20=09=3D=E2=98=9D=F0=9F?="
       "=?utf-8?Q?=8F=BB?=",
-      mhtml_headers["Subject"]);
-  EXPECT_EQ(kURL, mhtml_headers["Snapshot-Content-Location"]);
+      mhtml_headers.find("Subject")->value);
+  EXPECT_EQ(kURL, mhtml_headers.find("Snapshot-Content-Location")->value);
 }
 
 TEST_F(MHTMLArchiveTest, TestMHTMLPartsWithBinaryEncoding) {
@@ -287,20 +292,19 @@
 
   // Read the MHTML data line per line and do some pseudo-parsing to make sure
   // the right encoding is used for the different sections.
-  LineReader line_reader(std::string(mhtml_data().data(), mhtml_data().size()));
+  LineReader line_reader(String(mhtml_data().data(), mhtml_data().size()));
   int part_count = 0;
-  std::string line, last_line;
+  String line, last_line;
   while (line_reader.GetNextLine(&line)) {
     last_line = line;
     if (line != kEndOfPartBoundary)
       continue;
     part_count++;
 
-    std::map<std::string, std::string> part_headers =
-        ExtractHeaders(line_reader);
-    EXPECT_FALSE(part_headers["Content-Type"].empty());
-    EXPECT_EQ("binary", part_headers["Content-Transfer-Encoding"]);
-    EXPECT_FALSE(part_headers["Content-Location"].empty());
+    HashMap<String, String> part_headers = ExtractHeaders(line_reader);
+    EXPECT_FALSE(part_headers.find("Content-Type")->value.IsEmpty());
+    EXPECT_EQ("binary", part_headers.find("Content-Transfer-Encoding")->value);
+    EXPECT_FALSE(part_headers.find("Content-Location")->value.IsEmpty());
   }
   EXPECT_EQ(12, part_count);
 
@@ -316,27 +320,26 @@
 
   // Read the MHTML data line per line and do some pseudo-parsing to make sure
   // the right encoding is used for the different sections.
-  LineReader line_reader(std::string(mhtml_data().data(), mhtml_data().size()));
+  LineReader line_reader(String(mhtml_data().data(), mhtml_data().size()));
   int part_count = 0;
-  std::string line, last_line;
+  String line, last_line;
   while (line_reader.GetNextLine(&line)) {
     last_line = line;
     if (line != kEndOfPartBoundary)
       continue;
     part_count++;
 
-    std::map<std::string, std::string> part_headers =
-        ExtractHeaders(line_reader);
+    HashMap<String, String> part_headers = ExtractHeaders(line_reader);
 
-    std::string content_type = part_headers["Content-Type"];
-    EXPECT_FALSE(content_type.empty());
+    String content_type = part_headers.find("Content-Type")->value;
+    EXPECT_FALSE(content_type.IsEmpty());
 
-    std::string encoding = part_headers["Content-Transfer-Encoding"];
-    EXPECT_FALSE(encoding.empty());
+    String encoding = part_headers.find("Content-Transfer-Encoding")->value;
+    EXPECT_FALSE(encoding.IsEmpty());
 
-    if (content_type.compare(0, 5, "text/") == 0)
+    if (content_type.StartsWith("text/"))
       EXPECT_EQ("quoted-printable", encoding);
-    else if (content_type.compare(0, 6, "image/") == 0)
+    else if (content_type.StartsWith("image/"))
       EXPECT_EQ("base64", encoding);
     else
       FAIL() << "Unexpected Content-Type: " << content_type;
@@ -384,9 +387,8 @@
             MHTMLArchive::kUseDefaultEncoding);
   // The serialization process should have added a date header corresponding to
   // mhtml_date().
-  std::map<std::string, std::string> mhtml_headers = ExtractMHTMLHeaders();
-  ASSERT_EQ(mhtml_date_header(),
-            String::FromUTF8(mhtml_headers["Date"].c_str()));
+  HashMap<String, String> mhtml_headers = ExtractMHTMLHeaders();
+  ASSERT_EQ(mhtml_date_header(), mhtml_headers.find("Date")->value);
 
   scoped_refptr<SharedBuffer> data =
       SharedBuffer::Create(mhtml_data().data(), mhtml_data().size());
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
index 5f55f0d..64ffadd 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -108,7 +108,7 @@
   if (is_dirty_)
     SetInnerEditorValue(value());
   else
-    SetNonDirtyValue(defaultValue());
+    SetNonDirtyValue(defaultValue(), TextControlSetValueSelection::kClamp);
 }
 
 bool HTMLTextAreaElement::IsPresentationAttribute(
@@ -231,7 +231,8 @@
 }
 
 void HTMLTextAreaElement::ResetImpl() {
-  SetNonDirtyValue(defaultValue());
+  SetNonDirtyValue(defaultValue(),
+                   TextControlSetValueSelection::kSetSelectionToEnd);
 }
 
 bool HTMLTextAreaElement::HasCustomFocusLogic() const {
@@ -386,9 +387,10 @@
   is_dirty_ = true;
 }
 
-void HTMLTextAreaElement::SetNonDirtyValue(const String& value) {
-  SetValueCommon(value, TextFieldEventBehavior::kDispatchNoEvent,
-                 TextControlSetValueSelection::kSetSelectionToEnd);
+void HTMLTextAreaElement::SetNonDirtyValue(
+    const String& value,
+    TextControlSetValueSelection selection) {
+  SetValueCommon(value, TextFieldEventBehavior::kDispatchNoEvent, selection);
   is_dirty_ = false;
 }
 
@@ -411,6 +413,13 @@
   if (normalized_value == value())
     return;
 
+  // selectionStart and selectionEnd values can be changed by
+  // SetInnerEditorValue(). We need to get them before SetInnerEditorValue() to
+  // clamp them later in a case of kClamp.
+  const bool is_clamp = selection == TextControlSetValueSelection::kClamp;
+  const unsigned selection_start = is_clamp ? selectionStart() : 0;
+  const unsigned selection_end = is_clamp ? selectionEnd() : 0;
+
   if (event_behavior != TextFieldEventBehavior::kDispatchNoEvent)
     SetValueBeforeFirstUserEditIfNotSet();
   value_ = normalized_value;
@@ -429,6 +438,10 @@
     // Set the caret to the end of the text value except for initialize.
     unsigned end_of_string = value_.length();
     SetSelectionRange(end_of_string, end_of_string);
+  } else if (is_clamp) {
+    const unsigned end_of_string = value_.length();
+    SetSelectionRange(std::min(end_of_string, selection_start),
+                      std::min(end_of_string, selection_end));
   }
 
   NotifyFormStateChanged();
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.h b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
index 0fcf7d0..88c44967 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
@@ -80,7 +80,7 @@
   void HandleBeforeTextInsertedEvent(BeforeTextInsertedEvent*) const;
   static String SanitizeUserInputValue(const String&, unsigned max_length);
   void UpdateValue();
-  void SetNonDirtyValue(const String&);
+  void SetNonDirtyValue(const String&, TextControlSetValueSelection);
   void SetValueCommon(const String&,
                       TextFieldEventBehavior,
                       TextControlSetValueSelection);
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.h b/third_party/blink/renderer/core/html/forms/text_control_element.h
index be97e12..97833d5 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.h
@@ -50,6 +50,7 @@
 
 enum class TextControlSetValueSelection {
   kSetSelectionToEnd,
+  kClamp,
   kDoNotSet,
 };
 
diff --git a/third_party/blink/renderer/core/inspector/OWNERS b/third_party/blink/renderer/core/inspector/OWNERS
index 690019e..049d297f 100644
--- a/third_party/blink/renderer/core/inspector/OWNERS
+++ b/third_party/blink/renderer/core/inspector/OWNERS
@@ -7,6 +7,7 @@
 # ensure backwards compatibility and committment to maintain.
 per-file browser_protocol.pdl=set noparent
 per-file browser_protocol.pdl=dgozman@chromium.org
+per-file browser_protocol.pdl=caseq@chromium.org
 per-file browser_protocol.pdl=pfeldman@chromium.org
 
 # COMPONENT: Platform>DevTools
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc
index 93a6b90..a551f31c 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc
@@ -133,7 +133,7 @@
 
 bool LayoutSVGEllipse::HasContinuousStroke() const {
   const SVGComputedStyle& svg_style = StyleRef().SvgStyle();
-  return svg_style.StrokeDashArray()->IsEmpty();
+  return svg_style.StrokeDashArray()->data.IsEmpty();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_rect.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_rect.cc
index f895585..f65bb23 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_rect.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_rect.cc
@@ -134,7 +134,7 @@
   // miterlimits, the join style used might not be correct (e.g. a miterlimit
   // of 1.4142135 should result in bevel joins, but may be drawn using miter
   // joins).
-  return svg_style.StrokeDashArray()->IsEmpty() &&
+  return svg_style.StrokeDashArray()->data.IsEmpty() &&
          svg_style.JoinStyle() == kMiterJoin &&
          svg_style.StrokeMiterLimit() >= 1.5;
 }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
index 7244b3e..11d4e5d 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
@@ -82,7 +82,7 @@
 }
 
 float LayoutSVGShape::DashScaleFactor() const {
-  if (!StyleRef().SvgStyle().StrokeDashArray()->size())
+  if (StyleRef().SvgStyle().StrokeDashArray()->data.IsEmpty())
     return 1;
   return ToSVGGeometryElement(*GetElement()).PathLengthScaleFactor();
 }
diff --git a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
index 83b72dc..31b2c4b 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
@@ -463,7 +463,7 @@
     const ComputedStyle& style,
     const SVGLengthContext& length_context) {
   DashArray dash_array;
-  for (const Length& dash_length : svg_dash_array.GetVector())
+  for (const Length& dash_length : svg_dash_array.data)
     dash_array.push_back(length_context.ValueForLength(dash_length, style));
   return dash_array;
 }
diff --git a/third_party/blink/renderer/core/style/svg_computed_style.cc b/third_party/blink/renderer/core/style/svg_computed_style.cc
index 0f6fd67..0f6cf0fe 100644
--- a/third_party/blink/renderer/core/style/svg_computed_style.cc
+++ b/third_party/blink/renderer/core/style/svg_computed_style.cc
@@ -110,7 +110,7 @@
 }
 
 scoped_refptr<SVGDashArray> SVGComputedStyle::InitialStrokeDashArray() {
-  DEFINE_STATIC_REF(SVGDashArray, initial_dash_array, SVGDashArray::Create());
+  DEFINE_STATIC_REF(SVGDashArray, initial_dash_array, new SVGDashArray);
   return initial_dash_array;
 }
 
@@ -177,7 +177,8 @@
     // If the dash array is toggled from/to 'none' we need to relayout, because
     // some shapes will decide on which codepath to use based on the presence
     // of a dash array.
-    if (stroke->dash_array->IsEmpty() != other.stroke->dash_array->IsEmpty())
+    if (stroke->dash_array->data.IsEmpty() !=
+        other.stroke->dash_array->data.IsEmpty())
       return true;
   }
 
@@ -199,7 +200,7 @@
     // include it when computing (approximating) the stroke boundaries during
     // layout.
     if (stroke->dash_offset != other.stroke->dash_offset ||
-        *stroke->dash_array != *other.stroke->dash_array)
+        stroke->dash_array->data != other.stroke->dash_array->data)
       return true;
   }
 
diff --git a/third_party/blink/renderer/core/style/svg_computed_style.h b/third_party/blink/renderer/core/style/svg_computed_style.h
index b2bbff7..443dd625 100644
--- a/third_party/blink/renderer/core/style/svg_computed_style.h
+++ b/third_party/blink/renderer/core/style/svg_computed_style.h
@@ -211,7 +211,7 @@
   }
 
   void SetStrokeDashArray(scoped_refptr<SVGDashArray> dash_array) {
-    if (*stroke->dash_array != *dash_array)
+    if (stroke->dash_array->data != dash_array->data)
       stroke.Access()->dash_array = std::move(dash_array);
   }
 
diff --git a/third_party/blink/renderer/core/style/svg_computed_style_defs.cc b/third_party/blink/renderer/core/style/svg_computed_style_defs.cc
index c6d8ee1e..fb02ba1 100644
--- a/third_party/blink/renderer/core/style/svg_computed_style_defs.cc
+++ b/third_party/blink/renderer/core/style/svg_computed_style_defs.cc
@@ -88,7 +88,7 @@
 bool StyleStrokeData::operator==(const StyleStrokeData& other) const {
   return width == other.width && opacity == other.opacity &&
          miter_limit == other.miter_limit && dash_offset == other.dash_offset &&
-         *dash_array == *other.dash_array && paint == other.paint &&
+         dash_array->data == other.dash_array->data && paint == other.paint &&
          visited_link_paint == other.visited_link_paint;
 }
 
diff --git a/third_party/blink/renderer/core/style/svg_computed_style_defs.h b/third_party/blink/renderer/core/style/svg_computed_style_defs.h
index ed347b21..e0c4c48 100644
--- a/third_party/blink/renderer/core/style/svg_computed_style_defs.h
+++ b/third_party/blink/renderer/core/style/svg_computed_style_defs.h
@@ -36,14 +36,13 @@
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/ref_counted.h"
-#include "third_party/blink/renderer/platform/wtf/ref_vector.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
 
 class StyleSVGResource;
 
-typedef RefVector<Length> SVGDashArray;
+typedef base::RefCountedData<WTF::Vector<Length>> SVGDashArray;
 
 enum SVGPaintType {
   SVG_PAINTTYPE_RGBCOLOR,
diff --git a/third_party/blink/renderer/core/style/svg_computed_style_test.cc b/third_party/blink/renderer/core/style/svg_computed_style_test.cc
index 4df3aa4..66c86cf 100644
--- a/third_party/blink/renderer/core/style/svg_computed_style_test.cc
+++ b/third_party/blink/renderer/core/style/svg_computed_style_test.cc
@@ -11,12 +11,12 @@
 namespace blink {
 
 // Ensures RefPtr values are compared by their values, not by pointers.
-#define TEST_STYLE_REFPTR_VALUE_NO_DIFF(type, fieldName)               \
+#define TEST_STYLE_REFCOUNTED_VALUE_NO_DIFF(type, fieldName)           \
   {                                                                    \
     scoped_refptr<SVGComputedStyle> svg1 = SVGComputedStyle::Create(); \
     scoped_refptr<SVGComputedStyle> svg2 = SVGComputedStyle::Create(); \
-    scoped_refptr<type> value1 = type::Create();                       \
-    scoped_refptr<type> value2 = value1->Copy();                       \
+    scoped_refptr<type> value1 = new type();                           \
+    scoped_refptr<type> value2 = new type(value1->data);               \
     svg1->Set##fieldName(value1);                                      \
     svg2->Set##fieldName(value2);                                      \
     EXPECT_FALSE(svg1->Diff(*svg2).HasDifference());                   \
@@ -39,7 +39,7 @@
   TEST_STYLE_VALUE_NO_DIFF(float, StrokeMiterLimit);
   TEST_STYLE_VALUE_NO_DIFF(UnzoomedLength, StrokeWidth);
   TEST_STYLE_VALUE_NO_DIFF(Length, StrokeDashOffset);
-  TEST_STYLE_REFPTR_VALUE_NO_DIFF(SVGDashArray, StrokeDashArray);
+  TEST_STYLE_REFCOUNTED_VALUE_NO_DIFF(SVGDashArray, StrokeDashArray);
 
   TEST_STYLE_VALUE_NO_DIFF(SVGPaint, StrokePaint);
   {
diff --git a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
index 0c229b5..689f7f8 100644
--- a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
@@ -56,7 +56,7 @@
 }
 }
 
-inline SVGAnimateMotionElement::SVGAnimateMotionElement(Document& document)
+SVGAnimateMotionElement::SVGAnimateMotionElement(Document& document)
     : SVGAnimationElement(svg_names::kAnimateMotionTag, document),
       has_to_point_at_end_of_duration_(false) {
   SetCalcMode(kCalcModePaced);
diff --git a/third_party/blink/renderer/core/svg/svg_animate_transform_element.cc b/third_party/blink/renderer/core/svg/svg_animate_transform_element.cc
index 0e7523e..cd853e05 100644
--- a/third_party/blink/renderer/core/svg/svg_animate_transform_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_animate_transform_element.cc
@@ -28,8 +28,7 @@
 
 namespace blink {
 
-inline SVGAnimateTransformElement::SVGAnimateTransformElement(
-    Document& document)
+SVGAnimateTransformElement::SVGAnimateTransformElement(Document& document)
     : SVGAnimateElement(svg_names::kAnimateTransformTag, document),
       transform_type_(SVGTransformType::kUnknown) {}
 
diff --git a/third_party/blink/renderer/core/svg/svg_circle_element.cc b/third_party/blink/renderer/core/svg/svg_circle_element.cc
index 1bfacfd..c75cf02 100644
--- a/third_party/blink/renderer/core/svg/svg_circle_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_circle_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGCircleElement::SVGCircleElement(Document& document)
+SVGCircleElement::SVGCircleElement(Document& document)
     : SVGGeometryElement(svg_names::kCircleTag, document),
       cx_(MakeGarbageCollected<SVGAnimatedLength>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_clip_path_element.cc b/third_party/blink/renderer/core/svg/svg_clip_path_element.cc
index a58d62c..ac4060b 100644
--- a/third_party/blink/renderer/core/svg/svg_clip_path_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_clip_path_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGClipPathElement::SVGClipPathElement(Document& document)
+SVGClipPathElement::SVGClipPathElement(Document& document)
     : SVGGraphicsElement(svg_names::kClipPathTag, document),
       clip_path_units_(MakeGarbageCollected<
                        SVGAnimatedEnumeration<SVGUnitTypes::SVGUnitType>>(
diff --git a/third_party/blink/renderer/core/svg/svg_defs_element.cc b/third_party/blink/renderer/core/svg/svg_defs_element.cc
index eca0a78..91cbff54 100644
--- a/third_party/blink/renderer/core/svg/svg_defs_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_defs_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGDefsElement::SVGDefsElement(Document& document)
+SVGDefsElement::SVGDefsElement(Document& document)
     : SVGGraphicsElement(svg_names::kDefsTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGDefsElement)
diff --git a/third_party/blink/renderer/core/svg/svg_desc_element.cc b/third_party/blink/renderer/core/svg/svg_desc_element.cc
index 64364cd..5d0f2eb 100644
--- a/third_party/blink/renderer/core/svg/svg_desc_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_desc_element.cc
@@ -24,7 +24,7 @@
 
 namespace blink {
 
-inline SVGDescElement::SVGDescElement(Document& document)
+SVGDescElement::SVGDescElement(Document& document)
     : SVGElement(svg_names::kDescTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGDescElement)
diff --git a/third_party/blink/renderer/core/svg/svg_discard_element.cc b/third_party/blink/renderer/core/svg/svg_discard_element.cc
index 2545693..a56d937 100644
--- a/third_party/blink/renderer/core/svg/svg_discard_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_discard_element.cc
@@ -34,9 +34,8 @@
 
 namespace blink {
 
-inline SVGDiscardElement::SVGDiscardElement(Document& document)
-    : SVGSMILElement(svg_names::kDiscardTag, document) {
-}
+SVGDiscardElement::SVGDiscardElement(Document& document)
+    : SVGSMILElement(svg_names::kDiscardTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGDiscardElement)
 
diff --git a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
index e1354c2..0fa63d2 100644
--- a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGEllipseElement::SVGEllipseElement(Document& document)
+SVGEllipseElement::SVGEllipseElement(Document& document)
     : SVGGeometryElement(svg_names::kEllipseTag, document),
       cx_(MakeGarbageCollected<SVGAnimatedLength>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_fe_blend_element.cc b/third_party/blink/renderer/core/svg/svg_fe_blend_element.cc
index 7bff340..3c48b7b4 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_blend_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_blend_element.cc
@@ -81,7 +81,7 @@
   return entries;
 }
 
-inline SVGFEBlendElement::SVGFEBlendElement(Document& document)
+SVGFEBlendElement::SVGFEBlendElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEBlendTag, document),
       in1_(MakeGarbageCollected<SVGAnimatedString>(this, svg_names::kInAttr)),
       in2_(MakeGarbageCollected<SVGAnimatedString>(this, svg_names::kIn2Attr)),
diff --git a/third_party/blink/renderer/core/svg/svg_fe_color_matrix_element.cc b/third_party/blink/renderer/core/svg/svg_fe_color_matrix_element.cc
index 52a29279..a4aec29 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_color_matrix_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_color_matrix_element.cc
@@ -39,7 +39,7 @@
   return entries;
 }
 
-inline SVGFEColorMatrixElement::SVGFEColorMatrixElement(Document& document)
+SVGFEColorMatrixElement::SVGFEColorMatrixElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEColorMatrixTag,
                                            document),
       values_(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_component_transfer_element.cc b/third_party/blink/renderer/core/svg/svg_fe_component_transfer_element.cc
index e3822db..db5359e 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_component_transfer_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_component_transfer_element.cc
@@ -32,8 +32,7 @@
 
 namespace blink {
 
-inline SVGFEComponentTransferElement::SVGFEComponentTransferElement(
-    Document& document)
+SVGFEComponentTransferElement::SVGFEComponentTransferElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEComponentTransferTag,
                                            document),
       in1_(MakeGarbageCollected<SVGAnimatedString>(this, svg_names::kInAttr)) {
diff --git a/third_party/blink/renderer/core/svg/svg_fe_composite_element.cc b/third_party/blink/renderer/core/svg/svg_fe_composite_element.cc
index 588dcfda..33d7e05 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_composite_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_composite_element.cc
@@ -43,7 +43,7 @@
   return entries;
 }
 
-inline SVGFECompositeElement::SVGFECompositeElement(Document& document)
+SVGFECompositeElement::SVGFECompositeElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFECompositeTag,
                                            document),
       k1_(MakeGarbageCollected<SVGAnimatedNumber>(this,
diff --git a/third_party/blink/renderer/core/svg/svg_fe_convolve_matrix_element.cc b/third_party/blink/renderer/core/svg/svg_fe_convolve_matrix_element.cc
index 812cac6..48580c7 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_convolve_matrix_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_convolve_matrix_element.cc
@@ -75,8 +75,7 @@
   return parse_status;
 }
 
-inline SVGFEConvolveMatrixElement::SVGFEConvolveMatrixElement(
-    Document& document)
+SVGFEConvolveMatrixElement::SVGFEConvolveMatrixElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEConvolveMatrixTag,
                                            document),
       bias_(MakeGarbageCollected<SVGAnimatedNumber>(this,
diff --git a/third_party/blink/renderer/core/svg/svg_fe_diffuse_lighting_element.cc b/third_party/blink/renderer/core/svg/svg_fe_diffuse_lighting_element.cc
index 5a00420b..4e8d66ae 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_diffuse_lighting_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_diffuse_lighting_element.cc
@@ -28,8 +28,7 @@
 
 namespace blink {
 
-inline SVGFEDiffuseLightingElement::SVGFEDiffuseLightingElement(
-    Document& document)
+SVGFEDiffuseLightingElement::SVGFEDiffuseLightingElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEDiffuseLightingTag,
                                            document),
       diffuse_constant_(MakeGarbageCollected<SVGAnimatedNumber>(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_displacement_map_element.cc b/third_party/blink/renderer/core/svg/svg_fe_displacement_map_element.cc
index 4abbe24..76b9626 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_displacement_map_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_displacement_map_element.cc
@@ -35,8 +35,7 @@
   return entries;
 }
 
-inline SVGFEDisplacementMapElement::SVGFEDisplacementMapElement(
-    Document& document)
+SVGFEDisplacementMapElement::SVGFEDisplacementMapElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEDisplacementMapTag,
                                            document),
       scale_(MakeGarbageCollected<SVGAnimatedNumber>(this,
diff --git a/third_party/blink/renderer/core/svg/svg_fe_distant_light_element.cc b/third_party/blink/renderer/core/svg/svg_fe_distant_light_element.cc
index f6b135f..d477634 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_distant_light_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_distant_light_element.cc
@@ -24,7 +24,7 @@
 
 namespace blink {
 
-inline SVGFEDistantLightElement::SVGFEDistantLightElement(Document& document)
+SVGFEDistantLightElement::SVGFEDistantLightElement(Document& document)
     : SVGFELightElement(svg_names::kFEDistantLightTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEDistantLightElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_drop_shadow_element.cc b/third_party/blink/renderer/core/svg/svg_fe_drop_shadow_element.cc
index 98eb6468..d4290f5d 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_drop_shadow_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_drop_shadow_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGFEDropShadowElement::SVGFEDropShadowElement(Document& document)
+SVGFEDropShadowElement::SVGFEDropShadowElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEDropShadowTag,
                                            document),
       dx_(MakeGarbageCollected<SVGAnimatedNumber>(this, svg_names::kDxAttr, 2)),
diff --git a/third_party/blink/renderer/core/svg/svg_fe_flood_element.cc b/third_party/blink/renderer/core/svg/svg_fe_flood_element.cc
index d0ae516..e9bbec68 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_flood_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_flood_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGFEFloodElement::SVGFEFloodElement(Document& document)
+SVGFEFloodElement::SVGFEFloodElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEFloodTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEFloodElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_func_a_element.cc b/third_party/blink/renderer/core/svg/svg_fe_func_a_element.cc
index c7b40ee..fea7438 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_func_a_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_func_a_element.cc
@@ -22,7 +22,7 @@
 
 namespace blink {
 
-inline SVGFEFuncAElement::SVGFEFuncAElement(Document& document)
+SVGFEFuncAElement::SVGFEFuncAElement(Document& document)
     : SVGComponentTransferFunctionElement(svg_names::kFEFuncATag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEFuncAElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_func_b_element.cc b/third_party/blink/renderer/core/svg/svg_fe_func_b_element.cc
index 00f0835..59fe60b7 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_func_b_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_func_b_element.cc
@@ -22,7 +22,7 @@
 
 namespace blink {
 
-inline SVGFEFuncBElement::SVGFEFuncBElement(Document& document)
+SVGFEFuncBElement::SVGFEFuncBElement(Document& document)
     : SVGComponentTransferFunctionElement(svg_names::kFEFuncBTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEFuncBElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_func_g_element.cc b/third_party/blink/renderer/core/svg/svg_fe_func_g_element.cc
index ab64f16..73abfba 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_func_g_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_func_g_element.cc
@@ -22,7 +22,7 @@
 
 namespace blink {
 
-inline SVGFEFuncGElement::SVGFEFuncGElement(Document& document)
+SVGFEFuncGElement::SVGFEFuncGElement(Document& document)
     : SVGComponentTransferFunctionElement(svg_names::kFEFuncGTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEFuncGElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_func_r_element.cc b/third_party/blink/renderer/core/svg/svg_fe_func_r_element.cc
index 1b3b77b..1dc71766f 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_func_r_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_func_r_element.cc
@@ -22,7 +22,7 @@
 
 namespace blink {
 
-inline SVGFEFuncRElement::SVGFEFuncRElement(Document& document)
+SVGFEFuncRElement::SVGFEFuncRElement(Document& document)
     : SVGComponentTransferFunctionElement(svg_names::kFEFuncRTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEFuncRElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_gaussian_blur_element.cc b/third_party/blink/renderer/core/svg/svg_fe_gaussian_blur_element.cc
index 03942f26..c7d8a05 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_gaussian_blur_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_gaussian_blur_element.cc
@@ -27,7 +27,7 @@
 
 namespace blink {
 
-inline SVGFEGaussianBlurElement::SVGFEGaussianBlurElement(Document& document)
+SVGFEGaussianBlurElement::SVGFEGaussianBlurElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEGaussianBlurTag,
                                            document),
       std_deviation_(MakeGarbageCollected<SVGAnimatedNumberOptionalNumber>(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_image_element.cc b/third_party/blink/renderer/core/svg/svg_fe_image_element.cc
index 7a46fce..34671bd 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_image_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_image_element.cc
@@ -35,7 +35,7 @@
 
 namespace blink {
 
-inline SVGFEImageElement::SVGFEImageElement(Document& document)
+SVGFEImageElement::SVGFEImageElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEImageTag, document),
       SVGURIReference(this),
       preserve_aspect_ratio_(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_merge_element.cc b/third_party/blink/renderer/core/svg/svg_fe_merge_element.cc
index cebb72fc..efe3d4a 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_merge_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_merge_element.cc
@@ -28,7 +28,7 @@
 
 namespace blink {
 
-inline SVGFEMergeElement::SVGFEMergeElement(Document& document)
+SVGFEMergeElement::SVGFEMergeElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEMergeTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEMergeElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_merge_node_element.cc b/third_party/blink/renderer/core/svg/svg_fe_merge_node_element.cc
index af5c0412..d12ae5a9 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_merge_node_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_merge_node_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGFEMergeNodeElement::SVGFEMergeNodeElement(Document& document)
+SVGFEMergeNodeElement::SVGFEMergeNodeElement(Document& document)
     : SVGElement(svg_names::kFEMergeNodeTag, document),
       in1_(MakeGarbageCollected<SVGAnimatedString>(this, svg_names::kInAttr)) {
   AddToPropertyMap(in1_);
diff --git a/third_party/blink/renderer/core/svg/svg_fe_morphology_element.cc b/third_party/blink/renderer/core/svg/svg_fe_morphology_element.cc
index ed7f68a..16c0c5d9 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_morphology_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_morphology_element.cc
@@ -36,7 +36,7 @@
   return entries;
 }
 
-inline SVGFEMorphologyElement::SVGFEMorphologyElement(Document& document)
+SVGFEMorphologyElement::SVGFEMorphologyElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEMorphologyTag,
                                            document),
       radius_(MakeGarbageCollected<SVGAnimatedNumberOptionalNumber>(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_offset_element.cc b/third_party/blink/renderer/core/svg/svg_fe_offset_element.cc
index 3023935..9f7d52e 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_offset_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_offset_element.cc
@@ -27,7 +27,7 @@
 
 namespace blink {
 
-inline SVGFEOffsetElement::SVGFEOffsetElement(Document& document)
+SVGFEOffsetElement::SVGFEOffsetElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFEOffsetTag, document),
       dx_(MakeGarbageCollected<SVGAnimatedNumber>(this,
                                                   svg_names::kDxAttr,
diff --git a/third_party/blink/renderer/core/svg/svg_fe_point_light_element.cc b/third_party/blink/renderer/core/svg/svg_fe_point_light_element.cc
index 4d2d8fef..dea2fc20 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_point_light_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_point_light_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGFEPointLightElement::SVGFEPointLightElement(Document& document)
+SVGFEPointLightElement::SVGFEPointLightElement(Document& document)
     : SVGFELightElement(svg_names::kFEPointLightTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFEPointLightElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_specular_lighting_element.cc b/third_party/blink/renderer/core/svg/svg_fe_specular_lighting_element.cc
index 477a400..018d11d 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_specular_lighting_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_specular_lighting_element.cc
@@ -30,8 +30,7 @@
 
 namespace blink {
 
-inline SVGFESpecularLightingElement::SVGFESpecularLightingElement(
-    Document& document)
+SVGFESpecularLightingElement::SVGFESpecularLightingElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFESpecularLightingTag,
                                            document),
       specular_constant_(MakeGarbageCollected<SVGAnimatedNumber>(
diff --git a/third_party/blink/renderer/core/svg/svg_fe_spot_light_element.cc b/third_party/blink/renderer/core/svg/svg_fe_spot_light_element.cc
index 3d6be82..7af592b 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_spot_light_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_spot_light_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGFESpotLightElement::SVGFESpotLightElement(Document& document)
+SVGFESpotLightElement::SVGFESpotLightElement(Document& document)
     : SVGFELightElement(svg_names::kFESpotLightTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGFESpotLightElement)
diff --git a/third_party/blink/renderer/core/svg/svg_fe_tile_element.cc b/third_party/blink/renderer/core/svg/svg_fe_tile_element.cc
index adf114516..d37599a 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_tile_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_tile_element.cc
@@ -27,7 +27,7 @@
 
 namespace blink {
 
-inline SVGFETileElement::SVGFETileElement(Document& document)
+SVGFETileElement::SVGFETileElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFETileTag, document),
       in1_(MakeGarbageCollected<SVGAnimatedString>(this, svg_names::kInAttr)) {
   AddToPropertyMap(in1_);
diff --git a/third_party/blink/renderer/core/svg/svg_fe_turbulence_element.cc b/third_party/blink/renderer/core/svg/svg_fe_turbulence_element.cc
index daaad82..91566bdd 100644
--- a/third_party/blink/renderer/core/svg/svg_fe_turbulence_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_fe_turbulence_element.cc
@@ -45,7 +45,7 @@
   return entries;
 }
 
-inline SVGFETurbulenceElement::SVGFETurbulenceElement(Document& document)
+SVGFETurbulenceElement::SVGFETurbulenceElement(Document& document)
     : SVGFilterPrimitiveStandardAttributes(svg_names::kFETurbulenceTag,
                                            document),
       base_frequency_(MakeGarbageCollected<SVGAnimatedNumberOptionalNumber>(
diff --git a/third_party/blink/renderer/core/svg/svg_filter_element.cc b/third_party/blink/renderer/core/svg/svg_filter_element.cc
index d7e1ff2..4ca300c 100644
--- a/third_party/blink/renderer/core/svg/svg_filter_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_filter_element.cc
@@ -30,7 +30,7 @@
 
 namespace blink {
 
-inline SVGFilterElement::SVGFilterElement(Document& document)
+SVGFilterElement::SVGFilterElement(Document& document)
     : SVGElement(svg_names::kFilterTag, document),
       SVGURIReference(this),
       // Spec: If the x/y attribute is not specified, the effect is as if a
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
index a49b5eb69..c87dd10 100644
--- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGForeignObjectElement::SVGForeignObjectElement(Document& document)
+SVGForeignObjectElement::SVGForeignObjectElement(Document& document)
     : SVGGraphicsElement(svg_names::kForeignObjectTag, document),
       x_(MakeGarbageCollected<SVGAnimatedLength>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.cc b/third_party/blink/renderer/core/svg/svg_image_element.cc
index 20d1b40..c044634 100644
--- a/third_party/blink/renderer/core/svg/svg_image_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_image_element.cc
@@ -35,7 +35,7 @@
 
 namespace blink {
 
-inline SVGImageElement::SVGImageElement(Document& document)
+SVGImageElement::SVGImageElement(Document& document)
     : SVGGraphicsElement(svg_names::kImageTag, document),
       SVGURIReference(this),
       is_default_overridden_intrinsic_size_(false),
diff --git a/third_party/blink/renderer/core/svg/svg_line_element.cc b/third_party/blink/renderer/core/svg/svg_line_element.cc
index 2b94812..1f86dc25 100644
--- a/third_party/blink/renderer/core/svg/svg_line_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_line_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGLineElement::SVGLineElement(Document& document)
+SVGLineElement::SVGLineElement(Document& document)
     : SVGGeometryElement(svg_names::kLineTag, document),
       x1_(MakeGarbageCollected<SVGAnimatedLength>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
index 4a99dbd8..5c16603 100644
--- a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
@@ -30,7 +30,7 @@
 
 namespace blink {
 
-inline SVGLinearGradientElement::SVGLinearGradientElement(Document& document)
+SVGLinearGradientElement::SVGLinearGradientElement(Document& document)
     : SVGGradientElement(svg_names::kLinearGradientTag, document),
       // Spec: If the x1|y1|y2 attribute is not specified, the effect is as if a
       // value of "0%" were specified.
diff --git a/third_party/blink/renderer/core/svg/svg_marker_element.cc b/third_party/blink/renderer/core/svg/svg_marker_element.cc
index 7f51cac..7066bd7 100644
--- a/third_party/blink/renderer/core/svg/svg_marker_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_marker_element.cc
@@ -40,7 +40,7 @@
   return entries;
 }
 
-inline SVGMarkerElement::SVGMarkerElement(Document& document)
+SVGMarkerElement::SVGMarkerElement(Document& document)
     : SVGElement(svg_names::kMarkerTag, document),
       SVGFitToViewBox(this),
       ref_x_(MakeGarbageCollected<SVGAnimatedLength>(
diff --git a/third_party/blink/renderer/core/svg/svg_mask_element.cc b/third_party/blink/renderer/core/svg/svg_mask_element.cc
index e23ec38..601fd96 100644
--- a/third_party/blink/renderer/core/svg/svg_mask_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_mask_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGMaskElement::SVGMaskElement(Document& document)
+SVGMaskElement::SVGMaskElement(Document& document)
     : SVGElement(svg_names::kMaskTag, document),
       SVGTests(this),
       // Spec: If the x/y attribute is not specified, the effect is as if a
diff --git a/third_party/blink/renderer/core/svg/svg_metadata_element.cc b/third_party/blink/renderer/core/svg/svg_metadata_element.cc
index 0fd9920e1..05cca08 100644
--- a/third_party/blink/renderer/core/svg/svg_metadata_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_metadata_element.cc
@@ -24,7 +24,7 @@
 
 namespace blink {
 
-inline SVGMetadataElement::SVGMetadataElement(Document& document)
+SVGMetadataElement::SVGMetadataElement(Document& document)
     : SVGElement(svg_names::kMetadataTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGMetadataElement)
diff --git a/third_party/blink/renderer/core/svg/svg_mpath_element.cc b/third_party/blink/renderer/core/svg/svg_mpath_element.cc
index b49d09d..932c1ab 100644
--- a/third_party/blink/renderer/core/svg/svg_mpath_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_mpath_element.cc
@@ -27,9 +27,8 @@
 
 namespace blink {
 
-inline SVGMPathElement::SVGMPathElement(Document& document)
-    : SVGElement(svg_names::kMPathTag, document), SVGURIReference(this) {
-}
+SVGMPathElement::SVGMPathElement(Document& document)
+    : SVGElement(svg_names::kMPathTag, document), SVGURIReference(this) {}
 
 void SVGMPathElement::Trace(blink::Visitor* visitor) {
   visitor->Trace(target_id_observer_);
diff --git a/third_party/blink/renderer/core/svg/svg_path_element.cc b/third_party/blink/renderer/core/svg/svg_path_element.cc
index e6009f4..1939e02 100644
--- a/third_party/blink/renderer/core/svg/svg_path_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_path_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGPathElement::SVGPathElement(Document& document)
+SVGPathElement::SVGPathElement(Document& document)
     : SVGGeometryElement(svg_names::kPathTag, document),
       path_(MakeGarbageCollected<SVGAnimatedPath>(this,
                                                   svg_names::kDAttr,
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.cc b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
index 5bebed5..aff9cdf 100644
--- a/third_party/blink/renderer/core/svg/svg_pattern_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
@@ -34,7 +34,7 @@
 
 namespace blink {
 
-inline SVGPatternElement::SVGPatternElement(Document& document)
+SVGPatternElement::SVGPatternElement(Document& document)
     : SVGElement(svg_names::kPatternTag, document),
       SVGURIReference(this),
       SVGTests(this),
diff --git a/third_party/blink/renderer/core/svg/svg_polygon_element.cc b/third_party/blink/renderer/core/svg/svg_polygon_element.cc
index 4149711..f68bd9e5 100644
--- a/third_party/blink/renderer/core/svg/svg_polygon_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_polygon_element.cc
@@ -24,7 +24,7 @@
 
 namespace blink {
 
-inline SVGPolygonElement::SVGPolygonElement(Document& document)
+SVGPolygonElement::SVGPolygonElement(Document& document)
     : SVGPolyElement(svg_names::kPolygonTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGPolygonElement)
diff --git a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
index 7f36e465..6745501 100644
--- a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-inline SVGRadialGradientElement::SVGRadialGradientElement(Document& document)
+SVGRadialGradientElement::SVGRadialGradientElement(Document& document)
     : SVGGradientElement(svg_names::kRadialGradientTag, document),
       // Spec: If the cx/cy/r attribute is not specified, the effect is as if a
       // value of "50%" were specified.
diff --git a/third_party/blink/renderer/core/svg/svg_rect_element.cc b/third_party/blink/renderer/core/svg/svg_rect_element.cc
index b1173aa..3337cf2 100644
--- a/third_party/blink/renderer/core/svg/svg_rect_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_rect_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGRectElement::SVGRectElement(Document& document)
+SVGRectElement::SVGRectElement(Document& document)
     : SVGGeometryElement(svg_names::kRectTag, document),
       x_(MakeGarbageCollected<SVGAnimatedLength>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_script_element.cc b/third_party/blink/renderer/core/svg/svg_script_element.cc
index b5df678..66eec634 100644
--- a/third_party/blink/renderer/core/svg/svg_script_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_script_element.cc
@@ -33,8 +33,8 @@
 
 namespace blink {
 
-inline SVGScriptElement::SVGScriptElement(Document& document,
-                                          const CreateElementFlags flags)
+SVGScriptElement::SVGScriptElement(Document& document,
+                                   const CreateElementFlags flags)
     : SVGElement(svg_names::kScriptTag, document),
       SVGURIReference(this),
       loader_(InitializeScriptLoader(flags.IsCreatedByParser(),
diff --git a/third_party/blink/renderer/core/svg/svg_stop_element.cc b/third_party/blink/renderer/core/svg/svg_stop_element.cc
index 7a70c50..44f91e6 100644
--- a/third_party/blink/renderer/core/svg/svg_stop_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_stop_element.cc
@@ -27,7 +27,7 @@
 
 namespace blink {
 
-inline SVGStopElement::SVGStopElement(Document& document)
+SVGStopElement::SVGStopElement(Document& document)
     : SVGElement(svg_names::kStopTag, document),
       offset_(MakeGarbageCollected<SVGAnimatedNumber>(
           this,
diff --git a/third_party/blink/renderer/core/svg/svg_style_element.cc b/third_party/blink/renderer/core/svg/svg_style_element.cc
index 25f587b..05187c3 100644
--- a/third_party/blink/renderer/core/svg/svg_style_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_style_element.cc
@@ -31,8 +31,8 @@
 
 namespace blink {
 
-inline SVGStyleElement::SVGStyleElement(Document& document,
-                                        const CreateElementFlags flags)
+SVGStyleElement::SVGStyleElement(Document& document,
+                                 const CreateElementFlags flags)
     : SVGElement(svg_names::kStyleTag, document),
       StyleElement(&document, flags.IsCreatedByParser()) {}
 
diff --git a/third_party/blink/renderer/core/svg/svg_switch_element.cc b/third_party/blink/renderer/core/svg/svg_switch_element.cc
index c7904f36..284be64 100644
--- a/third_party/blink/renderer/core/svg/svg_switch_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_switch_element.cc
@@ -26,7 +26,7 @@
 
 namespace blink {
 
-inline SVGSwitchElement::SVGSwitchElement(Document& document)
+SVGSwitchElement::SVGSwitchElement(Document& document)
     : SVGGraphicsElement(svg_names::kSwitchTag, document) {
   UseCounter::Count(document, WebFeature::kSVGSwitchElement);
 }
diff --git a/third_party/blink/renderer/core/svg/svg_symbol_element.cc b/third_party/blink/renderer/core/svg/svg_symbol_element.cc
index c5d6a27..f472636 100644
--- a/third_party/blink/renderer/core/svg/svg_symbol_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_symbol_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGSymbolElement::SVGSymbolElement(Document& document)
+SVGSymbolElement::SVGSymbolElement(Document& document)
     : SVGElement(svg_names::kSymbolTag, document), SVGFitToViewBox(this) {}
 
 void SVGSymbolElement::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/svg/svg_text_element.cc b/third_party/blink/renderer/core/svg/svg_text_element.cc
index 11a07c8..24e23a2 100644
--- a/third_party/blink/renderer/core/svg/svg_text_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_text_element.cc
@@ -24,7 +24,7 @@
 
 namespace blink {
 
-inline SVGTextElement::SVGTextElement(Document& doc)
+SVGTextElement::SVGTextElement(Document& doc)
     : SVGTextPositioningElement(svg_names::kTextTag, doc) {}
 
 DEFINE_NODE_FACTORY(SVGTextElement)
diff --git a/third_party/blink/renderer/core/svg/svg_text_path_element.cc b/third_party/blink/renderer/core/svg/svg_text_path_element.cc
index 4ba4e104..4b1cf72a 100644
--- a/third_party/blink/renderer/core/svg/svg_text_path_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_text_path_element.cc
@@ -46,7 +46,7 @@
   return entries;
 }
 
-inline SVGTextPathElement::SVGTextPathElement(Document& document)
+SVGTextPathElement::SVGTextPathElement(Document& document)
     : SVGTextContentElement(svg_names::kTextPathTag, document),
       SVGURIReference(this),
       start_offset_(MakeGarbageCollected<SVGAnimatedLength>(
diff --git a/third_party/blink/renderer/core/svg/svg_tspan_element.cc b/third_party/blink/renderer/core/svg/svg_tspan_element.cc
index af93d45..3855127 100644
--- a/third_party/blink/renderer/core/svg/svg_tspan_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_tspan_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGTSpanElement::SVGTSpanElement(Document& document)
+SVGTSpanElement::SVGTSpanElement(Document& document)
     : SVGTextPositioningElement(svg_names::kTSpanTag, document) {}
 
 DEFINE_NODE_FACTORY(SVGTSpanElement)
diff --git a/third_party/blink/renderer/core/svg/svg_unknown_element.cc b/third_party/blink/renderer/core/svg/svg_unknown_element.cc
index a0898f1c..48ce4711 100644
--- a/third_party/blink/renderer/core/svg/svg_unknown_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_unknown_element.cc
@@ -32,8 +32,8 @@
 
 namespace blink {
 
-inline SVGUnknownElement::SVGUnknownElement(const QualifiedName& tag_name,
-                                            Document& document)
+SVGUnknownElement::SVGUnknownElement(const QualifiedName& tag_name,
+                                     Document& document)
     : SVGElement(tag_name, document) {}
 
 DEFINE_ELEMENT_FACTORY_WITH_TAGNAME(SVGUnknownElement)
diff --git a/third_party/blink/renderer/core/svg/svg_unknown_element.h b/third_party/blink/renderer/core/svg/svg_unknown_element.h
index c820676..8bef130a 100644
--- a/third_party/blink/renderer/core/svg/svg_unknown_element.h
+++ b/third_party/blink/renderer/core/svg/svg_unknown_element.h
@@ -47,9 +47,9 @@
  public:
   DECLARE_ELEMENT_FACTORY_WITH_TAGNAME(SVGUnknownElement);
 
- private:
   SVGUnknownElement(const QualifiedName&, Document&);
 
+ private:
   bool LayoutObjectIsNeeded(const ComputedStyle&) const override {
     return false;
   }
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc
index d404c3b3..e0b505a5 100644
--- a/third_party/blink/renderer/core/svg/svg_use_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -49,7 +49,7 @@
 
 namespace blink {
 
-inline SVGUseElement::SVGUseElement(Document& document)
+SVGUseElement::SVGUseElement(Document& document)
     : SVGGraphicsElement(svg_names::kUseTag, document),
       SVGURIReference(this),
       x_(MakeGarbageCollected<SVGAnimatedLength>(
diff --git a/third_party/blink/renderer/core/svg/svg_view_element.cc b/third_party/blink/renderer/core/svg/svg_view_element.cc
index 3406b2b..695e6c0 100644
--- a/third_party/blink/renderer/core/svg/svg_view_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_view_element.cc
@@ -25,7 +25,7 @@
 
 namespace blink {
 
-inline SVGViewElement::SVGViewElement(Document& document)
+SVGViewElement::SVGViewElement(Document& document)
     : SVGElement(svg_names::kViewTag, document), SVGFitToViewBox(this) {
   UseCounter::Count(document, WebFeature::kSVGViewElement);
 }
diff --git a/third_party/blink/renderer/core/xml/xpath_step.cc b/third_party/blink/renderer/core/xml/xpath_step.cc
index b98a499..e933e00 100644
--- a/third_party/blink/renderer/core/xml/xpath_step.cc
+++ b/third_party/blink/renderer/core/xml/xpath_step.cc
@@ -217,7 +217,7 @@
           // Paths without namespaces should match HTML elements in HTML
           // documents despite those having an XHTML namespace. Names are
           // compared case-insensitively.
-          return DeprecatedEqualIgnoringCase(element.localName(), name) &&
+          return EqualIgnoringASCIICase(element.localName(), name) &&
                  (namespace_uri.IsNull() ||
                   namespace_uri == element.namespaceURI());
         }
diff --git a/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js b/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
index de8b0eb..d8eba906 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
@@ -694,7 +694,7 @@
    * @param {!Protocol.BackgroundService.ServiceName} serviceName
    */
   constructor(storagePanel, serviceName) {
-    super(storagePanel, Resources.BackgroundServiceTreeElement._getUIString(serviceName), false);
+    super(storagePanel, Resources.BackgroundServiceView.getUIString(serviceName), false);
 
     /** @const {!Protocol.BackgroundService.ServiceName} */
     this._serviceName = serviceName;
@@ -713,21 +713,6 @@
   }
 
   /**
-   * @param {string} serviceName The name of the background service.
-   * @return {string} The UI String to display.
-   */
-  static _getUIString(serviceName) {
-    switch (serviceName) {
-      case Protocol.BackgroundService.ServiceName.BackgroundFetch:
-        return Common.UIString('Background Fetch');
-      case Protocol.BackgroundService.ServiceName.BackgroundSync:
-        return Common.UIString('Background Sync');
-      default:
-        return '';
-    }
-  }
-
-  /**
    * @param {?Resources.BackgroundServiceModel} model
    */
   _initialize(model) {
diff --git a/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js b/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
index 4021f43..bfd5c8e 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
@@ -4,6 +4,21 @@
 
 Resources.BackgroundServiceView = class extends UI.VBox {
   /**
+   * @param {string} serviceName The name of the background service.
+   * @return {string} The UI String to display.
+   */
+  static getUIString(serviceName) {
+    switch (serviceName) {
+      case Protocol.BackgroundService.ServiceName.BackgroundFetch:
+        return ls`Background Fetch`;
+      case Protocol.BackgroundService.ServiceName.BackgroundSync:
+        return ls`Background Sync`;
+      default:
+        return '';
+    }
+  }
+
+  /**
    * @param {!Protocol.BackgroundService.ServiceName} serviceName
    * @param {!Resources.BackgroundServiceModel} model
    */
@@ -57,6 +72,9 @@
     /** @const {!UI.VBox} */
     this._previewPanel = new UI.VBox();
 
+    /** @type {?Resources.BackgroundServiceView.EventDataNode} */
+    this._selectedEventNode = null;
+
     /** @type {?UI.Widget} */
     this._preview = null;
 
@@ -82,16 +100,16 @@
 
     this._toolbar.appendSeparator();
 
-    this._originCheckbox =
-        new UI.ToolbarCheckbox(ls`Show events from other domains`, undefined, () => this._refreshView());
-    this._toolbar.appendToolbarItem(this._originCheckbox);
-
-    this._toolbar.appendSeparator();
-
     this._saveButton = new UI.ToolbarButton(ls`Save events`, 'largeicon-download');
     this._saveButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._saveToFile());
     this._saveButton.setEnabled(false);
     this._toolbar.appendToolbarItem(this._saveButton);
+
+    this._toolbar.appendSeparator();
+
+    this._originCheckbox =
+        new UI.ToolbarCheckbox(ls`Show events from other domains`, undefined, () => this._refreshView());
+    this._toolbar.appendToolbarItem(this._originCheckbox);
   }
 
   /**
@@ -108,9 +126,10 @@
    * Clears the grid and panel.
    */
   _clearView() {
+    this._selectedEventNode = null;
     this._dataGrid.rootNode().removeChildren();
-    this._showPreview(null);
     this._saveButton.setEnabled(false);
+    this._showPreview(null);
   }
 
   /**
@@ -135,7 +154,12 @@
     const state = /** @type {!Resources.BackgroundServiceModel.RecordingState} */ (event.data);
     if (state.serviceName !== this._serviceName)
       return;
+
+    if (state.isRecording === this._recordButton.toggled())
+      return;
+
     this._recordButton.setToggled(state.isRecording);
+    this._showPreview(this._selectedEventNode);
   }
 
   /**
@@ -163,8 +187,10 @@
     const dataNode = new Resources.BackgroundServiceView.EventDataNode(data, serviceEvent.eventMetadata);
     this._dataGrid.rootNode().appendChild(dataNode);
 
-    // There's at least one event. So we can allow saving the events.
-    this._saveButton.setEnabled(true);
+    if (this._dataGrid.rootNode().children.length === 1) {
+      this._saveButton.setEnabled(true);
+      this._showPreview(this._selectedEventNode);
+    }
   }
 
   /**
@@ -174,9 +200,9 @@
     const columns = /** @type {!Array<!DataGrid.DataGrid.ColumnDescriptor>} */ ([
       {id: 'id', title: ls`#`, weight: 1},
       {id: 'timestamp', title: ls`Timestamp`, weight: 8},
+      {id: 'eventName', title: ls`Event`, weight: 10},
       {id: 'origin', title: ls`Origin`, weight: 10},
       {id: 'swSource', title: ls`SW Source`, weight: 4},
-      {id: 'eventName', title: ls`Event`, weight: 10},
       {id: 'instanceId', title: ls`Instance ID`, weight: 10},
     ]);
     const dataGrid = new DataGrid.DataGrid(columns);
@@ -238,13 +264,36 @@
    * @param {?Resources.BackgroundServiceView.EventDataNode} dataNode
    */
   _showPreview(dataNode) {
+    if (this._selectedEventNode && this._selectedEventNode === dataNode)
+      return;
+
+    this._selectedEventNode = dataNode;
+
     if (this._preview)
       this._preview.detach();
 
-    if (dataNode)
-      this._preview = dataNode.createPreview();
-    else
-      this._preview = new UI.EmptyWidget(ls`Select a value to preview`);
+    if (this._selectedEventNode) {
+      this._preview = this._selectedEventNode.createPreview();
+    } else if (this._dataGrid.rootNode().children.length) {
+      // Inform users that grid entries are clickable.
+      this._preview = new UI.EmptyWidget(ls`Select an entry to view metadata`);
+    } else if (this._recordButton.toggled()) {
+      // Inform users that we are recording/waiting for events.
+      this._preview = new UI.EmptyWidget(
+          ls`Recording ${Resources.BackgroundServiceView.getUIString(this._serviceName)} activity...`);
+    } else {
+      this._preview = new UI.VBox();
+      this._preview.contentElement.classList.add('background-service-landing-page');
+      const centered = this._preview.contentElement.createChild('div');
+
+      const landingRecordButton =
+          new UI.ToolbarToggle(ls`Toggle Record`, 'largeicon-start-recording', 'largeicon-stop-recording');
+      landingRecordButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._toggleRecording());
+
+      // TODO(rayankans): Add a keyboard shortcut.
+      centered.createChild('p').appendChild(UI.formatLocalized(
+          'Click the record button %s to start recording.', [UI.createInlineButton(landingRecordButton)]));
+    }
 
     this._preview.show(this._previewPanel.contentElement);
   }
@@ -291,12 +340,25 @@
   }
 
   /**
-   * @return {!UI.SearchableView}
+   * @return {!UI.VBox}
    */
   createPreview() {
-    const metadata = {};
-    for (const entry of this._eventMetadata)
-      metadata[entry.key] = entry.value;
-    return SourceFrame.JSONView.createViewSync(metadata);
+    const preview = new UI.VBox();
+    preview.element.classList.add('background-service-metadata');
+
+    for (const entry of this._eventMetadata) {
+      const div = createElementWithClass('div', 'background-service-metadata-entry');
+      div.createChild('div', 'background-service-metadata-name').textContent = entry.key + ': ';
+      div.createChild('div', 'background-service-metadata-value source-code').textContent = entry.value;
+      preview.element.appendChild(div);
+    }
+
+    if (!preview.element.children.length) {
+      const div = createElementWithClass('div', 'background-service-metadata-entry');
+      div.createChild('div', 'background-service-metadata-name').textContent = ls`No metadata for this event`;
+      preview.element.appendChild(div);
+    }
+
+    return preview;
   }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css b/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
index c276c7a6..8cd3c21 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
+++ b/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
@@ -7,3 +7,44 @@
     flex: auto;
     border: none;
 }
+
+.background-service-landing-page {
+    justify-content: center;
+    align-items: center;
+    font-size: 13px;
+    color: #777;
+}
+
+.background-service-landing-page > div {
+    max-width: 450px;
+    margin: 10px;
+}
+
+.background-service-landing-page > div > p {
+    flex: none;
+    white-space: pre-line;
+}
+
+.background-service-metadata {
+    padding-left: 5px;
+    padding-top: 10px;
+}
+
+.background-service-metadata-entry {
+    padding-left: 10px;
+    padding-bottom: 5px;
+}
+
+.background-service-metadata-name {
+    color: rgb(33%, 33%, 33%);
+    display: inline-block;
+    margin-right: 0.25em;
+    font-weight: bold;
+}
+
+.background-service-metadata-value {
+    display: inline;
+    margin-right: 1em;
+    white-space: pre-wrap;
+    word-break: break-all;
+}
\ No newline at end of file
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 9ef8b9f61..0ac1c5b 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -490,7 +490,7 @@
   layout_object_mapping_.Set(layout_object, axid);
   new_obj->Init();
   new_obj->SetLastKnownIsIgnoredValue(new_obj->AccessibilityIsIgnored());
-  if (node) {
+  if (node && node->GetLayoutObject() == layout_object) {
     AXID prev_axid = node_object_mapping_.at(node);
     if (prev_axid != 0 && prev_axid != axid) {
       Remove(node);
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
index 42958d1e..a890647 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -199,8 +199,7 @@
     return;
   }
 
-  String text = SystemClipboard::GetInstance().ReadPlainText(
-      mojom::ClipboardBuffer::kStandard);
+  String text = SystemClipboard::GetInstance().ReadPlainText();
   script_promise_resolver_->Resolve(text);
 }
 
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_reader.cc b/third_party/blink/renderer/modules/clipboard/clipboard_reader.cc
index b2f3e95..b6c7de8 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_reader.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_reader.cc
@@ -23,8 +23,7 @@
   ~ClipboardImageReader() override = default;
 
   Blob* ReadFromSystem() override {
-    SkBitmap bitmap = SystemClipboard::GetInstance().ReadImage(
-        mojom::ClipboardBuffer::kStandard);
+    SkBitmap bitmap = SystemClipboard::GetInstance().ReadImage();
 
     // Encode bitmap to Vector<uint8_t> on the main thread.
     SkPixmap pixmap;
@@ -46,8 +45,7 @@
   ~ClipboardTextReader() override = default;
 
   Blob* ReadFromSystem() override {
-    String plain_text = SystemClipboard::GetInstance().ReadPlainText(
-        mojom::ClipboardBuffer::kStandard);
+    String plain_text = SystemClipboard::GetInstance().ReadPlainText();
 
     // Encode WTF String to UTF-8, the standard text format for blobs.
     CString utf_text = plain_text.Utf8();
diff --git a/third_party/blink/renderer/modules/imagecapture/BUILD.gn b/third_party/blink/renderer/modules/imagecapture/BUILD.gn
index 58b71a57..76602d8 100644
--- a/third_party/blink/renderer/modules/imagecapture/BUILD.gn
+++ b/third_party/blink/renderer/modules/imagecapture/BUILD.gn
@@ -8,12 +8,17 @@
   sources = [
     "image_capture.cc",
     "image_capture.h",
+    "image_capture_frame_grabber.cc",
+    "image_capture_frame_grabber.h",
     "media_settings_range.h",
     "photo_capabilities.cc",
     "photo_capabilities.h",
   ]
 
   deps = [
+    "//media",
     "//media/capture/mojom:image_capture_blink",
+    "//skia",
+    "//third_party/libyuv",
   ]
 }
diff --git a/third_party/blink/renderer/modules/imagecapture/DEPS b/third_party/blink/renderer/modules/imagecapture/DEPS
index 1307c6dd..8328eae 100644
--- a/third_party/blink/renderer/modules/imagecapture/DEPS
+++ b/third_party/blink/renderer/modules/imagecapture/DEPS
@@ -1,3 +1,8 @@
 include_rules = [
   "+media/capture/mojom/image_capture.mojom-blink.h",
+
+  "+media/base",
+  "+skia/ext/platform_canvas.h",
+  "+third_party/libyuv",
+  "+third_party/skia/include/core",
 ]
diff --git a/third_party/blink/renderer/modules/imagecapture/OWNERS b/third_party/blink/renderer/modules/imagecapture/OWNERS
index 1ac08b0..ab8e7ba 100644
--- a/third_party/blink/renderer/modules/imagecapture/OWNERS
+++ b/third_party/blink/renderer/modules/imagecapture/OWNERS
@@ -1,5 +1,7 @@
-mcasas@chromium.org
 reillyg@chromium.org
 
+# Original (legacy) owner.
+mcasas@chromium.org
+
 # COMPONENT: Blink>ImageCapture
 # TEAM: webrtc-dev@chromium.org
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
index 122e66ff..99c7580 100644
--- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -9,7 +9,6 @@
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/public/platform/web_image_capture_frame_grabber.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
 #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -18,6 +17,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
+#include "third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.h"
 #include "third_party/blink/renderer/modules/imagecapture/media_settings_range.h"
 #include "third_party/blink/renderer/modules/imagecapture/photo_capabilities.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h"
@@ -312,7 +312,7 @@
 
   // Create |m_frameGrabber| the first time.
   if (!frame_grabber_) {
-    frame_grabber_ = Platform::Current()->CreateImageCaptureFrameGrabber();
+    frame_grabber_ = std::make_unique<ImageCaptureFrameGrabber>();
   }
 
   if (!frame_grabber_) {
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.h b/third_party/blink/renderer/modules/imagecapture/image_capture.h
index ea0caa46..fc3963d 100644
--- a/third_party/blink/renderer/modules/imagecapture/image_capture.h
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture.h
@@ -21,10 +21,10 @@
 namespace blink {
 
 class ExceptionState;
+class ImageCaptureFrameGrabber;
 class MediaStreamTrack;
 class PhotoCapabilities;
 class ScriptPromiseResolver;
-class WebImageCaptureFrameGrabber;
 
 // TODO(mcasas): Consider adding a web test checking that this class is not
 // garbage collected while it has event listeners.
@@ -98,7 +98,7 @@
   void ResolveWithPhotoCapabilities(ScriptPromiseResolver*);
 
   Member<MediaStreamTrack> stream_track_;
-  std::unique_ptr<WebImageCaptureFrameGrabber> frame_grabber_;
+  std::unique_ptr<ImageCaptureFrameGrabber> frame_grabber_;
   media::mojom::blink::ImageCapturePtr service_;
 
   Member<MediaTrackCapabilities> capabilities_;
diff --git a/content/renderer/image_capture/image_capture_frame_grabber.cc b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc
similarity index 68%
rename from content/renderer/image_capture/image_capture_frame_grabber.cc
rename to third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc
index 8500e38..ce9144d 100644
--- a/content/renderer/image_capture/image_capture_frame_grabber.cc
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc
@@ -2,24 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/image_capture/image_capture_frame_grabber.h"
+#include "third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.h"
 
-#include "base/bind.h"
-#include "cc/paint/paint_canvas.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/video_frame.h"
+#include "media/base/video_types.h"
 #include "media/base/video_util.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/platform/web_callbacks.h"
 #include "third_party/blink/public/platform/web_media_stream_source.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
+#include "third_party/blink/renderer/platform/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
 #include "third_party/libyuv/include/libyuv.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkSurface.h"
 
-namespace content {
-
-using blink::WebImageCaptureGrabFrameCallbacks;
+namespace blink {
 
 namespace {
 
@@ -29,22 +28,37 @@
 
 }  // anonymous namespace
 
+// Template specialization of [1], needed to be able to pass callbacks
+// that have ScopedWebCallbacks paramaters across threads.
+//
+// [1] third_party/blink/renderer/platform/cross_thread_copier.h.
+template <typename T>
+struct CrossThreadCopier<ScopedWebCallbacks<T>>
+    : public CrossThreadCopierPassThrough<ScopedWebCallbacks<T>> {
+  STATIC_ONLY(CrossThreadCopier);
+  using Type = ScopedWebCallbacks<T>;
+  static ScopedWebCallbacks<T> Copy(ScopedWebCallbacks<T> pointer) {
+    return pointer;
+  }
+};
+
 // Ref-counted class to receive a single VideoFrame on IO thread, convert it and
 // send it to |main_task_runner_|, where this class is created and destroyed.
 class ImageCaptureFrameGrabber::SingleShotFrameHandler
-    : public base::RefCountedThreadSafe<SingleShotFrameHandler> {
+    : public WTF::ThreadSafeRefCounted<SingleShotFrameHandler> {
  public:
   SingleShotFrameHandler() : first_frame_received_(false) {}
 
   // Receives a |frame| and converts its pixels into a SkImage via an internal
   // PaintSurface and SkPixmap. Alpha channel, if any, is copied.
-  void OnVideoFrameOnIOThread(SkImageDeliverCB callback,
-                              const scoped_refptr<media::VideoFrame>& frame,
-                              base::TimeTicks current_time);
+  void OnVideoFrameOnIOThread(
+      SkImageDeliverCB callback,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      const scoped_refptr<media::VideoFrame>& frame,
+      base::TimeTicks current_time);
 
  private:
-  friend class base::RefCountedThreadSafe<SingleShotFrameHandler>;
-  virtual ~SingleShotFrameHandler() {}
+  friend class WTF::ThreadSafeRefCounted<SingleShotFrameHandler>;
 
   // Flag to indicate that the first frames has been processed, and subsequent
   // ones can be safely discarded.
@@ -55,6 +69,7 @@
 
 void ImageCaptureFrameGrabber::SingleShotFrameHandler::OnVideoFrameOnIOThread(
     SkImageDeliverCB callback,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const scoped_refptr<media::VideoFrame>& frame,
     base::TimeTicks /* current_time */) {
   DCHECK(frame->format() == media::PIXEL_FORMAT_I420 ||
@@ -73,10 +88,13 @@
   sk_sp<SkSurface> surface = SkSurface::MakeRaster(info);
   DCHECK(surface);
 
+  auto wrapper_callback = media::BindToLoop(
+      std::move(task_runner), ConvertToBaseCallback(std::move(callback)));
+
   SkPixmap pixmap;
   if (!skia::GetWritablePixels(surface->getCanvas(), &pixmap)) {
     DLOG(ERROR) << "Error trying to map SkSurface's pixels";
-    std::move(callback).Run(sk_sp<SkImage>());
+    std::move(wrapper_callback).Run(sk_sp<SkImage>());
     return;
   }
 
@@ -104,25 +122,25 @@
                              pixmap.height());
   }
 
-  std::move(callback).Run(surface->makeImageSnapshot());
+  std::move(wrapper_callback).Run(surface->makeImageSnapshot());
 }
 
 ImageCaptureFrameGrabber::ImageCaptureFrameGrabber()
     : frame_grab_in_progress_(false), weak_factory_(this) {}
 
 ImageCaptureFrameGrabber::~ImageCaptureFrameGrabber() {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
 void ImageCaptureFrameGrabber::GrabFrame(
-    blink::WebMediaStreamTrack* track,
-    std::unique_ptr<blink::WebImageCaptureGrabFrameCallbacks> callbacks,
+    WebMediaStreamTrack* track,
+    std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!!callbacks);
 
   DCHECK(track && !track->IsNull() && track->GetPlatformTrack());
-  DCHECK_EQ(blink::WebMediaStreamSource::kTypeVideo, track->Source().GetType());
+  DCHECK_EQ(WebMediaStreamSource::kTypeVideo, track->Source().GetType());
 
   if (frame_grab_in_progress_) {
     // Reject grabFrame()s too close back to back.
@@ -130,8 +148,8 @@
     return;
   }
 
-  auto scoped_callbacks = blink::MakeScopedWebCallbacks(
-      std::move(callbacks), base::BindOnce(&OnError));
+  auto scoped_callbacks =
+      MakeScopedWebCallbacks(std::move(callbacks), WTF::Bind(&OnError));
 
   // A SingleShotFrameHandler is bound and given to the Track to guarantee that
   // only one VideoFrame is converted and delivered to OnSkImage(), otherwise
@@ -139,26 +157,24 @@
   // is being processed, which might be further held up if UI is busy, see
   // https://crbug.com/623042.
   frame_grab_in_progress_ = true;
-  blink::MediaStreamVideoSink::ConnectToTrack(
+  MediaStreamVideoSink::ConnectToTrack(
       *track,
-      base::BindRepeating(
+      ConvertToBaseCallback(CrossThreadBind(
           &SingleShotFrameHandler::OnVideoFrameOnIOThread,
           base::MakeRefCounted<SingleShotFrameHandler>(),
-          media::BindToLoop(
-              std::move(task_runner),
-              base::BindRepeating(&ImageCaptureFrameGrabber::OnSkImage,
-                                  weak_factory_.GetWeakPtr(),
-                                  base::Passed(&scoped_callbacks)))),
+          WTF::Passed(CrossThreadBind(
+              &ImageCaptureFrameGrabber::OnSkImage, weak_factory_.GetWeakPtr(),
+              WTF::Passed(std::move(scoped_callbacks)))),
+          WTF::Passed(std::move(task_runner)))),
       false);
 }
 
 void ImageCaptureFrameGrabber::OnSkImage(
-    blink::ScopedWebCallbacks<blink::WebImageCaptureGrabFrameCallbacks>
-        callbacks,
+    ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> callbacks,
     sk_sp<SkImage> image) {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  blink::MediaStreamVideoSink::DisconnectFromTrack();
+  MediaStreamVideoSink::DisconnectFromTrack();
   frame_grab_in_progress_ = false;
   if (image)
     callbacks.PassCallbacks()->OnSuccess(image);
@@ -166,4 +182,4 @@
     callbacks.PassCallbacks()->OnError();
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.h b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.h
new file mode 100644
index 0000000..60ffa2a
--- /dev/null
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.h
@@ -0,0 +1,65 @@
+// Copyright 2016 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 THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_checker.h"
+#include "third_party/blink/public/platform/scoped_web_callbacks.h"
+#include "third_party/blink/public/platform/web_callbacks.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_video_sink.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+
+class SkImage;
+
+namespace blink {
+
+class WebMediaStreamTrack;
+
+// TODO(crbug.com/945851): Avoid referencing to WebCallbacks, and reference to
+// CallbackPromiseAdapter directly.
+using WebImageCaptureGrabFrameCallbacks = WebCallbacks<sk_sp<SkImage>, void>;
+
+// This class grabs Video Frames from a given Media Stream Video Track, binding
+// a method of an ephemeral SingleShotFrameHandler every time grabFrame() is
+// called. This method receives an incoming media::VideoFrame on a background
+// thread and converts it into the appropriate SkBitmap which is sent back to
+// OnSkBitmap(). This class is single threaded throughout.
+class ImageCaptureFrameGrabber final : public MediaStreamVideoSink {
+ public:
+  using SkImageDeliverCB = WTF::CrossThreadFunction<void(sk_sp<SkImage>)>;
+
+  ImageCaptureFrameGrabber();
+  ~ImageCaptureFrameGrabber() override;
+
+  void GrabFrame(WebMediaStreamTrack* track,
+                 std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks,
+                 scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+
+ private:
+  // Internal class to receive, convert and forward one frame.
+  class SingleShotFrameHandler;
+
+  void OnSkImage(
+      ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> callbacks,
+      sk_sp<SkImage> image);
+
+  // Flag to indicate that there is a frame grabbing in progress.
+  bool frame_grab_in_progress_;
+
+  THREAD_CHECKER(thread_checker_);
+  base::WeakPtrFactory<ImageCaptureFrameGrabber> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageCaptureFrameGrabber);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl_test.cc b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl_test.cc
index 8a17adc..bc0ccd0 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl_test.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl_test.cc
@@ -4,13 +4,13 @@
 
 #include "third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.h"
 
-#include <map>
 #include <memory>
 
 #include "mojo/public/cpp/bindings/associated_interface_ptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/modules/screen_orientation/web_lock_orientation_callback.h"
+#include "third_party/blink/renderer/platform/wtf/hash_map.h"
 
 namespace blink {
 
@@ -120,25 +120,25 @@
 // Test that when a LockError message is received, the request is set as failed
 // with the correct values.
 TEST_F(ScreenOrientationControllerImplTest, LockRequest_Error) {
-  std::map<LockResult, blink::WebLockOrientationError> errors;
-  errors[LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_NOT_AVAILABLE] =
-      blink::kWebLockOrientationErrorNotAvailable;
-  errors[LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_FULLSCREEN_REQUIRED] =
-      blink::kWebLockOrientationErrorFullscreenRequired;
-  errors[LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED] =
-      blink::kWebLockOrientationErrorCanceled;
+  HashMap<LockResult, blink::WebLockOrientationError, WTF::IntHash<LockResult>>
+      errors;
+  errors.insert(LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_NOT_AVAILABLE,
+                blink::kWebLockOrientationErrorNotAvailable);
+  errors.insert(
+      LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_FULLSCREEN_REQUIRED,
+      blink::kWebLockOrientationErrorFullscreenRequired);
+  errors.insert(LockResult::SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED,
+                blink::kWebLockOrientationErrorCanceled);
 
-  for (std::map<LockResult, blink::WebLockOrientationError>::const_iterator it =
-           errors.begin();
-       it != errors.end(); ++it) {
+  for (auto it = errors.begin(); it != errors.end(); ++it) {
     MockLockOrientationCallback::LockOrientationResultHolder callback_results;
     LockOrientation(
         blink::kWebScreenOrientationLockPortraitPrimary,
         std::make_unique<MockLockOrientationCallback>(&callback_results));
-    RunLockResultCallback(GetRequestId(), it->first);
+    RunLockResultCallback(GetRequestId(), it->key);
     EXPECT_FALSE(callback_results.succeeded_);
     EXPECT_TRUE(callback_results.failed_);
-    EXPECT_EQ(it->second, callback_results.error_);
+    EXPECT_EQ(it->value, callback_results.error_);
   }
 }
 
diff --git a/third_party/blink/renderer/platform/exported/platform.cc b/third_party/blink/renderer/platform/exported/platform.cc
index fd98073c..df15215a 100644
--- a/third_party/blink/renderer/platform/exported/platform.cc
+++ b/third_party/blink/renderer/platform/exported/platform.cc
@@ -42,7 +42,6 @@
 #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
 #include "third_party/blink/public/platform/web_canvas_capture_handler.h"
 #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h"
-#include "third_party/blink/public/platform/web_image_capture_frame_grabber.h"
 #include "third_party/blink/public/platform/web_media_recorder_handler.h"
 #include "third_party/blink/public/platform/web_media_stream_center.h"
 #include "third_party/blink/public/platform/web_prerendering_support.h"
@@ -342,11 +341,6 @@
   return nullptr;
 }
 
-std::unique_ptr<WebImageCaptureFrameGrabber>
-Platform::CreateImageCaptureFrameGrabber() {
-  return nullptr;
-}
-
 std::unique_ptr<webrtc::RtpCapabilities> Platform::GetRtpSenderCapabilities(
     const WebString& kind) {
   return nullptr;
diff --git a/third_party/blink/renderer/platform/geometry/float_size.h b/third_party/blink/renderer/platform/geometry/float_size.h
index 69b75ebb..74f13ab 100644
--- a/third_party/blink/renderer/platform/geometry/float_size.h
+++ b/third_party/blink/renderer/platform/geometry/float_size.h
@@ -35,6 +35,7 @@
 #include "third_party/blink/renderer/platform/geometry/int_size.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
+#include "third_party/blink/renderer/platform/wtf/hash_traits.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 #include "third_party/skia/include/core/SkSize.h"
 #include "ui/gfx/geometry/size_f.h"
@@ -80,6 +81,7 @@
            -std::numeric_limits<float>::epsilon() < height_ &&
            height_ < std::numeric_limits<float>::epsilon();
   }
+  bool IsValid() const { return !std::isnan(width_) && !std::isnan(height_); }
   bool IsExpressibleAsIntSize() const;
 
   float AspectRatio() const { return width_ / height_; }
@@ -150,6 +152,9 @@
 
  private:
   float width_, height_;
+
+  friend struct ::WTF::DefaultHash<blink::FloatSize>;
+  friend struct ::WTF::HashTraits<blink::FloatSize>;
 };
 
 inline FloatSize& operator+=(FloatSize& a, const FloatSize& b) {
@@ -220,4 +225,37 @@
 // Allows this class to be stored in a HeapVector.
 WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::FloatSize)
 
+namespace WTF {
+
+template <>
+struct DefaultHash<blink::FloatSize> {
+  STATIC_ONLY(DefaultHash);
+  struct Hash {
+    STATIC_ONLY(Hash);
+    static unsigned GetHash(const blink::FloatSize& key) {
+      return HashInts(key.Width(), key.Height());
+    }
+    static bool Equal(const blink::FloatSize& a, const blink::FloatSize& b) {
+      return a == b;
+    }
+    static const bool safe_to_compare_to_empty_or_deleted = true;
+  };
+};
+
+template <>
+struct HashTraits<blink::FloatSize> : GenericHashTraits<blink::FloatSize> {
+  STATIC_ONLY(HashTraits);
+  static const bool kEmptyValueIsZero = true;
+  static blink::FloatSize EmptyValue() { return blink::FloatSize(); }
+  static void ConstructDeletedValue(blink::FloatSize& slot, bool) {
+    float quiet_nan = std::numeric_limits<float>::quiet_NaN();
+    slot = blink::FloatSize(quiet_nan, quiet_nan);
+  }
+  static bool IsDeletedValue(const blink::FloatSize& value) {
+    return !value.IsValid();
+  }
+};
+
+}  // namespace WTF
+
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GEOMETRY_FLOAT_SIZE_H_
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.cc b/third_party/blink/renderer/platform/heap/heap_compact.cc
index 8766f7f..c16aed28 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact.cc
+++ b/third_party/blink/renderer/platform/heap/heap_compact.cc
@@ -124,12 +124,6 @@
         slot, std::pair<void*, MovingObjectCallback>(callback_data, callback));
   }
 
-  void RemoveFixupCallback(MovableReference* slot) {
-    auto it = fixup_callbacks_.find(slot);
-    if (it != fixup_callbacks_.end())
-      fixup_callbacks_.erase(it);
-  }
-
   void RelocateInteriorFixups(Address from, Address to, size_t size) {
     SparseHeapBitmap* range = interiors_->HasRange(from, size);
     if (LIKELY(!range))
@@ -271,7 +265,7 @@
  private:
   void VerifyUpdatedSlot(MovableReference* slot);
 
-  ThreadHeap* heap_;
+  ThreadHeap* const heap_;
 
   // Tracking movable and updatable references. For now, we keep a
   // map which for each movable object, recording the slot that
@@ -321,13 +315,7 @@
 #endif  // DCHECK_IS_ON()
 }
 
-HeapCompact::HeapCompact(ThreadHeap* heap)
-    : heap_(heap),
-      do_compact_(false),
-      gc_count_since_last_compaction_(0),
-      free_list_size_(0),
-      compactable_arenas_(0u),
-      last_fixup_count_for_testing_(0) {
+HeapCompact::HeapCompact(ThreadHeap* heap) : heap_(heap) {
   // The heap compaction implementation assumes the contiguous range,
   //
   //   [Vector1ArenaIndex, HashTableArenaIndex]
@@ -420,13 +408,6 @@
   force_compaction_gc_ = false;
 }
 
-void HeapCompact::RemoveSlot(MovableReference* slot) {
-  auto it = traced_slots_.find(slot);
-  if (it != traced_slots_.end())
-    traced_slots_.erase(it);
-  Fixups().RemoveFixupCallback(slot);
-}
-
 void HeapCompact::RegisterMovingObjectReference(MovableReference* slot) {
   CHECK(heap_->LookupPageForAddress(reinterpret_cast<Address>(slot)));
 
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.h b/third_party/blink/renderer/platform/heap/heap_compact.h
index c8c31992..fec3b50 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact.h
+++ b/third_party/blink/renderer/platform/heap/heap_compact.h
@@ -52,10 +52,6 @@
   explicit HeapCompact(ThreadHeap*);
   ~HeapCompact();
 
-  // Remove slot from traced_slots_ when a registered slot is destructed by
-  // mutator
-  void RemoveSlot(MovableReference* slot);
-
   // Determine if a GC for the given type and reason should also perform
   // additional heap compaction.
   //
@@ -143,13 +139,7 @@
  private:
   class MovableObjectFixups;
 
-  // Sample the amount of fragmentation and heap memory currently residing
-  // on the freelists of the arenas we're able to compact. The computed
-  // numbers will be subsequently used to determine if a heap compaction
-  // is on order (shouldCompact().)
-  void UpdateHeapResidency();
-
-  // Parameters controlling when compaction should be done:
+  static bool force_compaction_gc_;
 
   // Number of GCs that must have passed since last compaction GC.
   static const int kGCCountSinceLastCompactionThreshold = 10;
@@ -158,32 +148,35 @@
   // should be considered.
   static const size_t kFreeListSizeThreshold = 512 * 1024;
 
-  ThreadHeap* const heap_;
+  // Sample the amount of fragmentation and heap memory currently residing
+  // on the freelists of the arenas we're able to compact. The computed
+  // numbers will be subsequently used to determine if a heap compaction
+  // is on order (shouldCompact().)
+  void UpdateHeapResidency();
 
   MovableObjectFixups& Fixups();
 
+  ThreadHeap* const heap_;
   std::unique_ptr<MovableObjectFixups> fixups_;
 
-  // Set to |true| when a compacting sweep will go ahead.
-  bool do_compact_;
-  size_t gc_count_since_last_compaction_;
-
-  // Last reported freelist size, across all compactable arenas.
-  size_t free_list_size_;
-
-  // If compacting, i'th heap arena will be compacted
-  // if corresponding bit is set. Indexes are in
-  // the range of BlinkGC::ArenaIndices.
-  unsigned compactable_arenas_;
-
   // The set is to remember slots that traced during
   // marking phases. The mapping between the slots and the backing stores are
   // created at the atomic pause phase.
   HashSet<MovableReference*> traced_slots_;
 
-  size_t last_fixup_count_for_testing_;
+  // Set to |true| when a compacting sweep will go ahead.
+  bool do_compact_ = false;
+  size_t gc_count_since_last_compaction_ = 0;
 
-  static bool force_compaction_gc_;
+  // Last reported freelist size, across all compactable arenas.
+  size_t free_list_size_ = 0;
+
+  size_t last_fixup_count_for_testing_ = 0;
+
+  // If compacting, i'th heap arena will be compacted
+  // if corresponding bit is set. Indexes are in
+  // the range of BlinkGC::ArenaIndices.
+  unsigned compactable_arenas_ = 0u;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/testing/unit_test_helpers.cc b/third_party/blink/renderer/platform/testing/unit_test_helpers.cc
index 5d18e76..b3c2163 100644
--- a/third_party/blink/renderer/platform/testing/unit_test_helpers.cc
+++ b/third_party/blink/renderer/platform/testing/unit_test_helpers.cc
@@ -132,21 +132,20 @@
   return SharedBuffer::Create(buffer.data(), buffer.size());
 }
 
-LineReader::LineReader(const std::string& text) : text_(text), index_(0) {}
+LineReader::LineReader(const String& text) : text_(text), index_(0) {}
 
-bool LineReader::GetNextLine(std::string* line) {
-  line->clear();
+bool LineReader::GetNextLine(String* line) {
   if (index_ >= text_.length())
     return false;
 
-  size_t end_of_line_index = text_.find("\r\n", index_);
-  if (end_of_line_index == std::string::npos) {
-    *line = text_.substr(index_);
+  wtf_size_t end_of_line_index = text_.Find("\r\n", index_);
+  if (end_of_line_index == kNotFound) {
+    *line = text_.Substring(index_);
     index_ = text_.length();
     return true;
   }
 
-  *line = text_.substr(index_, end_of_line_index - index_);
+  *line = text_.Substring(index_, end_of_line_index - index_);
   index_ = end_of_line_index + 2;
   return true;
 }
diff --git a/third_party/blink/renderer/platform/testing/unit_test_helpers.h b/third_party/blink/renderer/platform/testing/unit_test_helpers.h
index 59abf5f..36092e9 100644
--- a/third_party/blink/renderer/platform/testing/unit_test_helpers.h
+++ b/third_party/blink/renderer/platform/testing/unit_test_helpers.h
@@ -83,11 +83,11 @@
   DISALLOW_NEW();
 
  public:
-  LineReader(const std::string& text);
-  bool GetNextLine(std::string* line);
+  LineReader(const String& text);
+  bool GetNextLine(String* line);
 
  private:
-  std::string text_;
+  String text_;
   size_t index_;
 };
 
diff --git a/third_party/blink/renderer/platform/weborigin/security_policy.cc b/third_party/blink/renderer/platform/weborigin/security_policy.cc
index d2b74b7e..60f01f0f 100644
--- a/third_party/blink/renderer/platform/weborigin/security_policy.cc
+++ b/third_party/blink/renderer/platform/weborigin/security_policy.cc
@@ -382,25 +382,4 @@
   return true;
 }
 
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kAlways,
-                   network::mojom::ReferrerPolicy::kAlways);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kDefault,
-                   network::mojom::ReferrerPolicy::kDefault);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kNoReferrerWhenDowngrade,
-                   network::mojom::ReferrerPolicy::kNoReferrerWhenDowngrade);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kNever,
-                   network::mojom::ReferrerPolicy::kNever);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kOrigin,
-                   network::mojom::ReferrerPolicy::kOrigin);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin,
-                   network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kSameOrigin,
-                   network::mojom::ReferrerPolicy::kSameOrigin);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::kStrictOrigin,
-                   network::mojom::ReferrerPolicy::kStrictOrigin);
-STATIC_ASSERT_ENUM(network::mojom::ReferrerPolicy::
-                       kNoReferrerWhenDowngradeOriginWhenCrossOrigin,
-                   network::mojom::ReferrerPolicy::
-                       kNoReferrerWhenDowngradeOriginWhenCrossOrigin);
-
 }  // namespace blink
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 12b15ec..2f1d850c 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -528,6 +528,15 @@
     },
     {
         'paths': [
+            'third_party/blink/renderer/modules/imagecapture/',
+        ],
+        'allowed': [
+            'media::.+',
+            'libyuv::.+',
+        ]
+    },
+    {
+        'paths': [
             'third_party/blink/renderer/modules/media_capabilities/',
         ],
         'allowed': [
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
index dfc540c..567e9fd7 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
@@ -111,7 +111,7 @@
 crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-ic-003.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-break-word-005.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-000.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-text/shaping/shaping-001.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-002.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-003.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-004.html [ Pass ]
@@ -274,7 +274,7 @@
 crbug.com/591099 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ]
 crbug.com/591099 fast/canvas/OffscreenCanvas-copyImage.html [ Pass ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-positioned.html [ Pass ]
-crbug.com/591099 fast/css-intrinsic-dimensions/height-tables.html [ Pass ]
+crbug.com/591099 fast/css-intrinsic-dimensions/height-tables.html [ Failure Pass ]
 crbug.com/591099 fast/css/absolute-inline-alignment-2.html [ Pass ]
 crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ]
 crbug.com/591099 fast/css/outline-offset-large.html [ Failure ]
@@ -289,7 +289,18 @@
 crbug.com/591099 fast/peerconnection/RTCPeerConnection-many.html [ Pass ]
 crbug.com/591099 fast/replaced/replaced-breaking.html [ Failure Pass ]
 # Some outline rect is added double offset.
-crbug.com/835484 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-003.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-004.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-005.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-006.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-replaced-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-replaced-002.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-replaced-003.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-023.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/white-space/control-chars-00C.html [ Pass ]
+crbug.com/835484 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure Pass ]
 crbug.com/899902 fast/text/ellipsis-with-self-painting-layer.html [ Pass ]
 crbug.com/591099 fast/text/emoji-vertical-origin-visual.html [ Failure ]
 crbug.com/591099 fast/text/font-format-support-color-cff2-vertical.html [ Failure ]
@@ -302,11 +313,11 @@
 crbug.com/591099 http/tests/appcache/non-html.xhtml [ Crash Pass ]
 crbug.com/591099 http/tests/csspaint/invalidation-border-image.html [ Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Crash Pass ]
-crbug.com/591099 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Pass ]
+crbug.com/591099 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Pass Timeout ]
 crbug.com/591099 http/tests/devtools/tracing-session-id.js [ Pass ]
 crbug.com/591099 http/tests/devtools/tracing/console-timeline.js [ Pass ]
 crbug.com/591099 http/tests/html/validation-bubble-oopif-clip.html [ Pass ]
-crbug.com/591099 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure Pass ]
+crbug.com/591099 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure ]
 crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Pass ]
 crbug.com/591099 http/tests/security/inactive-document-with-empty-security-origin.html [ Pass Timeout ]
 crbug.com/591099 images/feature-policy-oversized-images-resize.html [ Pass ]
@@ -336,6 +347,7 @@
 crbug.com/591099 virtual/display-lock/display-lock/lock-before-append/measure-updated-layout.html [ Failure ]
 crbug.com/591099 virtual/display-lock/http/tests/devtools/elements/highlight/highlight-display-locked.js [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/ [ Skip ]
+crbug.com/591099 virtual/fractional_scrolling_threaded/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-copyImage.html [ Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Pass ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 9c227b6..c8ff0c3 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -427,6 +427,7 @@
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker-proxied/thorough/cors-base-https-other-https.html [ Slow ]
@@ -443,6 +444,7 @@
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 http/tests/fetch/serviceworker/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/serviceworker/thorough/cors-base-https-other-https.html [ Slow ]
@@ -462,6 +464,7 @@
 crbug.com/874695 http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 http/tests/fetch/window/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/window/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/window/thorough/cors-base-https-other-https.html [ Slow ]
@@ -481,6 +484,7 @@
 crbug.com/874695 http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/workers/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 http/tests/fetch/workers/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/workers/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/workers/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 http/tests/fetch/workers/thorough/cors-base-https-other-https.html [ Slow ]
@@ -626,6 +630,7 @@
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/cors-base-https-other-https.html [ Slow ]
@@ -644,6 +649,7 @@
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/serviceworker/thorough/cors-base-https-other-https.html [ Slow ]
@@ -663,6 +669,7 @@
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/window/thorough/cors-base-https-other-https.html [ Slow ]
@@ -682,6 +689,7 @@
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/outofblink-cors/http/tests/fetch/workers/thorough/cors-base-https-other-https.html [ Slow ]
@@ -715,6 +723,7 @@
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker-proxied/thorough/cors-base-https-other-https.html [ Slow ]
@@ -731,6 +740,7 @@
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/serviceworker/thorough/cors-base-https-other-https.html [ Slow ]
@@ -750,6 +760,7 @@
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/window/thorough/cors-base-https-other-https.html [ Slow ]
@@ -769,6 +780,7 @@
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/auth-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/874695 virtual/streaming-preload/http/tests/fetch/workers/thorough/cors-base-https-other-https.html [ Slow ]
@@ -873,6 +885,7 @@
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/auth-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker-proxied/thorough/cors-base-https-other-https.html [ Slow ]
@@ -891,6 +904,7 @@
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/auth-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/serviceworker/thorough/cors-base-https-other-https.html [ Slow ]
@@ -910,6 +924,7 @@
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/auth-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/window/thorough/cors-base-https-other-https.html [ Slow ]
@@ -929,6 +944,7 @@
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/auth-nocors-base-https-other-https.html [ Slow ]
+crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/auth-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/cookie-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/cookie-nocors-base-https-other-https.html [ Slow ]
 crbug.com/948056 virtual/streams-native/http/tests/fetch/workers/thorough/cors-base-https-other-https.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 79aca3d..376bb50 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -5647,9 +5647,9 @@
 
 # Flaky crash due to "bad mojo message".
 crbug.com/906952 editing/pasteboard/file-drag-to-editable.html [ Pass Crash ]
-crbug.com/906952 fast/events/before-unload-return-value-from-listener.html [ Pass Crash ]
-crbug.com/906952 virtual/mouseevent_fractional/fast/events/before-unload-return-value-from-listener.html [ Pass Crash ]
-crbug.com/906952 virtual/user-activation-v2/fast/events/before-unload-return-value-from-listener.html [ Pass Crash ]
+crbug.com/906952 fast/events/before-unload-return-value-from-listener.html [ Pass Crash Timeout ]
+crbug.com/906952 virtual/mouseevent_fractional/fast/events/before-unload-return-value-from-listener.html [ Pass Crash Timeout ]
+crbug.com/906952 virtual/user-activation-v2/fast/events/before-unload-return-value-from-listener.html [ Pass Crash Timeout ]
 
 #Sheriff 2018-11-21
 
diff --git a/third_party/blink/web_tests/external/wpt/common/security-features/resources/common.js b/third_party/blink/web_tests/external/wpt/common/security-features/resources/common.js
index 936b39e..b42a909 100644
--- a/third_party/blink/web_tests/external/wpt/common/security-features/resources/common.js
+++ b/third_party/blink/web_tests/external/wpt/common/security-features/resources/common.js
@@ -263,7 +263,8 @@
       false);
   return bindEvents2(window, "message", iframe, "error", window, "error")
       .then(event => {
-          assert_equals(event.source, iframe.contentWindow);
+          if (event.source !== iframe.contentWindow)
+            return Promise.reject(new Error('Unexpected event.source'));
           return event.data;
         });
 }
@@ -481,8 +482,7 @@
   if (type == 'audio')
     return new OfflineAudioContext(2,44100*40,44100).audioWorklet;
 
-  assert_unreached('unknown worklet type is passed.');
-  return undefined;
+  throw new Error('unknown worklet type is passed.');
 }
 
 function requestViaWorklet(type, url) {
@@ -510,7 +510,8 @@
   const promise =
     bindEvents2(window, "message", iframe, "error", window, "error")
       .then(event => {
-          assert_equals(event.source, iframe.contentWindow, "event.source");
+          if (event.source !== iframe.contentWindow)
+            return Promise.reject(new Error('Unexpected event.source'));
           return event.data;
         });
   navigableElement.click();
diff --git a/third_party/blink/web_tests/external/wpt/domxpath/001-expected.txt b/third_party/blink/web_tests/external/wpt/domxpath/001-expected.txt
deleted file mode 100644
index e8e17ecc..0000000
--- a/third_party/blink/web_tests/external/wpt/domxpath/001-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-This is a testharness.js-based test.
-PASS HTML elements no namespace prefix
-PASS HTML elements namespace prefix
-PASS HTML elements mixed use of prefix
-PASS SVG elements no namespace prefix
-PASS SVG elements namespace prefix
-PASS HTML elements mixed case
-PASS SVG elements mixed case selector
-PASS Non-ascii HTML element
-FAIL Non-ascii HTML element2 assert_array_equals: lengths differ, expected 0 got 1
-PASS Non-ascii HTML element3
-PASS Throw with invalid prefix
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt
deleted file mode 100644
index eaab1e2c..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-This is a testharness.js-based test.
-PASS Setting defaultValue in a textarea should move the cursor to the end
-PASS Setting defaultValue in a textarea with a value should NOT make any difference
-PASS Setting textContent in a textarea should move selection{Start,End} to the end
-PASS Adding children to a textarea should move selection{Start,End} to the end
-PASS Removing children from a textarea should update selection{Start,End}
-PASS Setting the same value (with different newlines) in a textarea should NOT update selection{Start,End}
-FAIL Removing child nodes in non-dirty textarea should make selection{Start,End} 0 assert_equals: selectionStart after appendChild expected 0 but got 6
-PASS Setting value to a shorter string than defaultValue should correct the cursor position
-PASS Shortening value by turning the input type into 'url' should correct selection{Start,End}
-PASS Shortening value by turning the input type into 'color' and back to 'text' should correct selection{Start,End}
-PASS Resetting a value to a shorter string than defaultValue should correct the cursor position
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra.html
index e76f5f6..c8ba83b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-start-end-extra.html
@@ -16,9 +16,9 @@
     assert_equals(el.selectionEnd, 0);
     el.defaultValue = "123";
     assert_equals(el.value.length, 3);
-    assert_equals(el.selectionStart, 3);
-    assert_equals(el.selectionEnd, 3);
-  }, "Setting defaultValue in a textarea should move the cursor to the end");
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
+  }, "Setting defaultValue in a textarea should NOT move the cursor to the end");
 
   test(function() {
     var el = document.createElement("textarea");
@@ -34,34 +34,34 @@
   test(function() {
     var el = document.createElement("textarea");
     el.appendChild(document.createTextNode("abcdef"));
-    assert_equals(el.selectionStart, 6);
-    assert_equals(el.selectionEnd, 6);
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
     el.textContent = "abcdef123456";
-    assert_equals(el.selectionStart, 12);
-    assert_equals(el.selectionEnd, 12);
-  }, "Setting textContent in a textarea should move selection{Start,End} to the end");
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
+  }, "Setting textContent in a textarea should NOT move selection{Start,End} to the end");
 
   test(function() {
     var el = document.createElement("textarea");
     el.appendChild(document.createTextNode("abcdef"));
-    assert_equals(el.selectionStart, 6);
-    assert_equals(el.selectionEnd, 6);
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
     el.appendChild(document.createTextNode("123456"));
-    assert_equals(el.selectionStart, 12);
-    assert_equals(el.selectionEnd, 12);
-  }, "Adding children to a textarea should move selection{Start,End} to the end");
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
+  }, "Adding children to a textarea should NOT move selection{Start,End} to the end");
 
   test(function() {
     var el = document.createElement("textarea");
     el.appendChild(document.createTextNode("abcdef"));
     el.appendChild(document.createTextNode("123"));
-    assert_equals(el.selectionStart, 9);
-    assert_equals(el.selectionEnd, 9);
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
 
     el.removeChild(el.firstChild);
-    assert_equals(el.selectionStart, 3);
-    assert_equals(el.selectionEnd, 3);
-  }, "Removing children from a textarea should update selection{Start,End}");
+    assert_equals(el.selectionStart, 0);
+    assert_equals(el.selectionEnd, 0);
+  }, "Removing children from a textarea should NOT update selection{Start,End}");
 
   test(function() {
     var el = document.createElement("textarea");
@@ -104,8 +104,8 @@
     var el = document.createElement("textarea");
     el.defaultValue = "123";
     assert_equals(el.value.length, 3);
-    assert_equals(el.selectionStart, 3);
-    assert_equals(el.selectionEnd, 3);
+    el.selectionStart = 3;
+    el.selectionEnd = 3;
     el.value = "12";
     assert_equals(el.value.length, 2);
     assert_equals(el.selectionStart, 2);
diff --git a/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation-expected.txt b/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation-expected.txt
index d4122351..f69a93a 100644
--- a/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation-expected.txt
+++ b/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation-expected.txt
@@ -27,15 +27,6 @@
 - reset form
 PASS ta.selectionStart is 7
 PASS ta.selectionEnd is 7
-- set new defaultValue
-PASS ta.selectionStart is 9
-PASS ta.selectionEnd is 9
-- set same defaultValue
-PASS ta.selectionStart is 2
-PASS ta.selectionEnd is 3
-- append a text node
-PASS ta.selectionStart is 12
-PASS ta.selectionEnd is 12
 - append a empty text node
 PASS ta.selectionStart is 2
 PASS ta.selectionEnd is 3
diff --git a/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation.html b/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation.html
index c7529b3..eec51f7 100644
--- a/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation.html
+++ b/third_party/blink/web_tests/fast/forms/textarea/textarea-selection-preservation.html
@@ -49,22 +49,6 @@
     shouldBe('ta.selectionStart', '7');
     shouldBe('ta.selectionEnd', '7');
 
-    debug("- set new defaultValue");
-    ta.defaultValue = 'abc123456';
-    shouldBe('ta.selectionStart', '9');
-    shouldBe('ta.selectionEnd', '9');
-
-    debug("- set same defaultValue");
-    ta.setSelectionRange(2, 3);
-    ta.defaultValue = 'abc123456';
-    shouldBe('ta.selectionStart', '2');
-    shouldBe('ta.selectionEnd', '3');
-
-    debug("- append a text node");
-    ta.appendChild(document.createTextNode('foo'));
-    shouldBe('ta.selectionStart', '12');
-    shouldBe('ta.selectionEnd', '12');
-
     debug("- append a empty text node");
     ta.setSelectionRange(2, 3);
     ta.appendChild(document.createTextNode(''));
diff --git a/third_party/blink/web_tests/inspector-protocol/resources/console-log-navigate.html b/third_party/blink/web_tests/inspector-protocol/resources/console-log-navigate.html
index 56cdede..099d9984 100644
--- a/third_party/blink/web_tests/inspector-protocol/resources/console-log-navigate.html
+++ b/third_party/blink/web_tests/inspector-protocol/resources/console-log-navigate.html
@@ -1,29 +1,35 @@
 <script>
-function navigate()
+function navigateOnce()
 {
+  let ran = false;
+  return function() {
+    if (ran)
+      return; 
+    ran = true;
     anchor = document.createElement("a");
     anchor.href = "about:blank";
     anchor.click();
+  }
 }
 
 function logArray()
 {
     array = [];
-    array.__defineGetter__(0, () => navigate());
+    array.__defineGetter__(0, navigateOnce());
     console.log(array);
 }
 
 function logDate()
 {
     var a = new Date();
-    a.toString = () => navigate();
+    a.toString = navigateOnce();
     console.log(a);
 }
 
 function logDateWithArg()
 {
     var a = new Date();
-    a.toString = () => navigate();
+    a.toString = navigateOnce();
     console.log(42, a);
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/blink/web_tests/inspector-protocol/runtime/runtime-console-log-handle-navigate.js b/third_party/blink/web_tests/inspector-protocol/runtime/runtime-console-log-handle-navigate.js
index fa90d38..35f270e 100644
--- a/third_party/blink/web_tests/inspector-protocol/runtime/runtime-console-log-handle-navigate.js
+++ b/third_party/blink/web_tests/inspector-protocol/runtime/runtime-console-log-handle-navigate.js
@@ -1,29 +1,32 @@
 (async function(testRunner) {
   var {page, session, dp} = await testRunner.startBlank(`This tests how navigation is handled from inside debugger code (console.log).`);
-
-  await session.evaluateAsync(`
-    function appendIframe(url) {
-      var frame = document.createElement('iframe');
-      frame.id = 'iframe';
-      frame.src = url;
-      document.body.appendChild(frame);
-      return new Promise(resolve => frame.onload = resolve);
-    }
-    appendIframe('${testRunner.url('../resources/console-log-navigate-on-load.html')}')
-  `);
-
+  setTimeout(()=>testRunner.completeTest(), 3000);
   await dp.Runtime.enable();
   await checkExpression('logArray()');
   await checkExpression('logDate()');
   await checkExpression('logDateWithArg()');
-  testRunner.completeTest();
 
   async function checkExpression(expression) {
-    var contextId;
-    await dp.Runtime.onceExecutionContextCreated();
-    dp.Runtime.onceExecutionContextCreated().then(result => contextId = result.params.context.id);
-    await session.evaluateAsync(`appendIframe('${testRunner.url('../resources/console-log-navigate.html')}')`);
+    const iframeUrl = testRunner.url('../resources/console-log-navigate.html');
+    const iframeContextCreated = dp.Runtime.onceExecutionContextCreated();
+    await session.evaluateAsync(`
+      new Promise(resolve => {
+        let frame = document.createElement('iframe');
+        frame.src = "${iframeUrl}";
+        frame.onload = resolve;
+        document.body.appendChild(frame);
+      });
+    `);
+    const contextId = (await iframeContextCreated).params.context.id;
+
     testRunner.log(`Got new context: ${contextId !== undefined}`);
-    testRunner.log(await dp.Runtime.evaluate({ expression: expression, contextId: contextId }));
+
+    const aboutBlankContextCreated = dp.Runtime.onceExecutionContextCreated();
+    testRunner.log(await dp.Runtime.evaluate({
+      expression: expression,
+      contextId: contextId
+    }));
+    await aboutBlankContextCreated;
   }
+
 })
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl
index d819a6f..66d8d430 100644
--- a/tools/gritsettings/translation_expectations.pyl
+++ b/tools/gritsettings/translation_expectations.pyl
@@ -27,6 +27,7 @@
       "chrome/android/java/strings/android_chrome_strings.grd",
       "chrome/android/features/vr/java/strings/android_chrome_vr_strings.grd",
       "chrome/android/features/media_router/java/strings/android_chrome_media_router_strings.grd",
+      "chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd",
       "chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd",
       "chrome/android/touchless/java/strings/touchless_strings.grd",
       "chrome/android/webapk/strings/android_webapk_strings.grd",
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 7b21d29..7f0a1b3 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -152,7 +152,7 @@
       'ToTWin': 'clang_tot_official_minimal_symbols_static_release_x86',
       'ToTWin(dbg)': 'clang_tot_shared_debug_x86',
       'ToTWin(dll)': 'clang_tot_minimal_symbols_shared_release_x86_dcheck',
-      'ToTWinOfficial': 'clang_tot_win_official_full_symbols_static_x86',
+      'ToTWinOfficial': 'clang_tot_win_official_full_symbols_thin_lto_static_x86',
       'ToTWin64': 'clang_tot_official_minimal_symbols_static_release',
       'ToTWin64(dbg)': 'clang_tot_shared_debug',
       'ToTWin64(dll)': 'clang_tot_shared_release_dcheck',
@@ -1302,8 +1302,8 @@
       'clang_tot', 'minimal_symbols', 'shared', 'release', 'x86', 'dcheck_always_on',
     ],
 
-    'clang_tot_win_official_full_symbols_static_x86': [
-      'clang_tot', 'official', 'full_symbols', 'static', 'x86', 'win_linker_timing',
+    'clang_tot_win_official_full_symbols_thin_lto_static_x86': [
+      'clang_tot', 'official', 'full_symbols', 'thin_lto', 'static', 'x86', 'win_linker_timing',
     ],
 
     'clang_tot_win_official_full_symbols_thin_lto_static': [
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4631828..76b86d69 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -16630,6 +16630,10 @@
   <int value="554" label="PolicyListMultipleSourceMergeList"/>
   <int value="555" label="SamlPasswordExpirationAdvanceWarningDays"/>
   <int value="556" label="DeviceScheduledUpdateCheck"/>
+  <int value="557" label="KerberosEnabled"/>
+  <int value="558" label="KerberosRememberPasswordEnabled"/>
+  <int value="559" label="KerberosAddAccountsAllowed"/>
+  <int value="560" label="KerberosAccounts"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -44150,6 +44154,9 @@
   <int value="3" label="Server failed"/>
   <int value="4" label="Cleanup failed"/>
   <int value="5" label="Decryption failed"/>
+  <int value="6" label="Add failed"/>
+  <int value="7" label="Update failed"/>
+  <int value="8" label="Metadata persistence failed"/>
 </enum>
 
 <enum name="PaymentRequestAbortReason">
@@ -54197,6 +54204,7 @@
   <int value="13" label="Sites shown in Trusted Web Activities"/>
   <int value="14" label="Offline Pages"/>
   <int value="15" label="Send Tab To Self"/>
+  <int value="16" label="Updates"/>
 </enum>
 
 <enum name="TabBackgroundLoadStatus">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 4f73dba..9c50ecd97 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4128,6 +4128,8 @@
 </histogram>
 
 <histogram name="Apps.AppListSearchQueryLength" units="characters">
+<!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
+
   <owner>calamity@chromium.org</owner>
   <summary>
     The length of the app list search query when a result is opened. This is
@@ -138130,6 +138132,10 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.AecDelayAdjustmentMsAgnosticValue" units="ms">
+  <obsolete>
+    Deprecated 4/2019 in issue bugs.webrtc.org/10563 due to the reporting
+    component (AEC2) being deprecated.
+  </obsolete>
   <owner>hlundin@chromium.org</owner>
   <summary>
     The AEC in WebRTC will sometimes realign the far- and near-end signal
@@ -138141,6 +138147,10 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.AecDelayAdjustmentMsSystemValue" units="ms">
+  <obsolete>
+    Deprecated 4/2019 in issue bugs.webrtc.org/10563 due to the reporting
+    component (AEC2) being deprecated.
+  </obsolete>
   <owner>hlundin@chromium.org</owner>
   <summary>
     The AEC in WebRTC will sometimes realign the far- and near-end signal
@@ -155739,6 +155749,7 @@
   <suffix name="ClamshellMode" label="Clamshell Mode Enabled"/>
   <suffix name="TabletMode" label="Tablet Mode Enabled"/>
   <affected-histogram name="Apps.AppListFolderNameLength"/>
+  <affected-histogram name="Apps.AppListSearchQueryLength"/>
   <affected-histogram name="Apps.AppListSearchResultOpenTypeV2"/>
   <affected-histogram
       name="Apps.PaginationTransition.DragScroll.PresentationTime"/>
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 41be0d2..3131168 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -424,12 +424,7 @@
       layout_manager->ViewVisibilitySet(parent_, this, visible);
   }
 
-  if (visible != visible_) {
-    // If the View is currently visible, schedule paint to refresh parent.
-    // TODO(beng): not sure we should be doing this if we have a layer.
-    if (visible_)
-      SchedulePaint();
-
+  if (visible_ != visible) {
     visible_ = visible;
     AdvanceFocusIfNecessary();
 
@@ -444,21 +439,25 @@
     PropagateVisibilityNotifications(this, visible_);
     UpdateLayerVisibility();
 
-    // If we are newly visible, schedule paint.
-    if (visible_)
-      SchedulePaint();
+    // Notify all other subscriptions of the change.
+    OnPropertyChanged(&visible_, kPropertyEffectsLayout);
   }
 }
 
+PropertyChangedSubscription View::AddVisibleChangedCallback(
+    PropertyChangedCallback callback) {
+  return AddPropertyChangedCallback(&visible_, std::move(callback));
+}
+
 bool View::IsDrawn() const {
   return visible_ && parent_ ? parent_->IsDrawn() : false;
 }
 
-void View::SetEnabled(bool is_enabled) {
-  if (enabled_ == is_enabled)
+void View::SetEnabled(bool enabled) {
+  if (enabled_ == enabled)
     return;
 
-  enabled_ = is_enabled;
+  enabled_ = enabled;
   AdvanceFocusIfNecessary();
   OnPropertyChanged(&enabled_, kPropertyEffectsPaint);
 }
@@ -968,7 +967,7 @@
   View::Views children = GetChildrenInZOrder();
   DCHECK_EQ(children_.size(), children.size());
   for (auto* child : base::Reversed(children)) {
-    if (!child->visible())
+    if (!child->GetVisible())
       continue;
 
     gfx::Point point_in_child_coords(point);
@@ -1610,7 +1609,7 @@
 void View::UpdateLayerVisibility() {
   bool visible = visible_;
   for (const View* v = parent_; visible && v && !v->layer(); v = v->parent_)
-    visible = v->visible();
+    visible = v->GetVisible();
 
   UpdateChildLayerVisibility(visible);
 }
@@ -2066,7 +2065,7 @@
   if (widget) {
     RegisterChildrenForVisibleBoundsNotification(view);
 
-    if (view->visible())
+    if (view->GetVisible())
       view->SchedulePaint();
   }
 
@@ -2102,7 +2101,7 @@
   bool is_removed_from_widget = false;
   if (widget) {
     UnregisterChildrenForVisibleBoundsNotification(view);
-    if (view->visible())
+    if (view->GetVisible())
       view->SchedulePaint();
 
     is_removed_from_widget = !new_parent || new_parent->GetWidget() != widget;
@@ -2707,6 +2706,7 @@
 // declaration for View.
 BEGIN_METADATA(View)
 ADD_PROPERTY_METADATA(View, bool, Enabled)
+ADD_PROPERTY_METADATA(View, bool, Visible)
 END_METADATA()
 
 }  // namespace views
diff --git a/ui/views/view.h b/ui/views/view.h
index faa1c0a..f6f448b 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -550,12 +550,23 @@
   // GetPreferredSize().height().
   virtual int GetHeightForWidth(int w) const;
 
+  // The |Visible| property. See comment above for instructions on declaring and
+  // implementing a property.
+  //
   // Sets whether this view is visible. Painting is scheduled as needed. Also,
   // clears focus if the focused view or one of its ancestors is set to be
   // hidden.
   virtual void SetVisible(bool visible);
+  // Return whether a view is visible.
+  bool GetVisible() const { return visible_; }
 
-  // Return whether a view is visible
+  // Adds a callback subscription associated with the above Visible property.
+  // The callback will be invoked whenever the Visible property changes.
+  PropertyChangedSubscription AddVisibleChangedCallback(
+      PropertyChangedCallback callback) WARN_UNUSED_RESULT;
+
+  // NOTE: Deprecated. Please use GetVisible() which is the getter for the
+  // |Visible| property.
   bool visible() const { return visible_; }
 
   // Returns true if this view is drawn on screen.
@@ -567,7 +578,7 @@
   // Set whether this view is enabled. A disabled view does not receive keyboard
   // or mouse inputs. If |enabled| differs from the current value, SchedulePaint
   // is invoked. Also, clears focus if the focused view is disabled.
-  void SetEnabled(bool is_enabled);
+  void SetEnabled(bool enabled);
   // Returns whether the view is enabled.
   bool GetEnabled() const { return enabled_; }
 
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index ebfd11c..5783a21 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -5010,6 +5010,17 @@
   EXPECT_FALSE(test_view.GetEnabled());
 }
 
+TEST_F(ViewTest, TestVisibleChangedCallback) {
+  View test_view;
+  bool visibility_changed = false;
+  auto subscription = test_view.AddVisibleChangedCallback(base::BindRepeating(
+      [](bool* visibility_changed) { *visibility_changed = true; },
+      &visibility_changed));
+  test_view.SetVisible(false);
+  EXPECT_TRUE(visibility_changed);
+  EXPECT_FALSE(test_view.GetVisible());
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Observer tests.
 ////////////////////////////////////////////////////////////////////////////////