diff --git a/core/core.services.yml b/core/core.services.yml
index 79f1fc1..57aa0c5 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -68,25 +68,11 @@ services:
     arguments: ['@config.cachedstorage.storage', '@cache.config']
     tags:
       - { name: persist }
-  config.context.factory:
-    class: Drupal\Core\Config\Context\ConfigContextFactory
-    arguments: ['@event_dispatcher', '@uuid']
-  config.context:
-    class: Drupal\Core\Config\Context\ContextInterface
-    tags:
-      - { name: persist }
-    factory_method: get
-    factory_service: config.context.factory
-  config.context.free:
-    class: Drupal\Core\Config\Context\ContextInterface
-    factory_method: get
-    factory_service: config.context.factory
-    arguments: [Drupal\Core\Config\Context\FreeConfigContext]
   config.factory:
     class: Drupal\Core\Config\ConfigFactory
     tags:
       - { name: persist }
-    arguments: ['@config.storage', '@config.context']
+    arguments: ['@config.storage']
   config.storage.staging:
     class: Drupal\Core\Config\FileStorage
     factory_class: Drupal\Core\Config\FileStorageFactory
diff --git a/core/includes/config.inc b/core/includes/config.inc
index fa804ac..322be2c 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -16,6 +16,22 @@
  */
 
 /**
+ * Sets the language on the configuration object factory.
+ *
+ * @param Drupal\Core\Language\Language $language
+ *   The language that config objects should have injected in to them.
+ *
+ * @return Drupal\Core\Language\Language $language
+ *   The language object that was previously set in the config factory.
+ */
+function config_factory_set_language(Language $language) {
+  $current_language = Drupal::service('config.factory')->getLanguage();
+  drupal_container()->get('config.factory')->setLanguage($language);
+  Drupal::service('config.factory')->setLanguage($language);
+  return $current_language;
+}
+
+/**
  * Installs the default configuration of a given extension.
  *
  * When an extension is installed, it searches all the default configuration
@@ -131,54 +147,6 @@ function config($name) {
 }
 
 /**
- * Sets the config context on the config factory.
- *
- * This allows configuration objects to be created using special configuration
- * contexts eg. global override free or locale using a user preferred language.
- * Calling this function affects all subsequent calls to \Drupal::config() until
- * config_context_leave() is called.
- *
- * @see config_context_leave()
- * @see \Drupal\Core\Config\ConfigFactory
- *
- * @param string $context_name
- *   The name of the config context service on the container or a fully
- *   qualified class implementing \Drupal\Core\Config\Context\ContextInterface.
- *
- * @return \Drupal\Core\Config\Context\ContextInterface
- *   The configuration context object.
- */
-function config_context_enter($context_name) {
-  if (drupal_container()->has($context_name)) {
-    $context = drupal_container()->get($context_name);
-  }
-  elseif (class_exists($context_name) && in_array('Drupal\Core\Config\Context\ContextInterface', class_implements($context_name))) {
-    $context = drupal_container()
-      ->get('config.context.factory')
-      ->get($context_name);
-  }
-  else {
-    throw new ConfigException(sprintf('Unknown config context service or class: %s', $context_name));
-  }
-  drupal_container()
-    ->get('config.factory')
-    ->enterContext($context);
-  return $context;
-}
-
-/**
- * Leaves the current config context returning to the previous context.
- *
- * @see config_context_enter()
- * @see \Drupal\Core\Config\ConfigFactory
- */
-function config_context_leave() {
-  drupal_container()
-    ->get('config.factory')
-    ->leaveContext();
-}
-
-/**
  * Return a list of all config entity types provided by a module.
  *
  * @param string $module
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 91a241f..1a97a96 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -374,17 +374,9 @@ function install_begin_request(&$install_state) {
     $container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher');
 
     $container->register('config.storage', 'Drupal\Core\Config\InstallStorage');
-    $container->register('config.context.factory', 'Drupal\Core\Config\Context\ConfigContextFactory')
-      ->addArgument(new Reference('event_dispatcher'))
-      ->addArgument(new Reference('uuid'));
-
-    $container->register('config.context', 'Drupal\Core\Config\Context\ContextInterface')
-      ->setFactoryService(new Reference('config.context.factory'))
-      ->setFactoryMethod('get');
 
     $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory')
-      ->addArgument(new Reference('config.storage'))
-      ->addArgument(new Reference('config.context'));
+      ->addArgument(new Reference('config.storage'));
 
     // Register the 'language_manager' service.
     $container
diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index 02afbd1..039fd0d 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -9,7 +9,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Config\ConfigNameException;
-use Drupal\Core\Config\Context\ContextInterface;
+use Drupal\Core\Language\Language;
 
 /**
  * Defines the default configuration object.
@@ -29,6 +29,13 @@ class Config {
   const MAX_NAME_LENGTH = 250;
 
   /**
+   * The Language object used to override configuration data.
+   *
+   * @var Drupal\Core\Language\Language
+   */
+  protected $language;
+
+  /**
    * The name of the configuration object.
    *
    * @var string
@@ -64,13 +71,6 @@ class Config {
   protected $storage;
 
   /**
-   * The configuration context used for this configuration object.
-   *
-   * @var \Drupal\Core\Config\Context\ContextInterface
-   */
-  protected $context;
-
-  /**
    * Whether the config object has already been loaded.
    *
    * @var bool
@@ -85,13 +85,13 @@ class Config {
    * @param \Drupal\Core\Config\StorageInterface $storage
    *   A storage controller object to use for reading and writing the
    *   configuration data.
-   * @param \Drupal\Core\Config\Context\ContextInterface $context
-   *   The configuration context used for this configuration object.
+   * @param Drupal\Core\Language\Language $language
+   *   The Language object used to override configuration data.
    */
-  public function __construct($name, StorageInterface $storage, ContextInterface $context) {
+  public function __construct($name, StorageInterface $storage, Language $language) {
     $this->name = $name;
     $this->storage = $storage;
-    $this->context = $context;
+    $this->language = $language;
   }
 
   /**
@@ -287,7 +287,6 @@ protected function replaceData(array $data) {
    *   The configuration object.
    */
   public function setOverride(array $data) {
-    $this->context->setOverrides($this->getName(), $data);
     $this->resetOverriddenData();
     return $this;
   }
@@ -302,8 +301,7 @@ public function setOverride(array $data) {
    */
   protected function setOverriddenData() {
     $this->overriddenData = $this->data;
-    $overrides = $this->context->getOverrides($this->getName());
-    if (is_array($overrides)) {
+    if (isset($overrides) && is_array($overrides)) {
       $this->overriddenData = NestedArray::mergeDeepArray(array($this->overriddenData, $overrides), TRUE);
     }
     return $this;
@@ -488,7 +486,6 @@ public function getStorage() {
    * Dispatch a config event.
    */
   protected function notify($config_event_name) {
-    $this->context->notify($config_event_name, $this);
   }
 
   /**
@@ -508,4 +505,27 @@ public function merge(array $data_to_merge) {
     $this->replaceData(NestedArray::mergeDeepArray(array($this->data, $data_to_merge), TRUE));
     return $this;
   }
+
+  /**
+   * Returns the language object for this Config object.
+   *
+   * @return \Drupal\Core\Language\Language
+   */
+  public function getLanguage() {
+    return $this->language;
+  }
+
+  /**
+   * Get configuration name for this language.
+   *
+   * It will be the same name with a prefix depending on language code:
+   * locale.config.LANGCODE.NAME
+   *
+   * @return string
+   *   The localized config name.
+   */
+  public function getLocaleConfigName() {
+    return 'locale.config.' . $this->language->id . '.' . $this->getName();
+  }
 }
+
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index fe9f4cb..4994f4b 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Config;
 
 use Drupal\Core\Config\Context\ContextInterface;
+use Drupal\Core\Language\Language;
 
 /**
  * Defines the configuration object factory.
@@ -22,11 +23,10 @@
  *
  * @see Drupal\Core\Config\StorageInterface
  *
- * A configuration context is an object containing parameters that will be
- * available to the configuration plug-ins for them to customize the
- * configuration data in different ways.
  *
- * @see Drupal\Core\Config\Context\ContextInterface
+ * @todo:
+ * -- when to fire the config override event?
+ * --- once during __construct(), then again on any call to setLanguage()?
  */
 class ConfigFactory {
 
@@ -38,11 +38,11 @@ class ConfigFactory {
   protected $storage;
 
   /**
-   * A stack of configuration contexts the last being the context in use.
+   * The Language object used to override configuration data.
    *
-   * @var array
+   * @var Drupal\Core\Language\Language
    */
-  protected $contextStack = array();
+  protected $language;
 
   /**
    * Cached configuration objects.
@@ -59,9 +59,11 @@ class ConfigFactory {
    * @param \Drupal\Core\Config\Context\ContextInterface
    *   Configuration context object.
    */
-  public function __construct(StorageInterface $storage, ContextInterface $context) {
+  public function __construct(StorageInterface $storage, Language $language = NULL) {
     $this->storage = $storage;
-    $this->enterContext($context);
+    // @todo: always inject language, once we figure out how to handle language
+    // and the DIC in early bootstrap phases.
+    $this->language = isset($language) ? $language : language_default();
   }
 
   /**
@@ -74,18 +76,17 @@ public function __construct(StorageInterface $storage, ContextInterface $context
    *   A configuration object.
    */
   public function get($name) {
-    $context = $this->getContext();
-    $cache_key = $this->getCacheKey($name, $context);
+    $cache_key = $this->getCacheKey($name);
     if (isset($this->cache[$cache_key])) {
       return $this->cache[$cache_key];
     }
 
-    $this->cache[$cache_key] = new Config($name, $this->storage, $context);
+    $this->cache[$cache_key] = new Config($name, $this->storage, $this->language);
     return $this->cache[$cache_key]->init();
   }
 
   /**
-   * Returns a list of configuration objects for a given names and context.
+   * Returns a list of configuration objects for a given names.
    *
    * This will pre-load all requested configuration objects does not create
    * new configuration objects.
@@ -97,11 +98,9 @@ public function get($name) {
    *   List of successfully loaded configuration objects, keyed by name.
    */
   public function loadMultiple(array $names) {
-    $context = $this->getContext();
-
     $list = array();
     foreach ($names as $key => $name) {
-      $cache_key = $this->getCacheKey($name, $context);
+      $cache_key = $this->getCacheKey($name);
       // @todo: Deleted configuration stays in $this->cache, only return
       //   config entities that are not new.
       if (isset($this->cache[$cache_key]) && !$this->cache[$cache_key]->isNew()) {
@@ -114,8 +113,8 @@ public function loadMultiple(array $names) {
     if (!empty($names)) {
       $storage_data = $this->storage->readMultiple($names);
       foreach ($storage_data as $name => $data) {
-        $cache_key = $this->getCacheKey($name, $context);
-        $this->cache[$cache_key] = new Config($name, $this->storage, $context);
+        $cache_key = $this->getCacheKey($name);
+        $this->cache[$cache_key] = new Config($name, $this->storage, $this->language);
         $this->cache[$cache_key]->initWithData($data);
         $list[$name] = $this->cache[$cache_key];
       }
@@ -163,16 +162,15 @@ public function reset($name = NULL) {
    *   The renamed config object.
    */
   public function rename($old_name, $new_name) {
-    $context = $this->getContext();
-    $old_cache_key = $this->getCacheKey($old_name, $context);
-    $new_cache_key = $this->getCacheKey($new_name, $context);
+    $old_cache_key = $this->getCacheKey($old_name);
+    $new_cache_key = $this->getCacheKey($new_name);
     if (isset($this->cache[$old_cache_key])) {
       $config = $this->cache[$old_cache_key];
       unset($this->cache[$old_cache_key]);
     }
     else {
       // Create the config object if it's not yet loaded into the static cache.
-      $config = new Config($old_name, $this->storage, $context);
+      $config = new Config($old_name, $this->storage, $this->language);
     }
 
     $this->cache[$new_cache_key] = $config;
@@ -181,59 +179,16 @@ public function rename($old_name, $new_name) {
   }
 
   /**
-   * Sets the config context by adding it to the context stack.
-   *
-   * @param \Drupal\Core\Config\Context\ContextInterface $context
-   *   The configuration context to add.
-   *
-   * @return \Drupal\Core\Config\ConfigFactory
-   *   The config factory object.
-   */
-  public function enterContext(ContextInterface $context) {
-    // Initialize the context as it is being entered.
-    $this->contextStack[] = $context->init();
-    return $this;
-  }
-
-  /**
-   * Gets the current config context.
-   *
-   * @return \Drupal\Core\Config\Context\ContextInterface $context
-   *   The current configuration context.
-   */
-  public function getContext() {
-    return end($this->contextStack);
-  }
-
-  /**
-   * Leaves the current context by removing it from the context stack.
-   *
-   * @return \Drupal\Core\Config\ConfigFactory
-   *   The config factory object.
-   */
-  public function leaveContext() {
-    // Ensure at least one context is left on the stack. We already ensured
-    // there is at least one context set by taking the initial one in the
-    // constructor.
-    if (count($this->contextStack) > 1) {
-      array_pop($this->contextStack);
-    }
-    return $this;
-  }
-
-  /**
-   * Gets the cache key for a given config name in a particular context.
+   * Gets the cache key for a given config name.
    *
    * @param string $name
    *   The name of the configuration object.
-   * @param \Drupal\Core\Config\Context\ContextInterface $context
-   *   The configuration context.
    *
    * @return string
    *   The cache key.
    */
-  public function getCacheKey($name, ContextInterface $context) {
-    return $name . ':' . $context->getUuid();
+  public function getCacheKey($name) {
+    return $this->language->id . ":$name";
   }
 
   /**
@@ -262,4 +217,41 @@ public function clearStaticCache() {
     $this->cache = array();
     return $this;
   }
+
+  /**
+   * Set the language to be injected in to Config objects.
+   *
+   * @param Language $language
+   * @return ConfigFactory
+   */
+  public function setLanguage(Language $language) {
+    $this->language = $language;
+    return $this;
+  }
+
+  /**
+   * Get the language to be injected in to Config objects.
+   *
+   * @return Drupal\Core\Language\Language
+   */
+  public function getLanguage() {
+    return $this->language;
+  }
+
+  /**
+   * Get configuration name for this language.
+   *
+   * It will be the same name with a prefix depending on language code:
+   * locale.config.LANGCODE.NAME
+   *
+   * @param string $name
+   *   The name of the config object.
+   *
+   * @return string
+   *   The localized config name.
+   */
+  public function getLocaleConfigName($name) {
+    return 'locale.config.' . $this->language->id . '.' . $name;
+  }
 }
+
diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php
index ba2ece6..89e600b 100644
--- a/core/lib/Drupal/Core/Config/ConfigImporter.php
+++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\Core\Config;
 
-use Drupal\Core\Config\Context\FreeConfigContext;
 use Drupal\Core\Entity\EntityManager;
 use Drupal\Core\Lock\LockBackendInterface;
 use Drupal\Component\Uuid\UuidInterface;
@@ -54,13 +53,6 @@ class ConfigImporter {
   protected $eventDispatcher;
 
   /**
-   * The configuration context.
-   *
-   * @var \Drupal\Core\Config\Context\ContextInterface
-   */
-  protected $context;
-
-  /**
    * The configuration factory.
    *
    * @var \Drupal\Core\Config\ConfigFactory
@@ -127,10 +119,6 @@ public function __construct(StorageComparerInterface $storage_comparer, EventDis
     $this->lock = $lock;
     $this->uuidService = $uuid_service;
     $this->processed = $this->storageComparer->getEmptyChangelist();
-    // Use an override free context for importing so that overrides to do not
-    // pollute the imported data. The context is hard coded to ensure this is
-    // the case.
-    $this->context = new FreeConfigContext($this->eventDispatcher, $this->uuidService);
   }
 
   /**
@@ -224,7 +212,6 @@ public function import() {
       // Ensure that the changes have been validated.
       $this->validate();
 
-      $this->configFactory->enterContext($this->context);
       if (!$this->lock->acquire(static::ID)) {
         // Another process is synchronizing configuration.
         throw new ConfigImporterException(sprintf('%s is already importing', static::ID));
@@ -237,9 +224,6 @@ public function import() {
       // The import is now complete.
       $this->lock->release(static::ID);
       $this->reset();
-      // Leave the context used during import and clear the ConfigFactory's
-      // static cache.
-      $this->configFactory->leaveContext()->reset();
     }
     return $this;
   }
@@ -264,7 +248,7 @@ public function validate() {
   protected function importConfig() {
     foreach (array('delete', 'create', 'update') as $op) {
       foreach ($this->getUnprocessed($op) as $name) {
-        $config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context);
+        $config = new Config($name, $this->storageComparer->getTargetStorage(), language_default());
         if ($op == 'delete') {
           $config->delete();
         }
@@ -297,11 +281,11 @@ 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 = new Config($name, $this->storageComparer->getTargetStorage(), language_default());
           $old_config->load();
 
           $data = $this->storageComparer->getSourceStorage()->read($name);
-          $new_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context);
+          $new_config = new Config($name, $this->storageComparer->getTargetStorage(), language_default());
           if ($data !== FALSE) {
             $new_config->setData($data);
           }
diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContext.php b/core/lib/Drupal/Core/Config/Context/ConfigContext.php
deleted file mode 100644
index 128165b..0000000
--- a/core/lib/Drupal/Core/Config/Context/ConfigContext.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\Context\ConfigContext.
- */
-
-namespace Drupal\Core\Config\Context;
-
-use Drupal\Core\Config\Config;
-use Drupal\Core\Config\ConfigEvent;
-use Drupal\Component\Utility\NestedArray;
-use Drupal\Component\Uuid\UuidInterface;
-use Symfony\Component\EventDispatcher\EventDispatcher;
-
-/**
- * Defines the base configuration context object.
- *
- * A configuration context object provides a data array that can be used as
- * parameters to get customized configuration objects.
- */
-class ConfigContext implements ContextInterface {
-
-  /**
-   * The actual storage of key-value pairs.
-   *
-   * @var array
-   */
-  protected $data = array();
-
-  /**
-   * Any config overrides of key-value pairs.
-   *
-   * @var array
-   */
-  protected $overrides = array();
-
-  /**
-   * An event dispatcher instance to use for configuration events.
-   *
-   * @var \Symfony\Component\EventDispatcher\EventDispatcher
-   */
-  protected $eventDispatcher;
-
-  /**
-   * A unique identifier for the context.
-   *
-   * @var string
-   */
-  protected $uuid;
-
-  /**
-   * The UUID service.
-   *
-   * @var \Drupal\Component\Uuid\UuidInterface
-   */
-  protected $uuidService;
-
-  /**
-   * Constructs the configuration context.
-   *
-   * @param \Symfony\Component\EventDispatcher\EventDispatcher $event_dispatcher
-   *   An event dispatcher instance to use for configuration events.
-   * @param \Drupal\Component\Uuid\UuidInterface
-   *   The UUID service.
-   */
-  public function __construct(EventDispatcher $event_dispatcher, UuidInterface $uuid) {
-    $this->eventDispatcher = $event_dispatcher;
-    $this->uuidService = $uuid;
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::init().
-   */
-  public function init() {
-    // Reset existing overrides and get a UUID for this context.
-    $this->overrides = array();
-    $this->setUuid();
-    // Notify event listeners that a configuration context has been created.
-    $this->notify('context', NULL);
-    return $this;
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::get().
-   */
-  public function get($key) {
-    return array_key_exists($key, $this->data) ? $this->data[$key] : NULL;
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::set().
-   */
-  public function set($key, $value) {
-    $this->data[$key] = $value;
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::setUuid().
-   */
-  public function setUuid() {
-    $this->uuid = $this->uuidService->generate();
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::getUuid().
-   */
-  public function getUuid() {
-    return $this->uuid;
-  }
-
-  /**
-   * 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));
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::setOverride().
-   */
-  public function setOverrides($config_name, $data) {
-    if (!isset($this->overrides[$config_name])) {
-      $this->overrides[$config_name] = $data;
-    }
-    else {
-      $this->overrides[$config_name] = NestedArray::mergeDeepArray(array($this->overrides[$config_name], $data), TRUE);
-    }
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::getOverrides().
-   */
-  public function getOverrides($config_name) {
-    if (isset($this->overrides[$config_name])) {
-      return $this->overrides[$config_name];
-    }
-    return FALSE;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php b/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php
deleted file mode 100644
index de3fd7b..0000000
--- a/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\Context\ConfigContextFactory.
- */
-
-namespace Drupal\Core\Config\Context;
-
-use Drupal\Core\Config\Config;
-use Drupal\Core\Config\ConfigException;
-use Drupal\Component\Uuid\UuidInterface;
-use Symfony\Component\EventDispatcher\EventDispatcher;
-
-/**
- * Defines configuration context factory.
- *
- * The configuration context factory creates configuration context objects.
- *
- * @see \Drupal\Core\Config\Context\ContextInterface
- */
-class ConfigContextFactory {
-
-  /**
-   * An event dispatcher instance to use for configuration events.
-   *
-   * @var \Symfony\Component\EventDispatcher\EventDispatcher
-   */
-  protected $eventDispatcher;
-
-  /**
-   * The UUID service.
-   *
-   * @var \Drupal\Component\Uuid\UuidInterface
-   */
-  protected $uuidService;
-
-  /**
-   * Constructs the configuration context.
-   *
-   * @param \Symfony\Component\EventDispatcher\EventDispatcher $event_dispatcher
-   *   An event dispatcher instance to use for configuration events.
-   * @param \Drupal\Component\Uuid\UuidInterface
-   *   The UUID service.
-   */
-  public function __construct(EventDispatcher $event_dispatcher, UuidInterface $uuid) {
-    $this->eventDispatcher = $event_dispatcher;
-    $this->uuidService = $uuid;
-  }
-
-  /**
-   * Returns a configuration context object.
-   *
-   * @param string $class
-   *   (Optional) The name of the configuration class to use. Defaults to
-   *   Drupal\Core\Config\Context\ConfigContext
-   *
-   * @return \Drupal\Core\Config\Context\ContextInterface $context
-   *   (Optional) The configuration context to use.
-   */
-  public function get($class = NULL) {
-    if (!$class) {
-      $class = 'Drupal\Core\Config\Context\ConfigContext';
-    }
-    if (class_exists($class)) {
-      $context = new $class($this->eventDispatcher, $this->uuidService);
-    }
-    else {
-      throw new ConfigException(sprintf('Unknown config context class: %s', $class));
-    }
-    return $context;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Config/Context/ContextInterface.php b/core/lib/Drupal/Core/Config/Context/ContextInterface.php
deleted file mode 100644
index e7e4904..0000000
--- a/core/lib/Drupal/Core/Config/Context/ContextInterface.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\Context\ContextInterface.
- */
-
-namespace Drupal\Core\Config\Context;
-
-use Drupal\Core\Config\Config;
-
-/**
- * Defines the configuration context interface.
- *
- * The configuration context object will contain predefined parameters used
- * by the configuration object for storage operations and notifications
- * and contextual data to be used by configuration event listeners.
- *
- * @see Drupal\Core\Config\Config
- * @see Drupal\Core\Config\ConfigFactory
- * @see \Drupal::config()
- */
-interface ContextInterface {
-
-  /**
-   * Initializes a configuration context for use.
-   *
-   * @return \Drupal\Core\Config\Context\ConfigContext
-   *   The config context object.
-   */
-  public function init();
-
-  /**
-   * Returns the stored value for a given key.
-   *
-   * @param string $key
-   *   The key of the data to retrieve.
-   *
-   * @return mixed
-   *   The stored value, or NULL if no value exists.
-   */
-  public function get($key);
-
-  /**
-   * Saves a value for a given key.
-   *
-   * @param string $key
-   *   The key of the data to store.
-   * @param mixed $value
-   *   The data to store.
-   */
-  public function set($key, $value);
-
-  /**
-   * Sets the uuid for the context.
-   *
-   * @return string
-   *   The context's uuid.
-   */
-  public function setUuid();
-
-  /**
-   * Gets the uuid for the context.
-   *
-   * @return string
-   *   The context's uuid.
-   */
-  public function getUuid();
-
-  /**
-   * Dispatches a config event.
-   *
-   * @param string $config_event_name
-   *   Event name.
-   * @param \Drupal\Core\Config\Config $config
-   *   (optional) Configuration object.
-   */
-  public function notify($config_event_name, Config $config = NULL);
-
-  /**
-   * Sets the override data for a configuration object.
-   *
-   * @param string $config_name
-   *   Configuration name.
-   * @param array data
-   *   The override data.
-   */
-  public function setOverrides($config_name, $data);
-
-  /**
-   * Gets the override data for a configuration object.
-   *
-   * @param string $config_name
-   *   Configuration name.
-   *
-   * @return mixed
-   *   The override data or FALSE if there is none.
-   */
-  public function getOverrides($config_name);
-
-}
diff --git a/core/lib/Drupal/Core/Config/Context/FreeConfigContext.php b/core/lib/Drupal/Core/Config/Context/FreeConfigContext.php
deleted file mode 100644
index 4307f97..0000000
--- a/core/lib/Drupal/Core/Config/Context/FreeConfigContext.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\Context\FreeConfigContext.
- */
-
-namespace Drupal\Core\Config\Context;
-
-/**
- * Defines the override-free configuration context object.
- */
-class FreeConfigContext extends ConfigContext {
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::getOverrides().
-   */
-  public function getOverrides($config_name) {
-    // Do nothing as this is override free.
-    return FALSE;
-  }
-
-  /**
-   * Implements \Drupal\Core\Config\Context\ContextInterface::setOverride().
-   */
-  public function setOverrides($config_name, $data) {
-    // Do nothing as this is override free.
-  }
-
-}
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverride.php b/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverride.php
index f3f3ea6..479df54 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverride.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverride.php
@@ -47,14 +47,6 @@ function testConfigLocaleOverride() {
     $this->assertIdentical($config->get('foo'), 'en bar');
     $this->assertIdentical($config->get('404'), 'herp');
 
-    // Ensure that we get the expected value when we avoid overrides.
-    config_context_enter('config.context.free');
-    $config_admin = \Drupal::config($name);
-    $this->assertIdentical($config_admin->get('foo'), 'bar');
-    $this->assertIdentical($config_admin->get('404'), 'herp');
-
-    // Leave the non override context.
-    config_context_leave();
     $config = \Drupal::config($name);
     $this->assertIdentical($config->get('foo'), 'en bar');
     $this->assertIdentical($config->get('404'), 'herp');
@@ -88,18 +80,6 @@ function testConfigLocaleUserOverride() {
       'preferred_langcode' => 'fr',
     ));
 
-    $user_config_context = config_context_enter('Drupal\user\UserConfigContext');
-    $user_config_context->setAccount($account);
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'fr bar');
-    // Ensure the non-overriden value is still the same.
-    $this->assertIdentical($config->get('404'), 'herp');
-
-    // Ensure that we get the expected value when we leave the user context. The
-    // locale overrides contain an English override too, so although we are not
-    // in a user based language override context, the English language override
-    // applies due to the negotiated language for the page.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
 
@@ -126,26 +106,6 @@ function testConfigLocaleUserOverride() {
       'status' => 1,
       'preferred_langcode' => 'en',
     ));
-    // Create a new user config context to stack on top of the existign one.
-    $en_user_config_context = config_context_enter('Drupal\user\UserConfigContext');
-    $en_user_config_context->setAccount($account);
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'en bar');
-
-    // Ensure that we get the expected value when we leave the english user
-    // context.
-    config_context_leave();
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'de bar');
-
-    // Ensure that we get the expected value when we leave the german user
-    // context.
-    config_context_leave();
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'en bar');
-
-    // Ensure that we cannot leave the default context.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
   }
@@ -170,18 +130,6 @@ function testConfigLocaleLanguageOverride() {
     )));
 
     $language = language_load('fr');
-    $language_config_context = config_context_enter('Drupal\language\LanguageConfigContext');
-    $language_config_context->setLanguage($language);
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'fr bar');
-    // Ensure the non-overridden value is still the same.
-    $this->assertIdentical($config->get('404'), 'herp');
-
-    // Ensure that we get the expected value when we leave the language context. The
-    // locale overrides contain an English override too, so although we are not
-    // in a language override context, the English language override
-    // applies due to the negotiated language for the page.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
 
@@ -196,25 +144,12 @@ function testConfigLocaleLanguageOverride() {
     // Enter an english context on top of the german context.
     $language = language_load('en');
     // Create a new language config context to stack on top of the existing one.
-    $en_language_config_context = config_context_enter('Drupal\language\LanguageConfigContext');
-    $en_language_config_context->setLanguage($language);
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), 'en bar');
-
-    // Ensure that we get the expected value when we leave the english
-    // language context.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'de bar');
 
-    // Ensure that we get the expected value when we leave the german
-    // language context.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
 
-    // Ensure that we cannot leave the default context.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
   }
@@ -247,51 +182,25 @@ function testConfigLocaleUserAndGlobalOverride() {
       'preferred_langcode' => 'fr',
     ));
 
-    $user_config_context = config_context_enter('Drupal\user\UserConfigContext');
-    $user_config_context->setAccount($account);
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'fr bar');
     // Ensure the value overriden from global $conf works.
     $this->assertIdentical($config->get('404'), 'global herp');
 
-    // Ensure that we get the expected value when we leave the user context. The
-    // locale overrides contain an English override too, so although we are not
-    // in a user based language override context, the English language override
-    // applies due to the negotiated language for the page.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
     // Global override should still apply.
     $this->assertIdentical($config->get('404'), 'global herp');
 
-    // Ensure that we cannot leave the default context.
-    config_context_leave();
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
     // Global override should still apply.
     $this->assertIdentical($config->get('404'), 'global herp');
 
-    // Ensure that we get the expected value when we avoid overrides.
-    config_context_enter('config.context.free');
     $config_admin = \Drupal::config('config_test.system');
     // Language override should not apply anymore.
     $this->assertIdentical($config_admin->get('foo'), 'bar');
     // Global override should not apply.
     $this->assertIdentical($config_admin->get('404'), 'herp');
-    config_context_leave();
-  }
-
-  /**
-   * Tests config_context_enter() invalid context name handling.
-   */
-  function testInvalidContextName() {
-    $message = 'Expected ConfigException was thrown for an invalid context_name argument.';
-    try {
-      config_context_enter('invalid.config.context');
-      $this->fail($message);
-    }
-    catch (ConfigException $e) {
-      $this->pass($message);
-    }
   }
 }
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigOverrideTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigOverrideTest.php
index a6016c3..25b0ff1 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigOverrideTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigOverrideTest.php
@@ -61,14 +61,6 @@ function testConfOverride() {
     $this->assertFalse(isset($data['baz']));
     $this->assertIdentical($data['404'], $expected_original_data['404']);
 
-    // Enter an override-free context to ensure the original data remains.
-    config_context_enter('config.context.free');
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), $expected_original_data['foo']);
-    $this->assertIdentical($config->get('baz'), $expected_original_data['baz']);
-    $this->assertIdentical($config->get('404'), $expected_original_data['404']);
-    config_context_leave();
-
     // Get the configuration object in an overriden context (the one set by
     // default).
     $config = \Drupal::config('config_test.system');
@@ -100,14 +92,6 @@ function testConfOverride() {
     $this->assertIdentical($config->get('baz'), $conf['config_test.system']['baz']);
     $this->assertIdentical($config->get('404'), $conf['config_test.system']['404']);
 
-    // Enter an override-free context to ensure the original data remains saved.
-    config_context_enter('config.context.free');
-    $config = \Drupal::config('config_test.system');
-    $this->assertIdentical($config->get('foo'), $expected_original_data['foo']);
-    $this->assertIdentical($config->get('baz'), $expected_original_data['baz']);
-    $this->assertIdentical($config->get('404'), $expected_original_data['404']);
-    config_context_leave();
-
     // Write file to staging.
     $staging = $this->container->get('config.storage.staging');
     $expected_new_data = array(
diff --git a/core/modules/language/lib/Drupal/language/LanguageConfigContext.php b/core/modules/language/lib/Drupal/language/LanguageConfigContext.php
deleted file mode 100644
index 58b83a6..0000000
--- a/core/modules/language/lib/Drupal/language/LanguageConfigContext.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\language\LanguageConfigContext.
- */
-
-namespace Drupal\language;
-
-use Drupal\Core\Config\Context\ConfigContext;
-use Drupal\Core\Language\Language;
-
-
-/**
- * Defines a configuration context object for a language.
- *
- * This should be used when configuration objects need a context for a language
- * other than the current language.
- *
- */
-class LanguageConfigContext extends ConfigContext {
-
-  /**
-   * Predefined key for language object.
-   */
-  const LANGUAGE_KEY = 'language';
-
-  /**
-   * Creates the configuration context for language.
-   *
-   * @param \Drupal\Core\Language\Language $language
-   *   The language to add to the config context.
-   *
-   * @return \Drupal\Core\Language\Language
-   *   The language config context object.
-   */
-  public function setLanguage(Language $language) {
-    $this->set(self::LANGUAGE_KEY, $language);
-    // Re-initialize since the language change changes the context fundamentally.
-    $this->init();
-    return $this;
-  }
-
-}
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
index 11fa899..dda8b89 100644
--- a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
+++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
@@ -7,7 +7,6 @@
 namespace Drupal\locale;
 
 use Drupal\Core\Config\Config;
-use Drupal\Core\Config\Context\ConfigContext;
 use Drupal\Core\Config\Context\ContextInterface;
 use Drupal\Core\Config\ConfigEvent;
 use Drupal\Core\Config\StorageDispatcher;
@@ -18,7 +17,6 @@
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
-
 /**
  * Locale Config helper
  *
@@ -34,66 +32,13 @@ class LocaleConfigSubscriber implements EventSubscriberInterface {
   protected $languageManager;
 
   /**
-   * Default configuration context.
-   *
-   * @var \Drupal\Core\Config\Context\ContextInterface
-   */
-  protected $defaultConfigContext;
-
-  /**
    * Constructs a LocaleConfigSubscriber object.
    *
    * @param \Drupal\Core\Language\LanguageManager $language_manager
    *   The language manager service.
-   * @param \Drupal\Core\Config\Context\ConfigContext $config_context
-   *   The configuration context service.
    */
-  public function __construct(LanguageManager $language_manager, ContextInterface $config_context) {
+  public function __construct(LanguageManager $language_manager) {
     $this->languageManager = $language_manager;
-    $this->defaultConfigContext = $config_context;
-  }
-
-  /**
-   * Initializes configuration context with language.
-   *
-   * @param \Drupal\Core\Config\ConfigEvent $event
-   *   The Event to process.
-   */
-  public function configContext(ConfigEvent $event) {
-    $context = $event->getContext();
-
-    // If there is a language set explicitly in the current context, use it.
-    // Otherwise check if there is a user set in the current context,
-    // to set the language based on the preferred language of the user.
-    // Otherwise set it based on the negotiated interface language.
-    if ($language = $context->get('language')) {
-      $context->set('locale.language', $language);
-    }
-    elseif ($account = $context->get('user.account')) {
-      $context->set('locale.language', language_load($account->getPreferredLangcode()));
-    }
-    elseif ($language = $this->languageManager->getLanguage(Language::TYPE_INTERFACE)) {
-      $context->set('locale.language', $language);
-    }
-  }
-
-  /**
-   * Override configuration values with localized data.
-   *
-   * @param \Drupal\Core\Config\ConfigEvent $event
-   *   The Event to process.
-   */
-  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);
-      }
-    }
   }
 
   /**
@@ -103,11 +48,7 @@ public function configLoad(ConfigEvent $event) {
    *   Kernel event to respond to.
    */
   public function onKernelRequestSetDefaultConfigContextLocale(GetResponseEvent $event) {
-    // Re-initialize the default configuration context to ensure any cached
-    // configuration object are reset and can be translated. This will invoke
-    // the config context event which will retrieve the negotiated language
-    // from the language manager in configContext().
-    $this->defaultConfigContext->init();
+    // Set the language on the ConfigFactory based on whatever we negotiate.
   }
 
   /**
@@ -132,11 +73,10 @@ public function getLocaleConfigName($name, Language $language) {
    * Implements EventSubscriberInterface::getSubscribedEvents().
    */
   static function getSubscribedEvents() {
-    $events['config.context'][] = array('configContext', 20);
-    $events['config.load'][] = array('configLoad', 20);
     // Set the priority above the one from the RouteListener (priority 32)
     // so ensure that the context is cleared before the routing system steps in.
     $events[KernelEvents::REQUEST][] = array('onKernelRequestSetDefaultConfigContextLocale', 48);
     return $events;
   }
 }
+
diff --git a/core/modules/locale/locale.services.yml b/core/modules/locale/locale.services.yml
index f632704..1d5bff3 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -3,7 +3,7 @@ services:
     class: Drupal\locale\LocaleConfigSubscriber
     tags:
       - { name: event_subscriber }
-    arguments: ['@language_manager', '@config.context']
+    arguments: ['@language_manager']
   locale.config.typed:
     class: Drupal\locale\LocaleConfigManager
     arguments: ['@config.storage', '@config.storage.schema', '@config.storage.installer', '@locale.storage']
diff --git a/core/modules/user/lib/Drupal/user/UserConfigContext.php b/core/modules/user/lib/Drupal/user/UserConfigContext.php
deleted file mode 100644
index 1d5f497..0000000
--- a/core/modules/user/lib/Drupal/user/UserConfigContext.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\user\UserConfigContext.
- */
-
-namespace Drupal\user;
-
-use Drupal\Core\Config\Context\ConfigContext;
-use Drupal\user\UserInterfaceInterface;
-
-
-/**
- * Defines a configuration context object for a user account.
- *
- * This should be used when configuration objects need a context for a user
- * other than the current user.
- *
- * @see user_mail()
- */
-class UserConfigContext extends ConfigContext {
-
-  /**
-   * Predefined key for account object.
-   */
-  const USER_KEY = 'user.account';
-
-  /**
-   * Creates the configuration context for user accounts.
-   *
-   * @param \Drupal\user\UserInterface $account
-   *   The account to add to the config context.
-   *
-   * @return \Drupal\user\UserConfigContext
-   *   The user config context object.
-   */
-  public function setAccount(UserInterface $account) {
-    $this->set(self::USER_KEY, $account);
-    // Re-initialize since the user change changes the context fundamentally.
-    $this->init();
-    return $this;
-  }
-
-}
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 24aee74..d9f94c4 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -1416,12 +1416,10 @@ function user_mail($key, &$message, $params) {
   $langcode = $message['langcode'];
   $variables = array('user' => $params['account']);
 
-  // Get configuration objects customized for the user specified in $params as
-  // this user is not necessarily the same as the one triggering the mail. This
-  // allows the configuration objects to be localized for the user's language if
-  // the locale module is enabled.
-  $user_config_context = config_context_enter('Drupal\user\UserConfigContext');
-  $user_config_context->setAccount($params['account']);
+  $original_language = \Drupal::configFactory()->getLanguage();
+
+  $language = language_load($params['account']->getPreferredLangcode());
+  \Drupal::configFactory()->setLanguage($language);
   $mail_config = \Drupal::config('user.mail');
 
    // We do not sanitize the token replacement, since the output of this
@@ -1430,8 +1428,7 @@ function user_mail($key, &$message, $params) {
   $message['subject'] .= $token_service->replace($mail_config->get($key . '.subject'), $variables, $token_options);
   $message['body'][] = $token_service->replace($mail_config->get($key . '.body'), $variables, $token_options);
 
-  // Return the previous config context.
-  config_context_leave();
+  \Drupal::configFactory()->setLanguage($original_language);
 }
 
 /**
diff --git a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
index 75d051d..fba504a 100644
--- a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
@@ -10,7 +10,6 @@
 use Drupal\Component\Utility\Settings;
 use Drupal\Core\Config\ConfigFactory;
 use Drupal\Core\Config\NullStorage;
-use Drupal\Core\Config\Context\ConfigContextFactory;
 use Drupal\Core\PathProcessor\PathProcessorAlias;
 use Drupal\Core\PathProcessor\PathProcessorManager;
 use Symfony\Component\EventDispatcher\EventDispatcher;
