diff --git a/core/core.services.yml b/core/core.services.yml
index b850c9e..d7af951 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -84,6 +84,10 @@ services:
   config.installer:
     class: Drupal\Core\Config\ConfigInstaller
     arguments: ['@config.factory', '@config.storage', '@config.typed', '@entity.manager', '@event_dispatcher']
+  config.cache_prime_subscriber:
+    class: Drupal\Core\Config\ConfigCachePrimeSubscriber
+    tags:
+      - { name: event_subscriber }
   config.storage.staging:
     class: Drupal\Core\Config\FileStorage
     factory_class: Drupal\Core\Config\FileStorageFactory
diff --git a/core/lib/Drupal/Core/Config/ConfigCachePrimeEvent.php b/core/lib/Drupal/Core/Config/ConfigCachePrimeEvent.php
new file mode 100644
index 0000000..5961fe7
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigCachePrimeEvent.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Config\ConfigCachePrimeEvent.
+ */
+
+namespace Drupal\Core\Config;
+
+use Drupal\Core\Language\Language;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Event object to allow the configuration cache to be primed.
+ *
+ * Subscribers to the 'config.cache.prime' event return a list of names that
+ * they want the configuration factory to prime the cache with.
+ */
+class ConfigCachePrimeEvent extends Event {
+
+  /**
+   * Configuration names.
+   *
+   * @var array
+   */
+  protected $names = array();
+
+  /**
+   * Gets configuration names.
+   *
+   * @return array
+   *   The list of configuration names that can be overridden.
+   */
+  public function getNames() {
+    return $this->names;
+  }
+
+  /**
+   * Adds configuration object names to prime the cache with.
+   *
+   * @param array $names
+   *   The configuration object names.
+   *
+   * @return self
+   *   The ConfigCachePrimeEvent object.
+   */
+  public function addNames(array $names) {
+    $this->names += $names;
+    $this->names = array_unique($this->names);
+    return $this;
+  }
+
+  /**
+   * Removes configuration object names to preload.
+   *
+   * @param array $names_to_remove
+   *   The configuration object names remove preload.
+   *
+   * @return self
+   *   The ConfigCachePrimeEvent object.
+   */
+  public function removeNames(array $names_to_remove) {
+    $this->names = array_diff($this->names, $names_to_remove);
+    return $this;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Config/ConfigCachePrimeSubscriber.php b/core/lib/Drupal/Core/Config/ConfigCachePrimeSubscriber.php
new file mode 100644
index 0000000..fd5d2bd
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/ConfigCachePrimeSubscriber.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Config\ConfigCachePrimeSubscriber.
+ */
+
+namespace Drupal\Core\Config;
+
+use Drupal\Component\Utility\Settings;
+use Drupal\Core\Config\ConfigCachePrimeEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Core configuration cache prime subscriber.
+ */
+class ConfigCachePrimeSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Returns the names of any configuration objects in Settings.
+   *
+   * @param \Drupal\Core\Config\ConfigCachePrimeEvent $event
+   *   Configuration cache prime event to respond to.
+   */
+  public function onConfigCachePrimeGetSettingsNames(ConfigCachePrimeEvent $event) {
+    $settings_config_names = Settings::getSingleton()->get('config_cache_prime_names', array());
+    if ($settings_config_names) {
+      $event->addNames($settings_config_names);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events['config.prime.cache'][] = array('onConfigCachePrimeGetSettingsNames');
+    return $events;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index 7029d11..14d3ec3 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageDefault;
+use Drupal\Core\Config\ConfigCachePrimeEvent;
+use Drupal\Core\Config\ConfigModuleOverridesEvent;
 use Symfony\Component\EventDispatcher\EventDispatcher;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -71,6 +73,13 @@ class ConfigFactory implements ConfigFactoryInterface, EventSubscriberInterface
   protected $typedConfigManager;
 
   /**
+   * Whether or not the cache has been primed yet.
+   *
+   * @var boolean
+   */
+  protected $isCachePrimed;
+
+  /**
    * Constructs the Config factory.
    *
    * @param \Drupal\Core\Config\StorageInterface $storage
@@ -84,6 +93,7 @@ public function __construct(StorageInterface $storage, EventDispatcherInterface
     $this->storage = $storage;
     $this->eventDispatcher = $event_dispatcher;
     $this->typedConfigManager = $typed_config;
+    $this->isCachePrimed = FALSE;
   }
 
   /**
@@ -150,6 +160,12 @@ public function get($name) {
    * {@inheritdoc}
    */
   public function loadMultiple(array $names) {
+    global $conf;
+
+    if (!$this->isCachePrimed) {
+      $names = array_unique($names + $this->getCachePrimeNames());
+    }
+
     $list = array();
 
     foreach ($names as $key => $name) {
@@ -228,6 +244,24 @@ protected function loadModuleOverrides(array $names) {
   }
 
   /**
+   * Get a list of configuration object names to prime our cache with.
+   *
+   * @return array
+   *   An array of configuration object names.
+   */
+  protected function getCachePrimeNames() {
+    // It's possible an event subscriber may call back in to the configuration
+    // system to figure out which configuration objects to prime the cache with.
+    // Yes, this is stupid, but this is Drupal.
+    // This could get us stuck in an infinite loop, so set the flag before
+    // dispatching the event to avoid unintended recursion.
+    $this->isCachePrimed = TRUE;
+    $config_cache_prime_event = new ConfigCachePrimeEvent();
+    $this->eventDispatcher->dispatch('config.cache.prime', $config_cache_prime_event);
+    return $config_cache_prime_event->getNames();
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function reset($name = NULL) {
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 5642dc5..1c3c8c4 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -276,6 +276,14 @@
 $settings['update_free_access'] = FALSE;
 
 /**
+ * Configuration cache prime.
+ *
+ * The core configuration system will prime it's cache with any configuration
+ * objects named in this array.
+ */
+# $settings['config_cache_prime_names'] = array();
+
+/**
  * Twig debugging:
  *
  * When debugging is enabled:
