diff --git content/browser/appcache/appcache_internals_ui.cc content/browser/appcache/appcache_internals_ui.cc
index 71bf90c54ae5..d3308da307d7 100644
--- content/browser/appcache/appcache_internals_ui.cc
+++ content/browser/appcache/appcache_internals_ui.cc
@@ -372,8 +372,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/blob_storage/chrome_blob_storage_context.cc content/browser/blob_storage/chrome_blob_storage_context.cc
index bf41a25bcd29..9e6dd89497e7 100644
--- content/browser/blob_storage/chrome_blob_storage_context.cc
+++ content/browser/blob_storage/chrome_blob_storage_context.cc
@@ -76,6 +76,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 2412f15c5fb7..3434d129af64 100644
--- content/browser/blob_storage/chrome_blob_storage_context.h
+++ content/browser/blob_storage/chrome_blob_storage_context.h
@@ -47,6 +47,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 125078b9cb44..b24609a807ba 100644
--- content/browser/browser_context.cc
+++ content/browser/browser_context.cc
@@ -127,11 +127,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(
@@ -553,6 +560,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 d2478ae31473..5fd30c1cd72c 100644
--- content/browser/devtools/protocol/service_worker_handler.cc
+++ content/browser/devtools/protocol/service_worker_handler.cc
@@ -337,8 +337,7 @@ Response ServiceWorkerHandler::DispatchSyncEvent(
   if (!base::StringToInt64(registration_id, &id))
     return CreateInvalidVersionIdErrorResponse();
 
-  StoragePartitionImpl* partition =
-      static_cast<StoragePartitionImpl*>(process_->GetStoragePartition());
+  StoragePartition* partition = process_->GetStoragePartition();
   BackgroundSyncContext* sync_context = partition->GetBackgroundSyncContext();
 
   BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
diff --git content/browser/download/download_manager_impl.cc content/browser/download/download_manager_impl.cc
index 0992aad5fe6c..788d432c48d9 100644
--- content/browser/download/download_manager_impl.cc
+++ content/browser/download/download_manager_impl.cc
@@ -83,9 +83,9 @@ WebContents* GetWebContents(int render_process_id,
   return WebContents::FromFrameTreeNodeId(frame_tree_node_id);
 }
 
-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;
@@ -95,8 +95,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) {
@@ -987,16 +986,17 @@ void DownloadManagerImpl::BeginDownloadInternal(
   if (base::FeatureList::IsEnabled(features::kNetworkService)) {
     std::unique_ptr<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());
     BrowserThread::PostTaskAndReplyWithResult(
         BrowserThread::IO, FROM_HERE,
         base::BindOnce(
             &BeginResourceDownload, std::move(params), std::move(request),
-            storage_partition->url_loader_factory_getter(),
-             base::WrapRefCounted(storage_partition->GetFileSystemContext()),
-             id, weak_factory_.GetWeakPtr()),
+            base::WrapRefCounted(
+                storage_partition->url_loader_factory_getter()),
+            base::WrapRefCounted(storage_partition->GetFileSystemContext()),
+            id, weak_factory_.GetWeakPtr()),
         base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler,
                        weak_factory_.GetWeakPtr()));
   } else {
diff --git content/browser/loader/navigation_url_loader_network_service.cc content/browser/loader/navigation_url_loader_network_service.cc
index 70148056059b..599b068dfdea 100644
--- content/browser/loader/navigation_url_loader_network_service.cc
+++ content/browser/loader/navigation_url_loader_network_service.cc
@@ -615,11 +615,12 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService(
 
   g_next_request_id--;
 
-  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(), weak_factory_.GetWeakPtr());
+      base::WrapRefCounted(partition->url_loader_factory_getter()),
+      weak_factory_.GetWeakPtr());
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&URLLoaderRequestController::Start,
diff --git content/browser/payments/payment_app_provider_impl.cc content/browser/payments/payment_app_provider_impl.cc
index 8816724941ff..6b9a26b7c615 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,
@@ -358,8 +359,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 a61b8ab0886e..5be550085df1 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);
   }
 
   return new RenderProcessHostImpl(browser_context, storage_partition_impl,
@@ -1260,7 +1258,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 =
@@ -1280,7 +1278,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),
@@ -1316,7 +1314,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),
@@ -1350,7 +1349,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());
 
@@ -1665,6 +1665,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
@@ -1679,8 +1693,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(
@@ -1709,10 +1723,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(), get_contexts_callback,
+      service_worker_context, get_contexts_callback,
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
 
   AddFilter(resource_message_filter_.get());
@@ -1735,9 +1749,9 @@ void RenderProcessHostImpl::CreateMessageFilters() {
   AddFilter(
       new MidiHost(GetID(), BrowserMainLoop::GetInstance()->midi_service()));
   AddFilter(new AppCacheDispatcherHost(
-      storage_partition_impl_->GetAppCacheService(), GetID()));
+      app_cache_service, GetID()));
   AddFilter(new DOMStorageMessageFilter(
-      storage_partition_impl_->GetDOMStorageContext()));
+      dom_storage_context));
 
 #if BUILDFLAG(ENABLE_WEBRTC)
   peer_connection_tracker_host_ = new PeerConnectionTrackerHost(
@@ -1765,13 +1779,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)
@@ -1783,11 +1796,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());
 
diff --git content/browser/renderer_host/render_process_host_impl.h content/browser/renderer_host/render_process_host_impl.h
index b5528d49e678..aaecb9f0b0f7 100644
--- content/browser/renderer_host/render_process_host_impl.h
+++ content/browser/renderer_host/render_process_host_impl.h
@@ -84,7 +84,6 @@ class ResourceMessageFilter;
 class SiteInstance;
 class SiteInstanceImpl;
 class StoragePartition;
-class StoragePartitionImpl;
 
 #if BUILDFLAG(ENABLE_WEBRTC)
 class MediaStreamDispatcherHost;
@@ -128,7 +127,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);
 
@@ -140,7 +139,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);
 
@@ -422,7 +421,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
@@ -657,10 +656,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 082e5c990dcc..8398a8613b08 100644
--- content/browser/renderer_interface_binders.cc
+++ content/browser/renderer_interface_binders.cc
@@ -112,7 +112,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));
       }));
@@ -128,9 +128,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));
       }));
 }
 
diff --git content/browser/shared_worker/shared_worker_connector_impl.cc content/browser/shared_worker/shared_worker_connector_impl.cc
index 4fb7fcdb85c9..bf0155992715 100644
--- content/browser/shared_worker/shared_worker_connector_impl.cc
+++ content/browser/shared_worker/shared_worker_connector_impl.cc
@@ -23,20 +23,22 @@ void SharedWorkerConnectorImpl::Create(
   RenderProcessHost* host = RenderProcessHost::FromID(process_id);
   ResourceContext* resource_context =
       host->GetBrowserContext()->GetResourceContext();
-  StoragePartitionImpl* storage_partition_impl =
-      static_cast<StoragePartitionImpl*>(host->GetStoragePartition());
+  StoragePartition* storage_partition_impl = host->GetStoragePartition();
 
   // TODO(darin): Surely there can be a better way to extract a comparable
   // identifier from a StoragePartition instance.
   WorkerStoragePartition worker_storage_partition(
       storage_partition_impl->GetURLRequestContext(),
       storage_partition_impl->GetMediaURLRequestContext(),
-      storage_partition_impl->GetAppCacheService(),
+      static_cast<ChromeAppCacheService*>(
+          storage_partition_impl->GetAppCacheService()),
       storage_partition_impl->GetQuotaManager(),
       storage_partition_impl->GetFileSystemContext(),
       storage_partition_impl->GetDatabaseTracker(),
-      storage_partition_impl->GetIndexedDBContext(),
-      storage_partition_impl->GetServiceWorkerContext());
+      static_cast<IndexedDBContextImpl*>(
+          storage_partition_impl->GetIndexedDBContext()),
+      static_cast<ServiceWorkerContextWrapper*>(
+          storage_partition_impl->GetServiceWorkerContext()));
 
   CreateInternal(process_id, frame_id, resource_context,
                  worker_storage_partition, std::move(request));
diff --git content/browser/shared_worker/shared_worker_service_impl.cc content/browser/shared_worker/shared_worker_service_impl.cc
index ecf29e7851da..bba93010b3ad 100644
--- content/browser/shared_worker/shared_worker_service_impl.cc
+++ content/browser/shared_worker/shared_worker_service_impl.cc
@@ -63,17 +63,19 @@ bool SharedWorkerServiceImpl::TerminateWorker(
     const url::Origin& constructor_origin,
     StoragePartition* storage_partition,
     ResourceContext* resource_context) {
-  StoragePartitionImpl* storage_partition_impl =
-      static_cast<StoragePartitionImpl*>(storage_partition);
+  StoragePartition* storage_partition_impl = storage_partition;
   WorkerStoragePartitionId partition_id(WorkerStoragePartition(
       storage_partition_impl->GetURLRequestContext(),
       storage_partition_impl->GetMediaURLRequestContext(),
-      storage_partition_impl->GetAppCacheService(),
+      static_cast<ChromeAppCacheService*>(
+          storage_partition_impl->GetAppCacheService()),
       storage_partition_impl->GetQuotaManager(),
       storage_partition_impl->GetFileSystemContext(),
       storage_partition_impl->GetDatabaseTracker(),
-      storage_partition_impl->GetIndexedDBContext(),
-      storage_partition_impl->GetServiceWorkerContext()));
+      static_cast<IndexedDBContextImpl*>(
+          storage_partition_impl->GetIndexedDBContext()),
+      static_cast<ServiceWorkerContextWrapper*>(
+          storage_partition_impl->GetServiceWorkerContext())));
 
   for (const auto& iter : worker_hosts_) {
     SharedWorkerHost* host = iter.second.get();
diff --git content/browser/storage_partition_impl.h content/browser/storage_partition_impl.h
index 54818f596e4c..58bd25f9bd24 100644
--- content/browser/storage_partition_impl.h
+++ content/browser/storage_partition_impl.h
@@ -119,13 +119,13 @@ class CONTENT_EXPORT StoragePartitionImpl
   void ClearBluetoothAllowedDevicesMapForTesting() override;
   void SetNetworkFactoryForTesting(
       mojom::URLLoaderFactory* test_factory) override;
-  BackgroundFetchContext* GetBackgroundFetchContext();
-  BackgroundSyncContext* GetBackgroundSyncContext();
-  PaymentAppContextImpl* GetPaymentAppContext();
-  BroadcastChannelProvider* GetBroadcastChannelProvider();
-  BluetoothAllowedDevicesMap* GetBluetoothAllowedDevicesMap();
-  BlobURLLoaderFactory* GetBlobURLLoaderFactory();
-  BlobRegistryWrapper* GetBlobRegistry();
+  BackgroundFetchContext* GetBackgroundFetchContext() override;
+  BackgroundSyncContext* GetBackgroundSyncContext() override;
+  PaymentAppContextImpl* GetPaymentAppContext() override;
+  BroadcastChannelProvider* GetBroadcastChannelProvider() override;
+  BluetoothAllowedDevicesMap* GetBluetoothAllowedDevicesMap() override;
+  BlobURLLoaderFactory* GetBlobURLLoaderFactory() override;
+  BlobRegistryWrapper* GetBlobRegistry() override;
 
   // mojom::StoragePartitionService interface.
   void OpenLocalStorage(
@@ -136,18 +136,18 @@ class CONTENT_EXPORT StoragePartitionImpl
       const url::Origin& origin,
       mojo::InterfaceRequest<mojom::LevelDBWrapper> 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_; }
 
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 8996f11d328e..75b658f5a2d2 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/network_service.mojom.h"
@@ -296,9 +296,8 @@ class WebUIURLLoaderFactory : public 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 f75be61ccdef..84f1063fb081 100644
--- content/public/browser/browser_context.h
+++ content/public/browser/browser_context.h
@@ -200,6 +200,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.
@@ -288,6 +290,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 fa9a14e82472..7ed0814308aa 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/url_loader_factory.mojom.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
 #include "net/cookies/cookie_store.h"
 
 class GURL;
@@ -42,12 +43,20 @@ 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 PaymentAppContextImpl;
 class PlatformNotificationContext;
 class ServiceWorkerContext;
+class URLLoaderFactoryGetter;
 
 #if !defined(OS_ANDROID)
 class HostZoomLevelContext;
@@ -60,6 +69,11 @@ class NetworkContext;
 class URLLoaderFactory;
 }
 
+namespace mojom {
+class NetworkContext;
+class StoragePartitionService;
+}
+
 // Defines what persistent state a child process can access.
 //
 // The StoragePartition defines the view each child process has of the
@@ -92,6 +106,13 @@ class CONTENT_EXPORT StoragePartition {
   virtual ZoomLevelDelegate* GetZoomLevelDelegate() = 0;
 #endif  // !defined(OS_ANDROID)
   virtual PlatformNotificationContext* GetPlatformNotificationContext() = 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;
 
   enum : uint32_t {
     REMOVE_DATA_MASK_APPCACHE = 1 << 0,
@@ -200,6 +221,14 @@ class CONTENT_EXPORT StoragePartition {
   virtual void SetNetworkFactoryForTesting(
       mojom::URLLoaderFactory* test_factory) = 0;
 
+  virtual URLLoaderFactoryGetter* url_loader_factory_getter() = 0;
+  virtual BrowserContext* browser_context() const = 0;
+
+  // Called by each renderer process once.
+  virtual mojo::BindingId Bind(
+      int process_id,
+      mojo::InterfaceRequest<mojom::StoragePartitionService> request) = 0;
+
  protected:
   virtual ~StoragePartition() {}
 };
diff --git storage/browser/database/database_tracker.cc storage/browser/database/database_tracker.cc
index e4ee15fd49ab..5adc8867d6df 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))) &&