diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index a723087..1988a14 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -252,6 +252,7 @@ public function rebuildThemeData() {
     // Set defaults for theme info.
     $defaults = array(
       'engine' => 'twig',
+      'base theme' => 'stable',
       'regions' => array(
         'sidebar_first' => 'Left sidebar',
         'sidebar_second' => 'Right sidebar',
@@ -282,6 +283,11 @@ public function rebuildThemeData() {
       $theme->status = (int) isset($installed[$key]);
 
       $theme->info = $this->infoParser->parse($theme->getPathname()) + $defaults;
+      // Remove the default Stable base theme when 'base theme: false' is set in
+      // a theme .info.yml file.
+      if ($theme->info['base theme'] === FALSE) {
+        unset($theme->info['base theme']);
+      }
 
       // Add the info file modification time, so it becomes available for
       // contributed modules to use for ordering theme lists.
diff --git a/core/modules/system/src/Tests/Theme/StableThemeTest.php b/core/modules/system/src/Tests/Theme/StableThemeTest.php
new file mode 100644
index 0000000..06866b5
--- /dev/null
+++ b/core/modules/system/src/Tests/Theme/StableThemeTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Theme\StableThemeTest.
+ */
+
+namespace Drupal\system\Tests\Theme;
+
+use Drupal\simpletest\KernelTestBase;
+
+/**
+ * Tests the behavior of the Stable theme.
+ *
+ * @group Theme
+ */
+class StableThemeTest extends KernelTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  public static $modules = ['system'];
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * The theme manager.
+   *
+   * @var \Drupal\Core\Theme\ThemeManagerInterface
+   */
+  protected $themeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->themeHandler = $this->container->get('theme_handler');
+    $this->themeManager = $this->container->get('theme.manager');
+  }
+
+  /**
+   * Ensures Stable is used by default when no base theme has been defined.
+   */
+  public function testStableIsDefault() {
+    $this->themeHandler->install(['test_stable']);
+    $this->config('system.theme')->set('default', 'test_stable')->save();
+    $theme = $this->themeManager->getActiveTheme();
+    /** @var \Drupal\Core\Theme\ActiveTheme $base_theme */
+    $base_themes = $theme->getBaseThemes();
+    $base_theme = reset($base_themes);
+    $this->assertTrue($base_theme->getName() == 'stable', "Stable theme is the base theme if a theme hasn't decided to opt out.");
+  }
+
+  /**
+   * Tests opting out of Stable by setting the base theme to false.
+   */
+  public function testWildWest() {
+    $this->themeHandler->install(['test_wild_west']);
+    $this->config('system.theme')->set('default', 'test_wild_west')->save();
+    $theme = $this->themeManager->getActiveTheme();
+    /** @var \Drupal\Core\Theme\ActiveTheme $base_theme */
+    $base_themes = $theme->getBaseThemes();
+    $this->assertTrue(empty($base_themes), 'No base theme is set when a theme has opted out of using Stable.');
+  }
+
+}
diff --git a/core/modules/system/src/Tests/Update/StableBaseThemeUpdateTest.php b/core/modules/system/src/Tests/Update/StableBaseThemeUpdateTest.php
new file mode 100644
index 0000000..f782243
--- /dev/null
+++ b/core/modules/system/src/Tests/Update/StableBaseThemeUpdateTest.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Update\StableBaseThemeUpdateTest.
+ */
+
+namespace Drupal\system\Tests\Update;
+
+/**
+ * Tests the upgrade path for introducing the Stable base theme.
+ *
+ * @see https://www.drupal.org/node/2575421
+ *
+ * @group system
+ */
+class StableBaseThemeUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.stable-base-theme-2575421.php',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->themeHandler = $this->container->get('theme_handler');
+    $this->themeHandler->refreshInfo();
+  }
+
+  /**
+   * Tests that the Stable base theme is installed if necessary.
+   */
+  public function testUpdateHookN() {
+    $this->assertTrue($this->themeHandler->themeExists('test_stable'));
+    $this->assertFalse($this->themeHandler->themeExists('stable'));
+
+    $this->runUpdates();
+
+    // Refresh the theme handler now that Stable has been installed.
+    $this->themeHandler->refreshInfo();
+    $this->assertTrue($this->themeHandler->themeExists('stable'));
+  }
+
+}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 47f6dca..6f0b877 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1808,5 +1808,22 @@ function system_update_8011() {
 }
 
 /**
+ * Install the Stable base theme if needed.
+ */
+function system_update_8012() {
+  $theme_handler = \Drupal::service('theme_handler');
+  // Ensure we have fresh info.
+  $theme_handler->rebuildThemeData();
+  foreach ($theme_handler->listInfo() as $theme) {
+    // We first check that a base theme is set because if it's set to false then
+    // it's unset in \Drupal\Core\Extension\ThemeHandler::rebuildThemeData().
+    if (isset($theme->info['base theme']) && $theme->info['base theme'] == 'stable') {
+      $theme_handler->install(['stable']);
+      return;
+    }
+  }
+}
+
+/**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.stable-base-theme-2575421.php b/core/modules/system/tests/fixtures/update/drupal-8.stable-base-theme-2575421.php
new file mode 100644
index 0000000..7b658b4
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal-8.stable-base-theme-2575421.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains database additions to drupal-8.bare.standard.php.gz for testing the
+ * upgrade path of https://www.drupal.org/node/2575421.
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+// Enable test_stable theme.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$connection->update('config')
+  ->fields([
+    'data' => serialize(array_merge_recursive($extensions, ['theme' => ['test_stable' => 0]]))
+  ])
+  ->condition('name', 'core.extension')
+  ->execute();
diff --git a/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml b/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml
index 7b76ded..afa55cb 100644
--- a/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml
+++ b/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml
@@ -3,6 +3,7 @@ type: theme
 description: 'Test theme which acts as a base theme for other test subthemes.'
 version: VERSION
 core: 8.x
+base theme: false
 libraries:
   - test_basetheme/global-styling
 stylesheets-remove:
diff --git a/core/modules/system/tests/themes/test_invalid_engine/test_invalid_engine.info.yml b/core/modules/system/tests/themes/test_invalid_engine/test_invalid_engine.info.yml
index 229ede4..92410bf 100644
--- a/core/modules/system/tests/themes/test_invalid_engine/test_invalid_engine.info.yml
+++ b/core/modules/system/tests/themes/test_invalid_engine/test_invalid_engine.info.yml
@@ -4,3 +4,4 @@ description: 'Test theme which has a non-existent theme engine.'
 version: VERSION
 core: 8.x
 engine: not_real_engine
+base theme: false
diff --git a/core/modules/system/tests/themes/test_stable/test_stable.info.yml b/core/modules/system/tests/themes/test_stable/test_stable.info.yml
new file mode 100644
index 0000000..52f3fd1
--- /dev/null
+++ b/core/modules/system/tests/themes/test_stable/test_stable.info.yml
@@ -0,0 +1,5 @@
+name: Test Stable
+type: theme
+description: A theme to test that stable is set as the default.
+version: VERSION
+core: 8.x
diff --git a/core/modules/system/tests/themes/test_theme_nyan_cat_engine/test_theme_nyan_cat_engine.info.yml b/core/modules/system/tests/themes/test_theme_nyan_cat_engine/test_theme_nyan_cat_engine.info.yml
index a911bd0..315581a 100644
--- a/core/modules/system/tests/themes/test_theme_nyan_cat_engine/test_theme_nyan_cat_engine.info.yml
+++ b/core/modules/system/tests/themes/test_theme_nyan_cat_engine/test_theme_nyan_cat_engine.info.yml
@@ -4,3 +4,4 @@ description: 'Theme for testing the theme system with the Nyan Cat theme engine'
 version: VERSION
 core: 8.x
 engine: nyan_cat
+base theme: false
diff --git a/core/modules/system/tests/themes/test_wild_west/test_wild_west.info.yml b/core/modules/system/tests/themes/test_wild_west/test_wild_west.info.yml
new file mode 100644
index 0000000..d1fcb82
--- /dev/null
+++ b/core/modules/system/tests/themes/test_wild_west/test_wild_west.info.yml
@@ -0,0 +1,6 @@
+name: Test Wild West
+type: theme
+description: A theme that doesn't use Stable as its base. It tests the wild west instead.
+version: VERSION
+base theme: false
+core: 8.x
diff --git a/core/themes/classy/classy.info.yml b/core/themes/classy/classy.info.yml
index 7e74173..bd47945 100644
--- a/core/themes/classy/classy.info.yml
+++ b/core/themes/classy/classy.info.yml
@@ -4,6 +4,8 @@ description: 'A base theme with sensible default CSS classes added. Learn how to
 package: Core
 version: VERSION
 core: 8.x
+base theme: false
+hidden: true
 
 libraries:
   - classy/base
diff --git a/core/themes/stable/stable.info.yml b/core/themes/stable/stable.info.yml
new file mode 100644
index 0000000..960a683
--- /dev/null
+++ b/core/themes/stable/stable.info.yml
@@ -0,0 +1,8 @@
+name: Stable
+type: theme
+description: A default base theme using Drupal 8.0.0's core markup, CSS, and JavaScript.
+package: Core
+version: VERSION
+core: 8.x
+base theme: false
+hidden: true
diff --git a/core/themes/stark/stark.info.yml b/core/themes/stark/stark.info.yml
index 70609c1..f6c9ba5 100644
--- a/core/themes/stark/stark.info.yml
+++ b/core/themes/stark/stark.info.yml
@@ -4,3 +4,4 @@ description: 'An intentionally plain theme with no styling to demonstrate defaul
 package: Core
 version: VERSION
 core: 8.x
+base theme: false
