diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index cfd8427..d3b8dfb 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -95,7 +95,7 @@ function drupal_theme_initialize() {
     return;
   }
 
-  $themes = list_themes();
+  $themes = \Drupal::service('theme_handler')->listInfo();
 
   // @todo Let the theme.negotiator listen to the kernel request event.
   // Determine the active theme for the theme negotiator service. This includes
@@ -727,7 +727,7 @@ function drupal_find_theme_templates($cache, $extension, $path) {
   // used for filtering. This allows base themes to have sub-themes in its
   // folder hierarchy without affecting the base themes template discovery.
   $theme_paths = array();
-  foreach (list_themes() as $theme_info) {
+  foreach (\Drupal::service('theme_handler')->listInfo() as $theme_info) {
     if (!empty($theme_info->base_theme)) {
       $theme_paths[$theme_info->base_theme][$theme_info->getName()] = $theme_info->getPath();
     }
diff --git a/core/lib/Drupal/Core/Theme/Registry.php b/core/lib/Drupal/Core/Theme/Registry.php
index e84b33b..4a6081a 100644
--- a/core/lib/Drupal/Core/Theme/Registry.php
+++ b/core/lib/Drupal/Core/Theme/Registry.php
@@ -166,7 +166,7 @@ protected function init($theme_name = NULL) {
     // Instead of the global theme, a specific theme was requested.
     else {
       // @see drupal_theme_initialize()
-      $themes = $this->listThemes();
+      $themes = \Drupal::service('theme_handler')->listInfo();
       $this->theme = $themes[$theme_name];
 
       // Find all base themes.
@@ -386,7 +386,8 @@ protected function build() {
    *   example, if a theme hook is both defined by a module and a theme, then
    *   the definition in the theme will be used.
    * @param \stdClass $theme
-   *   The loaded $theme object as returned from list_themes().
+   *   The loaded $theme object as returned from
+   *   ThemeHandlerInterface::listInfo().
    * @param string $path
    *   The directory where $name is. For example, modules/system or
    *   themes/bartik.
@@ -577,15 +578,6 @@ protected function getPath($module) {
   }
 
   /**
-   * Wraps list_themes().
-   *
-   * @return array
-   */
-  protected function listThemes() {
-    return list_themes();
-  }
-
-  /**
    * Wraps drupal_theme_initialize().
    */
   protected function initializeTheme() {
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 1bca18b..6abc867 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -58,7 +58,7 @@ function block_help($path, $arg) {
     else {
       $demo_theme = \Drupal::config('system.theme')->get('default');
     }
-    $themes = list_themes();
+    $themes = \Drupal::service('theme_handler')->listInfo();
     $output = '<p>' . t('This page provides a drag-and-drop interface for adding a block to a region, and for controlling the order of blocks within regions. To add a block to a region, or to configure its specific title and visibility settings, click the block title under <em>Place blocks</em>. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page.') . '</p>';
     $output .= '<p>' . l(t('Demonstrate block regions (@theme)', array('@theme' => $themes[$demo_theme]->info['name'])), 'admin/structure/block/demo/' . $demo_theme) . '</p>';
     return $output;
@@ -388,7 +388,7 @@ function _block_get_renderable_block($element) {
  * Implements hook_rebuild().
  */
 function block_rebuild() {
-  foreach (list_themes() as $name => $data) {
+  foreach (\Drupal::service('theme_handler')->listInfo() as $name => $data) {
     if ($data->status) {
       _block_rehash($name);
     }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
index 3ed3842..284d9b3 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
@@ -90,7 +90,7 @@ public function addForm(CustomBlockTypeInterface $custom_block_type, Request $re
     $block = $this->customBlockStorage->create(array(
       'type' => $custom_block_type->id()
     ));
-    if (($theme = $request->query->get('theme')) && in_array($theme, array_keys(list_themes()))) {
+    if (($theme = $request->query->get('theme')) && in_array($theme, array_keys(\Drupal::service('theme_handler')->listInfo()))) {
       // We have navigated to this page from the block library and will keep track
       // of the theme for redirecting the user to the configuration page for the
       // newly created block in the given theme.
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
index 82cb852..a603a00 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
@@ -152,7 +152,7 @@ public function testsCustomBlockAddTypes() {
       ->getStorageController('custom_block');
 
     // Enable all themes.
-    theme_enable(array('bartik', 'seven'));
+    \Drupal::service('theme_handler')->enable(array('bartik', 'seven'));
     $themes = array('bartik', 'seven', 'stark');
     $theme_settings = $this->container->get('config.factory')->get('system.theme');
     foreach ($themes as $default_theme) {
diff --git a/core/modules/block/lib/Drupal/block/BlockFormController.php b/core/modules/block/lib/Drupal/block/BlockFormController.php
index 4ce4c81..ef5bd60 100644
--- a/core/modules/block/lib/Drupal/block/BlockFormController.php
+++ b/core/modules/block/lib/Drupal/block/BlockFormController.php
@@ -229,7 +229,7 @@ public function form(array $form, array &$form_state) {
     }
     else {
       $theme_options = array();
-      foreach (list_themes() as $theme_name => $theme_info) {
+      foreach (\Drupal::service('theme_handler')->listInfo() as $theme_name => $theme_info) {
         if (!empty($theme_info->status)) {
           $theme_options[$theme_name] = $theme_info->info['name'];
         }
diff --git a/core/modules/block/lib/Drupal/block/Controller/BlockController.php b/core/modules/block/lib/Drupal/block/Controller/BlockController.php
index ebd9bc9..ee05f8c 100644
--- a/core/modules/block/lib/Drupal/block/Controller/BlockController.php
+++ b/core/modules/block/lib/Drupal/block/Controller/BlockController.php
@@ -26,7 +26,7 @@ class BlockController extends ControllerBase {
    *   A render array containing the CSS and title for the block region demo.
    */
   public function demo($theme) {
-    $themes = list_themes();
+    $themes = \Drupal::service('theme_handler')->listInfo();
     return array(
       '#title' => String::checkPlain($themes[$theme]->info['name']),
       '#attached' => array(
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockAdminThemeTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockAdminThemeTest.php
index d553440..6265907 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockAdminThemeTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockAdminThemeTest.php
@@ -42,7 +42,7 @@ function testAdminTheme() {
     $this->assertResponse(403);
 
     // Enable admin theme and confirm that tab is accessible.
-    theme_enable(array('bartik'));
+    \Drupal::service('theme_handler')->enable(array('bartik'));
     $edit['admin_theme'] = 'bartik';
     $this->drupalPostForm('admin/appearance', $edit, t('Save configuration'));
     $this->drupalGet('admin/structure/block/list/bartik');
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockHiddenRegionTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockHiddenRegionTest.php
index 3fa85d6..6fe57e1 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockHiddenRegionTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockHiddenRegionTest.php
@@ -60,7 +60,7 @@ public function testBlockNotInHiddenRegion() {
 
     // Enable "block_test_theme" and set it as the default theme.
     $theme = 'block_test_theme';
-    theme_enable(array($theme));
+    \Drupal::service('theme_handler')->enable(array($theme));
     \Drupal::config('system.theme')
       ->set('default', $theme)
       ->save();
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
index e7b99e1..87364a3 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
@@ -158,7 +158,7 @@ function testBlock() {
    */
   public function testBlockThemeSelector() {
     // Enable all themes.
-    theme_enable(array('bartik', 'seven'));
+    \Drupal::service('theme_handler')->enable(array('bartik', 'seven'));
     $theme_settings = $this->container->get('config.factory')->get('system.theme');
     foreach (array('bartik', 'stark', 'seven') as $theme) {
       $this->drupalGet('admin/structure/block/list/' . $theme);
diff --git a/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php b/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
index c544960..c4a4ffe 100644
--- a/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
@@ -51,7 +51,7 @@ function testNewDefaultThemeBlocks() {
     // Enable a different theme.
     $new_theme = 'bartik';
     $this->assertFalse($new_theme == $default_theme, 'The new theme is different from the previous default theme.');
-    theme_enable(array($new_theme));
+    \Drupal::service('theme_handler')->enable(array($new_theme));
     \Drupal::config('system.theme')
       ->set('default', $new_theme)
       ->save();
diff --git a/core/modules/block/lib/Drupal/block/Tests/NonDefaultBlockAdminTest.php b/core/modules/block/lib/Drupal/block/Tests/NonDefaultBlockAdminTest.php
index 72f3d1d..cdfbdd9 100644
--- a/core/modules/block/lib/Drupal/block/Tests/NonDefaultBlockAdminTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/NonDefaultBlockAdminTest.php
@@ -33,7 +33,7 @@ function testNonDefaultBlockAdmin() {
     $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer themes'));
     $this->drupalLogin($admin_user);
     $new_theme = 'bartik';
-    theme_enable(array($new_theme));
+    \Drupal::service('theme_handler')->enable(array($new_theme));
     $this->drupalGet('admin/structure/block/list/' . $new_theme);
     $this->assertText('Bartik(' . t('active tab') . ')', 'Tab for non-default theme found.');
   }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
index 153df41..1e25edd 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
@@ -25,7 +25,7 @@ public static function getInfo() {
 
   public function setUp() {
     parent::setUp();
-    theme_enable(array('breakpoint_test_theme'));
+    \Drupal::service('theme_handler')->enable(array('breakpoint_test_theme'));
   }
 
   /**
@@ -53,7 +53,7 @@ public function testThemeBreakpoints() {
     $this->verifyBreakpointGroup($breakpoint_group_obj);
 
     // Disable the test theme and verify the breakpoint group is deleted.
-    theme_disable(array('breakpoint_test_theme'));
+    \Drupal::service('theme_handler')->disable(array('breakpoint_test_theme'));
     $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'breakpoint_group_load: Loading a deleted breakpoint group returns false.', 'Breakpoint API');
   }
 
@@ -81,7 +81,7 @@ public function testThemeBreakpointGroup() {
     $this->verifyBreakpointGroup($breakpoint_group_obj);
 
     // Disable the test theme and verify the breakpoint group is deleted.
-    theme_disable(array('breakpoint_test_theme'));
+    \Drupal::service('theme_handler')->disable(array('breakpoint_test_theme'));
     $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'breakpoint_group_load: Loading a deleted breakpoint group returns false.', 'Breakpoint API');
   }
 
diff --git a/core/modules/color/lib/Drupal/color/Tests/ColorTest.php b/core/modules/color/lib/Drupal/color/Tests/ColorTest.php
index 2e14d68..9eec044 100644
--- a/core/modules/color/lib/Drupal/color/Tests/ColorTest.php
+++ b/core/modules/color/lib/Drupal/color/Tests/ColorTest.php
@@ -52,7 +52,7 @@ function setUp() {
         'scheme_color' => '#3b3b3b',
       ),
     );
-    theme_enable(array_keys($this->themes));
+    \Drupal::service('theme_handler')->enable(array_keys($this->themes));
 
     // Array filled with valid and not valid color values
     $this->colorTests = array(
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
index cf7af82..d41bdd0 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
@@ -47,7 +47,7 @@ public static function getInfo() {
    */
   function testCommentLinks() {
     // Bartik theme alters comment links, so use a different theme.
-    theme_enable(array('stark'));
+    \Drupal::service('theme_handler')->enable(array('stark'));
     \Drupal::config('system.theme')
       ->set('default', 'stark')
       ->save();
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
index ed4b1e2..48b3123 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
@@ -668,7 +668,7 @@ public function testAlterInfo() {
   public function testThemeDiscovery() {
     // Enable the test theme and rebuild routes.
     $theme = 'config_translation_test_theme';
-    theme_enable(array($theme));
+    \Drupal::service('theme_handler')->enable(array($theme));
     // Enabling a theme will cause the kernel terminate event to rebuild the
     // router. Simulate that here.
     \Drupal::service('router.builder')->rebuildIfNeeded();
diff --git a/core/modules/system/lib/Drupal/system/Controller/ThemeController.php b/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
index ece04d5..ca5f0f6 100644
--- a/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
+++ b/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
@@ -36,7 +36,7 @@ public function disable(Request $request) {
 
     if (isset($theme)) {
       // Get current list of themes.
-      $themes = list_themes();
+      $themes = $this->themeHandler->listInfo();
 
       // Check if the specified theme is one recognized by the system.
       if (!empty($themes[$theme])) {
@@ -45,7 +45,7 @@ public function disable(Request $request) {
           drupal_set_message(t('%theme is the default theme and cannot be disabled.', array('%theme' => $themes[$theme]->info['name'])), 'error');
         }
         else {
-          theme_disable(array($theme));
+          $this->themeHandler->disable(array($theme));
           drupal_set_message(t('The %theme theme has been disabled.', array('%theme' => $themes[$theme]->info['name'])));
         }
       }
@@ -77,11 +77,12 @@ public function enable(Request $request) {
 
     if (isset($theme)) {
       // Get current list of themes.
-      $themes = list_themes(TRUE);
+      $this->themeHandler->reset();
+      $themes = $this->themeHandler->listInfo();
 
       // Check if the specified theme is one recognized by the system.
       if (!empty($themes[$theme])) {
-        theme_enable(array($theme));
+        $this->themeHandler->enable(array($theme));
         drupal_set_message(t('The %theme theme has been enabled.', array('%theme' => $themes[$theme]->info['name'])));
       }
       else {
diff --git a/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php b/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php
index 9459aad..bd5f016 100644
--- a/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php
+++ b/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php
@@ -67,7 +67,7 @@ public function getFormId() {
   public function buildForm(array $form, array &$form_state, $theme = '') {
     $form = parent::buildForm($form, $form_state);
 
-    $themes = list_themes();
+    $themes = \Drupal::service('theme_handler')->listInfo();
 
     // Deny access if the theme is disabled or not found.
     if (!empty($theme) && (empty($themes[$theme]) || !$themes[$theme]->status)) {
@@ -78,7 +78,7 @@ public function buildForm(array $form, array &$form_state, $theme = '') {
     if ($theme) {
       $var = 'theme_' . $theme . '_settings';
       $config_key = $theme . '.settings';
-      $themes = list_themes();
+      $themes = \Drupal::service('theme_handler')->listInfo();
       $features = $themes[$theme]->info['features'];
     }
     else {
diff --git a/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php b/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
index da6910d..2e9a39f 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
@@ -18,7 +18,7 @@ class ThemeLocalTask extends DerivativeBase {
    * {@inheritdoc}
    */
   public function getDerivativeDefinitions($base_plugin_definition) {
-    foreach (list_themes() as $theme_name => $theme) {
+    foreach (\Drupal::service('theme_handler')->listInfo() as $theme_name => $theme) {
       if ($theme->status) {
         $this->derivatives[$theme_name] = $base_plugin_definition;
         $this->derivatives[$theme_name]['title'] = $theme->info['name'];
diff --git a/core/modules/system/lib/Drupal/system/Tests/Ajax/FrameworkTest.php b/core/modules/system/lib/Drupal/system/Tests/Ajax/FrameworkTest.php
index aa51ab5..ffe3141 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Ajax/FrameworkTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Ajax/FrameworkTest.php
@@ -221,7 +221,7 @@ public function testCurrentPathChange() {
   public function testLazyLoadOverriddenCSS() {
     // The test theme overrides system.module.css without an implementation,
     // thereby removing it.
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
     \Drupal::config('system.theme')
       ->set('default', 'test_theme')
       ->save();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Batch/PageTest.php b/core/modules/system/lib/Drupal/system/Tests/Batch/PageTest.php
index f268e02..2185abb 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Batch/PageTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Batch/PageTest.php
@@ -38,7 +38,7 @@ function testBatchProgressPageTheme() {
     \Drupal::config('system.theme')
       ->set('default', 'bartik')
       ->save();
-    theme_enable(array('seven'));
+    \Drupal::service('theme_handler')->enable(array('seven'));
     \Drupal::config('system.theme')->set('admin', 'seven')->save();
     // Log in as an administrator who can see the administrative theme.
     $admin_user = $this->drupalCreateUser(array('view the administration theme'));
diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php
index 72fe06a..1066f96 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php
@@ -384,19 +384,19 @@ protected function initializeTestThemeConfiguration() {
     $this->default_theme = 'bartik';
     $this->admin_theme = 'seven';
     $this->alternate_theme = 'stark';
-    theme_enable(array($this->default_theme));
+    \Drupal::service('theme_handler')->enable(array($this->default_theme));
     \Drupal::config('system.theme')
       ->set('default', $this->default_theme)
       ->set('admin', $this->admin_theme)
       ->save();
-    theme_disable(array($this->alternate_theme));
+    \Drupal::service('theme_handler')->disable(array($this->alternate_theme));
   }
 
   /**
    * Test the theme negotiation when it is set to use an administrative theme.
    */
   protected function doTestThemeCallbackAdministrative() {
-    theme_enable(array($this->admin_theme));
+    \Drupal::service('theme_handler')->enable(array($this->admin_theme));
     $this->drupalGet('menu-test/theme-callback/use-admin-theme');
     $this->assertText('Active theme: seven. Actual theme: seven.', 'The administrative theme can be correctly set in a theme negotiation.');
     $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
@@ -407,7 +407,7 @@ protected function doTestThemeCallbackAdministrative() {
    */
   protected function doTestThemeCallbackMaintenanceMode() {
     $this->container->get('state')->set('system.maintenance_mode', TRUE);
-    theme_enable(array($this->admin_theme));
+    \Drupal::service('theme_handler')->enable(array($this->admin_theme));
 
     // For a regular user, the fact that the site is in maintenance mode means
     // we expect the theme callback system to be bypassed entirely.
@@ -434,7 +434,7 @@ protected function doTestThemeCallbackOptionalTheme() {
     $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
 
     // Now enable the theme and request it again.
-    theme_enable(array($this->alternate_theme));
+    \Drupal::service('theme_handler')->enable(array($this->alternate_theme));
     $this->drupalGet('menu-test/theme-callback/use-stark-theme');
     $this->assertText('Active theme: stark. Actual theme: stark.', 'The theme negotiation system uses an optional theme once it has been enabled.');
     $this->assertRaw('stark/css/layout.css', "The optional theme's CSS appears on the page.");
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
index 5175b7f..1b70509 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
@@ -33,7 +33,7 @@ function testSystemInfoAlter() {
     $info = system_rebuild_module_data();
     $this->assertFalse(isset($info['node']->info['required']), 'Before the module_test is installed the node module is not required.');
     // Enable seven and the test module.
-    theme_enable(array('seven'));
+    \Drupal::service('theme_handler')->enable(array('seven'));
     \Drupal::moduleHandler()->install(array('module_test'), FALSE);
     $this->assertTrue(\Drupal::moduleHandler()->moduleExists('module_test'), 'Test module is enabled.');
 
@@ -45,8 +45,8 @@ function testSystemInfoAlter() {
     $system_list_themes = system_list('theme');
     $info = $system_list_themes['seven']->info;
     $this->assertTrue(isset($info['regions']['test_region']), 'Altered theme info was returned by system_list().');
-    $list_themes = list_themes();
-    $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was returned by list_themes().');
+    $list_themes = \Drupal::service('theme_handler')->listInfo();
+    $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was returned by listInfo().');
     system_list_reset();
     $info = system_rebuild_module_data();
     $this->assertTrue($info['node']->info['required'], 'After the module_test is installed the node module is required.');
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/System/ThemeTest.php
index 520cb11..f644cc5 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/ThemeTest.php
@@ -178,7 +178,7 @@ function testThemeSettings() {
    * Test the administration theme functionality.
    */
   function testAdministrationTheme() {
-    theme_enable(array('bartik', 'seven'));
+    \Drupal::service('theme_handler')->enable(array('bartik', 'seven'));
 
     // Enable an administration theme and show it on the node admin pages.
     $edit = array(
@@ -233,7 +233,7 @@ function testAdministrationTheme() {
    */
   function testSwitchDefaultTheme() {
     // Enable Bartik and set it as the default theme.
-    theme_enable(array('bartik'));
+    \Drupal::service('theme_handler')->enable(array('bartik'));
     $this->drupalGet('admin/appearance');
     $this->clickLink(t('Set as default'));
     $this->assertEqual(\Drupal::config('system.theme')->get('default'), 'bartik');
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php
index b2816aa..a43e697 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php
@@ -86,7 +86,7 @@ function setUp() {
     // Enable all available non-testing themes.
     $listing = new ExtensionDiscovery();
     $this->themes = $listing->scan('theme', FALSE);
-    theme_enable(array_keys($this->themes));
+    \Drupal::service('theme_handler')->enable(array_keys($this->themes));
 
     // Create a test user.
     $this->user = $this->drupalCreateUser(array('access content', 'access user profiles'));
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
index c152a27..865db14 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
@@ -33,7 +33,7 @@ public static function getInfo() {
    * Tests stylesheets-override and stylesheets-remove.
    */
   function testStylesheets() {
-    theme_enable(array('test_basetheme', 'test_subtheme'));
+    \Drupal::service('theme_handler')->enable(array('test_basetheme', 'test_subtheme'));
     \Drupal::config('system.theme')
       ->set('default', 'test_subtheme')
       ->save();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php
index a987e1f..faf5783 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeSuggestionsAlterTest.php
@@ -31,7 +31,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
index 638d8e5..0f25b18 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
@@ -32,7 +32,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
   }
 
   /**
@@ -199,13 +199,14 @@ function testFunctionOverride() {
   }
 
   /**
-   * Test the list_themes() function.
+   * Test the listInfo() function.
    */
   function testListThemes() {
-    $themes = list_themes();
-    // Check if drupal_theme_access() retrieves enabled themes properly from list_themes().
+    $themes = \Drupal::service('theme_handler')->listInfo();
+    // Check if drupal_theme_access() retrieves enabled themes properly from
+    // ThemeHandlerInterface::listInfo().
     $this->assertTrue(drupal_theme_access('test_theme'), 'Enabled theme detected');
-    // Check if list_themes() returns disabled themes.
+    // Check if ThemeHandlerIntface::listInfo() returns disabled themes.
     $this->assertTrue(array_key_exists('test_basetheme', $themes), 'Disabled theme detected');
     // Check for base theme and subtheme lists.
     $base_theme_list = array('test_basetheme' => 'Theme test base theme');
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestPhpTemplate.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestPhpTemplate.php
index 35680fa..948e486 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestPhpTemplate.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestPhpTemplate.php
@@ -31,7 +31,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    theme_enable(array('test_theme_phptemplate'));
+    \Drupal::service('theme_handler')->enable(array('test_theme_phptemplate'));
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
index 2dce51f..110c88c 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
@@ -31,7 +31,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigDebugMarkupTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigDebugMarkupTest.php
index 9c2105a..cb9f034 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigDebugMarkupTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigDebugMarkupTest.php
@@ -34,7 +34,7 @@ public static function getInfo() {
    */
   function testTwigDebugMarkup() {
     $extension = twig_extension();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
     \Drupal::config('system.theme')->set('default', 'test_theme')->save();
     // Enable debug, rebuild the service container, and clear all caches.
     $this->settingsSet('twig_debug', TRUE);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigExtensionTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigExtensionTest.php
index 8fdc293..bcc9208 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigExtensionTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigExtensionTest.php
@@ -31,7 +31,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigSettingsTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigSettingsTest.php
index 5689b3d..1d9dcfc 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigSettingsTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigSettingsTest.php
@@ -77,7 +77,7 @@ function testTwigDebugOverride() {
    */
   function testTwigCacheOverride() {
     $extension = twig_extension();
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
     \Drupal::config('system.theme')
       ->set('default', 'test_theme')
       ->save();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
index 0aa1f1f..c40e4ec 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
@@ -64,7 +64,7 @@ protected function setUp() {
     parent::setUp();
 
     // Setup test_theme.
-    theme_enable(array('test_theme'));
+    \Drupal::service('theme_handler')->enable(array('test_theme'));
     \Drupal::config('system.theme')->set('default', 'test_theme')->save();
 
     // Create and log in as admin.
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 75f1c60..aac17a3 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -19,13 +19,13 @@ function system_theme_default() {
   $theme = $request->get('theme');
   if (!empty($theme)) {
     // Get current list of themes.
-    $themes = list_themes();
+    $themes = \Drupal::service('theme_handler')->listInfo();
 
     // Check if the specified theme is one recognized by the system.
     if (!empty($themes[$theme])) {
       // Enable the theme if it is currently disabled.
       if (empty($themes[$theme]->status)) {
-       theme_enable(array($theme));
+       \Drupal::service('theme_handler')->enable(array($theme));
       }
       // Set the default theme.
       \Drupal::config('system.theme')
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 8ae6c7c..5f3c973 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1460,7 +1460,7 @@ function hook_cache_flush() {
  * @see drupal_flush_all_caches()
  */
 function hook_rebuild() {
-  $themes = list_themes();
+  $themes = \Drupal::service('theme_handler')->listInfo();
   foreach ($themes as $theme) {
     _block_rehash($theme->getName());
   }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 7a7208e..3d2a820 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -566,7 +566,7 @@ function system_requirements($phase) {
  * Implements hook_install().
  */
 function system_install() {
-  // Enable and set the default theme. Can't use theme_enable() this early in
+  // Enable and set the default theme. Can't use ThemeHandlerInterface::enable() this early in
   // installation.
   \Drupal::service('config.installer')->installDefaultConfig('theme', 'stark');
   \Drupal::config('system.theme')
diff --git a/core/modules/system/theme.api.php b/core/modules/system/theme.api.php
index c86b161..a61020a 100644
--- a/core/modules/system/theme.api.php
+++ b/core/modules/system/theme.api.php
@@ -327,7 +327,7 @@ function hook_theme_suggestions_HOOK_alter(array &$suggestions, array $variables
  * @param array $theme_list
  *   Array containing the names of the themes being enabled.
  *
- * @see theme_enable()
+ * @see \Drupal\Core\Extension\ThemeHandlerInterface::enable()
  */
 function hook_themes_enabled($theme_list) {
   foreach ($theme_list as $theme) {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/ThemeTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/ThemeTest.php
index ee8cc38..b5ca140 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/ThemeTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/ThemeTest.php
@@ -25,7 +25,7 @@ function setUp() {
 
     // Make sure we are using distinct default and administrative themes for
     // the duration of these tests.
-    theme_enable(array('bartik', 'seven'));
+    \Drupal::service('theme_handler')->enable(array('bartik','seven'));
     \Drupal::config('system.theme')
       ->set('default', 'bartik')
       ->set('admin', 'seven')
diff --git a/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php b/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php
index e6da900..3194d6f 100644
--- a/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php
+++ b/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php
@@ -53,7 +53,7 @@ protected function setUp() {
       ->get('system.theme')
       ->set('default', 'bartik')
       ->save();
-    theme_enable(array('seven'));
+    \Drupal::service('theme_handler')->enable(array('seven'));
     $this->container->get('config.factory')
       ->get('system.theme')
       ->set('admin', 'seven')
diff --git a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
index a184092..4adab8a 100644
--- a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
+++ b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
@@ -168,7 +168,7 @@ function testUpdateContribOrder() {
    */
   function testUpdateBaseThemeSecurityUpdate() {
     // Only enable the subtheme, not the base theme.
-    theme_enable(array('update_test_subtheme'));
+    \Drupal::service('theme_handler')->enable(array('update_test_subtheme'));
 
     // Define the initial state for core and the subtheme.
     $system_info = array(
@@ -271,7 +271,7 @@ function testUpdateHiddenBaseTheme() {
     module_load_include('compare.inc', 'update');
 
     // Enable the subtheme.
-    theme_enable(array('update_test_subtheme'));
+    \Drupal::service('theme_handler')->enable(array('update_test_subtheme'));
 
     // Add a project and initial state for base theme and subtheme.
     $system_info = array(
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php b/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
index caade6e..7cbee4e 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
@@ -29,7 +29,7 @@ public function buildForm(array $form, array &$form_state) {
 
     $config = $this->configFactory->get('views.settings');
     $options = array();
-    foreach (list_themes() as $name => $theme) {
+    foreach (\Drupal::service('theme_handler')->listInfo() as $name => $theme) {
       if ($theme->status) {
         $options[$name] = $theme->info['name'];
       }
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index bec1107..849af9e 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -20,8 +20,9 @@ function standard_install() {
   \Drupal::config('system.theme')
     ->set('default', $default_theme)
     ->save();
-  theme_enable(array($default_theme));
-  theme_disable(array('stark'));
+  $theme_handler = \Drupal::service('theme_handler');
+  $theme_handler->enable(array($default_theme));
+  $theme_handler->disable(array('stark'));
 
   // Set front page to "node".
   \Drupal::config('system.site')->set('page.front', 'node')->save();
@@ -78,7 +79,7 @@ function standard_install() {
   $shortcut->save();
 
   // Enable the admin theme.
-  theme_enable(array('seven'));
+  $theme_handler->enable(array('seven'));
   \Drupal::config('system.theme')->set('admin', 'seven')->save();
   \Drupal::config('node.settings')->set('use_admin_theme', '1')->save();
 }
