diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml
index 1b06282..e33c1c4 100644
--- a/core/config/schema/core.data_types.schema.yml
+++ b/core/config/schema/core.data_types.schema.yml
@@ -120,6 +120,11 @@ action_configuration_default:
   sequence:
     - type: string
 
+# Theme settings schema is automatically applied to a theme's
+# THEME_NAME.settings configuration unless the theme provides its own schema.
+# Static analysis of configuration objects using schema will have to duplicate
+# the system_config_schema_info_alter() to determine a theme's
+# THEME_NAME.settings schema.
 theme_settings:
   type: mapping
   mapping:
diff --git a/core/modules/config/src/Tests/DefaultConfigTest.php b/core/modules/config/src/Tests/DefaultConfigTest.php
index 99ff07a..0c026da 100644
--- a/core/modules/config/src/Tests/DefaultConfigTest.php
+++ b/core/modules/config/src/Tests/DefaultConfigTest.php
@@ -41,7 +41,7 @@ class DefaultConfigTest extends KernelTestBase {
    *
    * @var array
    */
-  protected $themes = ['seven'];
+  protected $themes = ['seven', 'test_chained_subtheme'];
 
   protected function setUp() {
     parent::setUp();
diff --git a/core/modules/system/src/Tests/Theme/ThemeTest.php b/core/modules/system/src/Tests/Theme/ThemeTest.php
index 7f3587f..c781133 100644
--- a/core/modules/system/src/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/src/Tests/Theme/ThemeTest.php
@@ -208,7 +208,10 @@ function testListThemes() {
 
     // Check for base theme and subtheme lists.
     $base_theme_list = array('test_basetheme' => 'Theme test base theme');
-    $sub_theme_list = array('test_subtheme' => 'Theme test subtheme');
+    $sub_theme_list = [
+      'test_subtheme' => 'Theme test subtheme',
+      'test_chained_subtheme' => 'Theme test chained subtheme',
+    ];
     $this->assertIdentical($themes['test_basetheme']->sub_themes, $sub_theme_list, 'Base theme\'s object includes list of subthemes.');
     $this->assertIdentical($themes['test_subtheme']->base_themes, $base_theme_list, 'Subtheme\'s object includes list of base themes.');
     // Check for theme engine in subtheme.
@@ -281,4 +284,22 @@ function testRegionClass() {
     $this->assertEqual(count($elements), 1, 'New class found.');
   }
 
+  /**
+   * Test that themes inherit configuration schema through base themes.
+   */
+  function testThemeSchemaInheritance() {
+    $this->container->get('theme_handler')->install(array('test_chained_subtheme'));
+    // Rebuild the definitions since the theme definitions will have been
+    // resolved to complete definitions during theme installation.
+    $typed_config = \Drupal::service('config.typed');
+    $typed_config->clearCachedDefinitions();
+    $definitions = $typed_config->getDefinitions();
+    // Test that themes with a base theme inherit the schema correctly.
+    $this->assertEqual('test_subtheme.settings', $definitions['test_chained_subtheme.settings']['type']);
+    $this->assertEqual('test_basetheme.settings', $definitions['test_subtheme.settings']['type']);
+    $this->assertEqual('theme_settings', $definitions['test_basetheme.settings']['type']);
+
+    $this->assertEqual('classy.settings', $definitions['test_theme.settings']['type']);
+    $this->assertEqual('theme_settings', $definitions['classy.settings']['type']);
+  }
 }
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 32193be..71d4a75 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -1313,3 +1313,38 @@ function system_path_insert() {
 function system_path_delete($path) {
   \Drupal::service('path.alias_manager')->cacheClear();
 }
+
+/**
+ * Implements hook_config_schema_info_alter().
+ */
+function system_config_schema_info_alter(&$definitions) {
+  // Provide a default schema for all theme settings files if the theme does
+  // provide its own schema already.
+  foreach (\Drupal::service('theme_handler')->listInfo(TRUE) as $name => $theme) {
+    $config_name = $name . '.settings';
+    if (!isset($definitions[$config_name])) {
+      // Create a list of possible schema keys.
+      if (isset($theme->base_themes)) {
+        $schema_keys = array_reverse(array_keys($theme->base_themes));
+        array_walk($schema_keys, function (&$theme) {
+          $theme = $theme . '.settings';
+        });
+      }
+      $schema_keys[] = 'theme_settings';
+
+      // Create all the schema keys so that theme's inherit the schema from
+      // their base theme.
+      foreach ($schema_keys as $schema_key) {
+        $definitions[$config_name] = array(
+          'type' => $schema_key,
+          'label' => $name . ' settings',
+        );
+        $config_name = $schema_key;
+        if (isset($definitions[$config_name])) {
+          // No need to continue building the base theme schema chain.
+          break;
+        }
+      }
+    }
+  }
+}
diff --git a/core/modules/system/tests/themes/test_chained_subtheme/config/install/test_chained_subtheme.settings.yml b/core/modules/system/tests/themes/test_chained_subtheme/config/install/test_chained_subtheme.settings.yml
new file mode 100644
index 0000000..719eafb
--- /dev/null
+++ b/core/modules/system/tests/themes/test_chained_subtheme/config/install/test_chained_subtheme.settings.yml
@@ -0,0 +1 @@
+base: overriden
diff --git a/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.info.yml b/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.info.yml
new file mode 100644
index 0000000..8942cc7
--- /dev/null
+++ b/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.info.yml
@@ -0,0 +1,6 @@
+name: 'Theme test chained subtheme'
+type: theme
+description: 'Test theme which uses test_subtheme as the base theme.'
+version: VERSION
+core: 8.x
+base theme: test_subtheme
diff --git a/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.theme b/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.theme
new file mode 100644
index 0000000..6bf0811
--- /dev/null
+++ b/core/modules/system/tests/themes/test_chained_subtheme/test_chained_subtheme.theme
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * Add hooks for tests to use.
+ */
diff --git a/core/modules/system/tests/themes/test_subtheme/config/schema/test_subtheme.schema.yml b/core/modules/system/tests/themes/test_subtheme/config/schema/test_subtheme.schema.yml
deleted file mode 100644
index 9c7b0ce..0000000
--- a/core/modules/system/tests/themes/test_subtheme/config/schema/test_subtheme.schema.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-test_subtheme.settings:
-  type: theme_settings
-  label: 'Test sub theme settings'
-  mapping:
-    override:
-      type: string
-      label: 'Whether the setting has been overridden'
diff --git a/core/themes/bartik/config/schema/bartik.schema.yml b/core/themes/bartik/config/schema/bartik.schema.yml
deleted file mode 100644
index ef355e3..0000000
--- a/core/themes/bartik/config/schema/bartik.schema.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Schema for the configuration files of the Bartik theme.
-
-bartik.settings:
-  type: theme_settings
-  label: 'Bartik settings'
diff --git a/core/themes/seven/config/schema/seven.schema.yml b/core/themes/seven/config/schema/seven.schema.yml
deleted file mode 100644
index 8e40d45..0000000
--- a/core/themes/seven/config/schema/seven.schema.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Schema for the configuration files of the Seven theme.
-
-seven.settings:
-  type: theme_settings
-  label: 'Seven settings'
