diff --git content/browser/appcache/appcache_internals_ui.cc content/browser/appcache/appcache_internals_ui.cc
index b5f06abaeb8a..dd0fac00e45e 100644
--- content/browser/appcache/appcache_internals_ui.cc
+++ content/browser/appcache/appcache_internals_ui.cc
@@ -371,8 +371,8 @@ void AppCacheInternalsUI::CreateProxyForPartition(
     StoragePartition* storage_partition) {
   scoped_refptr<Proxy> proxy =
       new Proxy(weak_ptr_factory_.GetWeakPtr(), storage_partition->GetPath());
-  proxy->Initialize(static_cast<StoragePartitionImpl*>(storage_partition)
-                        ->GetAppCacheService());
+  proxy->Initialize(static_cast<ChromeAppCacheService*>(
+      storage_partition->GetAppCacheService()));
   appcache_proxies_.push_back(proxy);
 }
 
diff --git content/browser/background_fetch/background_fetch_service_impl.cc content/browser/background_fetch/background_fetch_service_impl.cc
index be53f5115d3d..92f09f04f3a1 100644
--- content/browser/background_fetch/background_fetch_service_impl.cc
+++ content/browser/background_fetch/background_fetch_service_impl.cc
@@ -38,8 +38,7 @@ void BackgroundFetchServiceImpl::Create(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(
           BackgroundFetchServiceImpl::CreateOnIoThread,
-          WrapRefCounted(static_cast<StoragePartitionImpl*>(
-                             render_process_host->GetStoragePartition())
+          WrapRefCounted(render_process_host->GetStoragePartition()
                              ->GetBackgroundFetchContext()),
           origin, std::move(request)));
 }
diff --git content/browser/blob_storage/chrome_blob_storage_context.cc content/browser/blob_storage/chrome_blob_storage_context.cc
index 05e3cc192262..3775eab5323b 100644
--- content/browser/blob_storage/chrome_blob_storage_context.cc
+++ content/browser/blob_storage/chrome_blob_storage_context.cc
@@ -85,6 +85,11 @@ class BlobHandleImpl : public BlobHandle {
 
 ChromeBlobStorageContext::ChromeBlobStorageContext() {}
 
+// static
+const void* ChromeBlobStorageContext::GetUserDataKey() {
+  return kBlobStorageContextKeyName;
+}
+
 ChromeBlobStorageContext* ChromeBlobStorageContext::GetFor(
     BrowserContext* context) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git content/browser/blob_storage/chrome_blob_storage_context.h content/browser/blob_storage/chrome_blob_storage_context.h
index 8c5b031e1e65..bbe6fa6525a6 100644
--- content/browser/blob_storage/chrome_blob_storage_context.h
+++ content/browser/blob_storage/chrome_blob_storage_context.h
@@ -50,6 +50,8 @@ class CONTENT_EXPORT ChromeBlobStorageContext
  public:
   ChromeBlobStorageContext();
 
+  static const void* GetUserDataKey();
+
   // Must be called on the UI thread.
   static ChromeBlobStorageContext* GetFor(
       BrowserContext* browser_context);
diff --git content/browser/bluetooth/web_bluetooth_service_impl.cc content/browser/bluetooth/web_bluetooth_service_impl.cc
index e5c7291dcc8f..0eec8a11db35 100644
--- content/browser/bluetooth/web_bluetooth_service_impl.cc
+++ content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -1233,9 +1233,9 @@ url::Origin WebBluetoothServiceImpl::GetOrigin() {
 }
 
 BluetoothAllowedDevices& WebBluetoothServiceImpl::allowed_devices() {
-  StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
+  StoragePartition* partition =
       BrowserContext::GetDefaultStoragePartition(
-          web_contents()->GetBrowserContext()));
+          web_contents()->GetBrowserContext());
   scoped_refptr<BluetoothAllowedDevicesMap> allowed_devices_map =
       partition->GetBluetoothAllowedDevicesMap();
   return allowed_devices_map->GetOrCreateAllowedDevices(GetOrigin());
diff --git content/browser/browser_context.cc content/browser/browser_context.cc
index 0cf6cde723e6..ae04e57bfcbb 100644
--- content/browser/browser_context.cc
+++ content/browser/browser_context.cc
@@ -132,11 +132,18 @@ StoragePartition* GetStoragePartitionFromConfig(
   StoragePartitionImplMap* partition_map =
       GetStoragePartitionMap(browser_context);
 
-  if (browser_context->IsOffTheRecord())
+  if (browser_context->IsOffTheRecord() || browser_context->GetPath().empty())
     in_memory = true;
 
-  return partition_map->Get(partition_domain, partition_name, in_memory,
-                            can_create);
+  StoragePartitionImpl* partition_impl =
+      partition_map->Get(partition_domain, partition_name, in_memory,
+                         can_create);
+  if (partition_impl->browser_context() == browser_context)
+    return partition_impl;
+
+  // |browser_context| is a CefBrowserContextProxy object.
+  return partition_impl->browser_context()->
+      GetStoragePartitionProxy(browser_context, partition_impl);
 }
 
 void SaveSessionStateOnIOThread(
@@ -579,6 +586,11 @@ ServiceManagerConnection* BrowserContext::GetServiceManagerConnectionFor(
 BrowserContext::BrowserContext()
     : media_device_id_salt_(CreateRandomMediaDeviceIDSalt()) {}
 
+// static
+const void* BrowserContext::GetStoragePartitionMapUserDataKey() {
+  return kStoragePartitionMapKeyName;
+}
+
 BrowserContext::~BrowserContext() {
   CHECK(GetUserData(kMojoWasInitialized))
       << "Attempting to destroy a BrowserContext that never called "
diff --git content/browser/devtools/protocol/service_worker_handler.cc content/browser/devtools/protocol/service_worker_handler.cc
index 5501f6ad645d..7ecacac8c92d 100644
--- content/browser/devtools/protocol/service_worker_handler.cc
+++ content/browser/devtools/protocol/service_worker_handler.cc
@@ -170,8 +170,7 @@ void ServiceWorkerHandler::SetRenderer(int process_host_id,
     return;
   }
 
-  storage_partition_ =
-      static_cast<StoragePartitionImpl*>(process_host->GetStoragePartition());
+  storage_partition_ = process_host->GetStoragePartition();
   DCHECK(storage_partition_);
   context_ = static_cast<ServiceWorkerContextWrapper*>(
       storage_partition_->GetServiceWorkerContext());
diff --git content/browser/devtools/protocol/service_worker_handler.h content/browser/devtools/protocol/service_worker_handler.h
index ec9ab86d0ca6..0fe5219f1e84 100644
--- content/browser/devtools/protocol/service_worker_handler.h
+++ content/browser/devtools/protocol/service_worker_handler.h
@@ -24,7 +24,7 @@ class BrowserContext;
 class RenderFrameHostImpl;
 class ServiceWorkerContextWatcher;
 class ServiceWorkerContextWrapper;
-class StoragePartitionImpl;
+class StoragePartition;
 
 namespace protocol {
 
@@ -74,7 +74,7 @@ class ServiceWorkerHandler : public DevToolsDomainHandler,
   bool enabled_;
   scoped_refptr<ServiceWorkerContextWatcher> context_watcher_;
   BrowserContext* browser_context_;
-  StoragePartitionImpl* storage_partition_;
+  StoragePartition* storage_partition_;
 
   base::WeakPtrFactory<ServiceWorkerHandler> weak_factory_;
 
diff --git content/browser/download/download_manager_impl.cc content/browser/download/download_manager_impl.cc
index 02470e87915b..38caa4e8a936 100644
--- content/browser/download/download_manager_impl.cc
+++ content/browser/download/download_manager_impl.cc
@@ -78,9 +78,9 @@
 namespace content {
 namespace {
 
-StoragePartitionImpl* GetStoragePartition(BrowserContext* context,
-                                          int render_process_id,
-                                          int render_frame_id) {
+StoragePartition* GetStoragePartition(BrowserContext* context,
+                                      int render_process_id,
+                                      int render_frame_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   SiteInstance* site_instance = nullptr;
@@ -90,8 +90,7 @@ StoragePartitionImpl* GetStoragePartition(BrowserContext* context,
     if (render_frame_host_)
       site_instance = render_frame_host_->GetSiteInstance();
   }
-  return static_cast<StoragePartitionImpl*>(
-      BrowserContext::GetStoragePartition(context, site_instance));
+  return BrowserContext::GetStoragePartition(context, site_instance);
 }
 
 bool CanRequestURLFromRenderer(int render_process_id, GURL url) {
@@ -1161,7 +1160,7 @@ void DownloadManagerImpl::BeginDownloadInternal(
   if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
     std::unique_ptr<network::ResourceRequest> request =
         CreateResourceRequest(params.get());
-    StoragePartitionImpl* storage_partition =
+    StoragePartition* storage_partition =
         GetStoragePartition(browser_context_, params->render_process_host_id(),
                             params->render_frame_host_routing_id());
 
@@ -1182,7 +1181,8 @@ void DownloadManagerImpl::BeginDownloadInternal(
         BrowserThread::IO, FROM_HERE,
         base::BindOnce(&BeginResourceDownload, std::move(params),
                        std::move(request), std::move(blob_data_handle),
-                       storage_partition->url_loader_factory_getter(), id,
+                       base::WrapRefCounted(
+                          storage_partition->url_loader_factory_getter()), id,
                        weak_factory_.GetWeakPtr(), site_url, tab_url,
                        tab_referrer_url),
         base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler,
diff --git content/browser/download/parallel_download_job.cc content/browser/download/parallel_download_job.cc
index de25ae93f74d..73f490f783c9 100644
--- content/browser/download/parallel_download_job.cc
+++ content/browser/download/parallel_download_job.cc
@@ -304,8 +304,7 @@ void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) {
 
   // Send the request.
   worker->SendRequest(std::move(download_params),
-                      static_cast<StoragePartitionImpl*>(storage_partition)
-                          ->url_loader_factory_getter());
+                      storage_partition->url_loader_factory_getter());
   DCHECK(workers_.find(offset) == workers_.end());
   workers_[offset] = std::move(worker);
 }
diff --git content/browser/loader/navigation_url_loader_network_service.cc content/browser/loader/navigation_url_loader_network_service.cc
index 8e4c4a42b0a0..f78f3d3817ae 100644
--- content/browser/loader/navigation_url_loader_network_service.cc
+++ content/browser/loader/navigation_url_loader_network_service.cc
@@ -1020,11 +1020,12 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService(
     }
   }
 
-  auto* partition = static_cast<StoragePartitionImpl*>(storage_partition);
+  auto* partition = storage_partition;
   DCHECK(!request_controller_);
   request_controller_ = std::make_unique<URLLoaderRequestController>(
       std::move(initial_handlers), std::move(new_request), resource_context,
-      partition->url_loader_factory_getter(), request_info->common_params.url,
+      base::WrapRefCounted(partition->url_loader_factory_getter()),
+      request_info->common_params.url,
       request_info->begin_params->initiator_origin,
       request_info->common_params.suggested_filename,
       std::move(proxied_factory_request), std::move(proxied_factory_info),
diff --git content/browser/payments/payment_app_installer.cc content/browser/payments/payment_app_installer.cc
index d01fb931d358..962d10d44141 100644
--- content/browser/payments/payment_app_installer.cc
+++ content/browser/payments/payment_app_installer.cc
@@ -125,9 +125,9 @@ class SelfDeleteInstaller
   void SetPaymentAppIntoDatabase() {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-    StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
+    StoragePartition* partition =
         BrowserContext::GetDefaultStoragePartition(
-            web_contents()->GetBrowserContext()));
+            web_contents()->GetBrowserContext());
     scoped_refptr<PaymentAppContextImpl> payment_app_context =
         partition->GetPaymentAppContext();
 
diff --git content/browser/payments/payment_app_provider_impl.cc content/browser/payments/payment_app_provider_impl.cc
index d899d32fd383..7e62c70fc70a 100644
--- content/browser/payments/payment_app_provider_impl.cc
+++ content/browser/payments/payment_app_provider_impl.cc
@@ -329,10 +329,11 @@ void StartServiceWorkerForDispatch(BrowserContext* browser_context,
                                    ServiceWorkerStartCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
-      BrowserContext::GetDefaultStoragePartition(browser_context));
+  StoragePartition* partition =
+      BrowserContext::GetDefaultStoragePartition(browser_context);
   scoped_refptr<ServiceWorkerContextWrapper> service_worker_context =
-      partition->GetServiceWorkerContext();
+      static_cast<ServiceWorkerContextWrapper*>(
+          partition->GetServiceWorkerContext());
 
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
@@ -373,8 +374,8 @@ void PaymentAppProviderImpl::GetAllPaymentApps(
     GetAllPaymentAppsCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
-      BrowserContext::GetDefaultStoragePartition(browser_context));
+  StoragePartition* partition =
+      BrowserContext::GetDefaultStoragePartition(browser_context);
   scoped_refptr<PaymentAppContextImpl> payment_app_context =
       partition->GetPaymentAppContext();
 
diff --git content/browser/renderer_host/render_process_host_impl.cc content/browser/renderer_host/render_process_host_impl.cc
index 8c34d8e7af5e..55c0060a6c81 100644
--- content/browser/renderer_host/render_process_host_impl.cc
+++ content/browser/renderer_host/render_process_host_impl.cc
@@ -500,9 +500,8 @@ class SpareRenderProcessHostManager : public RenderProcessHostObserver {
   SpareRenderProcessHostManager() {}
 
   void WarmupSpareRenderProcessHost(BrowserContext* browser_context) {
-    StoragePartitionImpl* current_partition =
-        static_cast<StoragePartitionImpl*>(
-            BrowserContext::GetStoragePartition(browser_context, nullptr));
+    StoragePartition* current_partition =
+        BrowserContext::GetStoragePartition(browser_context, nullptr);
 
     if (spare_render_process_host_ &&
         matching_browser_context_ == browser_context &&
@@ -641,11 +640,10 @@ class DefaultSubframeProcessHostHolder : public base::SupportsUserData::Data,
   // Gets the correct render process to use for this SiteInstance.
   RenderProcessHost* GetProcessHost(SiteInstance* site_instance,
                                     bool is_for_guests_only) {
-    StoragePartitionImpl* default_partition =
-        static_cast<StoragePartitionImpl*>(
-            BrowserContext::GetDefaultStoragePartition(browser_context_));
-    StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
-        BrowserContext::GetStoragePartition(browser_context_, site_instance));
+    StoragePartition* default_partition =
+        BrowserContext::GetDefaultStoragePartition(browser_context_);
+    StoragePartition* partition =
+        BrowserContext::GetStoragePartition(browser_context_, site_instance);
 
     // Is this the default storage partition? If it isn't, then just give it its
     // own non-shared process.
@@ -1240,7 +1238,7 @@ void RenderProcessHost::SetMaxRendererProcessCount(size_t count) {
 // static
 RenderProcessHost* RenderProcessHostImpl::CreateRenderProcessHost(
     BrowserContext* browser_context,
-    StoragePartitionImpl* storage_partition_impl,
+    StoragePartition* storage_partition_impl,
     SiteInstance* site_instance,
     bool is_for_guests_only) {
   if (g_render_process_host_factory_) {
@@ -1249,8 +1247,8 @@ RenderProcessHost* RenderProcessHostImpl::CreateRenderProcessHost(
   }
 
   if (!storage_partition_impl) {
-    storage_partition_impl = static_cast<StoragePartitionImpl*>(
-        BrowserContext::GetStoragePartition(browser_context, site_instance));
+    storage_partition_impl =
+        BrowserContext::GetStoragePartition(browser_context, site_instance);
   }
   // If we've made a StoragePartition for guests (e.g., for the <webview> tag),
   // stash the Site URL on it. This way, when we start a service worker inside
@@ -1272,7 +1270,7 @@ RenderProcessHost* RenderProcessHostImpl::CreateRenderProcessHost(
 // static
 RenderProcessHost* RenderProcessHostImpl::CreateOrUseSpareRenderProcessHost(
     BrowserContext* browser_context,
-    StoragePartitionImpl* storage_partition_impl,
+    StoragePartition* storage_partition_impl,
     SiteInstance* site_instance,
     bool is_for_guests_only) {
   RenderProcessHost* render_process_host =
@@ -1292,7 +1290,7 @@ RenderProcessHost* RenderProcessHostImpl::CreateOrUseSpareRenderProcessHost(
 
 RenderProcessHostImpl::RenderProcessHostImpl(
     BrowserContext* browser_context,
-    StoragePartitionImpl* storage_partition_impl,
+    StoragePartition* storage_partition_impl,
     bool is_for_guests_only)
     : fast_shutdown_started_(false),
       deleting_soon_(false),
@@ -1325,7 +1323,8 @@ RenderProcessHostImpl::RenderProcessHostImpl(
       indexed_db_factory_(new IndexedDBDispatcherHost(
           id_,
           storage_partition_impl_->GetURLRequestContext(),
-          storage_partition_impl_->GetIndexedDBContext(),
+          static_cast<IndexedDBContextImpl*>(
+              storage_partition_impl_->GetIndexedDBContext()),
           ChromeBlobStorageContext::GetFor(browser_context_))),
       channel_connected_(false),
       sent_render_process_ready_(false),
@@ -1359,7 +1358,8 @@ RenderProcessHostImpl::RenderProcessHostImpl(
   }
 
   push_messaging_manager_.reset(new PushMessagingManager(
-      GetID(), storage_partition_impl_->GetServiceWorkerContext()));
+      GetID(), static_cast<ServiceWorkerContextWrapper*>(
+          storage_partition_impl_->GetServiceWorkerContext())));
 
   AddObserver(indexed_db_factory_.get());
 
@@ -1680,6 +1680,20 @@ void RenderProcessHostImpl::ResetChannelProxy() {
 
 void RenderProcessHostImpl::CreateMessageFilters() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Cast to the derived type from StoragePartitionImpl.
+  auto app_cache_service = static_cast<ChromeAppCacheService*>(
+      storage_partition_impl_->GetAppCacheService());
+  auto dom_storage_context = static_cast<DOMStorageContextWrapper*>(
+      storage_partition_impl_->GetDOMStorageContext());
+  auto cache_storage_context = static_cast<CacheStorageContextImpl*>(
+      storage_partition_impl_->GetCacheStorageContext());
+  auto service_worker_context = static_cast<ServiceWorkerContextWrapper*>(
+      storage_partition_impl_->GetServiceWorkerContext());
+  auto platform_notification_context =
+      static_cast<PlatformNotificationContextImpl*>(
+          storage_partition_impl_->GetPlatformNotificationContext());
+
   AddFilter(new ResourceSchedulerFilter(GetID()));
   MediaInternals* media_internals = MediaInternals::GetInstance();
   // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages
@@ -1694,8 +1708,8 @@ void RenderProcessHostImpl::CreateMessageFilters() {
       new RenderMessageFilter(
           GetID(), GetBrowserContext(), request_context.get(),
           widget_helper_.get(), media_internals,
-          storage_partition_impl_->GetDOMStorageContext(),
-          storage_partition_impl_->GetCacheStorageContext()));
+          dom_storage_context,
+          cache_storage_context));
   AddFilter(render_message_filter.get());
 
   render_frame_message_filter_ = new RenderFrameMessageFilter(
@@ -1724,10 +1738,10 @@ void RenderProcessHostImpl::CreateMessageFilters() {
       ChromeBlobStorageContext::GetFor(browser_context);
 
   resource_message_filter_ = new ResourceMessageFilter(
-      GetID(), storage_partition_impl_->GetAppCacheService(),
+      GetID(), app_cache_service,
       blob_storage_context.get(),
       storage_partition_impl_->GetFileSystemContext(),
-      storage_partition_impl_->GetServiceWorkerContext(),
+      service_worker_context,
       storage_partition_impl_->GetPrefetchURLLoaderService(),
       get_contexts_callback,
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
@@ -1754,8 +1768,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
   }
   AddFilter(
       new MidiHost(GetID(), BrowserMainLoop::GetInstance()->midi_service()));
-  AddFilter(new DOMStorageMessageFilter(
-      storage_partition_impl_->GetDOMStorageContext()));
+  AddFilter(new DOMStorageMessageFilter(dom_storage_context));
 
 #if BUILDFLAG(ENABLE_WEBRTC)
   peer_connection_tracker_host_ = new PeerConnectionTrackerHost(GetID());
@@ -1778,13 +1791,12 @@ void RenderProcessHostImpl::CreateMessageFilters() {
 
   scoped_refptr<CacheStorageDispatcherHost> cache_storage_filter =
       new CacheStorageDispatcherHost();
-  cache_storage_filter->Init(storage_partition_impl_->GetCacheStorageContext());
+  cache_storage_filter->Init(cache_storage_context);
   AddFilter(cache_storage_filter.get());
 
   scoped_refptr<ServiceWorkerDispatcherHost> service_worker_filter =
       new ServiceWorkerDispatcherHost(GetID(), resource_context);
-  service_worker_filter->Init(
-      storage_partition_impl_->GetServiceWorkerContext());
+  service_worker_filter->Init(service_worker_context);
   AddFilter(service_worker_filter.get());
 
 #if BUILDFLAG(ENABLE_WEBRTC)
@@ -1796,11 +1808,8 @@ void RenderProcessHostImpl::CreateMessageFilters() {
   AddFilter(new TraceMessageFilter(GetID()));
   AddFilter(new ResolveProxyMsgHelper(request_context.get()));
 
-  scoped_refptr<ServiceWorkerContextWrapper> service_worker_context(
-      static_cast<ServiceWorkerContextWrapper*>(
-          storage_partition_impl_->GetServiceWorkerContext()));
   notification_message_filter_ = new NotificationMessageFilter(
-      GetID(), storage_partition_impl_->GetPlatformNotificationContext(),
+      GetID(), platform_notification_context,
       resource_context, service_worker_context, browser_context);
   AddFilter(notification_message_filter_.get());
 
@@ -1934,7 +1943,8 @@ void RenderProcessHostImpl::RegisterMojoInterfaces() {
 
   registry->AddInterface(base::BindRepeating(
       &AppCacheDispatcherHost::Create,
-      base::Unretained(storage_partition_impl_->GetAppCacheService()),
+      base::Unretained(static_cast<ChromeAppCacheService*>(
+          storage_partition_impl_->GetAppCacheService())),
       GetID()));
 
   AddUIThreadInterface(registry.get(), base::Bind(&FieldTrialRecorder::Create));
diff --git content/browser/renderer_host/render_process_host_impl.h content/browser/renderer_host/render_process_host_impl.h
index 51c2ff46b9ad..5e830df5d433 100644
--- content/browser/renderer_host/render_process_host_impl.h
+++ content/browser/renderer_host/render_process_host_impl.h
@@ -83,7 +83,6 @@ class ResourceMessageFilter;
 class SiteInstance;
 class SiteInstanceImpl;
 class StoragePartition;
-class StoragePartitionImpl;
 
 #if BUILDFLAG(ENABLE_WEBRTC)
 class P2PSocketDispatcherHost;
@@ -126,7 +125,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
   // legal).
   static RenderProcessHost* CreateOrUseSpareRenderProcessHost(
       BrowserContext* browser_context,
-      StoragePartitionImpl* storage_partition_impl,
+      StoragePartition* storage_partition_impl,
       SiteInstance* site_instance,
       bool is_for_guests_only);
 
@@ -138,7 +137,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
   // null.
   static RenderProcessHost* CreateRenderProcessHost(
       BrowserContext* browser_context,
-      StoragePartitionImpl* storage_partition_impl,
+      StoragePartition* storage_partition_impl,
       SiteInstance* site_instance,
       bool is_for_guests_only);
 
@@ -419,7 +418,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
   // Use CreateRenderProcessHost() instead of calling this constructor
   // directly.
   RenderProcessHostImpl(BrowserContext* browser_context,
-                        StoragePartitionImpl* storage_partition_impl,
+                        StoragePartition* storage_partition_impl,
                         bool is_for_guests_only);
 
   // Initializes a new IPC::ChannelProxy in |channel_|, which will be connected
@@ -655,10 +654,10 @@ class CONTENT_EXPORT RenderProcessHostImpl
   // called.
   int instance_id_ = 1;
 
-  BrowserContext* const browser_context_;
+  BrowserContext* browser_context_;
 
   // Owned by |browser_context_|.
-  StoragePartitionImpl* storage_partition_impl_;
+  StoragePartition* storage_partition_impl_;
 
   // The observers watching our lifetime.
   base::ObserverList<RenderProcessHostObserver> observers_;
diff --git content/browser/renderer_interface_binders.cc content/browser/renderer_interface_binders.cc
index 9b1c71bdb19c..891969b30d79 100644
--- content/browser/renderer_interface_binders.cc
+++ content/browser/renderer_interface_binders.cc
@@ -134,7 +134,7 @@ void RendererInterfaceBinders::InitializeParameterizedBinderRegistry() {
   parameterized_binder_registry_.AddInterface(
       base::Bind([](payments::mojom::PaymentManagerRequest request,
                     RenderProcessHost* host, const url::Origin& origin) {
-        static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
+        host->GetStoragePartition()
             ->GetPaymentAppContext()
             ->CreatePaymentManager(std::move(request));
       }));
@@ -148,7 +148,7 @@ void RendererInterfaceBinders::InitializeParameterizedBinderRegistry() {
   parameterized_binder_registry_.AddInterface(base::BindRepeating(
       [](blink::mojom::LockManagerRequest request, RenderProcessHost* host,
          const url::Origin& origin) {
-        static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
+        host->GetStoragePartition()
             ->GetLockManager()
             ->CreateService(std::move(request), origin);
       }));
@@ -157,9 +157,10 @@ void RendererInterfaceBinders::InitializeParameterizedBinderRegistry() {
   parameterized_binder_registry_.AddInterface(
       base::Bind([](blink::mojom::NotificationServiceRequest request,
                     RenderProcessHost* host, const url::Origin& origin) {
-        static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
-            ->GetPlatformNotificationContext()
-            ->CreateService(host->GetID(), origin, std::move(request));
+        static_cast<PlatformNotificationContextImpl*>(
+            host->GetStoragePartition()
+                ->GetPlatformNotificationContext())
+                ->CreateService(host->GetID(), origin, std::move(request));
       }));
   parameterized_binder_registry_.AddInterface(
       base::BindRepeating(&BackgroundFetchServiceImpl::Create));
diff --git content/browser/shared_worker/shared_worker_connector_impl.cc content/browser/shared_worker/shared_worker_connector_impl.cc
index 11b579bdeca4..8dcbe5ff390e 100644
--- content/browser/shared_worker/shared_worker_connector_impl.cc
+++ content/browser/shared_worker/shared_worker_connector_impl.cc
@@ -41,8 +41,8 @@ void SharedWorkerConnectorImpl::Connect(
     return;
   }
   SharedWorkerServiceImpl* service =
-      static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
-          ->GetSharedWorkerService();
+      static_cast<SharedWorkerServiceImpl*>(host->GetStoragePartition()
+          ->GetSharedWorkerService());
   service->ConnectToWorker(process_id_, frame_id_, std::move(info),
                            std::move(client), creation_context_type,
                            blink::MessagePortChannel(std::move(message_port)));
diff --git content/browser/storage_partition_impl.h content/browser/storage_partition_impl.h
index 580d2e0d78d9..0309f5c1df48 100644
--- content/browser/storage_partition_impl.h
+++ content/browser/storage_partition_impl.h
@@ -99,7 +99,7 @@ class CONTENT_EXPORT StoragePartitionImpl
   storage::FileSystemContext* GetFileSystemContext() override;
   storage::DatabaseTracker* GetDatabaseTracker() override;
   DOMStorageContextWrapper* GetDOMStorageContext() override;
-  LockManager* GetLockManager();  // override; TODO: Add to interface
+  LockManager* GetLockManager() override;
   IndexedDBContextImpl* GetIndexedDBContext() override;
   CacheStorageContextImpl* GetCacheStorageContext() override;
   ServiceWorkerContextWrapper* GetServiceWorkerContext() override;
@@ -137,14 +137,14 @@ class CONTENT_EXPORT StoragePartitionImpl
   void FlushNetworkInterfaceForTesting() override;
   void WaitForDeletionTasksForTesting() override;
 
-  BackgroundFetchContext* GetBackgroundFetchContext();
-  BackgroundSyncContext* GetBackgroundSyncContext();
-  PaymentAppContextImpl* GetPaymentAppContext();
-  BroadcastChannelProvider* GetBroadcastChannelProvider();
-  BluetoothAllowedDevicesMap* GetBluetoothAllowedDevicesMap();
-  BlobURLLoaderFactory* GetBlobURLLoaderFactory();
-  BlobRegistryWrapper* GetBlobRegistry();
-  PrefetchURLLoaderService* GetPrefetchURLLoaderService();
+  BackgroundFetchContext* GetBackgroundFetchContext() override;
+  BackgroundSyncContext* GetBackgroundSyncContext() override;
+  PaymentAppContextImpl* GetPaymentAppContext() override;
+  BroadcastChannelProvider* GetBroadcastChannelProvider() override;
+  BluetoothAllowedDevicesMap* GetBluetoothAllowedDevicesMap() override;
+  BlobURLLoaderFactory* GetBlobURLLoaderFactory() override;
+  BlobRegistryWrapper* GetBlobRegistry() override;
+  PrefetchURLLoaderService* GetPrefetchURLLoaderService() override;
 
   // mojom::StoragePartitionService interface.
   void OpenLocalStorage(const url::Origin& origin,
@@ -153,18 +153,18 @@ class CONTENT_EXPORT StoragePartitionImpl
       const std::string& namespace_id,
       mojom::SessionStorageNamespaceRequest request) override;
 
-  scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter() {
-    return url_loader_factory_getter_;
+  URLLoaderFactoryGetter* url_loader_factory_getter() override {
+    return url_loader_factory_getter_.get();
   }
 
   // Can return nullptr while |this| is being destroyed.
-  BrowserContext* browser_context() const;
+  BrowserContext* browser_context() const override;
 
   // Called by each renderer process once. Returns the id of the created
   // binding.
   mojo::BindingId Bind(
       int process_id,
-      mojo::InterfaceRequest<mojom::StoragePartitionService> request);
+      mojo::InterfaceRequest<mojom::StoragePartitionService> request) override;
 
   auto& bindings_for_testing() { return bindings_; }
 
@@ -175,10 +175,11 @@ class CONTENT_EXPORT StoragePartitionImpl
   // one must use the "chrome-guest://blahblah" site URL to ensure that the
   // service worker stays in this StoragePartition. This is an empty GURL if
   // this StoragePartition is not for guests.
-  void set_site_for_service_worker(const GURL& site_for_service_worker) {
+  void set_site_for_service_worker(
+      const GURL& site_for_service_worker) override {
     site_for_service_worker_ = site_for_service_worker;
   }
-  const GURL& site_for_service_worker() const {
+  const GURL& site_for_service_worker() const override {
     return site_for_service_worker_;
   }
 
diff --git content/browser/streams/stream_context.cc content/browser/streams/stream_context.cc
index 7aafca3aafcd..aac07962f6a5 100644
--- content/browser/streams/stream_context.cc
+++ content/browser/streams/stream_context.cc
@@ -22,6 +22,11 @@ namespace content {
 
 StreamContext::StreamContext() {}
 
+// static
+const void* StreamContext::GetUserDataKey() {
+  return kStreamContextKeyName;
+}
+
 StreamContext* StreamContext::GetFor(BrowserContext* context) {
   if (!context->GetUserData(kStreamContextKeyName)) {
     scoped_refptr<StreamContext> stream = new StreamContext();
diff --git content/browser/streams/stream_context.h content/browser/streams/stream_context.h
index 075ae3e7431e..57fb5fd2c4a8 100644
--- content/browser/streams/stream_context.h
+++ content/browser/streams/stream_context.h
@@ -29,6 +29,7 @@ class StreamContext
  public:
   StreamContext();
 
+  CONTENT_EXPORT static const void* GetUserDataKey();
   CONTENT_EXPORT static StreamContext* GetFor(BrowserContext* browser_context);
 
   void InitializeOnIOThread();
diff --git content/browser/webui/web_ui_url_loader_factory.cc content/browser/webui/web_ui_url_loader_factory.cc
index 32457c8510f9..27f3012f76f5 100644
--- content/browser/webui/web_ui_url_loader_factory.cc
+++ content/browser/webui/web_ui_url_loader_factory.cc
@@ -20,13 +20,13 @@
 #include "content/browser/histogram_internals_url_loader.h"
 #include "content/browser/loader/global_routing_id.h"
 #include "content/browser/resource_context_impl.h"
-#include "content/browser/storage_partition_impl.h"
 #include "content/browser/webui/network_error_url_loader.h"
 #include "content/browser/webui/url_data_manager_backend.h"
 #include "content/browser/webui/url_data_source_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/url_constants.h"
@@ -296,9 +296,8 @@ class WebUIURLLoaderFactory : public network::mojom::URLLoaderFactory,
   const std::string& scheme() const { return scheme_; }
 
  private:
-  StoragePartitionImpl* GetStoragePartition() {
-    return static_cast<StoragePartitionImpl*>(
-        render_frame_host_->GetProcess()->GetStoragePartition());
+  StoragePartition* GetStoragePartition() {
+    return render_frame_host_->GetProcess()->GetStoragePartition();
   }
 
   RenderFrameHost* render_frame_host_;
diff --git content/public/browser/browser_context.h content/public/browser/browser_context.h
index 9edd7b1d9123..c61b034c68cc 100644
--- content/public/browser/browser_context.h
+++ content/public/browser/browser_context.h
@@ -207,6 +207,8 @@ class CONTENT_EXPORT BrowserContext : public base::SupportsUserData {
 
   BrowserContext();
 
+  static const void* GetStoragePartitionMapUserDataKey();
+
   ~BrowserContext() override;
 
   // Shuts down the storage partitions associated to this browser context.
@@ -295,6 +297,14 @@ class CONTENT_EXPORT BrowserContext : public base::SupportsUserData {
           const base::FilePath& partition_path,
           bool in_memory) = 0;
 
+  // CEF returns a proxy object that forwards method calls to |partition_impl|.
+  virtual content::StoragePartition* GetStoragePartitionProxy(
+      BrowserContext* browser_context,
+      content::StoragePartition* partition_impl) {
+    NOTREACHED();
+    return nullptr;
+  }
+
   using StaticServiceMap =
       std::map<std::string, service_manager::EmbeddedServiceInfo>;
 
diff --git content/public/browser/storage_partition.h content/public/browser/storage_partition.h
index 55c298e02b57..b277e50ab372 100644
--- content/public/browser/storage_partition.h
+++ content/public/browser/storage_partition.h
@@ -14,6 +14,7 @@
 #include "base/time/time.h"
 #include "content/common/content_export.h"
 #include "content/public/common/shared_url_loader_factory.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
 #include "net/cookies/cookie_store.h"
 
 class GURL;
@@ -49,13 +50,23 @@ class DatabaseTracker;
 namespace content {
 
 class AppCacheService;
+class BackgroundFetchContext;
+class BackgroundSyncContext;
+class BlobRegistryWrapper;
+class BlobURLLoaderFactory;
+class BluetoothAllowedDevicesMap;
+class BroadcastChannelProvider;
 class BrowserContext;
 class CacheStorageContext;
 class DOMStorageContext;
 class IndexedDBContext;
+class LockManager;
+class PaymentAppContextImpl;
 class PlatformNotificationContext;
+class PrefetchURLLoaderService;
 class ServiceWorkerContext;
 class SharedWorkerService;
+class URLLoaderFactoryGetter;
 
 #if !defined(OS_ANDROID)
 class HostZoomLevelContext;
@@ -63,6 +74,10 @@ class HostZoomMap;
 class ZoomLevelDelegate;
 #endif  // !defined(OS_ANDROID)
 
+namespace mojom {
+class StoragePartitionService;
+}
+
 // Defines what persistent state a child process can access.
 //
 // The StoragePartition defines the view each child process has of the
@@ -90,6 +105,7 @@ class CONTENT_EXPORT StoragePartition {
   virtual storage::FileSystemContext* GetFileSystemContext() = 0;
   virtual storage::DatabaseTracker* GetDatabaseTracker() = 0;
   virtual DOMStorageContext* GetDOMStorageContext() = 0;
+  virtual LockManager* GetLockManager() = 0;
   virtual IndexedDBContext* GetIndexedDBContext() = 0;
   virtual ServiceWorkerContext* GetServiceWorkerContext() = 0;
   virtual SharedWorkerService* GetSharedWorkerService() = 0;
@@ -209,6 +225,26 @@ class CONTENT_EXPORT StoragePartition {
   // Wait until all deletions tasks are finished. For test use only.
   virtual void WaitForDeletionTasksForTesting() = 0;
 
+  virtual BackgroundFetchContext* GetBackgroundFetchContext() = 0;
+  virtual BackgroundSyncContext* GetBackgroundSyncContext() = 0;
+  virtual PaymentAppContextImpl* GetPaymentAppContext() = 0;
+  virtual BroadcastChannelProvider* GetBroadcastChannelProvider() = 0;
+  virtual BluetoothAllowedDevicesMap* GetBluetoothAllowedDevicesMap() = 0;
+  virtual BlobURLLoaderFactory* GetBlobURLLoaderFactory() = 0;
+  virtual BlobRegistryWrapper* GetBlobRegistry() = 0;
+  virtual PrefetchURLLoaderService* GetPrefetchURLLoaderService() = 0;
+
+  virtual URLLoaderFactoryGetter* url_loader_factory_getter() = 0;
+  virtual BrowserContext* browser_context() const = 0;
+
+  virtual mojo::BindingId Bind(
+      int process_id,
+      mojo::InterfaceRequest<mojom::StoragePartitionService> request) = 0;
+      
+  virtual void set_site_for_service_worker(
+      const GURL& site_for_service_worker) = 0;
+  virtual const GURL& site_for_service_worker() const = 0;
+
  protected:
   virtual ~StoragePartition() {}
 };
diff --git storage/browser/database/database_tracker.cc storage/browser/database/database_tracker.cc
index f6986c4babc4..1a467451e351 100644
--- storage/browser/database/database_tracker.cc
+++ storage/browser/database/database_tracker.cc
@@ -492,7 +492,7 @@ bool DatabaseTracker::LazyInit() {
     meta_table_.reset(new sql::MetaTable());
 
     is_initialized_ =
-        base::CreateDirectory(db_dir_) &&
+        (is_incognito_ ? true : base::CreateDirectory(db_dir_)) &&
         (db_->is_open() ||
          (is_incognito_ ? db_->OpenInMemory() :
           db_->Open(kTrackerDatabaseFullPath))) &&