diff --git a/core/core.services.yml b/core/core.services.yml
index 6954b56..14142ae 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -224,6 +224,9 @@ services:
   logger.channel.form:
     parent: logger.channel_base
     arguments: ['form']
+  logger.channel.system:
+    parent: logger.channel_base
+    arguments: ['system']
   logger.log_message_parser:
     class: Drupal\Core\Logger\LogMessageParser
 
@@ -291,7 +294,7 @@ services:
     arguments: ['@app.root', '%container.modules%', '@cache.bootstrap']
   module_installer:
     class: Drupal\Core\Extension\ModuleInstaller
-    arguments: ['@app.root', '@module_handler', '@kernel']
+    arguments: ['@app.root', '@module_handler', '@kernel', '@config.factory', '@config.installer', '@plugin.cache_clearer', '@router.builder_indicator', '@entity.manager', '@stream_wrapper_manager', '@theme_handler', '@logger.channel.system', '@config.manager', '@keyvalue']
   theme_handler:
     class: Drupal\Core\Extension\ThemeHandler
     arguments: ['@app.root', '@config.factory', '@module_handler', '@state', '@info_parser', '@logger.channel.default', '@asset.css.collection_optimizer', '@config.installer', '@config.manager', '@router.builder_indicator']
diff --git a/core/lib/Drupal/Core/Extension/ModuleInstaller.php b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
index f074ed3..ab6afe2 100644
--- a/core/lib/Drupal/Core/Extension/ModuleInstaller.php
+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -9,7 +9,16 @@
 
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Config\ConfigInstallerInterface;
+use Drupal\Core\Config\ConfigManagerInterface;
 use Drupal\Core\DrupalKernelInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\KeyValueStore\KeyValueStoreInterface;
+use Drupal\Core\Plugin\CachedDiscoveryClearer;
+use Drupal\Core\Routing\RouteBuilderIndicatorInterface;
+use Drupal\Core\StreamWrapper\StreamWrapperManager;
+use Psr\Log\LoggerInterface;
 
 /**
  * Default implementation of the module installer.
@@ -41,6 +50,76 @@ class ModuleInstaller implements ModuleInstallerInterface {
   protected $root;
 
   /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * The config installer.
+   *
+   * @var \Drupal\Core\Config\ConfigInstallerInterface
+   */
+  protected $configInstaller;
+
+  /**
+   * The plugin cache clearer.
+   *
+   * @var \Drupal\Core\Plugin\CachedDiscoveryClearer
+   */
+  protected $pluginCacheClearer;
+
+  /**
+   * The route rebuild indicator.
+   *
+   * @var \Drupal\Core\Routing\RouteBuilderIndicatorInterface
+   */
+  protected $routeRebuildIndicator;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The stream wrapper manager.
+   *
+   * @var \Drupal\Core\StreamWrapper\StreamWrapperManager
+   */
+  protected $streamWrapperManager;
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * The logger.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * The config manager.
+   *
+   * @var \Drupal\Core\Config\ConfigManagerInterface
+   */
+  protected $configManager;
+
+  /**
+   * The key value store.
+   *
+   * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
+   */
+  protected $keyValue;
+
+  /**
    * Constructs a new ModuleInstaller instance.
    *
    * @param string $root
@@ -49,21 +128,51 @@ class ModuleInstaller implements ModuleInstallerInterface {
    *   The module handler.
    * @param \Drupal\Core\DrupalKernelInterface $kernel
    *   The drupal kernel.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer
+   *   The config installer.
+   * @param \Drupal\Core\Plugin\CachedDiscoveryClearer $plugin_cache_clearer
+   *   The plugin cache clearer.
+   * @param \Drupal\Core\Routing\RouteBuilderIndicatorInterface $route_rebuild_indicator
+   *   The route rebuild indicator.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\StreamWrapper\StreamWrapperManager $stream_wrapper_manager
+   *   The stream wrapper manager.
+   * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
+   *   The theme handler.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   The logger.
+   * @param \Drupal\Core\Config\ConfigManagerInterface $config_manager
+   *   The config manager.
+   * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $key_value
+   *   The key value store.
    *
    * @see \Drupal\Core\DrupalKernel
    * @see \Drupal\Core\CoreServiceProvider
    */
-  public function __construct($root, ModuleHandlerInterface $module_handler, DrupalKernelInterface $kernel) {
+  public function __construct($root, ModuleHandlerInterface $module_handler, DrupalKernelInterface $kernel, ConfigFactoryInterface $config_factory, ConfigInstallerInterface $config_installer, CachedDiscoveryClearer $plugin_cache_clearer, RouteBuilderIndicatorInterface $route_rebuild_indicator, EntityManagerInterface $entity_manager, StreamWrapperManager $stream_wrapper_manager, ThemeHandlerInterface $theme_handler, LoggerInterface $logger, ConfigManagerInterface $config_manager, KeyValueStoreInterface $key_value) {
     $this->root = $root;
     $this->moduleHandler = $module_handler;
     $this->kernel = $kernel;
+    $this->configFactory = $config_factory;
+    $this->configInstaller = $config_installer;
+    $this->pluginCacheClearer = $plugin_cache_clearer;
+    $this->routeRebuildIndicator = $route_rebuild_indicator;
+    $this->entityManager = $entity_manager;
+    $this->streamWrapperManager = $stream_wrapper_manager;
+    $this->themeHandler = $theme_handler;
+    $this->logger = $logger;
+    $this->configManager = $config_manager;
+    $this->keyValue = $key_value;
   }
 
   /**
    * {@inheritdoc}
    */
   public function install(array $module_list, $enable_dependencies = TRUE) {
-    $extension_config = \Drupal::config('core.extension');
+    $extension_config = $this->configFactory->get('core.extension');
     if ($enable_dependencies) {
       // Get all module data so we can find dependencies and sort.
       $module_data = system_rebuild_module_data();
@@ -109,11 +218,9 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
     // Required for module installation checks.
     include_once $this->root . '/core/includes/install.inc';
 
-    /** @var \Drupal\Core\Config\ConfigInstaller $config_installer */
-    $config_installer = \Drupal::service('config.installer');
-    $sync_status = $config_installer->isSyncing();
+    $sync_status = $this->configInstaller->isSyncing();
     if ($sync_status) {
-      $source_storage = $config_installer->getSourceStorage();
+      $source_storage = $this->configInstaller->getSourceStorage();
     }
     $modules_installed = array();
     foreach ($module_list as $module) {
@@ -185,8 +292,8 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
         drupal_install_schema($module);
 
         // Clear plugin manager caches and flag router to rebuild if requested.
-        \Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
-        \Drupal::service('router.builder_indicator')->setRebuildNeeded();
+        $this->pluginCacheClearer->clearCachedDefinitions();
+        $this->routeRebuildIndicator->setRebuildNeeded();
 
         // Set the schema version to the number of the last update provided by
         // the module, or the minimum core schema version.
@@ -200,17 +307,15 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
         // For example, a SQL-based storage handler can use this as an
         // opportunity to create the necessary database tables.
         // @todo Clean this up in https://www.drupal.org/node/2350111.
-        $entity_manager = \Drupal::entityManager();
-        foreach ($entity_manager->getDefinitions() as $entity_type) {
+        foreach ($this->entityManager->getDefinitions() as $entity_type) {
           if ($entity_type->getProvider() == $module) {
-            $entity_manager->onEntityTypeCreate($entity_type);
+            $this->entityManager->onEntityTypeCreate($entity_type);
           }
         }
 
         // Install default configuration of the module.
-        $config_installer = \Drupal::service('config.installer');
         if ($sync_status) {
-          $config_installer
+          $this->configInstaller
             ->setSyncing(TRUE)
             ->setSourceStorage($source_storage);
         }
@@ -218,9 +323,9 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
           // If we're not in a config synchronisation reset the source storage
           // so that the extension install storage will pick up the new
           // configuration.
-          $config_installer->resetSourceStorage();
+          $this->configInstaller->resetSourceStorage();
         }
-        \Drupal::service('config.installer')->installDefaultConfig('module', $module);
+        $this->configInstaller->installDefaultConfig('module', $module);
 
         // If the module has no current updates, but has some that were
         // previously removed, set the version to the value of
@@ -239,22 +344,19 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
         // via Drush, as the 'translations' stream wrapper is provided by
         // Interface Translation module and is later used to import
         // translations.
-        \Drupal::service('stream_wrapper_manager')->register();
+        $this->streamWrapperManager->register();
 
         // Update the theme registry to include it.
         drupal_theme_rebuild();
 
         // Modules can alter theme info, so refresh theme data.
-        // @todo ThemeHandler cannot be injected into ModuleHandler, since that
-        //   causes a circular service dependency.
-        // @see https://drupal.org/node/2208429
-        \Drupal::service('theme_handler')->refreshInfo();
+        $this->themeHandler->refreshInfo();
 
         // Allow the module to perform install tasks.
         $this->moduleHandler->invoke($module, 'install');
 
         // Record the fact that it was installed.
-        \Drupal::logger('system')->info('%module module installed.', array('%module' => $module));
+        $this->logger->info('%module module installed.', array('%module' => $module));
       }
     }
 
@@ -279,7 +381,7 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
     }
 
     // Only process currently installed modules.
-    $extension_config = \Drupal::config('core.extension');
+    $extension_config = $this->configFactory->get('core.extension');
     $installed_modules = $extension_config->get('module') ?: array();
     if (!$module_list = array_intersect_key($module_list, $installed_modules)) {
       // Nothing to do. All modules already uninstalled.
@@ -323,11 +425,10 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       // Clean up all entity bundles (including fields) of every entity type
       // provided by the module that is being uninstalled.
       // @todo Clean this up in https://www.drupal.org/node/2350111.
-      $entity_manager = \Drupal::entityManager();
-      foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) {
+      foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
         if ($entity_type->getProvider() == $module) {
-          foreach (array_keys($entity_manager->getBundleInfo($entity_type_id)) as $bundle) {
-            $entity_manager->onBundleDelete($bundle, $entity_type_id);
+          foreach (array_keys($this->entityManager->getBundleInfo($entity_type_id)) as $bundle) {
+            $this->entityManager->onBundleDelete($bundle, $entity_type_id);
           }
         }
       }
@@ -340,15 +441,15 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       $this->moduleHandler->invoke($module, 'uninstall');
 
       // Remove all configuration belonging to the module.
-      \Drupal::service('config.manager')->uninstall('module', $module);
+      $this->configManager->uninstall('module', $module);
 
       // Notify interested components that this module's entity types are being
       // deleted. For example, a SQL-based storage handler can use this as an
       // opportunity to drop the corresponding database tables.
       // @todo Clean this up in https://www.drupal.org/node/2350111.
-      foreach ($entity_manager->getDefinitions() as $entity_type) {
+      foreach ($this->entityManager->getDefinitions() as $entity_type) {
         if ($entity_type->getProvider() == $module) {
-          $entity_manager->onEntityTypeDelete($entity_type);
+          $this->entityManager->onEntityTypeDelete($entity_type);
         }
       }
 
@@ -356,7 +457,7 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       drupal_uninstall_schema($module);
 
       // Remove the module's entry from the config.
-      $extension_config = \Drupal::config('core.extension');
+      $extension_config = $this->configFactory->get('core.extension');
       $extension_config->clear("module.$module")->save();
 
       // Update the module handler to remove the module.
@@ -375,8 +476,8 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       drupal_static_reset('system_rebuild_module_data');
 
       // Clear plugin manager caches and flag router to rebuild if requested.
-      \Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
-      \Drupal::service('router.builder_indicator')->setRebuildNeeded();
+      $this->pluginCacheClearer->clearCachedDefinitions();
+      $this->routeRebuildIndicator->setRebuildNeeded();
 
       // Update the kernel to exclude the uninstalled modules.
       $this->updateKernel($module_filenames);
@@ -385,15 +486,11 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       drupal_theme_rebuild();
 
       // Modules can alter theme info, so refresh theme data.
-      // @todo ThemeHandler cannot be injected into ModuleHandler, since that
-      //   causes a circular service dependency.
-      // @see https://drupal.org/node/2208429
-      \Drupal::service('theme_handler')->refreshInfo();
+      $this->themeHandler->refreshInfo();
 
-      \Drupal::logger('system')->info('%module module uninstalled.', array('%module' => $module));
+      $this->logger->info('%module module uninstalled.', array('%module' => $module));
 
-      $schema_store = \Drupal::keyValue('system.schema');
-      $schema_store->delete($module);
+      $this->keyValue->get('system.schema')->delete($module);
     }
     drupal_get_installed_schema_version(NULL, TRUE);
 
