diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 32ce838..76d6f72 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -1070,6 +1070,17 @@ function install_settings_form_submit($form, &$form_state) {
     'value'     => $config_directory_name ? $config_directory_name : 'config_' . drupal_hash_base64(drupal_random_bytes(55)),
     'required'  => TRUE,
   );
+  $settings['config'] = array(
+    'value' => array(
+      'storages' => array(
+        'Drupal\Core\Config\DatabaseStorage' => array(
+          'target' => 'default',
+          'weight' => 0,
+        ),
+      ),
+    ),
+    'required' => TRUE,
+  );
 
   drupal_rewrite_settings($settings);
 
diff --git a/core/lib/Drupal/Core/Config/ConfStorage.php b/core/lib/Drupal/Core/Config/ConfStorage.php
new file mode 100644
index 0000000..d63d3ef
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfStorage.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Config\DatabaseStorage.
+ */
+
+namespace Drupal\Core\Config;
+
+/**
+ * Defines the Conf storage controller.
+ */
+class ConfStorage implements StorageInterface {
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::__construct().
+   */
+  public function __construct(array $options = array()) {
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::read().
+   *
+   * @throws PDOException
+   * @throws Drupal\Core\Database\DatabaseExceptionWrapper
+   *   Only thrown in case $this->options['throw_exception'] is TRUE.
+   */
+  public function read($name) {
+    return isset($GLOBALS['conf'][$name]) && is_array($GLOBALS['conf'][$name]) ? $GLOBALS['conf'][$name] : FALSE;
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::write().
+   *
+   * @throws PDOException
+   *
+   * @todo Ignore slave targets for data manipulation operations.
+   */
+  public function write($name, array $data) {
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::delete().
+   *
+   * @throws PDOException
+   *
+   * @todo Ignore slave targets for data manipulation operations.
+   */
+  public function delete($name) {
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::encode().
+   */
+  public static function encode($data) {
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::decode().
+   *
+   * @throws ErrorException
+   *   unserialize() triggers E_NOTICE if the string cannot be unserialized.
+   */
+  public static function decode($raw) {
+  }
+
+  /**
+   * Implements Drupal\Core\Config\StorageInterface::listAll().
+   *
+   * @throws PDOException
+   * @throws Drupal\Core\Database\DatabaseExceptionWrapper
+   *   Only thrown in case $this->options['throw_exception'] is TRUE.
+   */
+  public function listAll($prefix = '') {
+    $n = strlen($prefix);
+    $list = array();
+    foreach ($GLOBALS['conf'] as $key => $value) {
+      if ((!$n || substr($key, 0, $prefix) == $prefix) && is_array($value)) {
+        $list[] = $key;
+      }
+    }
+    return $list;
+  }
+}
diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index a749a4b..345efad 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -101,27 +101,19 @@ class Config {
    *   The data that was requested.
    */
   public function get($key = '') {
-    global $conf;
-
     $name = $this->getName();
-    if (isset($conf[$name])) {
-      $merged_data = drupal_array_merge_deep($this->data, $conf[$name]);
-    }
-    else {
-      $merged_data = $this->data;
-    }
 
     if (empty($key)) {
-      return $merged_data;
+      return $this->data;
     }
     else {
       $parts = explode('.', $key);
       if (count($parts) == 1) {
-        return isset($merged_data[$key]) ? $merged_data[$key] : NULL;
+        return isset($this->data[$key]) ? $this->data[$key] : NULL;
       }
       else {
         $key_exists = NULL;
-        $value = drupal_array_get_nested_value($merged_data, $parts, $key_exists);
+        $value = drupal_array_get_nested_value($this->data, $parts, $key_exists);
         return $key_exists ? $value : NULL;
       }
     }
@@ -222,7 +214,7 @@ class Config {
    * Loads configuration data into this object.
    */
   public function load() {
-    $data = $this->storageDispatcher->selectStorage('read', $this->name)->read($this->name);
+    $data = $this->storageDispatcher->read($this->name);
     if ($data === FALSE) {
       $this->isNew = TRUE;
       $this->setData(array());
@@ -239,7 +231,7 @@ class Config {
    */
   public function save() {
     $this->sortByKey($this->data);
-    $this->storageDispatcher->selectStorage('write', $this->name)->write($this->name, $this->data);
+    $this->storageDispatcher->write($this->name, $this->data);
     $this->isNew = FALSE;
     return $this;
   }
@@ -269,7 +261,7 @@ class Config {
    */
   public function delete() {
     $this->data = array();
-    $this->storageDispatcher->selectStorage('write', $this->name)->delete($this->name);
+    $this->storageDispatcher->delete($this->name);
     $this->isNew = TRUE;
     return $this;
   }
diff --git a/core/lib/Drupal/Core/Config/StorageDispatcher.php b/core/lib/Drupal/Core/Config/StorageDispatcher.php
index ebf7049..d64b68c 100644
--- a/core/lib/Drupal/Core/Config/StorageDispatcher.php
+++ b/core/lib/Drupal/Core/Config/StorageDispatcher.php
@@ -14,10 +14,7 @@ namespace Drupal\Core\Config;
  * within a single request or context. Special use-cases, such as import and
  * export operations, should instantiate a custom storage dispatcher tailored
  * to their specific needs.
- *
- * The storage dispatcher instantiates storage controllers on demand, and only
- * once per storage.
- *
+ * *
  * @see Drupal\Core\Config\StorageInterface
  */
 class StorageDispatcher {
@@ -61,45 +58,55 @@ class StorageDispatcher {
    */
   public function __construct(array $storage_info) {
     $this->storageInfo = $storage_info;
+    $this->instantiateStorages();
+    foreach ($this->storageInfo as $class => $storage_config) {
+      $sort[$class] = $storage_config['weight'];
+    }
+    array_multisort($sort, SORT_NUMERIC, $this->storageInstances);
   }
 
-  /**
-   * Returns a storage controller to use for a given operation.
-   *
-   * Handles the core functionality of the storage dispatcher by determining
-   * which storage can handle a particular storage access operation and
-   * configuration object.
-   *
-   * @param string $access_operation
-   *   The operation access level; either 'read' or 'write'. Use 'write' both
-   *   for saving and deleting configuration.
-   * @param string $name
-   *   The name of the configuration object that is operated on.
-   *
-   * @return Drupal\Core\Config\StorageInterface
-   *   The storage controller instance that can handle the requested operation.
-   *
-   * @throws Drupal\Core\Config\ConfigException
-   *
-   * @todo Allow write operations to write to multiple storages.
-   */
-  public function selectStorage($access_operation, $name) {
-    // Determine the appropriate storage controller to use.
-    // Take the first defined storage that allows $op.
+  function instantiateStorages() {
+    $recurse = FALSE;
     foreach ($this->storageInfo as $class => $storage_config) {
-      if (!empty($storage_config[$access_operation])) {
-        $storage_class = $class;
-        break;
+      if (!isset($this->storageInstances[$class])) {
+        $storage = new $class($storage_config);
+        $this->storageInstances[$class] = $storage;
+        $config = $storage->read('config');
+        if (isset($config['storages'])) {
+          $recurse = TRUE;
+          $this->storageInfo += $config['storages'];
+        }
       }
     }
-    if (!isset($storage_class)) {
-      throw new ConfigException("Failed to find storage controller that allows $access_operation access for $name.");
+    if ($recurse) {
+      $this->instantiateStorages();
     }
+  }
 
-    // Instantiate a new storage controller object, if there is none yet.
-    if (!isset($this->storageInstances[$storage_class])) {
-      $this->storageInstances[$storage_class] = new $storage_class($this->storageInfo[$storage_class]);
+  function read($name) {
+    $result = FALSE;
+    foreach ($this->storageInstances as $storage) {
+      $current = $storage->read($name);
+      if ($current !== FALSE) {
+        // This is the first time a storage actually found the name.
+        if ($result === FALSE) {
+          $result = $current;
+        }
+        else {
+          $result = drupal_array_merge_deep($result, $current);
+        }
+      }
+    }
+    return $result;
+  }
+  function write($name, $data) {
+    foreach ($this->storageInstances as $storage) {
+      $storage->write($name, $data);
+    }
+  }
+  function delete($name) {
+    foreach ($this->storageInstances as $storage) {
+      $storage->delete($name);
     }
-    return $this->storageInstances[$storage_class];
   }
 }
diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
index a82f5b6..4de84b1 100644
--- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
+++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
@@ -45,16 +45,9 @@ class ContainerBuilder extends BaseContainerBuilder {
 
     // Register configuration storage dispatcher.
     $this->setParameter('config.storage.info', array(
-      'Drupal\Core\Config\DatabaseStorage' => array(
-        'connection' => 'default',
-        'target' => 'default',
-        'read' => TRUE,
-        'write' => TRUE,
-      ),
-      'Drupal\Core\Config\FileStorage' => array(
-        'directory' => config_get_config_directory(),
-        'read' => TRUE,
-        'write' => FALSE,
+      'Drupal\Core\Config\ConfStorage' => array(
+        // The config storage always wins.
+        'weight' => PHP_INT_MAX,
       ),
     ));
     $this->register('config.storage.dispatcher', 'Drupal\Core\Config\StorageDispatcher')
