diff --git a/core/core.services.yml b/core/core.services.yml
index 4eb462c..7ec7704 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -244,7 +244,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.importer_subscriber:
     class: Drupal\Core\Config\Importer\FinalMissingContentSubscriber
     tags:
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index fb18fe3..3b50f7f 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -410,8 +410,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::getAllConfigOverrides();
+  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 31d472a..da63d6c 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -201,12 +201,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;
   }
@@ -321,9 +325,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::getAllConfigOverrides() + $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 6ec8a5c..0e360b0 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 ($override = $this->settings->getConfigOverride($name)) {
+          $this->cache[$cache_key]->setSettingsOverride($override);
         }
       }
 
@@ -182,8 +193,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 ($override = $this->settings->getConfigOverride($name)) {
+            $this->cache[$cache_key]->setSettingsOverride($override);
           }
         }
 
diff --git a/core/lib/Drupal/Core/Site/Settings.php b/core/lib/Drupal/Core/Site/Settings.php
index 21298b4..7c15a29 100644
--- a/core/lib/Drupal/Core/Site/Settings.php
+++ b/core/lib/Drupal/Core/Site/Settings.php
@@ -25,6 +25,13 @@
   private $storage = array();
 
   /**
+   * Array with the config overrides.
+   *
+   * @var array
+   */
+  private $configOverrides = array();
+
+  /**
    * Singleton instance.
    *
    * @var \Drupal\Core\Site\Settings
@@ -37,8 +44,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;
   }
 
@@ -87,6 +95,19 @@ public static function get($name, $default = NULL) {
   }
 
   /**
+   * Returns overrides for a specified configuration object.
+   *
+   * @param string $config_name
+   *   The name of the configuration object.
+   *
+   * @return mixed
+   *   The value of the configuration override, NULL if not set.
+   */
+  public static function getConfigOverride($config_name) {
+    return isset(self::$instance->configOverrides[$config_name]) ? self::$instance->configOverrides[$config_name] : NULL;
+  }
+
+  /**
    * Returns all the settings. This is only used for testing purposes.
    *
    * @return array
@@ -97,6 +118,16 @@ public static function getAll() {
   }
 
   /**
+   * Returns all the config overrides. This is only used for testing purposes.
+   *
+   * @return array
+   *   All the configuration overrides.
+   */
+  public static function getAllConfigOverrides() {
+    return self::$instance->configOverrides;
+  }
+
+  /**
    * Bootstraps settings.php and the Settings singleton.
    *
    * @param string $app_root
@@ -112,7 +143,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 +156,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..d8caad5 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::getAllConfigOverrides();
+    $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 065d6fa..c134665 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 e42545d..26a928c 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::getAllConfigOverrides();
+    $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 ba8622b..3277d0b 100644
--- a/core/modules/simpletest/src/KernelTestBase.php
+++ b/core/modules/simpletest/src/KernelTestBase.php
@@ -198,7 +198,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::getAllConfigOverrides());
 
     // 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 4104b4b..5ac7479 100644
--- a/core/modules/simpletest/src/TestBase.php
+++ b/core/modules/simpletest/src/TestBase.php
@@ -1139,7 +1139,7 @@ private function prepareEnvironment() {
     $site_path = \Drupal::service('site.path');
     $this->originalSite = $site_path;
     $this->originalSettings = Settings::getAll();
-    $this->originalConfig = $GLOBALS['config'];
+    $this->originalConfig = Settings::getAllConfigOverrides();
     // @todo Remove all remnants of $GLOBALS['conf'].
     // @see https://www.drupal.org/node/2183323
     $this->originalConf = isset($GLOBALS['conf']) ? $GLOBALS['conf'] : NULL;
@@ -1316,9 +1316,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 042c8f2..71c4fc9 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -482,8 +482,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::getAllConfigOverrides();
+    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 05d9311..721849d 100644
--- a/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/ConfigFactoryTest.php
@@ -9,6 +9,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;
 
@@ -60,7 +61,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');
 
