diff --git a/core/core.services.yml b/core/core.services.yml
index f2ae071..48dce87 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -229,7 +229,7 @@ services:
     tags:
       - { name: event_subscriber }
       - { name: service_collector, tag: 'config.factory.override', call: addOverride }
-    arguments: ['@config.storage', '@event_dispatcher', '@config.typed']
+    arguments: ['@config.storage', '@event_dispatcher', '@config.typed', '@settings']
   config.installer:
     class: Drupal\Core\Config\ConfigInstaller
     arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher']
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 00c301e..b23572f 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -399,8 +399,9 @@ function install_begin_request($class_loader, &$install_state) {
   $container = $kernel->getContainer();
 
   // Register the file translation service.
-  if (isset($GLOBALS['config']['locale.settings']['translation']['path'])) {
-    $directory = $GLOBALS['config']['locale.settings']['translation']['path'];
+  $config_overrides = Settings::getConfigOverrides();
+  if (isset($config_overrides['locale.settings']['translation']['path'])) {
+    $directory = $config_overrides['locale.settings']['translation']['path'];
   }
   else {
     $directory = $site_path . '/files/translations';
diff --git a/core/includes/install.inc b/core/includes/install.inc
index 7e0e32e..cdd967b 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -202,12 +202,16 @@ function drupal_rewrite_settings($settings = array(), $settings_file = NULL) {
   // Build list of setting names and insert the values into the global namespace.
   $variable_names = array();
   $settings_settings = array();
+  $config_overrides = array();
   foreach ($settings as $setting => $data) {
-    if ($setting != 'settings') {
-      _drupal_rewrite_settings_global($GLOBALS[$setting], $data);
+    if ($setting == 'settings') {
+      _drupal_rewrite_settings_global($settings_settings, $data);
+    }
+    elseif ($setting == 'config') {
+      _drupal_rewrite_settings_global($config_overrides, $data);
     }
     else {
-      _drupal_rewrite_settings_global($settings_settings, $data);
+      _drupal_rewrite_settings_global($GLOBALS[$setting], $data);
     }
     $variable_names['$'. $setting] = $setting;
   }
@@ -322,9 +326,9 @@ function drupal_rewrite_settings($settings = array(), $settings_file = NULL) {
     else {
       // In case any $settings variables were written, import them into the
       // Settings singleton.
-      if (!empty($settings_settings)) {
+      if (!empty($settings_settings) || !empty($config_overrides)) {
         $old_settings = Settings::getAll();
-        new Settings($settings_settings + $old_settings);
+        new Settings($settings_settings + $old_settings, Settings::getConfigOverrides() + $config_overrides);
       }
       // The existing settings.php file might have been included already. In
       // case an opcode cache is enabled, the rewritten contents of the file
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index cdfd951..bce29dc 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Site\Settings;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
@@ -65,6 +66,13 @@ class ConfigFactory implements ConfigFactoryInterface, EventSubscriberInterface
   protected $configFactoryOverrides = array();
 
   /**
+   * The settings object which contains config overrides.
+   *
+   * @var \Drupal\Core\Site\Settings
+   */
+  protected $settings;
+
+  /**
    * Constructs the Config factory.
    *
    * @param \Drupal\Core\Config\StorageInterface $storage
@@ -73,11 +81,14 @@ class ConfigFactory implements ConfigFactoryInterface, EventSubscriberInterface
    *   An event dispatcher instance to use for configuration events.
    * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config
    *   The typed configuration manager.
+   * @param \Drupal\Core\Site\Settings $settings
+   *   The settings singleton.
    */
-  public function __construct(StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config) {
+  public function __construct(StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config, Settings $settings) {
     $this->storage = $storage;
     $this->eventDispatcher = $event_dispatcher;
     $this->typedConfigManager = $typed_config;
+    $this->settings = $settings;
   }
 
   /**
@@ -122,8 +133,8 @@ protected function doGet($name, $immutable = TRUE) {
           $this->cache[$cache_key]->setModuleOverride($overrides[$name]);
         }
         // Apply any settings.php overrides.
-        if (isset($GLOBALS['config'][$name])) {
-          $this->cache[$cache_key]->setSettingsOverride($GLOBALS['config'][$name]);
+        if ($this->settings->hasConfigOverride($name)) {
+          $this->cache[$cache_key]->setSettingsOverride($this->settings->getConfigOverride($name));
         }
       }
       return $this->cache[$cache_key];
@@ -179,8 +190,8 @@ protected function doLoadMultiple(array $names, $immutable = TRUE) {
           if (isset($module_overrides[$name])) {
             $this->cache[$cache_key]->setModuleOverride($module_overrides[$name]);
           }
-          if (isset($GLOBALS['config'][$name])) {
-            $this->cache[$cache_key]->setSettingsOverride($GLOBALS['config'][$name]);
+          if ($this->settings->hasConfigOverride($name)) {
+            $this->cache[$cache_key]->setSettingsOverride($this->settings->getConfigOverride($name));
           }
         }
         $list[$name] = $this->cache[$cache_key];
diff --git a/core/lib/Drupal/Core/Site/Settings.php b/core/lib/Drupal/Core/Site/Settings.php
index a48946a..82ab5ce 100644
--- a/core/lib/Drupal/Core/Site/Settings.php
+++ b/core/lib/Drupal/Core/Site/Settings.php
@@ -24,6 +24,13 @@
   private $storage = array();
 
   /**
+   * Array with the config overrides.
+   *
+   * @var array
+   */
+  private $configOverrides = array();
+
+  /**
    * Singleton instance.
    *
    * @var \Drupal\Core\Site\Settings
@@ -36,8 +43,9 @@
    * @param array $settings
    *   Array with the settings.
    */
-  public function __construct(array $settings) {
+  public function __construct(array $settings, array $config_overrides = array()) {
     $this->storage = $settings;
+    $this->configOverrides = $config_overrides;
     self::$instance = $this;
   }
 
@@ -86,6 +94,23 @@ public static function get($name, $default = NULL) {
   }
 
   /**
+   * Returns a config override.
+   *
+   * @param string $name
+   *   The name of the setting to return.
+   *
+   * @return mixed
+   *   The value of the config override, NULL if not set.
+   */
+  public static function getConfigOverride($name) {
+    return self::hasConfigOverride($name) ? self::$instance->configOverrides[$name] : NULL;
+  }
+
+  public static function hasConfigOverride($name) {
+    return array_key_exists($name, self::$instance->configOverrides);
+  }
+
+  /**
    * Returns all the settings. This is only used for testing purposes.
    *
    * @return array
@@ -96,6 +121,16 @@ public static function getAll() {
   }
 
   /**
+   * Returns all the config overrides. This is only used for testing purposes.
+   *
+   * @return array
+   *   All the config overrides.
+   */
+  public static function getConfigOverrides() {
+    return self::$instance->configOverrides;
+  }
+
+  /**
    * Bootstraps settings.php and the Settings singleton.
    *
    * @param string $app_root
@@ -111,7 +146,7 @@ public static function getAll() {
    */
   public static function initialize($app_root, $site_path, &$class_loader) {
     // Export these settings.php variables to the global namespace.
-    global $base_url, $config_directories, $config;
+    global $base_url, $config_directories;
     $settings = array();
     $config = array();
     $databases = array();
@@ -125,7 +160,7 @@ public static function initialize($app_root, $site_path, &$class_loader) {
     Database::setMultipleConnectionInfo($databases);
 
     // Initialize Settings.
-    new Settings($settings);
+    new Settings($settings, $config);
   }
 
   /**
diff --git a/core/modules/config/src/Tests/ConfigEventsTest.php b/core/modules/config/src/Tests/ConfigEventsTest.php
index fb6eca6..472296a 100644
--- a/core/modules/config/src/Tests/ConfigEventsTest.php
+++ b/core/modules/config/src/Tests/ConfigEventsTest.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Config\Config;
 use Drupal\Core\Config\ConfigEvents;
+use Drupal\Core\Site\Settings;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -64,8 +65,10 @@ function testConfigEvents() {
   function testConfigRenameEvent() {
     $name = 'config_events_test.test';
     $new_name = 'config_events_test.test_rename';
-    $GLOBALS['config'][$name] = array('key' => 'overridden');
-    $GLOBALS['config'][$new_name] = array('key' => 'new overridden');
+    $overrides = Settings::getConfigOverrides();
+    $overrides[$name] = array('key' => 'overridden');
+    $overrides[$new_name] = array('key' => 'new overridden');
+    new Settings(Settings::getAll(), $overrides);
 
     $config = $this->config($name);
     $config->set('key', 'initial')->save();
@@ -74,7 +77,7 @@ function testConfigRenameEvent() {
     $this->assertIdentical($event['current_config_data'], array('key' => 'initial'));
 
     // Override applies when getting runtime config.
-    $this->assertEqual($GLOBALS['config'][$name], \Drupal::config($name)->get());
+    $this->assertEqual(Settings::getConfigOverride($name), \Drupal::config($name)->get());
 
     \Drupal::configFactory()->rename($name, $new_name);
     $event = \Drupal::state()->get('config_events_test.event', array());
diff --git a/core/modules/config/src/Tests/ConfigExportUITest.php b/core/modules/config/src/Tests/ConfigExportUITest.php
index 1a679de..2f4569e 100644
--- a/core/modules/config/src/Tests/ConfigExportUITest.php
+++ b/core/modules/config/src/Tests/ConfigExportUITest.php
@@ -23,7 +23,7 @@ class ConfigExportUITest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('config', 'config_test', 'config_export_test');
+  public static $modules = array('config', 'config_test');
 
   /**
    * {@inheritdoc}
@@ -38,6 +38,13 @@ protected function setUp() {
    * Tests export of configuration.
    */
   function testExport() {
+    // Set up an override to ensure overrides don't pollute the export.
+    $settings['config']['system.maintenance']['message'] = (object) array(
+      'value' => 'Foo',
+      'required' => TRUE,
+    );
+    $this->writeSettings($settings);
+
     // Verify the export page with export submit button is available.
     $this->drupalGet('admin/config/development/configuration/full/export');
     $this->assertFieldById('edit-submit', t('Export'));
diff --git a/core/modules/config/src/Tests/ConfigOverrideTest.php b/core/modules/config/src/Tests/ConfigOverrideTest.php
index c2061ca..c121829 100644
--- a/core/modules/config/src/Tests/ConfigOverrideTest.php
+++ b/core/modules/config/src/Tests/ConfigOverrideTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config\Tests;
 
+use Drupal\Core\Site\Settings;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -43,7 +44,7 @@ function testConfOverride() {
     $overrides['config_test.system']['foo'] = 'overridden';
     $overrides['config_test.system']['baz'] = 'injected';
     $overrides['config_test.system']['404'] = 'derp';
-    $GLOBALS['config'] = $overrides;
+    new Settings(Settings::getAll(), $overrides);
 
     $this->installConfig(array('config_test'));
 
@@ -120,7 +121,8 @@ function testConfOverride() {
     // Test overrides of completely new configuration objects. In normal runtime
     // this should only happen for configuration entities as we should not be
     // creating simple configuration objects on the fly.
-    $GLOBALS['config']['config_test.new']['key'] = 'override';
+    $overrides['config_test.new']['key'] = 'override';
+    new Settings(Settings::getAll(), $overrides);
     $config = \Drupal::config('config_test.new');
     $this->assertTrue($config->isNew(), 'The configuration object config_test.new is new');
     $this->assertIdentical($config->get('key'), 'override');
diff --git a/core/modules/config/src/Tests/ConfigOverridesPriorityTest.php b/core/modules/config/src/Tests/ConfigOverridesPriorityTest.php
index e457023..7c4fb2f 100644
--- a/core/modules/config/src/Tests/ConfigOverridesPriorityTest.php
+++ b/core/modules/config/src/Tests/ConfigOverridesPriorityTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\config\Tests;
 
 use Drupal\Core\Language\Language;
+use Drupal\Core\Site\Settings;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -83,7 +84,9 @@ public function testOverridePriorities() {
     // Configure a global override to simulate overriding using settings.php. Do
     // not override system.site:mail or system.site:slogan to prove that the
     // language and module overrides still apply.
-    $GLOBALS['config']['system.site']['name'] = 'Site name global conf override';
+    $overrides = Settings::getConfigOverrides();
+    $overrides['system.site']['name'] = 'Site name global conf override';
+    new Settings(Settings::getAll(), $overrides);
     $config_factory->reset('system.site');
     $this->assertEqual('Site name global conf override', $config_factory->get('system.site')->get('name'));
     $this->assertEqual($module_overridden_slogan, $config_factory->get('system.site')->get('slogan'));
diff --git a/core/modules/config/tests/config_export_test/config_export_test.info.yml b/core/modules/config/tests/config_export_test/config_export_test.info.yml
deleted file mode 100644
index d0ceccd..0000000
--- a/core/modules/config/tests/config_export_test/config_export_test.info.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-name: 'Configuration export test'
-type: module
-package: Testing
-version: VERSION
-core: 8.x
diff --git a/core/modules/config/tests/config_export_test/config_export_test.module b/core/modules/config/tests/config_export_test/config_export_test.module
deleted file mode 100644
index e31566f..0000000
--- a/core/modules/config/tests/config_export_test/config_export_test.module
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-/**
- * @file
- * Provides config export testing support functionality.
- */
-
-// Override the system maintenance message for testing.
-$GLOBALS['config']['system.maintenance']['message'] = 'Foo';
diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php
index bd611f4..53d517f 100644
--- a/core/modules/simpletest/src/KernelTestBase.php
+++ b/core/modules/simpletest/src/KernelTestBase.php
@@ -197,7 +197,7 @@ protected function setUp() {
     // Restore and merge settings.
     // DrupalKernel::boot() initializes new Settings, and the containerBuild()
     // method sets additional settings.
-    new Settings($settings + Settings::getAll());
+    new Settings($settings + Settings::getAll(), Settings::getConfigOverrides());
 
     // Create and set new configuration directories.
     $this->prepareConfigDirectories();
diff --git a/core/modules/simpletest/src/TestBase.php b/core/modules/simpletest/src/TestBase.php
index a95bade..7337617 100644
--- a/core/modules/simpletest/src/TestBase.php
+++ b/core/modules/simpletest/src/TestBase.php
@@ -1142,7 +1142,7 @@ private function prepareEnvironment() {
     // Backup current in-memory configuration.
     $this->originalSite = conf_path();
     $this->originalSettings = Settings::getAll();
-    $this->originalConfig = $GLOBALS['config'];
+    $this->originalConfig = Settings::getConfigOverrides();
     // @todo Remove all remnants of $GLOBALS['conf'].
     // @see https://drupal.org/node/2183323
     $this->originalConf = isset($GLOBALS['conf']) ? $GLOBALS['conf'] : NULL;
@@ -1320,9 +1320,8 @@ private function restoreEnvironment() {
     drupal_static_reset();
 
     // Restore original in-memory configuration.
-    $GLOBALS['config'] = $this->originalConfig;
     $GLOBALS['conf'] = $this->originalConf;
-    new Settings($this->originalSettings);
+    new Settings($this->originalSettings, $this->originalConfig);
 
     // Restore original statics and globals.
     $GLOBALS['config_directories'] = $this->originalConfigDirectories;
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 8355a2c..5ee5462 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -393,8 +393,9 @@ function system_requirements($phase) {
     if ($file_private_path = Settings::get('file_private_path')) {
       $directories[] = $file_private_path;
     }
-    if (!empty($GLOBALS['config']['system.file']['path']['temporary'])) {
-      $directories[] = $GLOBALS['config']['system.file']['path']['temporary'];
+    $overrides = Settings::getConfigOverrides();
+    if (!empty($overrides['system.file']['path']['temporary'])) {
+      $directories[] = $overrides['system.file']['path']['temporary'];
     }
     else {
       // If the temporary directory is not overridden use an appropriate
diff --git a/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php b/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php
index 95bd570..b5919b0 100644
--- a/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Config\Config;
 use Drupal\Core\Config\ConfigFactory;
+use Drupal\Core\Site\Settings;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
@@ -54,7 +55,7 @@ public function setUp() {
     $this->storage = $this->getMock('Drupal\Core\Config\StorageInterface');
     $this->eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
     $this->typedConfig = $this->getMock('\Drupal\Core\Config\TypedConfigManagerInterface');
-    $this->configFactory = new ConfigFactory($this->storage, $this->eventDispatcher, $this->typedConfig);
+    $this->configFactory = new ConfigFactory($this->storage, $this->eventDispatcher, $this->typedConfig, new Settings([]));
 
     $this->cacheTagsInvalidator = $this->getMock('Drupal\Core\Cache\CacheTagsInvalidatorInterface');
 
