diff --git a/core/includes/config.inc b/core/includes/config.inc
index 8d0eea1..f40848c 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -1,8 +1,5 @@
 <?php
 
-use Drupal\Core\Config\DatabaseStorage;
-use Drupal\Core\Config\FileStorage;
-
 /**
  * @file
  * This is the API for configuration storage.
@@ -40,17 +37,12 @@ function config_install_default_config($module) {
   $module_config_dir = drupal_get_path('module', $module) . '/config';
   $drupal_config_dir = config_get_config_directory();
   if (is_dir(drupal_get_path('module', $module) . '/config')) {
-    $files = glob($module_config_dir . '/*.' . FileStorage::getFileExtension());
+    $config_store = new Drupal\Core\Config\ConfigStore;
+    $files = glob($module_config_dir . '/*.' . Drupal\Core\Config\FileStorage::getFileExtension());
     foreach ($files as $key => $file) {
-      // Load config data into the active store and write it out to the
-      // file system in the drupal config directory. Note the config name
-      // needs to be the same as the file name WITHOUT the extension.
-      $config_name = basename($file, '.' . FileStorage::getFileExtension());
-
-      $database_storage = new DatabaseStorage($config_name);
-      $file_storage = new FileStorage($config_name);
-      $file_storage->setPath($module_config_dir);
-      $database_storage->write($file_storage->read());
+      // Load config data into the config store. This will write it to the 
+      // cache, database and file storage layers.
+      $config_store->importFile($file);
     }
   }
 }
@@ -59,7 +51,7 @@ function config_install_default_config($module) {
  * @todo http://drupal.org/node/1552396 renames this into config_load_all().
  */
 function config_get_storage_names_with_prefix($prefix = '') {
-  return DatabaseStorage::getNamesWithPrefix($prefix);
+  return Drupal\Core\Config\DatabaseStorage::getNamesWithPrefix($prefix);
 }
 
 /**
@@ -83,6 +75,6 @@ function config_get_storage_names_with_prefix($prefix = '') {
  * @todo Replace this with an appropriate factory / ability to inject in
  *   alternate storage engines..
  */
-function config($name, $class = 'Drupal\Core\Config\DrupalConfig') {
-  return new $class(new DatabaseStorage($name));
+function config($name, $cache_safe = TRUE, $class = 'Drupal\Core\Config\DrupalConfig') {
+  return new $class($name, $cache_safe);
 }
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index 9416548..62f2ff3 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -103,7 +103,7 @@ class DatabaseBackend implements CacheBackendInterface {
     // If the cached data is temporary and subject to a per-user minimum
     // lifetime, compare the cache entry timestamp with the user session
     // cache_expiration timestamp. If the cache entry is too old, ignore it.
-    $config = config('system.performance');
+    $config = config('system.performance', FALSE);
     if ($cache->expire != CACHE_PERMANENT && $config->get('cache_lifetime') && isset($_SESSION['cache_expiration'][$this->bin]) && $_SESSION['cache_expiration'][$this->bin] > $cache->created) {
       // Ignore cache data that is too old and thus not valid for this user.
       return FALSE;
@@ -233,7 +233,7 @@ class DatabaseBackend implements CacheBackendInterface {
    * Implements Drupal\Core\Cache\CacheBackendInterface::garbageCollection().
    */
   function garbageCollection() {
-    $cache_lifetime = config('system.performance')->get('cache_lifetime');
+    $cache_lifetime = config('system.performance', FALSE)->get('cache_lifetime');
 
     // Clean-up the per-user cache expiration session data, so that the session
     // handler can properly clean-up the session data for anonymous users.
diff --git a/core/lib/Drupal/Core/Config/ConfigCacheStorage.php b/core/lib/Drupal/Core/Config/ConfigCacheStorage.php
new file mode 100644
index 0000000..d7b9d8f
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigCacheStorage.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\Core\Config;
+
+use Drupal\Core\Config\StorageBase;
+use Exception;
+
+/**
+ * Represents an cache-based configuration storage object.
+ */
+class ConfigCacheStorage extends StorageBase {
+  /**
+   * Implements StorageInterface::read().
+   */
+  public function read() {
+    $cache = cache('cache_config')->get($this->name);
+    return $cache ? $cache->data : FALSE;
+  }
+
+  /**
+   * Implements StorageInterface::write().
+   */
+  public function write($data) {
+    cache('cache_config')->set($this->name, $data);
+  }
+
+  /**
+   * Implements StorageInterface::delete().
+   */
+  public function delete() {
+    cache('cache_config')->delete($this->name);
+  }
+
+  /**
+   * Implements StorageInterface::encode().
+   */
+  public static function encode($data) {
+    return $data;
+  }
+
+  /**
+   * Implements StorageInterface::decode().
+   */
+  public static function decode($raw) {
+    return $raw;
+  }
+
+  /**
+   * Implements StorageInterface::getNamesWithPrefix().
+   */
+  static public function getNamesWithPrefix($prefix = '') {
+    return db_query('SELECT name FROM {config} WHERE name LIKE :name', array(':name' => db_like($prefix) . '%'))->fetchCol();
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Config/ConfigStore.php b/core/lib/Drupal/Core/Config/ConfigStore.php
new file mode 100644
index 0000000..3515c43
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigStore.php
@@ -0,0 +1,151 @@
+<?php
+
+namespace Drupal\Core\Config;
+
+use Drupal\Core\Config\StorageInterface;
+
+/**
+ * Defines a class for configuration storage manipulation.
+ *
+ * Allows reading and writing configuration data from and to a group of objects
+ * implementing StorageInterface
+ *
+ */
+class ConfigStore {
+  protected $name;
+
+  protected $cache_safe;
+
+  // Storage layers
+  protected $cache;
+  protected $database;
+  protected $file;
+
+  /**
+   * Constructs a ConfigStore.
+   *
+   * @param string $name
+   *   (optional) The name of a configuration object to load.
+   */
+  function __construct($name = NULL, $cache_safe = TRUE) {
+    $this->name = $name;
+    $this->cache_safe = $cache_safe;
+    $class = $this->getStorageClass('ConfigCache');
+    $this->cache = new $class($name);
+  }
+
+  /**
+   * Reads the configuration data from the storage.
+   */
+  function read() {
+    $data = FALSE;
+    if ($this->cache_safe) {
+      $data = $this->cache->read();
+    }
+    // Cache miss
+    if (!$data || !is_array($data) || empty ($data) ) {
+      $this->storageInitialize(array('database'));
+      $data = $this->database->read();
+      if ($this->cache_safe) {
+        $this->cache->write($data);
+      }
+    }
+    return $data;
+  }
+
+  /*
+   * @todo
+   */
+  function copy() {
+  }
+
+  function delete() {
+    $this->storageInitialize();
+    $this->database->delete();
+    $this->cache->delete();
+    $this->file->delete();
+  }
+  /**
+   * Checks whether the file and the storage is in sync.
+   *
+   * @return
+   *   TRUE if the file and the storage contains the same data, FALSE
+   *   if not.
+   */
+  function isOutOfSync(StorageInterface $storage1, StorageInterface $storage2) {
+
+  }
+
+  /**
+   * Writes the configuration data into the active storage and the file.
+   *
+   * @param $data
+   *   The configuration data to write.
+   */
+  function write(Array $data) {
+    $this->storageInitialize();
+    $this->database->write($data);
+    $this->cache->write($data);
+    $this->file->write($data);
+  }
+
+  /*
+   * Imports a file to the config store.
+   */
+  function importFile($path_to_file) {
+    // The config name needs to be the same as the file name WITHOUT the
+    // extension.
+    $config_name = basename($path_to_file, '.' . FileStorage::getFileExtension());
+    $this->setName($config_name);
+
+    // Create a storage object to load the file.
+    $import_storage = new FileStorage($config_name);
+    $import_storage->setPath(dirname($path_to_file));
+    $this->import($import_storage);
+  }
+
+  /*
+   * Imports a storage object to the config store.
+   */
+  function import(StorageInterface $import_storage) {
+    $data = $import_storage->read();
+    $this->write($data);
+  }
+
+  /*
+   * Initialises layers of storage.
+   */
+  public function storageInitialize($storage_layers = array('file', 'database')) {
+    foreach($storage_layers as $storage_layer) {
+      $class = $this->getStorageClass(ucfirst($storage_layer));
+      $this->$storage_layer = new $class($this->name);
+    }
+  }
+
+  function getStorageClass($class_name) {
+    global $conf;
+
+    if (isset($conf['config'][$class_name . 'Class'])) {
+      $class = $conf['config'][$class_name . 'Class'];
+    }
+    else {
+      $class = 'Drupal\Core\Config\\' . $class_name . 'Storage';
+    }
+    return $class;
+  }
+
+  /**
+   * Gets the name of this object.
+   */
+  public function getName() {
+    return $this->name;
+  }
+
+  /**
+   * Sets the name of this object.
+   */
+  public function setName($name) {
+    $this->name = $name;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Config/DatabaseStorage.php b/core/lib/Drupal/Core/Config/DatabaseStorage.php
index c736245..f51761f 100644
--- a/core/lib/Drupal/Core/Config/DatabaseStorage.php
+++ b/core/lib/Drupal/Core/Config/DatabaseStorage.php
@@ -9,7 +9,6 @@ use Exception;
  * Represents an SQL-based configuration storage object.
  */
 class DatabaseStorage extends StorageBase {
-
   /**
    * Implements StorageInterface::read().
    */
@@ -31,9 +30,9 @@ class DatabaseStorage extends StorageBase {
   }
 
   /**
-   * Implements StorageInterface::writeToActive().
+   * Implements StorageInterface::write().
    */
-  public function writeToActive($data) {
+  public function write($data) {
     $data = $this->encode($data);
     return db_merge('config')
       ->key(array('name' => $this->name))
@@ -42,9 +41,9 @@ class DatabaseStorage extends StorageBase {
   }
 
   /**
-   * @todo
+   * Implements StorageInterface::delete().
    */
-  public function deleteFromActive() {
+  public function delete() {
     db_delete('config')
       ->condition('name', $this->name)
       ->execute();
diff --git a/core/lib/Drupal/Core/Config/DrupalConfig.php b/core/lib/Drupal/Core/Config/DrupalConfig.php
index f5a9220..dec2a25 100644
--- a/core/lib/Drupal/Core/Config/DrupalConfig.php
+++ b/core/lib/Drupal/Core/Config/DrupalConfig.php
@@ -2,11 +2,12 @@
 
 namespace Drupal\Core\Config;
 
-use Drupal\Core\Config\StorageInterface;
+use Drupal\Core\Config\ConfigStore;
 use Drupal\Core\Config\ConfigException;
 
 /**
- * Represents the default configuration storage object.
+ * Represents the default configuration object in memory. Uses the ConfigStore
+ * to persist the object to cache, database and file.
  */
 class DrupalConfig {
 
@@ -27,13 +28,13 @@ class DrupalConfig {
   /**
    * Constructs a DrupalConfig object.
    *
-   * @param StorageInterface $storage
-   *   The storage engine where this config object should be saved.
+   * @param string $name
+   *   The name of a configuration object to load.
    *
    * @todo $this should really know about $name and make it publicly accessible.
    */
-  public function __construct(StorageInterface $storage) {
-    $this->storage = $storage;
+  public function __construct($name, $cache_safe = TRUE) {
+    $this->storage = new ConfigStore($name, $cache_safe);
     $this->read();
   }
 
@@ -41,8 +42,11 @@ class DrupalConfig {
    * Reads config data from the active store into our object.
    */
   public function read() {
-    $data = $this->storage->read();
-    $this->setData($data !== FALSE ? $data : array());
+    $this->data = &drupal_static('DrupalConfigStatic-' . $this->storage->getName());
+    if (empty($this->data)) {
+      $data = $this->storage->read();
+      $this->setData($data !== FALSE ? $data : array());
+    }
     return $this;
   }
 
@@ -214,7 +218,7 @@ class DrupalConfig {
    * Deletes the configuration object.
    */
   public function delete() {
-    $this->data = array();
+    $this->data = FALSE;
     $this->storage->delete();
   }
 }
diff --git a/core/lib/Drupal/Core/Config/FileStorage.php b/core/lib/Drupal/Core/Config/FileStorage.php
index 5e2ac1e..3fefb84 100644
--- a/core/lib/Drupal/Core/Config/FileStorage.php
+++ b/core/lib/Drupal/Core/Config/FileStorage.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Config;
 
+use Drupal\Core\Config\StorageBase;
 use Symfony\Component\Yaml\Yaml;
 
 /**
@@ -10,14 +11,7 @@ use Symfony\Component\Yaml\Yaml;
  * @todo Implement StorageInterface after removing DrupalConfig methods.
  * @todo Consider to extend StorageBase.
  */
-class FileStorage {
-
-  /**
-   * The name of the configuration object.
-   *
-   * @var string
-   */
-  protected $name;
+class FileStorage extends StorageBase {
 
   /**
    * The filesystem path containing the configuration object.
@@ -27,13 +21,6 @@ class FileStorage {
   protected $path;
 
   /**
-   * Implements StorageInterface::__construct().
-   */
-  public function __construct($name = NULL) {
-    $this->name = $name;
-  }
-
-  /**
    * Returns the path containing the configuration file.
    *
    * @return string
@@ -144,20 +131,6 @@ class FileStorage {
   }
 
   /**
-   * Implements StorageInterface::getName().
-   */
-  public function getName() {
-    return $this->name;
-  }
-
-  /**
-   * Implements StorageInterface::setName().
-   */
-  public function setName($name) {
-    $this->name = $name;
-  }
-
-  /**
    * Implements StorageInterface::getNamesWithPrefix().
    */
   public static function getNamesWithPrefix($prefix = '') {
diff --git a/core/lib/Drupal/Core/Config/StorageBase.php b/core/lib/Drupal/Core/Config/StorageBase.php
index b03ff27..6d95830 100644
--- a/core/lib/Drupal/Core/Config/StorageBase.php
+++ b/core/lib/Drupal/Core/Config/StorageBase.php
@@ -3,13 +3,12 @@
 namespace Drupal\Core\Config;
 
 use Drupal\Core\Config\StorageInterface;
-use Drupal\Core\Config\FileStorage;
+use Exception;
 
 /**
- * Base class for configuration storage controllers.
+ * Represents an SQL-based configuration storage object.
  */
 abstract class StorageBase implements StorageInterface {
-
   /**
    * The name of the configuration object.
    *
@@ -18,13 +17,6 @@ abstract class StorageBase implements StorageInterface {
   protected $name;
 
   /**
-   * The local file object to read from and write to.
-   *
-   * @var Drupal\Core\Config\FileStorage
-   */
-  protected $fileStorage;
-
-  /**
    * Implements StorageInterface::__construct().
    */
   function __construct($name = NULL) {
@@ -32,80 +24,6 @@ abstract class StorageBase implements StorageInterface {
   }
 
   /**
-   * Instantiates a new file storage object or returns the existing one.
-   *
-   * @return Drupal\Core\Config\FileStorage
-   *   The file object for this configuration object.
-   */
-  protected function fileStorage() {
-    if (!isset($this->fileStorage)) {
-      $this->fileStorage = new FileStorage($this->name);
-    }
-    return $this->fileStorage;
-  }
-
-  /**
-   * Implements StorageInterface::copyToFile().
-   */
-  public function copyToFile() {
-    return $this->writeToFile($this->read());
-  }
-
-  /**
-   * Implements StorageInterface::deleteFile().
-   */
-  public function deleteFile() {
-    return $this->fileStorage()->delete();
-  }
-
-  /**
-   * Implements StorageInterface::copyFromFile().
-   */
-  public function copyFromFile() {
-    return $this->writeToActive($this->readFromFile());
-  }
-
-  /**
-   * @todo
-   *
-   * @return
-   *   @todo
-   */
-  public function readFromFile() {
-    return $this->fileStorage()->read($this->name);
-  }
-
-  /**
-   * Implements StorageInterface::isOutOfSync().
-   */
-  public function isOutOfSync() {
-    return $this->read() !== $this->readFromFile();
-  }
-
-  /**
-   * Implements StorageInterface::write().
-   */
-  public function write($data) {
-    $this->writeToActive($data);
-    $this->writeToFile($data);
-  }
-
-  /**
-   * Implements StorageInterface::writeToFile().
-   */
-  public function writeToFile($data) {
-    return $this->fileStorage()->write($data);
-  }
-
-  /**
-   * Implements StorageInterface::delete().
-   */
-  public function delete() {
-    $this->deleteFromActive();
-    $this->deleteFile();
-  }
-
-  /**
    * Implements StorageInterface::getName().
    */
   public function getName() {
diff --git a/core/lib/Drupal/Core/Config/StorageInterface.php b/core/lib/Drupal/Core/Config/StorageInterface.php
index 43141a5..201d11e 100644
--- a/core/lib/Drupal/Core/Config/StorageInterface.php
+++ b/core/lib/Drupal/Core/Config/StorageInterface.php
@@ -26,30 +26,6 @@ interface StorageInterface {
   function read();
 
   /**
-   * Copies the configuration data from the storage into a file.
-   */
-  function copyToFile();
-
-  /**
-   * Copies the configuration data from the file into the storage.
-   */
-  function copyFromFile();
-
-  /**
-   * Deletes the configuration data file.
-   */
-  function deleteFile();
-
-  /**
-   * Checks whether the file and the storage is in sync.
-   *
-   * @return
-   *   TRUE if the file and the storage contains the same data, FALSE
-   *   if not.
-   */
-  function isOutOfSync();
-
-  /**
    * Writes the configuration data into the active storage and the file.
    *
    * @param $data
@@ -58,25 +34,6 @@ interface StorageInterface {
   function write($data);
 
   /**
-   * Writes the configuration data into the active storage but not the file.
-   *
-   * Use this function if you need to make temporary changes to your
-   * configuration.
-   *
-   * @param $data
-   *   The configuration data to write into active storage.
-   */
-  function writeToActive($data);
-
-  /**
-   * Writes the configuration data into the file.
-   *
-   * @param $data
-   *   The configuration data to write into the file.
-   */
-  function writeToFile($data);
-
-  /**
    * Encodes configuration data into the storage-specific format.
    *
    * @param array $data
diff --git a/core/modules/image/image.test b/core/modules/image/image.test
index f9a4ec1..19a2892 100644
--- a/core/modules/image/image.test
+++ b/core/modules/image/image.test
@@ -537,6 +537,7 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase {
     $this->assertFalse(is_dir($directory), t('Image style %style directory removed on style deletion.', array('%style' => $style['name'])));
 
     drupal_static_reset('image_styles');
+    drupal_static_reset('DrupalConfigStatic-' . 'image.style.' . $style_name);
     $this->assertFalse(image_style_load($style_name), t('Image style %style successfully deleted.', array('%style' => $style['name'])));
 
   }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 199f8c0..745f412 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -738,6 +738,8 @@ function system_schema() {
   );
   $schema['cache_bootstrap'] = $schema['cache'];
   $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 config.';
   $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'];
@@ -1888,6 +1890,15 @@ function system_update_8010() {
 }
 
 /**
+ * Moves system settings from variable to config.
+ */
+function system_update_8011() {
+  $cache_config_schema = drupal_get_schema_unprocessed('system', 'cache');
+  $cache_config_schema['description'] = 'Cache table for config.';
+  db_create_table('cache_config', $cache_config_schema);
+}
+
+/**
  * @} End of "defgroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
