diff --git a/core/includes/module.inc b/core/includes/module.inc
index 429f5db..97c2c48 100644
--- a/core/includes/module.inc
+++ b/core/includes/module.inc
@@ -71,7 +71,7 @@ function system_list($type) {
       if (!empty($theme->info['base theme'])) {
         // Make a list of the theme's base themes.
         require_once __DIR__ . '/theme.inc';
-        $lists['theme'][$key]->base_themes = drupal_find_base_themes($lists['theme'], $key);
+        $lists['theme'][$key]->base_themes = \Drupal::service('theme_handler')->getBaseThemes($lists['theme'], $key);
         // Don't proceed if there was a problem with the root base theme.
         if (!current($lists['theme'][$key]->base_themes)) {
           continue;
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 37f04f9..ce8320b 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -91,7 +91,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
@@ -841,7 +841,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->name] = dirname($theme_info->filename);
     }
diff --git a/core/lib/Drupal/Core/Theme/Registry.php b/core/lib/Drupal/Core/Theme/Registry.php
index 3c5ada7..e5fb439 100644
--- a/core/lib/Drupal/Core/Theme/Registry.php
+++ b/core/lib/Drupal/Core/Theme/Registry.php
@@ -114,6 +114,13 @@ class Registry implements DestructableInterface {
   protected $runtimeRegistry;
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
    * Constructs a \Drupal\Core\\Theme\Registry object.
    *
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache
@@ -129,6 +136,7 @@ public function __construct(CacheBackendInterface $cache, LockBackendInterface $
     $this->cache = $cache;
     $this->lock = $lock;
     $this->moduleHandler = $module_handler;
+    $this->themeHandler = \Drupal::service('theme_handler');
     $this->init($theme_name);
   }
 
@@ -165,7 +173,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 = $this->themeHandler->listInfo();
       $this->theme = $themes[$theme_name];
 
       // Find all base themes.
@@ -385,7 +393,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.
@@ -576,15 +585,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 dd3aa6f..1e5d2ff 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -59,7 +59,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;
@@ -415,7 +415,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 6469baf..500ecf7 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
@@ -39,6 +39,13 @@ class CustomBlockController extends ControllerBase implements ContainerInjection
   protected $customBlockTypeStorage;
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+   /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
@@ -64,6 +71,7 @@ public function __construct(PluginManagerInterface $entity_manager, EntityStorag
     $this->customBlockStorage = $custom_block_storage;
     $this->customBlockTypeStorage = $custom_block_type_storage;
     $this->entityManager = $entity_manager;
+    $this->themeHandler = \Drupal::service('theme_handler'); //???
   }
 
   /**
@@ -102,7 +110,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($this->themeHandler->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 7593adb..18e385d 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 92bbe88..296cecf 100644
--- a/core/modules/block/lib/Drupal/block/BlockFormController.php
+++ b/core/modules/block/lib/Drupal/block/BlockFormController.php
@@ -57,6 +57,13 @@ class BlockFormController extends EntityFormController {
   protected $configFactory;
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
    * Constructs a BlockFormController object.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
@@ -73,6 +80,7 @@ public function __construct(EntityManagerInterface $entity_manager, QueryFactory
     $this->entityQueryFactory = $entity_query_factory;
     $this->languageManager = $language_manager;
     $this->configFactory = $config_factory;
+    $this->themeHandler = \Drupal::service('theme_handler'); //??? Preparing for Injection
   }
 
   /**
@@ -236,7 +244,7 @@ public function form(array $form, array &$form_state) {
     }
     else {
       $theme_options = array();
-      foreach (list_themes() as $theme_name => $theme_info) {
+      foreach ($this->themeHandler->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 f2ebb41..d890bed 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/Plugin/Derivative/ThemeLocalTask.php b/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
index 9988813..2e35bdf 100644
--- a/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
@@ -24,6 +24,13 @@ class ThemeLocalTask extends DerivativeBase implements ContainerDerivativeInterf
    */
   protected $config;
 
+ /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
   /**
    * Constructs a new ThemeLocalTask.
    *
@@ -32,6 +39,7 @@ class ThemeLocalTask extends DerivativeBase implements ContainerDerivativeInterf
    */
   public function __construct(ConfigFactory $config_factory) {
     $this->config = $config_factory->get('system.theme');
+    $this->themeHandler = \Drupal::service('theme_handler'); //???
   }
 
   /**
@@ -47,7 +55,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   public function getDerivativeDefinitions(array $base_plugin_definition) {
     $default_theme = $this->config->get('default');
 
-    foreach (list_themes() as $theme_name => $theme) {
+    foreach ($this->themeHandler->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/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 208710e..e292429 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 af49957..edfca63 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) {
       // Select the 'Powered by Drupal' block to be placed.
diff --git a/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php b/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
index b3bf5b9..a092a13 100644
--- a/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/NewDefaultThemeBlocksTest.php
@@ -55,7 +55,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 ed88881..afaabd6 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
@@ -32,7 +32,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'));
   }
 
   /**
@@ -60,7 +60,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');
   }
 
@@ -88,7 +88,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 4193152..9c3c5c1 100644
--- a/core/modules/color/lib/Drupal/color/Tests/ColorTest.php
+++ b/core/modules/color/lib/Drupal/color/Tests/ColorTest.php
@@ -47,7 +47,7 @@ function setUp() {
         'scheme_color' => '#3b3b3b',
       ),
     );
-    theme_enable(array_keys($this->themes));
+    \Drupal::service('theme_handler')->enable(array_keys($this->themes));
     $this->container->get('router.builder')->rebuild();
     menu_router_rebuild();
 
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
index 6eabd64..e1d2141 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
@@ -46,7 +46,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/ConfigMapperManager.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperManager.php
index edb431c..b16d241 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperManager.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperManager.php
@@ -33,6 +33,14 @@ class ConfigMapperManager extends DefaultPluginManager implements ConfigMapperMa
    */
   protected $typedConfigManager;
 
+ /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+
   /**
    * {@inheritdoc}
    */
@@ -59,12 +67,14 @@ class ConfigMapperManager extends DefaultPluginManager implements ConfigMapperMa
   public function __construct(CacheBackendInterface $cache_backend, LanguageManager $language_manager, ModuleHandlerInterface $module_handler, TypedConfigManager $typed_config_manager) {
     $this->typedConfigManager = $typed_config_manager;
 
+    $this->themeHandler = \Drupal::service('theme_handler'); //???
+
     // Look at all themes and modules.
     $directories = array();
     foreach ($module_handler->getModuleList() as $module => $filename) {
       $directories[$module] = dirname($filename);
     }
-    foreach ($this->getThemeList() as $theme) {
+    foreach ($this->themeHandler->listInfo() as $theme) {
       $directories[$theme->name] = drupal_get_path('theme', $theme->name);
     }
 
@@ -82,23 +92,6 @@ public function __construct(CacheBackendInterface $cache_backend, LanguageManage
   }
 
   /**
-   * Returns the list of themes on the site.
-   *
-   * @param bool $refresh
-   *   Whether to refresh the cached theme list.
-   *
-   * @return array
-   *   An associative array of the currently available themes. The keys are the
-   *   themes' machine names and the values are objects. See list_themes() for
-   *   documentation on those objects.
-   *
-   * @todo Remove this once https://drupal.org/node/2109287 is fixed in core.
-   */
-  protected function getThemeList($refresh = FALSE) {
-    return list_themes($refresh);
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getMappers() {
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationBlockListController.php b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationBlockListController.php
index 35c10cc..76293b6 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationBlockListController.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationBlockListController.php
@@ -26,11 +26,19 @@ class ConfigTranslationBlockListController extends ConfigTranslationEntityListCo
   protected $themes = array();
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
    * {@inheritdoc}
    */
   public function __construct(EntityTypeInterface $entity_info, EntityStorageControllerInterface $storage, ModuleHandlerInterface $module_handler) {
     parent::__construct($entity_info, $storage, $module_handler);
-    $this->themes = list_themes();
+    $this->themeHandler = \Drupal::service('theme_handler'); //???
+    $this->themes = $this->themeHandler->listInfo();
   }
 
   /**
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 83f4a14..aadfdd3 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
@@ -664,7 +664,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));
     \Drupal::service('router.builder')->rebuild();
     menu_router_rebuild();
 
diff --git a/core/modules/system/lib/Drupal/system/Controller/ThemeController.php b/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
index 852d2b6..af74c2b 100644
--- a/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
+++ b/core/modules/system/lib/Drupal/system/Controller/ThemeController.php
@@ -27,6 +27,13 @@ class ThemeController implements ContainerInjectionInterface {
   protected $config;
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
    * Constructs a ThemeController object.
    *
    * @param \Drupal\Core\Config\Config $config
@@ -34,6 +41,7 @@ class ThemeController implements ContainerInjectionInterface {
    */
   public function __construct(Config $config) {
     $this->config = $config;
+    $this->themeHandler = \Drupal::service('theme_handler'); //??? Prepare for Injection
   }
 
   /**
@@ -63,7 +71,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])) {
@@ -72,7 +80,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'])));
         }
       }
@@ -104,11 +112,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 ec76227..7213d89 100644
--- a/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php
+++ b/core/modules/system/lib/Drupal/system/Form/ThemeSettingsForm.php
@@ -29,6 +29,13 @@ class ThemeSettingsForm extends ConfigFormBase {
   protected $moduleHandler;
 
   /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
    * Constructs a ThemeSettingsForm object.
    *
    * @param \Drupal\Core\Config\ConfigFactory $config_factory
@@ -42,6 +49,7 @@ public function __construct(ConfigFactory $config_factory, ContextInterface $con
     parent::__construct($config_factory, $context);
 
     $this->moduleHandler = $module_handler;
+    $this->themeHandler = \Drupal::service('theme_handler'); //??? Prepare for injection
   }
 
   /**
@@ -71,7 +79,7 @@ public function getFormId() {
   public function buildForm(array $form, array &$form_state, $theme = '') {
     $form = parent::buildForm($form, $form_state);
 
-    $themes = list_themes();
+    $themes = $this->themeHandler->listInfo();
 
     // Deny access if the theme is disabled or not found.
     if (!empty($theme) && (empty($themes[$theme]) || !$themes[$theme]->status)) {
@@ -82,7 +90,7 @@ public function buildForm(array $form, array &$form_state, $theme = '') {
     if ($theme) {
       $var = 'theme_' . $theme . '_settings';
       $config_key = $theme . '.settings';
-      $themes = list_themes();
+      $themes = $this->themeHandler->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 8a25fc3..53a6839 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
@@ -14,11 +14,19 @@
  */
 class ThemeLocalTask extends DerivativeBase {
 
+ /**
+   * The theme handler to use
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
   /**
    * {@inheritdoc}
    */
   public function getDerivativeDefinitions(array $base_plugin_definition) {
-    foreach (list_themes() as $theme_name => $theme) {
+    $this->themeHandler = \Drupal::service('theme_handler'); //???
+    foreach ($this->themeHandler->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 eced538..ea28e81 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 ccc327d..21b82f7 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterTest.php
@@ -498,19 +498,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.");
@@ -521,7 +521,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.
@@ -548,7 +548,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 c739dd9..458cac3 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
@@ -30,7 +30,7 @@ public static function getInfo() {
    */
   function testSystemInfoAlter() {
     // 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(module_exists('module_test'), 'Test module is enabled.');
 
@@ -42,7 +42,7 @@ 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().');
   }
 }
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 554450a..a6362e3 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 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 8a96631..5bf9633 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/EntityFilteringThemeTest.php
@@ -82,8 +82,8 @@ function setUp() {
     parent::setUp();
 
     // Enable all available themes for testing.
-    $this->themes = array_keys(list_themes());
-    theme_enable($this->themes);
+    $this->themes = array_keys(\Drupal::service('theme_handler')->listInfo());
+    \Drupal::service('theme_handler')->enable($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 00cd008..76398b5 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 492dfd6..deddac1 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 3a26efe..a6e557d 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 48d1e1f..e4eec69 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 3af30c8..bb99e46 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -192,13 +192,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')
@@ -206,9 +206,10 @@ function system_theme_default() {
         ->save();
 
       // Rebuild the menu. This duplicates the menu_router_rebuild() in
-      // theme_enable(). However, modules must know the current default theme in
-      // order to use this information in hook_menu() or hook_menu_alter()
-      // implementations, and doing the variable_set() before the theme_enable()
+      // ThemeHandlerInterface::enable(). However, modules must know the
+      // current default theme in order to use this information in
+      // hook_menu() or hook_menu_alter() implementations, and doing the
+      // variable_set() before the ThemeHandlerInterface::enable()
       // could result in a race condition where the theme is default but not
       // enabled.
       \Drupal::service('router.builder')->rebuild();
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index cabea75..f213662 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1626,7 +1626,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->name);
   }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 34d8dde..04d4e43 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -555,8 +555,8 @@ function system_requirements($phase) {
  * Implements hook_install().
  */
 function system_install() {
-  // Enable and set the default theme. Can't use theme_enable() this early in
-  // installation.
+  // Enable and set the default theme. Can't use ThemeHandlerInterface::enable()
+  // this early in installation.
   config_install_default_config('theme', 'stark');
   \Drupal::config('system.theme')
     ->set('default', 'stark')
diff --git a/core/modules/system/theme.api.php b/core/modules/system/theme.api.php
index 34758da..764f06b 100644
--- a/core/modules/system/theme.api.php
+++ b/core/modules/system/theme.api.php
@@ -224,7 +224,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 9d2d5e3..be8eff1 100644
--- a/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php
+++ b/core/modules/tour/lib/Drupal/tour/Tests/TourTestBasic.php
@@ -55,7 +55,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/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index 7c643cf..89c785b 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -1787,7 +1787,7 @@ public function buildOptionsForm(&$form, &$form_state) {
           $theme_engine = $GLOBALS['theme_engine'];
         }
         else {
-          $themes = list_themes();
+          $themes = \Drupal::service('theme_handler')->listInfo();
           $theme = $themes[$this->theme];
 
           // @see _drupal_theme_initialize()
@@ -1848,7 +1848,7 @@ public function buildOptionsForm(&$form, &$form_state) {
           );
         }
 
-        foreach (list_themes() as $key => $theme) {
+        foreach (\Drupal::service('theme_handler')->listInfo() as $key => $theme) {
           if (!empty($theme->info['hidden'])) {
             continue;
           }
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 e471528..3c174f8 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 8718567..5df1eab 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -18,8 +18,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();
 }
