diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 86fe8c6..e33c291 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -312,6 +312,7 @@ function install_begin_request(&$install_state) {
   require_once __DIR__ . '/common.inc';
   require_once __DIR__ . '/file.inc';
   require_once __DIR__ . '/install.inc';
+  require_once __DIR__ . '/theme.inc';
   require_once __DIR__ . '/schema.inc';
   require_once __DIR__ . '/../../' . settings()->get('path_inc', 'core/includes/path.inc');
 
diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index 02afbd1..5d2d3fe 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -54,7 +54,9 @@ class Config {
    *
    * @var array
    */
-  protected $overriddenData;
+  protected $overriddenData = array();
+
+  protected $overrides;
 
   /**
    * The storage used to load and save this configuration object.
@@ -88,42 +90,14 @@ class Config {
    * @param \Drupal\Core\Config\Context\ContextInterface $context
    *   The configuration context used for this configuration object.
    */
-  public function __construct($name, StorageInterface $storage, ContextInterface $context) {
+  public function __construct($name, StorageInterface $storage, ContextInterface $context, array $data = NULL, array $overrides = NULL) {
     $this->name = $name;
+    $this->isNew = is_null($data);
+    $this->data = $data ?: array();
+    $this->overrides = $overrides ?: array();
     $this->storage = $storage;
     $this->context = $context;
-  }
-
-  /**
-   * Initializes a configuration object.
-   *
-   * @return Drupal\Core\Config\Config
-   *   The configuration object.
-   */
-  public function init() {
-    $this->isLoaded = FALSE;
-    $this->overrides = array();
-    $this->notify('init');
-    return $this;
-  }
-
-  /**
-   * Initializes a configuration object with pre-loaded data.
-   *
-   * @param array $data
-   *   Array of loaded data for this configuration object.
-   *
-   * @return Drupal\Core\Config\Config
-   *   The configuration object.
-   */
-  public function initWithData(array $data) {
-    $this->isLoaded = TRUE;
-    $this->overrides = array();
-    $this->isNew = FALSE;
-    $this->notify('init');
-    $this->replaceData($data);
-    $this->notify('load');
-    return $this;
+    $this->setOverriddenData();
   }
 
   /**
@@ -185,9 +159,6 @@ public static function validateName($name) {
    *   TRUE if this config object does not exist in storage.
    */
   public function isNew() {
-    if (!$this->isLoaded) {
-      $this->load();
-    }
     return $this->isNew;
   }
 
@@ -219,12 +190,6 @@ public function isNew() {
    *   The data that was requested.
    */
   public function get($key = '') {
-    if (!$this->isLoaded) {
-      $this->load();
-    }
-    if (!isset($this->overriddenData)) {
-      $this->setOverriddenData();
-    }
     if (empty($key)) {
       return $this->overriddenData;
     }
@@ -302,9 +267,8 @@ public function setOverride(array $data) {
    */
   protected function setOverriddenData() {
     $this->overriddenData = $this->data;
-    $overrides = $this->context->getOverrides($this->getName());
-    if (is_array($overrides)) {
-      $this->overriddenData = NestedArray::mergeDeepArray(array($this->overriddenData, $overrides), TRUE);
+    if (!empty($this->overrides)) {
+      $this->overriddenData = NestedArray::mergeDeepArray(array($this->overriddenData, $this->overrides), TRUE);
     }
     return $this;
   }
@@ -319,7 +283,7 @@ protected function setOverriddenData() {
    *   The configuration object.
    */
   protected function resetOverriddenData() {
-    unset($this->overriddenData);
+    $this->setOverriddenData();
     return $this;
   }
 
@@ -335,9 +299,6 @@ protected function resetOverriddenData() {
    *   The configuration object.
    */
   public function set($key, $value) {
-    if (!$this->isLoaded) {
-      $this->load();
-    }
     // Type-cast value into a string.
     $value = $this->castValue($value);
 
@@ -404,9 +365,6 @@ public function castValue($value) {
    *   The configuration object.
    */
   public function clear($key) {
-    if (!$this->isLoaded) {
-      $this->load();
-    }
     $parts = explode('.', $key);
     if (count($parts) == 1) {
       unset($this->data[$key]);
@@ -419,28 +377,6 @@ public function clear($key) {
   }
 
   /**
-   * Loads configuration data into this object.
-   *
-   * @return Drupal\Core\Config\Config
-   *   The configuration object.
-   */
-  public function load() {
-    $this->isLoaded = FALSE;
-    $data = $this->storage->read($this->name);
-    if ($data === FALSE) {
-      $this->isNew = TRUE;
-      $this->replaceData(array());
-    }
-    else {
-      $this->isNew = FALSE;
-      $this->replaceData($data);
-    }
-    $this->notify('load');
-    $this->isLoaded = TRUE;
-    return $this;
-  }
-
-  /**
    * Saves the configuration object.
    *
    * @return Drupal\Core\Config\Config
@@ -449,9 +385,6 @@ public function load() {
   public function save() {
     // Validate the configuration object name before saving.
     static::validateName($this->name);
-    if (!$this->isLoaded) {
-      $this->load();
-    }
     $this->storage->write($this->name, $this->data);
     $this->isNew = FALSE;
     $this->notify('save');
@@ -501,9 +434,6 @@ protected function notify($config_event_name) {
    *   The configuration object.
    */
   public function merge(array $data_to_merge) {
-    if (!$this->isLoaded) {
-      $this->load();
-    }
     // Preserve integer keys so that config keys are not changed.
     $this->replaceData(NestedArray::mergeDeepArray(array($this->data, $data_to_merge), TRUE));
     return $this;
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index fe9f4cb..01f0a5e 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -38,6 +38,13 @@ class ConfigFactory {
   protected $storage;
 
   /**
+   * An event dispatcher instance to use for configuration events.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcher
+   */
+  protected $eventDispatcher;
+
+  /**
    * A stack of configuration contexts the last being the context in use.
    *
    * @var array
@@ -61,6 +68,7 @@ class ConfigFactory {
    */
   public function __construct(StorageInterface $storage, ContextInterface $context) {
     $this->storage = $storage;
+    $this->eventDispatcher = $context->getEventDispatcher();
     $this->enterContext($context);
   }
 
@@ -74,14 +82,13 @@ public function __construct(StorageInterface $storage, ContextInterface $context
    *   A configuration object.
    */
   public function get($name) {
-    $context = $this->getContext();
-    $cache_key = $this->getCacheKey($name, $context);
-    if (isset($this->cache[$cache_key])) {
-      return $this->cache[$cache_key];
+    $list = $this->loadMultiple(array($name));
+    if (isset($list[$name])) {
+      return $list[$name];
+    }
+    else {
+      return new Config($name, $this->storage, $this->getContext());
     }
-
-    $this->cache[$cache_key] = new Config($name, $this->storage, $context);
-    return $this->cache[$cache_key]->init();
   }
 
   /**
@@ -113,16 +120,31 @@ public function loadMultiple(array $names) {
     // Pre-load remaining configuration files.
     if (!empty($names)) {
       $storage_data = $this->storage->readMultiple($names);
+      $override_data = $this->notifyLoadMultiple($storage_data);
       foreach ($storage_data as $name => $data) {
+        $overrides = isset($override_data[$name]) ? $override_data[$name] : NULL;
         $cache_key = $this->getCacheKey($name, $context);
-        $this->cache[$cache_key] = new Config($name, $this->storage, $context);
-        $this->cache[$cache_key]->initWithData($data);
+        $this->cache[$cache_key] = new Config($name, $this->storage, $context, $data, $overrides);
         $list[$name] = $this->cache[$cache_key];
       }
     }
     return $list;
   }
 
+  protected function getEventDispatcher() {
+    return $this->eventDispatcher;
+  }
+
+  /**
+   * Dispatch the 'config.loadMultiple' event.
+   */
+  protected function notifyLoadMultiple($config_names) {
+    $event = new ConfigLoadMultipleEvent($config_names, $this->storage, $this->getContext());
+    return $this->getEventDispatcher()
+      ->dispatch('config.loadMultiple', $event)
+      ->getOverriddenData();
+  }
+
   /**
    * Resets and re-initializes configuration objects. Internal use only.
    *
diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php
index d496fe7..c0511d5 100644
--- a/core/lib/Drupal/Core/Config/ConfigImporter.php
+++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
@@ -286,13 +286,18 @@ protected function importInvokeOwner() {
         // Validate the configuration object name before importing it.
         // Config::validateName($name);
         if ($entity_type = config_get_entity_type_by_name($name)) {
-          $old_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context);
-          $old_config->load();
+          $old_data = $this->storageComparer->getTargetStorage()->read($name);
+          if ($old_data) {
+            $old_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context, $old_data);
+          }
+          else {
+            $old_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context);
+          }
 
-          $data = $this->storageComparer->getSourceStorage()->read($name);
           $new_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context);
-          if ($data !== FALSE) {
-            $new_config->setData($data);
+          $new_data = $this->storageComparer->getSourceStorage()->read($name);
+          if ($new_data !== FALSE) {
+            $new_config->setData($new_data);
           }
 
           $method = 'import' . ucfirst($op);
diff --git a/core/lib/Drupal/Core/Config/ConfigLoadMultipleEvent.php b/core/lib/Drupal/Core/Config/ConfigLoadMultipleEvent.php
new file mode 100644
index 0000000..3992476
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigLoadMultipleEvent.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Drupal\Core\Config;
+
+use Drupal\Core\Config\Context\ContextInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+class ConfigLoadMultipleEvent extends Event {
+
+  /**
+   * Configuration object names.
+   *
+   * @var array
+   */
+  protected $configNames;
+
+  /**
+   * Configuration context object.
+   *
+   * @var \Drupal\Core\Config\Context\ContextInterface
+   */
+  protected $context;
+
+  /**
+   * A storage controller instance for reading and writing configuration data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $storage;
+
+  protected $overriddenData;
+
+  /**
+   * Constructs a configuration event object.
+   *
+   * @param array
+   *   Configuration object names.
+   * @param \Drupal\Core\Config\Context\ContextInterface
+   *   Configuration context object.
+   */
+  public function __construct(array $config_names, StorageInterface $storage, ContextInterface $context) {
+    $this->configNames = $config_names;
+    $this->storage = $storage;
+    $this->context = $context;
+  }
+
+  public function setOverrides(array $overrides) {
+    // Merge all the things.
+  }
+
+  /**
+   * Get overridden data.
+   */
+  public function getOverriddenData() {
+    return $this->overriddenData;
+  }
+
+  /**
+   * Get storage.
+   */
+  public function getStorage() {
+    return $this->storage;
+  }
+
+  /**
+   * Get configuration object names.
+   */
+  public function getConfigNames() {
+    return $this->configNames;
+  }
+
+  /**
+   * Gets configuration context object.
+   *
+   * @return \Drupal\Core\Config\Context\ContextInterface
+   *   Configuration context.
+   */
+  public function getContext() {
+    return $this->context;
+  }
+}
diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContext.php b/core/lib/Drupal/Core/Config/Context/ConfigContext.php
index a5382fd..52e3e90 100644
--- a/core/lib/Drupal/Core/Config/Context/ConfigContext.php
+++ b/core/lib/Drupal/Core/Config/Context/ConfigContext.php
@@ -100,11 +100,15 @@ public function getUuid() {
     return $this->uuid;
   }
 
+  public function getEventDispatcher() {
+    return $this->eventDispatcher;
+  }
+
   /**
    * Implements \Drupal\Core\Config\Context\ContextInterface::notify().
    */
   public function notify($config_event_name, Config $config = NULL) {
-    $this->eventDispatcher->dispatch('config.' . $config_event_name, new ConfigEvent($this, $config));
+    $this->getEventDispatcher()->dispatch('config.' . $config_event_name, new ConfigEvent($this, $config));
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Config/Context/ContextInterface.php b/core/lib/Drupal/Core/Config/Context/ContextInterface.php
index e7e4904..d75cdf2 100644
--- a/core/lib/Drupal/Core/Config/Context/ContextInterface.php
+++ b/core/lib/Drupal/Core/Config/Context/ContextInterface.php
@@ -98,4 +98,6 @@ public function setOverrides($config_name, $data);
    */
   public function getOverrides($config_name);
 
+  public function getEventDispatcher();
+
 }
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
index cb9be73..f670891 100644
--- a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
+++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
@@ -86,12 +86,12 @@ public function configContext(ConfigEvent $event) {
   public function configLoad(ConfigEvent $event) {
     $context = $event->getContext();
     if ($language = $context->get('locale.language')) {
-      $config = $event->getConfig();
-      $locale_name = $this->getLocaleConfigName($config->getName(), $language);
-      // Check to see if the config storage has an appropriately named file
-      // containing override data.
-      if ($override = $event->getConfig()->getStorage()->read($locale_name)) {
-        $config->setOverride($override);
+      $locale_names = array();
+      foreach ($event->getConfigNames() as $name) {
+        $locale_names[] = $this->getLocaleConfigName($name, $language);
+      }
+      if ($overrides = $event->getStorage()->readMultiple($locale_names)) {
+        $event->setOverrides($overrides);
       }
     }
   }
@@ -133,7 +133,7 @@ public function getLocaleConfigName($name, Language $language) {
    */
   static function getSubscribedEvents() {
     $events['config.context'][] = array('configContext', 20);
-    $events['config.load'][] = array('configLoad', 20);
+    $events['config.loadMultiple'][] = array('configLoad', 20);
     $events[KernelEvents::REQUEST][] = array('onKernelRequestSetDefaultConfigContextLocale', 20);
     return $events;
   }
