diff --git a/core/authorize.php b/core/authorize.php
index c6ba51d..93b84a2 100644
--- a/core/authorize.php
+++ b/core/authorize.php
@@ -84,12 +84,6 @@ module_list(TRUE, FALSE, FALSE, $module_list);
 drupal_load('module', 'system');
 drupal_load('module', 'user');
 
-// We also want to have the language system available, but we do *NOT* want to
-// actually call drupal_bootstrap(DRUPAL_BOOTSTRAP_LANGUAGE), since that would
-// also force us through the DRUPAL_BOOTSTRAP_PAGE_HEADER phase, which loads
-// all the modules, and that's exactly what we're trying to avoid.
-drupal_language_initialize();
-
 // Initialize the maintenance theme for this administrative script.
 drupal_maintenance_theme();
 
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 6abe08a..9baa0b6 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -3,7 +3,7 @@
 use Drupal\Core\Database\Database;
 use Symfony\Component\ClassLoader\UniversalClassLoader;
 use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\Container;
 
 /**
  * @file
@@ -137,14 +137,9 @@ const DRUPAL_BOOTSTRAP_SESSION = 4;
 const DRUPAL_BOOTSTRAP_PAGE_HEADER = 5;
 
 /**
- * Seventh bootstrap phase: find out language of the page.
- */
-const DRUPAL_BOOTSTRAP_LANGUAGE = 6;
-
-/**
  * Final bootstrap phase: Drupal is fully loaded; validate and fix input data.
  */
-const DRUPAL_BOOTSTRAP_FULL = 7;
+const DRUPAL_BOOTSTRAP_FULL = 6;
 
 /**
  * Role ID for anonymous users; should match what's in the "role" table.
@@ -1999,7 +1994,6 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
     DRUPAL_BOOTSTRAP_VARIABLES,
     DRUPAL_BOOTSTRAP_SESSION,
     DRUPAL_BOOTSTRAP_PAGE_HEADER,
-    DRUPAL_BOOTSTRAP_LANGUAGE,
     DRUPAL_BOOTSTRAP_FULL,
   );
   // Not drupal_static(), because the only legitimate API to control this is to
@@ -2052,10 +2046,6 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
           _drupal_bootstrap_page_header();
           break;
 
-        case DRUPAL_BOOTSTRAP_LANGUAGE:
-          drupal_language_initialize();
-          break;
-
         case DRUPAL_BOOTSTRAP_FULL:
           require_once DRUPAL_ROOT . '/core/includes/common.inc';
           _drupal_bootstrap_full();
@@ -2314,7 +2304,7 @@ function drupal_get_bootstrap_phase() {
  * @param $reset
  *   TRUE or FALSE depending on whether the Container instance is to be reset.
  *
- * @return Symfony\Component\DependencyInjection\ContainerBuilder
+ * @return Drupal\Core\DependencyInjection\Container
  *   The instance of the Drupal Container used to set up and maintain object
  *   instances.
  */
@@ -2324,11 +2314,7 @@ function drupal_container($reset = FALSE) {
   // would leave Drupal in a nonfunctional state.
   static $container = NULL;
   if ($reset || !isset($container)) {
-    $container = new ContainerBuilder();
-    // An interface language always needs to be available for t() and other
-    // functions. This default is overridden by drupal_language_initialize()
-    // during language negotiation.
-    $container->register(LANGUAGE_TYPE_INTERFACE, 'Drupal\\Core\\Language\\Language');
+    $container = new Container();
   }
   return $container;
 }
@@ -2474,48 +2460,6 @@ function get_t() {
 }
 
 /**
- * Initializes all the defined language types.
- *
- * @see Drupal\Core\Language\Language
- */
-function drupal_language_initialize() {
-  $types = language_types_get_all();
-  $container = drupal_container();
-
-  // Ensure a language object is registered for each language type, whether the
-  // site is multilingual or not.
-  if (language_multilingual()) {
-    include_once DRUPAL_ROOT . '/core/includes/language.inc';
-    foreach ($types as $type) {
-      $language = language_types_initialize($type);
-      $container->set($type, NULL);
-      $container->register($type, 'Drupal\\Core\\Language\\Language')
-        ->addMethodCall('extend', array($language));
-    }
-    // Allow modules to react on language system initialization in multilingual
-    // environments.
-    bootstrap_invoke_all('language_init');
-  }
-  else {
-    $default = language_default();
-    foreach ($types as $type) {
-      $container->set($type, NULL);
-      $container->register($type, 'Drupal\\Core\\Language\\Language')
-        ->addMethodCall('extend', array($default));
-    }
-  }
-
-  // @todo Temporary backwards compatibility for code still using globals.
-  //   Remove after these issues:
-  //   - $language_interface: http://drupal.org/node/1510686
-  //   - $language_url: http://drupal.org/node/1512310
-  //   - $language_content: http://drupal.org/node/1512308
-  foreach ($types as $type) {
-    $GLOBALS[$type] = $container->get($type);
-  }
-}
-
-/**
  * Returns an array of the available language types.
  */
 function language_types_get_all() {
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 36e4f77..e4fb30d 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -254,10 +254,6 @@ function install_begin_request(&$install_state) {
   // Load module basics (needed for hook invokes).
   include_once DRUPAL_ROOT . '/core/includes/module.inc';
   include_once DRUPAL_ROOT . '/core/includes/session.inc';
-
-  // Set up $language, so t() caller functions will still work.
-  drupal_language_initialize();
-
   require_once DRUPAL_ROOT . '/core/includes/ajax.inc';
   $module_list['system']['filename'] = 'core/modules/system/system.module';
   $module_list['entity']['filename'] = 'core/modules/entity/entity.module';
diff --git a/core/lib/Drupal/Core/DependencyInjection/Container.php b/core/lib/Drupal/Core/DependencyInjection/Container.php
new file mode 100644
index 0000000..0e57a20
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Container.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\DependencyInjection\Container.
+ */
+
+namespace Drupal\Core\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * The base Drupal dependency injection container.
+ */
+class Container extends ContainerBuilder {
+
+  /**
+   * Registers base Drupal services to the dependency injection container.
+   */
+  public function __construct() {
+    parent::__construct();
+
+    // An interface language always needs to be available for t() and other
+    // functions. This default is overridden by during language negotiation.
+    $types = array(LANGUAGE_TYPE_INTERFACE, LANGUAGE_TYPE_CONTENT, LANGUAGE_TYPE_URL);
+    foreach ($types as $type) {
+      $this->register($type, 'Drupal\\Core\\Language\\Language')
+        ->addMethodCall('bootstrap', array($type, $this));
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 9b9223d..0227565 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Core\Language;
 
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
 /**
  * An object containing the information for an interface language.
  *
@@ -41,13 +43,46 @@ class Language {
 
   /**
    * Extend $this with properties from the given object.
-   *
-   * @todo Remove this function once $GLOBALS['language'] is gone.
    */
   public function extend($obj) {
     $vars = get_object_vars($obj);
     foreach ($vars as $var => $value) {
       $this->$var = $value;
     }
+    return $this;
+  }
+
+  /**
+   * Bootstraps the Language with the given type.
+   */
+  public function bootstrap($type, ContainerInterface $container) {
+    // Ensure a language object is registered for each language type, whether
+    // the site is multilingual or not.
+    if (language_multilingual()) {
+      // Initialize the language.
+      include_once DRUPAL_ROOT . '/core/includes/language.inc';
+      $language = language_types_initialize($type);
+      $GLOBALS[$type] = $this->extend($language);
+
+      // Check if we are to bootstrap the Language system.
+      if (!$container->has('language.bootstrap')) {
+        // Bootstrap modules should have been loaded when this function is called, so
+        // we don't need to tell module_list() to reset its internal list (and we
+        // therefore leave the first parameter at its default value of FALSE). We
+        // still pass in TRUE for the second parameter, though; in case this is the
+        // first time during the bootstrap that module_list() is called, we want to
+        // make sure that its internal cache is primed with the bootstrap modules
+        // only.
+        foreach (module_list(FALSE, TRUE) as $module) {
+          drupal_load('module', $module);
+          module_invoke($module, $hook);
+        }
+        $container->set('language.bootstrap', TRUE);
+      }
+    }
+    else {
+      $default = language_default();
+      $GLOBALS[$type] = $this->extend($default);
+    }
   }
 }
diff --git a/core/modules/language/language.install b/core/modules/language/language.install
index 5a962fa..7c2dd89 100644
--- a/core/modules/language/language.install
+++ b/core/modules/language/language.install
@@ -43,10 +43,6 @@ function language_uninstall() {
     variable_del("language_negotiation_$type");
     variable_del("language_negotiation_methods_weight_$type");
   }
-
-  // Re-initialize the language system so successive calls to t() and other
-  // functions will not expect languages to be present.
-  drupal_language_initialize();
 }
 
 /**
diff --git a/core/modules/language/language.test b/core/modules/language/language.test
index f0000e1..e641f7e 100644
--- a/core/modules/language/language.test
+++ b/core/modules/language/language.test
@@ -185,31 +185,11 @@ class LanguageDependencyInjectionTest extends DrupalWebTestCase {
   }
 
   /**
-   * Test dependency injected Language against the GLOBAL language object.
-   *
-   * @todo Once the PHP global is gone, we won't need this test as the same
-   * test is done without the PHP global in the following test.
-   */
-  function testDependencyInjectedLanguage() {
-    // Initialize the language system.
-    drupal_language_initialize();
-
-    $expected = $GLOBALS[LANGUAGE_TYPE_INTERFACE];
-    $result = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
-    foreach ($expected as $property => $value) {
-      $this->assertEqual($expected->$property, $result->$property, t('The dependency injected language object %prop property equals the $GLOBAL language object %prop property.', array('%prop' => $property)));
-    }
-  }
-
-  /**
    * Test dependency injected languages against a new Language object.
    *
    * @see Drupal\Core\Language\Language
    */
   function testDependencyInjectedNewLanguage() {
-    // Initialize the language system.
-    drupal_language_initialize();
-
     $expected = new Drupal\Core\Language\Language((array) language_default());
     $result = drupal_container()->get(LANGUAGE_TYPE_INTERFACE);
     foreach ($expected as $property => $value) {
@@ -234,9 +214,6 @@ class LanguageDependencyInjectionTest extends DrupalWebTestCase {
     );
     variable_set('language_default', $new_language_default);
 
-    // Initialize the language system.
-    drupal_language_initialize();
-
     // The langauge system creates a Language object which contains the
     // same properties as the new default language object.
     $expected = $new_language_default;
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index fa78e14..524373b 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -1584,7 +1584,6 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
     language_save($language);
 
     // Check the UI language.
-    drupal_language_initialize();
     $this->assertEqual($GLOBALS['language_interface']->langcode, $this->langcode, t('Current language: %lang', array('%lang' => $GLOBALS['language_interface']->langcode)));
 
     // Enable multilingual workflow option for articles.
@@ -1629,7 +1628,6 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
     $this->drupalGet('');
 
     // Check the init language logic.
-    drupal_language_initialize();
     $this->assertEqual($GLOBALS['language_interface']->langcode, 'en', t('Language after uninstall: %lang', array('%lang' => $GLOBALS['language_interface']->langcode)));
 
     // Check JavaScript files deletion.
diff --git a/core/modules/path/path.test b/core/modules/path/path.test
index 0066071..a3f5820 100644
--- a/core/modules/path/path.test
+++ b/core/modules/path/path.test
@@ -542,9 +542,6 @@ class PathMonolingualTestCase extends PathTestCase {
     // Set language detection to URL.
     $edit = array('language_interface[enabled][language-url]' => TRUE);
     $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
-
-    // Force languages to be initialized.
-    drupal_language_initialize();
   }
 
   /**
diff --git a/core/update.php b/core/update.php
index 9797833..bd45ef2 100644
--- a/core/update.php
+++ b/core/update.php
@@ -424,9 +424,9 @@ if (empty($op) && update_access_allowed()) {
 }
 
 // update_fix_d8_requirements() needs to run before bootstrapping beyond path.
-// So bootstrap to DRUPAL_BOOTSTRAP_LANGUAGE then include unicode.inc.
+// So bootstrap to DRUPAL_BOOTSTRAP_PAGE_HEADER then include unicode.inc.
 
-drupal_bootstrap(DRUPAL_BOOTSTRAP_LANGUAGE);
+drupal_bootstrap(DRUPAL_BOOTSTRAP_PAGE_HEADER);
 include_once DRUPAL_ROOT . '/core/includes/unicode.inc';
 
 update_fix_d8_requirements();
