diff --git a/core/lib/Drupal/Core/Config/CachedStorage.php b/core/lib/Drupal/Core/Config/CachedStorage.php
index 7d094b4..8a2844f 100644
--- a/core/lib/Drupal/Core/Config/CachedStorage.php
+++ b/core/lib/Drupal/Core/Config/CachedStorage.php
@@ -92,6 +92,10 @@ public function write($name, array $data) {
     return FALSE;
   }
 
+  public function getCache() {
+    return $this->cache;
+  }
+
   /**
    * Implements Drupal\Core\Config\StorageInterface::delete().
    */
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index 00d9773..69cc025 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -45,6 +45,10 @@ class ConfigFactory {
    */
   protected $cache = array();
 
+  protected $storageCache;
+
+  protected $preloadCids = array();
+
   /**
    * Constructs the Config factory.
    *
@@ -57,6 +61,19 @@ class ConfigFactory {
   public function __construct(StorageInterface $storage, EventDispatcher $event_dispatcher) {
     $this->storage = $storage;
     $this->eventDispatcher = $event_dispatcher;
+
+    if ($this->storage instanceof CachedStorage) {
+      $this->storageCache = $this->storage->getCache();
+      if ($preloadCidsCache = $this->storageCache->get('config:preload:cids')) {
+        $this->preloadCids = $preloadCidsCache->data;
+        $this->loadedCids = $this->preloadCids;
+        foreach ($this->storageCache->getMultiple($this->preloadCids) as $name => $cacheItem) {
+          $this->cache[$name] = new Config($name, $this->storage, $this->eventDispatcher);
+          $this->cache[$name]->init();
+          $this->cache[$name]->setData($cacheItem->data);
+        }
+      }
+    }
   }
 
   /**
@@ -72,6 +89,7 @@ public function get($name) {
     if (isset($this->cache[$name])) {
       return $this->cache[$name];
     }
+    $this->preloadCids[] = $name;
 
     $this->cache[$name] = new Config($name, $this->storage, $this->eventDispatcher);
     return $this->cache[$name]->init();
@@ -118,4 +136,11 @@ public function rename($old_name, $new_name) {
       $this->cache[$new_name] = $config;
     }
   }
+
+  public function __destruct() {
+    if ($this->preloadCids !== $this->loadedCids && $this->storageCache) {
+      $this->storageCache->set('config:preload:cids', $this->preloadCids);
+    }
+  }
 }
+
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index ff48b04..263ede7 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -38,6 +38,7 @@ public function build(ContainerBuilder $container) {
     $container
       ->register('config.cachedstorage.storage', 'Drupal\Core\Config\FileStorage')
       ->addArgument(config_get_config_directory(CONFIG_ACTIVE_DIRECTORY));
+
     // @todo Replace this with a cache.factory service plus 'config' argument.
     $container
       ->register('cache.config', 'Drupal\Core\Cache\CacheBackendInterface')
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 8c7d72a..bae5ad2 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -669,6 +669,8 @@ function system_schema() {
   $schema['cache_bootstrap']['description'] = 'Cache table for data required to bootstrap Drupal, may be routed to a shared memory cache.';
   $schema['cache_config'] = $schema['cache'];
   $schema['cache_config']['description'] = 'Cache table for configuration data.';
+  $schema['cache_config_preload'] = $schema['cache'];
+  $schema['cache_config_preload']['description'] = 'Cache table for preload configuration data.';
   $schema['cache_form'] = $schema['cache'];
   $schema['cache_form']['description'] = 'Cache table for the form system to store recently built forms and their storage data, to be used in subsequent page requests.';
   $schema['cache_page'] = $schema['cache'];
