diff --git a/core/includes/config.inc b/core/includes/config.inc
index 78d12e8..7f866a3 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -1,6 +1,8 @@
 <?php
 
+use Drupal\Core\Config\ConfigStore;
 use Drupal\Core\Config\DatabaseStorage;
+use Drupal\Core\Config\FileStorage;
 
 /**
  * @file
@@ -48,8 +50,8 @@ function config_install_default_config($module) {
       $file = array_pop($parts);
       $config_name = str_replace('.xml', '', $file);
 
-      $storage = new DatabaseStorage($config_name);
-      $storage->write(file_get_contents($module_config_dir . '/' . $file));
+      $store = new ConfigStore($config_name);
+      $store->write(config_decode(file_get_contents($module_config_dir . '/' . $file)));
     }
   }
 }
@@ -72,11 +74,7 @@ function config_install_default_config($module) {
  *   An array of file names under a branch.
  */
 function config_get_files_with_prefix($prefix = '') {
-  $files = glob(config_get_config_directory() . '/' . $prefix . '*.xml');
-  $clean_name = function ($value) {
-    return basename($value, '.xml');
-  };
-  return array_map($clean_name, $files);
+  return FileStorage::getNamesWithPrefix($prefix, config_get_config_directory());
 }
 
 /**
@@ -114,7 +112,7 @@ function config_get_storage_names_with_prefix($prefix = '') {
  *   alternate storage engines..
  */
 function config($name, $class = 'Drupal\Core\Config\DrupalConfig') {
-  return new $class(new DatabaseStorage($name));
+  return new $class(new ConfigStore($name));
 }
 
 /**
diff --git a/core/lib/Drupal/Core/Config/ConfigStore.php b/core/lib/Drupal/Core/Config/ConfigStore.php
new file mode 100644
index 0000000..2b99d9b
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigStore.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace Drupal\Core\Config;
+
+use Drupal\Core\Config\ConfigStoreInterface;
+use Drupal\Core\Config\FileStorage;
+use Drupal\Core\Config\DatabaseStorage;
+
+/**
+ * @todo
+ */
+class ConfigStore implements ConfigStoreInterface {
+
+  protected $name;
+
+  /**
+   * The local file object to read from and write to.
+   *
+   * @var Drupal\Core\Config\FileStorage
+   */
+  protected $fileStorage;
+
+  /**
+   * The local file object to read from and write to.
+   *
+   * @var Drupal\Core\Config\DatabaseStorage
+   */
+  protected $databaseStorage;
+
+  /**
+   * Implements StorageInterface::__construct().
+   */
+  function __construct($name) {
+    $this->name = $name;
+  }
+
+  /**
+   * 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;
+  }
+
+  /**
+   * Instantiates a new database storage object or returns the existing one.
+   *
+   * @return Drupal\Core\Config\DatabaseStorage
+   *   The database object for this configuration object.
+   */
+  protected function databaseStorage() {
+    if (!isset($this->databaseStorage)) {
+      $this->databaseStorage = new DatabaseStorage($this->name);
+    }
+    return $this->databaseStorage;
+  }
+
+  /**
+   * Implements StorageInterface::copyToFile().
+   */
+  public function copyToFile() {
+    return $this->fileStorage()->write($this->databaseStorage()->read());
+  }
+
+  /**
+   * Implements StorageInterface::copyFromFile().
+   */
+  public function copyFromFile() {
+    return $this->databaseStorage()->write($this->fileStorage()->read());
+  }
+
+  /**
+   * Implements StorageInterface::isOutOfSync().
+   */
+  public function isOutOfSync() {
+    return (boolean) array_diff(
+      $this->fileStorage()->read(),
+      $this->databaseStorage()->read()
+    );
+  }
+
+  /**
+   * Implements StorageInterface::read().
+   */
+  public function read() {
+    return $this->databaseStorage()->read();
+  }
+
+  /**
+   * Implements StorageInterface::write().
+   */
+  public function write($data) {
+    $this->databaseStorage()->write($data);
+    $this->fileStorage()->write($data);
+  }
+
+  /**
+   * Implements StorageInterface::delete().
+   */
+  public function delete() {
+    $this->databaseStorage()->delete();
+    $this->fileStorage()->delete();
+  }
+
+  /**
+   * Implements StorageInterface::getName().
+   */
+  public function getName() {
+    return $this->name;
+  }
+}
diff --git a/core/lib/Drupal/Core/Config/ConfigStoreInterface.php b/core/lib/Drupal/Core/Config/ConfigStoreInterface.php
new file mode 100644
index 0000000..e3caa88
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigStoreInterface.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Drupal\Core\Config;
+use Drupal\Core\Config\StorageInterface;
+
+/**
+ * Defines an interface for configuration storage manipulation.
+ *
+ * This class allows reading and writing configuration data from/to the
+ * active and file storage.
+ */
+interface ConfigStoreInterface {
+
+  /**
+   * Constructs a storage manipulation class.
+   *
+   * @param $name
+   *   Lowercase string, the name for the configuration data.
+   */
+  function __construct($name);
+
+  /**
+   * Reads the configuration data from the storage.
+   */
+  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();
+
+  /**
+   * 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
+   *   The configuration data to write.
+   */
+  function write($data);
+
+  /**
+   * Gets the name of this object.
+   */
+  public function getName();
+}
diff --git a/core/lib/Drupal/Core/Config/DatabaseStorage.php b/core/lib/Drupal/Core/Config/DatabaseStorage.php
index 63ae7b4..0eaa6bc 100644
--- a/core/lib/Drupal/Core/Config/DatabaseStorage.php
+++ b/core/lib/Drupal/Core/Config/DatabaseStorage.php
@@ -2,49 +2,84 @@
 
 namespace Drupal\Core\Config;
 
-use Drupal\Core\Config\StorageBase;
+use Drupal\Core\Config\StorageInterface;
 use Exception;
 
 /**
  * Represents an SQL-based configuration storage object.
  */
-class DatabaseStorage extends StorageBase {
+class DatabaseStorage implements StorageInterface {
 
   /**
-   * Overrides StorageBase::read().
+   * Constructs a DatabaseStorage object.
+   *
+   * @param string $name
+   *   The name for the configuration data. Should be lowercase.
+   */
+  public function __construct($name) {
+    $this->name = $name;
+  }
+
+  /**
+   * @todo.
    */
   public function read() {
     // There are situations, like in the installer, where we may attempt a
     // read without actually having the database available. In this case,
     // catch the exception and just return an empty array so the caller can
     // handle it if need be.
+    $data = array();
     try {
-      return db_query('SELECT data FROM {config} WHERE name = :name', array(':name' => $this->name))->fetchField();
+      $datastring = db_query('SELECT data FROM {config} WHERE name = :name', array(':name' => $this->name))->fetchField();
+      if ($datastring) {
+        $data = $this->decode($datastring);
+      }
     } catch (Exception $e) {
-      return array();
     }
+    return $data;
   }
 
   /**
    * Implements StorageInterface::writeToActive().
    */
-  public function writeToActive($data) {
+  public function write($data) {
     return db_merge('config')
       ->key(array('name' => $this->name))
-      ->fields(array('data' => $data))
+      ->fields(array('data' => $this->encode($data)))
       ->execute();
   }
 
   /**
    * @todo
    */
-  public function deleteFromActive() {
+  public function delete() {
     db_delete('config')
       ->condition('name', $this->name)
       ->execute();
   }
 
   /**
+   * @todo
+   */
+  public function encode($data) {
+    return serialize($data);
+  }
+
+  /**
+   * @todo
+   */
+  public function decode($data) {
+    return unserialize($data);
+  }
+
+  /**
+   * Implements StorageInterface::getName().
+   */
+  public function getName() {
+    return $this->name;
+  }
+
+  /**
    * Implements StorageInterface::getNamesWithPrefix().
    */
   static public function getNamesWithPrefix($prefix = '') {
diff --git a/core/lib/Drupal/Core/Config/DrupalConfig.php b/core/lib/Drupal/Core/Config/DrupalConfig.php
index c405757..d246c6c 100644
--- a/core/lib/Drupal/Core/Config/DrupalConfig.php
+++ b/core/lib/Drupal/Core/Config/DrupalConfig.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Core\Config;
 
-use Drupal\Core\Config\StorageInterface;
+use Drupal\Core\Config\ConfigStoreInterface;
 use Drupal\Core\Config\ConfigException;
 
 /**
@@ -27,7 +27,7 @@ class DrupalConfig {
    *
    * @todo $this should really know about $name and make it publicly accessible.
    */
-  public function __construct(StorageInterface $storage) {
+  public function __construct(ConfigStoreInterface $storage) {
     $this->storage = $storage;
     $this->read();
   }
@@ -36,7 +36,7 @@ class DrupalConfig {
    * Reads config data from the active store into our object.
    */
   public function read() {
-    $active = (array) config_decode($this->storage->read());
+    $active = (array) $this->storage->read();
     foreach ($active as $key => $value) {
       // If the setting is empty, return an empty string rather than an array.
       // This is necessary because SimpleXML's default behavior is to return
@@ -201,7 +201,7 @@ class DrupalConfig {
    * Saves the configuration object to disk as XML.
    */
   public function save() {
-    $this->storage->write(config_encode($this->data));
+    $this->storage->write($this->data);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Config/FileStorage.php b/core/lib/Drupal/Core/Config/FileStorage.php
index e65e168..c4806e6 100644
--- a/core/lib/Drupal/Core/Config/FileStorage.php
+++ b/core/lib/Drupal/Core/Config/FileStorage.php
@@ -1,6 +1,7 @@
 <?php
 
 namespace Drupal\Core\Config;
+use Drupal\Core\Config\StorageInterface;
 
 /**
  * Represents the file storage interface.
@@ -8,7 +9,7 @@ namespace Drupal\Core\Config;
  * Classes implementing this interface allow reading and writing configuration
  * data to and from disk.
  */
-class FileStorage {
+class FileStorage implements StorageInterface {
 
   /**
    * Constructs a FileStorage object.
@@ -67,7 +68,7 @@ class FileStorage {
    *   Exception
    */
   public function write($data) {
-    if (!file_put_contents($this->getFilePath(), $data)) {
+    if (!file_put_contents($this->getFilePath(), $this->encode($data))) {
       throw new FileStorageException('Failed to write configuration file: ' . $this->getFilePath());
     }
   }
@@ -81,7 +82,7 @@ class FileStorage {
   public function read() {
     if ($this->exists()) {
       $data = $this->readData();
-      return $data;
+      return $this->decode($data);
     }
     return FALSE;
   }
@@ -93,4 +94,30 @@ class FileStorage {
     // Needs error handling and etc.
     @drupal_unlink($this->getFilePath());
   }
+
+  public function encode($data) {
+    return config_encode($data);
+  }
+
+  public function decode($data) {
+    return config_decode($data);
+  }
+
+  /**
+   * Implements StorageInterface::getName().
+   */
+  public function getName() {
+    return $this->name;
+  }
+
+  /**
+   * Implements StorageInterface::getNamesWithPrefix().
+   */
+  static public function getNamesWithPrefix($prefix = '', $directory = '') {
+    $files = glob($directory . '/' . $prefix . '*.xml');
+    $clean_name = function ($value) {
+      return basename($value, '.xml');
+    };
+    return array_map($clean_name, $files);
+  }
 }
diff --git a/core/lib/Drupal/Core/Config/StorageBase.php b/core/lib/Drupal/Core/Config/StorageBase.php
deleted file mode 100644
index 7846aed..0000000
--- a/core/lib/Drupal/Core/Config/StorageBase.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-namespace Drupal\Core\Config;
-
-use Drupal\Core\Config\StorageInterface;
-use Drupal\Core\Config\FileStorage;
-
-/**
- * @todo
- */
-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) {
-    $this->name = $name;
-  }
-
-  /**
-   * 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() {
-    return $this->name;
-  }
-}
diff --git a/core/lib/Drupal/Core/Config/StorageInterface.php b/core/lib/Drupal/Core/Config/StorageInterface.php
index f1e8a3d..5cdd56a 100644
--- a/core/lib/Drupal/Core/Config/StorageInterface.php
+++ b/core/lib/Drupal/Core/Config/StorageInterface.php
@@ -6,7 +6,7 @@ namespace Drupal\Core\Config;
  * Defines an interface for configuration storage manipulation.
  *
  * This class allows reading and writing configuration data from/to the
- * storage and copying to/from the file storing the same data.
+ * storage.
  */
 interface StorageInterface {
 
@@ -24,31 +24,7 @@ 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.
+   * Writes the configuration object into the storage.
    *
    * @param $data
    *   The configuration data to write.
@@ -56,23 +32,25 @@ 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.
+   * Deletes the configuration object from the storage.
+   */
+  function delete();
+
+  /**
+   * Encodes the configuration data into the active storage and the file.
    *
    * @param $data
-   *   The configuration data to write into active storage.
+   *   The configuration data to write.
    */
-  function writeToActive($data);
+  function encode($data);
 
   /**
-   * Writes the configuration data into the file.
+   * Encodes the configuration data into the active storage and the file.
    *
    * @param $data
-   *   The configuration data to write into the file.
+   *   The configuration data to write.
    */
-  function writeToFile($data);
+  function decode($data);
 
   /**
    * Gets names starting with this prefix.
diff --git a/core/modules/config/config.test b/core/modules/config/config.test
index f69dde9..3338f43 100644
--- a/core/modules/config/config.test
+++ b/core/modules/config/config.test
@@ -14,7 +14,7 @@ use Drupal\simpletest\WebTestBase;
 class ConfigFileSecurityTestCase extends WebTestBase {
   protected $filename = 'foo.bar';
 
-  protected $testContent = 'Good morning, Denver!';
+  protected $testConfigData = array('test' => 'Good morning, Denver!');
 
   public static function getInfo() {
     return array(
@@ -29,7 +29,7 @@ class ConfigFileSecurityTestCase extends WebTestBase {
    */
   function testFilePersist() {
     $file = new FileStorage($this->filename);
-    $file->write($this->testContent);
+    $file->write($this->testConfigData);
 
     unset($file);
 
@@ -40,7 +40,7 @@ class ConfigFileSecurityTestCase extends WebTestBase {
       $file = new FileStorage($this->filename);
       $saved_content = $file->read();
 
-      $this->assertEqual($saved_content, $this->testContent, 'A file can be read back successfully.');
+      $this->assertEqual($saved_content, $this->testConfigData, 'A file can be read back successfully.');
     }
     catch (Exception $e) {
       $this->fail('File failed verification when being read.');
