diff --git a/core/config/install/core.extension.yml b/core/config/install/core.extension.yml
index eae39ef..1514a9e 100644
--- a/core/config/install/core.extension.yml
+++ b/core/config/install/core.extension.yml
@@ -1,5 +1,4 @@
 module: {}
-theme:
-  stark: 0
+theme: {}
 disabled:
   theme: {}
diff --git a/core/lib/Drupal/Core/Theme/DefaultNegotiator.php b/core/lib/Drupal/Core/Theme/DefaultNegotiator.php
index a33634f..2f0e6f7 100644
--- a/core/lib/Drupal/Core/Theme/DefaultNegotiator.php
+++ b/core/lib/Drupal/Core/Theme/DefaultNegotiator.php
@@ -43,10 +43,7 @@ public function applies(RouteMatchInterface $route_match) {
    * {@inheritdoc}
    */
   public function determineActiveTheme(RouteMatchInterface $route_match) {
-    // @todo Find a proper way to work at the beginning of the installer when
-    //   there is no configuration available yet. One proper way could be to
-    //   provider a custom negotiator during the installer.
-    return $this->config->get('default') ?: 'stark';
+    return $this->config->get('default');
   }
 
 }
diff --git a/core/lib/Drupal/Core/Theme/ThemeInitialization.php b/core/lib/Drupal/Core/Theme/ThemeInitialization.php
index 265c17e..b3af456 100644
--- a/core/lib/Drupal/Core/Theme/ThemeInitialization.php
+++ b/core/lib/Drupal/Core/Theme/ThemeInitialization.php
@@ -61,29 +61,40 @@ public function getActiveThemeByName($theme_name) {
     if ($active_theme = $this->state->get('theme.active_theme.' . $theme_name)) {
       return $active_theme;
     }
-    else {
-      $themes = $this->themeHandler->listInfo();
-
-      if (empty($themes)) {
-        throw new \RuntimeException('No theme is enabled.');
-      }
-      if (!isset($themes[$theme_name])) {
-        throw new \InvalidArgumentException(String::format('Theme %theme is not enabled/does not exist.', array('theme' => $theme_name)));
-      }
+    $themes = $this->themeHandler->listInfo();
+
+    // If no theme could be negotiated, or if the negotiated theme is not within
+    // the list of enabled themes, fall back to the default theme output of core
+    // and modules (like Stark, but without a theme extension at all). This is
+    // possible, because loadActiveTheme() always loads the Twig theme engine.
+    // This is desired, because missing or malformed theme configuration should
+    // not leave the application in a broken state. By falling back to default
+    // output, the user is able to reconfigure the theme through the UI.
+    // In addition, kernel tests are expected to operate with no theme and only
+    // the original theme output of modules by default.
+    if (empty($themes) || !$theme_name || !isset($themes[$theme_name])) {
+      $theme_name = 'core';
+      // /core/core.info.yml does not actually exist, but is required because
+      // Extension expects a pathname.
+      $active_theme = $this->getActiveTheme(new Extension('theme', 'core/core.info.yml'));
+
+      // Early-return and do not set state, because the initialized $theme_name
+      // differs from the original $theme_name.
+      return $active_theme;
+    }
 
-      // Find all our ancestor themes and put them in an array.
-      $base_themes = array();
-      $ancestor = $theme_name;
-      while ($ancestor && isset($themes[$ancestor]->base_theme)) {
-        $ancestor = $themes[$ancestor]->base_theme;
-        $base_themes[] = $themes[$ancestor];
-      }
+    // Find all our ancestor themes and put them in an array.
+    $base_themes = array();
+    $ancestor = $theme_name;
+    while ($ancestor && isset($themes[$ancestor]->base_theme)) {
+      $ancestor = $themes[$ancestor]->base_theme;
+      $base_themes[] = $themes[$ancestor];
+    }
 
-      $active_theme = $this->getActiveTheme($themes[$theme_name], $base_themes);
+    $active_theme = $this->getActiveTheme($themes[$theme_name], $base_themes);
 
-      $this->state->set('theme.active_theme.' . $theme_name, $active_theme);
-      return $active_theme;
-    }
+    $this->state->set('theme.active_theme.' . $theme_name, $active_theme);
+    return $active_theme;
   }
 
   /**
@@ -123,7 +134,7 @@ public function loadActiveTheme(ActiveTheme $active_theme) {
   /**
    * {@inheritdoc}
    */
-  public function getActiveTheme(Extension $theme, array $base_themes) {
+  public function getActiveTheme(Extension $theme, array $base_themes = []) {
     $theme_path = $theme->getPath();
 
     $values['path'] = $theme_path;
diff --git a/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php b/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php
index 7a7f240..f2b1547 100644
--- a/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php
+++ b/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php
@@ -60,6 +60,6 @@ public function loadActiveTheme(ActiveTheme $active_theme);
    * @return \Drupal\Core\Theme\ActiveTheme
    *   The active theme instance for the passed in $theme.
    */
-  public function getActiveTheme(Extension $theme, array $base_themes);
+  public function getActiveTheme(Extension $theme, array $base_themes = []);
 
 }
diff --git a/core/lib/Drupal/Core/Theme/ThemeManager.php b/core/lib/Drupal/Core/Theme/ThemeManager.php
index 49a0233..4e41f6d 100644
--- a/core/lib/Drupal/Core/Theme/ThemeManager.php
+++ b/core/lib/Drupal/Core/Theme/ThemeManager.php
@@ -124,7 +124,7 @@ protected function initTheme(RouteMatchInterface $route_match = NULL) {
     if (!$route_match) {
       $route_match = \Drupal::routeMatch();
     }
-    $theme = $this->themeNegotiator->determineActiveTheme($route_match) ?: 'stark';
+    $theme = $this->themeNegotiator->determineActiveTheme($route_match);
     $this->activeTheme = $this->themeInitialization->initTheme($theme);
   }
 
diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php
index afea590..616d064 100644
--- a/core/modules/simpletest/src/KernelTestBase.php
+++ b/core/modules/simpletest/src/KernelTestBase.php
@@ -176,7 +176,7 @@ protected function setUp() {
     // \Drupal\Core\Config\ConfigInstaller::installDefaultConfig() to work.
     // Write directly to active storage to avoid early instantiation of
     // the event dispatcher which can prevent modules from registering events.
-    \Drupal::service('config.storage')->write('core.extension', array('module' => array(), 'theme' => array('seven' => 1, 'stark' => 1)));
+    \Drupal::service('config.storage')->write('core.extension', array('module' => array(), 'theme' => array()));
 
     // Collect and set a fixed module list.
     $class = get_class($this);
diff --git a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
index 288cf4d..adf573e 100644
--- a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
+++ b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
@@ -281,6 +281,20 @@ function testEnableModulesTheme() {
   }
 
   /**
+   * Tests that there is no theme by default.
+   */
+  function testNoThemeByDefault() {
+    $themes = $this->container->get('config.factory')->get('core.extension')->get('theme');
+    $this->assertEqual($themes, array());
+
+    $extensions = $this->container->get('config.storage')->read('core.extension');
+    $this->assertEqual($extensions['theme'], array());
+
+    $active_theme = $this->container->get('theme.manager')->getActiveTheme();
+    $this->assertEqual($active_theme->getName(), 'core');
+  }
+
+  /**
    * Tests that drupal_get_profile() returns NULL.
    *
    * As the currently active installation profile is used when installing
diff --git a/core/modules/system/src/Tests/Extension/ThemeHandlerTest.php b/core/modules/system/src/Tests/Extension/ThemeHandlerTest.php
index d3ed687..75d10fd 100644
--- a/core/modules/system/src/Tests/Extension/ThemeHandlerTest.php
+++ b/core/modules/system/src/Tests/Extension/ThemeHandlerTest.php
@@ -36,10 +36,6 @@ public function containerBuild(ContainerBuilder $container) {
   protected function setUp() {
     parent::setUp();
     $this->installConfig(array('system'));
-
-    // Reset the available themes to test the case of no themes.
-    $this->extensionConfig()->set('theme', array());
-    $this->extensionConfig()->set('disabled.theme', array());
   }
 
   /**
@@ -55,17 +51,8 @@ function testEmpty() {
     // Rebuilding available themes should always yield results though.
     $this->assertTrue($this->themeHandler()->rebuildThemeData()['stark'], 'ThemeHandler::rebuildThemeData() yields all available themes.');
 
-    try {
-      // theme_get_setting() should fail, as no theme is available.
-      $this->assertIdentical(theme_get_setting('features.favicon'), TRUE);
-      $this->fail('No theme should lead to an exception');
-    }
-    catch (\RuntimeException $e) {
-      $this->assertEqual($e->getMessage(), 'No theme is enabled.');
-    }
-    catch (\Exception $e) {
-      $this->fail('The runtime exception should be thrown.');
-    }
+    // theme_get_setting() should return global default theme settings.
+    $this->assertIdentical(theme_get_setting('features.favicon'), TRUE);
   }
 
   /**
