diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index d92e27c..e6e44a1 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -1774,7 +1774,7 @@ function _drupal_bootstrap_configuration() {
 function _drupal_bootstrap_kernel() {
   // Normally, index.php puts a container in the Drupal class by creating a
   // kernel. If there is no container yet, create one.
-  if (!\Drupal::getContainer()) {
+  if (!\Drupal::hasContainer()) {
     $kernel = new DrupalKernel('prod', drupal_classloader());
     $kernel->boot();
     $request = Request::createFromGlobals();
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index 4106c5b..3ceba87 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -115,9 +115,28 @@ public static function setContainer(ContainerInterface $container) {
    * should not be used otherwise.
    *
    * @return \Symfony\Component\DependencyInjection\ContainerInterface
+   * @throws Exception
    */
   public static function getContainer() {
-    return static::$container;
+    if (static::$container) {
+      return static::$container;
+    }
+    $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+    $message = sprintf(
+      "%s called before the container was available.",
+      $backtrace[1]['class'] . $backtrace[1]['type'] . $backtrace[1]['function']
+    );
+    throw new \Exception($message);
+  }
+
+  /**
+   * Returns TRUE if the container is already set.
+   *
+   * @return bool
+   *   TRUE if the container is already set.
+   */
+  public static function hasContainer() {
+    return (bool) static::$container;
   }
 
   /**
@@ -133,7 +152,7 @@ public static function getContainer() {
    *   The specified service.
    */
   public static function service($id) {
-    return static::$container->get($id);
+    return static::getContainer()->get($id);
   }
 
   /**
@@ -146,7 +165,7 @@ public static function service($id) {
    *   TRUE if the specified service exists, FALSE otherwise.
    */
   public static function hasService($id) {
-    return static::$container && static::$container->has($id);
+    return static::hasContainer() && static::getContainer()->has($id);
   }
 
   /**
@@ -172,7 +191,7 @@ public static function hasService($id) {
    *   The currently active request object.
    */
   public static function request() {
-    return static::$container->get('request');
+    return static::getContainer()->get('request');
   }
 
   /**
@@ -181,7 +200,7 @@ public static function request() {
    * @return \Drupal\Core\Session\AccountInterface
    */
   public static function currentUser() {
-    return static::$container->get('current_user');
+    return static::getContainer()->get('current_user');
   }
 
   /**
@@ -191,7 +210,7 @@ public static function currentUser() {
    *   The entity manager service.
    */
   public static function entityManager() {
-    return static::$container->get('entity.manager');
+    return static::getContainer()->get('entity.manager');
   }
 
   /**
@@ -201,7 +220,7 @@ public static function entityManager() {
    *   The current active database's master connection.
    */
   public static function database() {
-    return static::$container->get('database');
+    return static::getContainer()->get('database');
   }
 
   /**
@@ -215,7 +234,7 @@ public static function database() {
    *   The cache object associated with the specified bin.
    */
   public static function cache($bin = 'cache') {
-    return static::$container->get('cache.' . $bin);
+    return static::getContainer()->get('cache.' . $bin);
   }
 
   /**
@@ -228,7 +247,7 @@ public static function cache($bin = 'cache') {
    *   An expirable key value store collection.
    */
   public static function keyValueExpirable($collection) {
-    return static::$container->get('keyvalue.expirable')->get($collection);
+    return static::getContainer()->get('keyvalue.expirable')->get($collection);
   }
 
   /**
@@ -237,7 +256,7 @@ public static function keyValueExpirable($collection) {
    * @return \Drupal\Core\Lock\LockBackendInterface
    */
   public static function lock() {
-    return static::$container->get('lock');
+    return static::getContainer()->get('lock');
   }
 
   /**
@@ -256,7 +275,7 @@ public static function lock() {
    *   A configuration object.
    */
   public static function config($name) {
-    return static::$container->get('config.factory')->get($name);
+    return static::getContainer()->get('config.factory')->get($name);
   }
 
   /**
@@ -269,7 +288,7 @@ public static function config($name) {
    * @return \Drupal\Core\Config\ConfigFactory
    */
   public static function configFactory() {
-    return static::$container->get('config.factory');
+    return static::getContainer()->get('config.factory');
   }
 
   /**
@@ -295,7 +314,7 @@ public static function configFactory() {
    *   The queue object for a given name.
    */
   public static function queue($name, $reliable = FALSE) {
-    return static::$container->get('queue')->get($name, $reliable);
+    return static::getContainer()->get('queue')->get($name, $reliable);
   }
 
   /**
@@ -307,7 +326,7 @@ public static function queue($name, $reliable = FALSE) {
    * @return \Drupal\Core\KeyValueStore\KeyValueStoreInterface
    */
   public static function keyValue($collection) {
-    return static::$container->get('keyvalue')->get($collection);
+    return static::getContainer()->get('keyvalue')->get($collection);
   }
 
   /**
@@ -322,7 +341,7 @@ public static function keyValue($collection) {
    * @return \Drupal\Core\KeyValueStore\StateInterface
    */
   public static function state() {
-    return static::$container->get('state');
+    return static::getContainer()->get('state');
   }
 
   /**
@@ -332,7 +351,7 @@ public static function state() {
    *   A guzzle http client instance.
    */
   public static function httpClient() {
-    return static::$container->get('http_default_client');
+    return static::getContainer()->get('http_default_client');
   }
 
   /**
@@ -349,7 +368,7 @@ public static function httpClient() {
    *   The query object that can query the given entity type.
    */
   public static function entityQuery($entity_type, $conjunction = 'AND') {
-    return static::$container->get('entity.query')->get($entity_type, $conjunction);
+    return static::getContainer()->get('entity.query')->get($entity_type, $conjunction);
   }
 
   /**
@@ -366,7 +385,7 @@ public static function entityQuery($entity_type, $conjunction = 'AND') {
    *   The query object that can query the given entity type.
    */
   public static function entityQueryAggregate($entity_type, $conjunction = 'AND') {
-    return static::$container->get('entity.query')->getAggregate($entity_type, $conjunction);
+    return static::getContainer()->get('entity.query')->getAggregate($entity_type, $conjunction);
   }
 
   /**
@@ -375,7 +394,7 @@ public static function entityQueryAggregate($entity_type, $conjunction = 'AND')
    * @return \Drupal\Core\Flood\FloodInterface
    */
   public static function flood() {
-    return static::$container->get('flood');
+    return static::getContainer()->get('flood');
   }
 
   /**
@@ -384,7 +403,7 @@ public static function flood() {
    * @return \Drupal\Core\Extension\ModuleHandlerInterface
    */
   public static function moduleHandler() {
-    return static::$container->get('module_handler');
+    return static::getContainer()->get('module_handler');
   }
 
   /**
@@ -398,7 +417,7 @@ public static function moduleHandler() {
    * @see \Drupal\Core\TypedData\TypedDataManager::create()
    */
   public static function typedDataManager() {
-    return static::$container->get('typed_data_manager');
+    return static::getContainer()->get('typed_data_manager');
   }
 
   /**
@@ -408,7 +427,7 @@ public static function typedDataManager() {
    *   The token service.
    */
   public static function token() {
-    return static::$container->get('token');
+    return static::getContainer()->get('token');
   }
 
   /**
@@ -418,7 +437,7 @@ public static function token() {
    *   The url generator service.
    */
   public static function urlGenerator() {
-    return static::$container->get('url_generator');
+    return static::getContainer()->get('url_generator');
   }
 
   /**
@@ -464,7 +483,7 @@ public static function urlGenerator() {
    * @see \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute()
    */
   public static function url($route_name, $route_parameters = array(), $options = array()) {
-    return static::$container->get('url_generator')->generateFromRoute($route_name, $route_parameters, $options);
+    return static::getContainer()->get('url_generator')->generateFromRoute($route_name, $route_parameters, $options);
   }
 
   /**
@@ -473,7 +492,7 @@ public static function url($route_name, $route_parameters = array(), $options =
    * @return \Drupal\Core\Utility\LinkGeneratorInterface
    */
   public static function linkGenerator() {
-    return static::$container->get('link_generator');
+    return static::getContainer()->get('link_generator');
   }
 
   /**
@@ -535,7 +554,7 @@ public static function linkGenerator() {
    * @see \Drupal\Core\Utility\LinkGeneratorInterface::generate()
    */
   public static function l($text, $route_name, array $parameters = array(), array $options = array()) {
-    return static::$container->get('link_generator')->generate($text, $route_name, $parameters, $options);
+    return static::getContainer()->get('link_generator')->generate($text, $route_name, $parameters, $options);
   }
 
   /**
@@ -545,7 +564,7 @@ public static function l($text, $route_name, array $parameters = array(), array
    *   The string translation manager.
    */
   public static function translation() {
-    return static::$container->get('string_translation');
+    return static::getContainer()->get('string_translation');
   }
 
   /**
@@ -555,7 +574,7 @@ public static function translation() {
    *   The language manager.
    */
   public static function languageManager() {
-    return static::$container->get('language_manager');
+    return static::getContainer()->get('language_manager');
   }
 
   /**
@@ -565,7 +584,7 @@ public static function languageManager() {
    *   The CSRF token manager.
    */
   public static function csrfToken() {
-    return static::$container->get('csrf_token');
+    return static::getContainer()->get('csrf_token');
   }
 
   /**
@@ -575,7 +594,7 @@ public static function csrfToken() {
    *   The transliteration manager.
    */
   public static function transliteration() {
-    return static::$container->get('transliteration');
+    return static::getContainer()->get('transliteration');
   }
 
   /**
@@ -585,7 +604,7 @@ public static function transliteration() {
    *   The form builder.
    */
   public static function formBuilder() {
-    return static::$container->get('form_builder');
+    return static::getContainer()->get('form_builder');
   }
 
 }
