diff --git a/core/includes/errors.inc b/core/includes/errors.inc
index b7c15b6..3ae1771 100644
--- a/core/includes/errors.inc
+++ b/core/includes/errors.inc
@@ -5,7 +5,11 @@
  * Functions for error handling.
  */
 
+use Drupal\Component\Utility\Settings;
 use Drupal\Component\Utility\String;
+use Drupal\Core\CoreServiceProvider;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\HttpFoundation\Response;
 
 /**
@@ -178,6 +182,10 @@ function error_displayable($error = NULL) {
  *   TRUE if the error is fatal.
  */
 function _drupal_log_error($error, $fatal = FALSE) {
+  // If there is no container build something minimal so that stuff works.
+  if (!\Drupal::hasContainer()) {
+    _drupal_build_error_container();
+  }
   // Initialize a maintenance theme if the bootstrap was not complete.
   // Do it early because drupal_set_message() triggers a drupal_theme_initialize().
   if ($fatal && (drupal_get_bootstrap_phase() != DRUPAL_BOOTSTRAP_FULL)) {
@@ -223,7 +231,7 @@ function _drupal_log_error($error, $fatal = FALSE) {
     }
   }
 
-  if (\Drupal::request()->isXmlHttpRequest()) {
+  if (\Drupal::hasRequest() && \Drupal::request()->isXmlHttpRequest()) {
     if ($fatal) {
       if (error_displayable($error)) {
         // When called from JavaScript, simply output the error message.
@@ -284,7 +292,7 @@ function _drupal_log_error($error, $fatal = FALSE) {
         $response->setStatusCode(500, '500 Service unavailable (with message)');
       }
 
-      return $response;
+      $response->send();
     }
   }
 }
@@ -385,3 +393,110 @@ function format_backtrace(array $backtrace) {
   }
   return $return;
 }
+
+/**
+ * Creates a container for the error handler and maintenance theme.
+ */
+function _drupal_build_error_container () {
+  // Need caching to be configured but don't actually want it in this
+  // situation, so use the NullBackend.
+  require_once DRUPAL_ROOT . '/core/includes/cache.inc';
+
+  // @todo Move into a proper Drupal\Core\DependencyInjection\InstallContainerBuilder.
+  $container = new ContainerBuilder();
+
+  $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'));
+
+  // Register the 'language_manager' service.
+  $container
+    ->register('language_manager', 'Drupal\Core\Language\LanguageManager')
+    ->addArgument(NULL);
+
+  // Register the translation services.
+  if (isset($GLOBALS['conf']['locale.settings']['translation.path'])) {
+    $directory = $GLOBALS['conf']['locale.settings']['translation.path'];
+  }
+  else {
+    $directory = conf_path() . '/files/translations';
+  }
+  $container
+    ->register('string_translator.file_translation', 'Drupal\Core\StringTranslation\Translator\FileTranslation')
+    ->addArgument($directory);
+  $container
+    ->register('string_translator.custom_strings', 'Drupal\Core\StringTranslation\Translator\CustomStrings')
+    ->addArgument(settings());
+  $container
+    ->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager')
+    ->addMethodCall('addTranslator', array(new Reference('string_translator.file_translation')))
+    ->addMethodCall('addTranslator', array(new Reference('string_translator.custom_strings')));
+
+  foreach (array('bootstrap', 'config', 'cache', 'menu', 'page', 'path') as $bin) {
+    $container
+      ->register("cache.$bin", 'Drupal\Core\Cache\MemoryBackend')
+      ->addArgument($bin);
+  }
+
+  // The error handler cannot use the database lock backend since the database
+  // is not up.
+  $container->register('lock', 'Drupal\Core\Lock\NullLockBackend');
+
+  // Register a module handler for managing enabled modules.
+  $container->register('module_handler', 'Drupal\Core\Extension\ModuleHandler');
+
+  $container
+    ->register('settings', 'Drupal\Component\Utility\Settings')
+    ->setFactoryClass('Drupal\Component\Utility\Settings')
+    ->setFactoryMethod('getSingleton');
+  $container
+    ->register('keyvalue', 'Drupal\Core\KeyValueStore\KeyValueFactory')
+    ->addArgument(new Reference('service_container'))
+    ->addArgument(new Reference('settings'));
+  $container->register('keyvalue.memory', 'Drupal\Core\KeyValueStore\KeyValueMemoryFactory');
+
+  $settings = Settings::getSingleton()->getAll();
+  // Override the default keyvalue storage to use memory as the database is
+  // not available.
+  $settings['keyvalue_default'] = 'keyvalue.memory';
+  new Settings($settings);
+
+  $container
+    ->register('state', 'Drupal\Core\KeyValueStore\KeyValueStoreInterface')
+    ->setFactoryService(new Reference('keyvalue'))
+    ->setFactoryMethod('get')
+    ->addArgument('state');
+
+  // Register Twig template engine for use during install.
+  CoreServiceProvider::registerTwig($container);
+
+  $container->register('url_generator', 'Drupal\Core\Routing\NullGenerator');
+
+  // Register UUID.
+  CoreServiceProvider::registerUuid($container);
+
+  // Register the CSS and JavaScript asset collection renderers.
+  $container
+    ->register('asset.css.collection_renderer', 'Drupal\Core\Asset\CssCollectionRenderer')
+    ->addArgument(new Reference('state'));
+  $container
+    ->register('asset.js.collection_renderer', 'Drupal\Core\Asset\JsCollectionRenderer')
+    ->addArgument(new Reference('state'));
+
+  \Drupal::setContainer($container);
+}
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index a03ee24..e36fd0a 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -157,6 +157,10 @@ public static function request() {
     return static::$container->get('request');
   }
 
+  public static function hasRequest() {
+    return static::$container->has('request');
+  }
+
   /**
    * Gets the current active user.
    *
@@ -557,4 +561,8 @@ public static function formBuilder() {
     return static::$container->get('form_builder');
   }
 
+  public static function hasContainer() {
+    return !empty(static::$container);
+  }
+
 }
