diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index b3b368b..0f6f5c7 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -333,6 +333,32 @@ public function disable(array $theme_list) {
   /**
    * {@inheritdoc}
    */
+  public function uninstall(array $theme_list) {
+    $extension_config = $this->configFactory->get('core.extension');
+
+    foreach ($theme_list as $key) {
+      if ($extension_config->get("theme.$key") !== NULL) {
+        throw new \InvalidArgumentException("Theme $key is still enabled.");
+      }
+      if ($extension_config->get("disabled.theme.$key") === NULL) {
+        throw new \InvalidArgumentException("Theme $key is not installed.");
+      }
+    }
+
+    foreach ($theme_list as $key) {
+      // Remove all configuration belonging to the theme.
+      \Drupal::service('config.manager')->uninstall('theme', $key);
+
+      $extension_config->clear("disabled.theme.$key");
+    }
+    $extension_config->save();
+
+    $this->moduleHandler->invokeAll('themes_uninstalled', array($theme_list));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function listInfo() {
     if (!isset($this->list)) {
       $this->list = array();
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
index c6194ea..2569d05 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
@@ -42,6 +42,16 @@ public function enable(array $theme_list, $enable_dependencies = TRUE);
   public function disable(array $theme_list);
 
   /**
+   * Uninstalls a given list of disabled themes.
+   *
+   * @param array $theme_list
+   *   The themes to uninstall.
+   *
+   * @see hook_themes_uninstalled()
+   */
+  public function uninstall(array $theme_list);
+
+  /**
    * Returns a list of currently enabled themes.
    *
    * @return \Drupal\Core\Extension\Extension[]
diff --git a/core/modules/system/lib/Drupal/system/Tests/Extension/ThemeHandlerTest.php b/core/modules/system/lib/Drupal/system/Tests/Extension/ThemeHandlerTest.php
index 0f5ecdc..0acb93e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Extension/ThemeHandlerTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Extension/ThemeHandlerTest.php
@@ -337,6 +337,60 @@ function testDisableNonExisting() {
   }
 
   /**
+   * Tests uninstalling a theme.
+   */
+  function testUninstall() {
+    $name = 'test_basetheme';
+
+    $this->themeHandler()->enable(array($name));
+    $this->themeHandler()->disable(array($name));
+    $this->assertTrue($this->config("$name.settings")->get());
+
+    $this->themeHandler()->uninstall(array($name));
+
+    $this->assertFalse(array_keys($this->themeHandler()->listInfo()));
+    $this->assertFalse(array_keys(system_list('theme')));
+
+    $this->assertFalse($this->config("$name.settings")->get());
+  }
+
+  /**
+   * Tests uninstalling a theme that is not installed.
+   */
+  function testUninstallNotInstalled() {
+    $name = 'test_basetheme';
+
+    try {
+      $message = 'ThemeHandler::uninstall() throws InvalidArgumentException upon uninstalling a theme that is not installed.';
+      $this->themeHandler()->uninstall(array($name));
+      $this->fail($message);
+    }
+    catch (\InvalidArgumentException $e) {
+      $this->pass(get_class($e) . ': ' . $e->getMessage());
+    }
+  }
+
+  /**
+   * Tests uninstalling a theme that is not disabled.
+   */
+  function testUninstallEnabled() {
+    $name = 'test_basetheme';
+
+    $this->themeHandler()->enable(array($name));
+
+    try {
+      $message = 'ThemeHandler::uninstall() throws InvalidArgumentException upon uninstalling a theme that is not installed.';
+      $this->themeHandler()->uninstall(array($name));
+      $this->fail($message);
+    }
+    catch (\InvalidArgumentException $e) {
+      $this->pass(get_class($e) . ': ' . $e->getMessage());
+    }
+
+    $this->assertTrue($this->config("$name.settings")->get());
+  }
+
+  /**
    * Tests that theme info can be altered by a module.
    *
    * @see module_test_system_info_alter()
