diff --git a/core/core.services.yml b/core/core.services.yml
index a827835..81ce652 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -165,6 +165,12 @@ services:
     arguments: [ '%container.namespaces%' ]
     tags:
       - { name: persist }
+  plugin.manager:
+    abstract: true
+    calls:
+      - [setLanguageManager, ['@language_manager']]
+      - [setModuleHandler, ['@module_handler']]
+      - [setNamespaces, ['@container.namespaces']]
   entity.manager:
     class: Drupal\Core\Entity\EntityManager
     arguments: ['@container.namespaces', '@service_container', '@module_handler', '@cache.cache', '@language_manager', '@string_translation']
diff --git a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
index 92bc3f0..e7b51bd 100644
--- a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
+++ b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
@@ -100,14 +100,61 @@ class DefaultPluginManager extends PluginManagerBase implements PluginManagerInt
    *   (optional) The name of the annotation that contains the plugin definition.
    *   Defaults to 'Drupal\Component\Annotation\Plugin'.
    */
-  public function __construct($subdir, \Traversable $namespaces, $plugin_definition_annotation_name = 'Drupal\Component\Annotation\Plugin') {
+  public function __construct($subdir, \Traversable $namespaces = NULL, $plugin_definition_annotation_name = 'Drupal\Component\Annotation\Plugin') {
     $this->subdir = $subdir;
-    $this->discovery = new AnnotatedClassDiscovery($subdir, $namespaces, $plugin_definition_annotation_name);
+    $this->pluginDefinitionAnnotationName = $plugin_definition_annotation_name;
+
+    if (isset($namespaces)) {
+      $this->setNamespaces($namespaces);
+    }
+  }
+
+  /**
+   * Sets the available namespaces.
+   */
+  public function setNamespaces(\Traversable $namespaces) {
+    $this->discovery = new AnnotatedClassDiscovery($this->subdir, $namespaces, $this->pluginDefinitionAnnotationName);
     $this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
     $this->factory = new ContainerFactory($this);
   }
 
   /**
+   * Sets the language manager.
+   */
+  public function setLanguageManager(LanguageManager $language_manager) {
+    $this->languageManager = $language_manager;
+  }
+
+  /**
+   * Set cache key.
+   */
+  public function setCacheKey($cache_key_prefix) {
+    $this->cacheKeyPrefix = $cache_key_prefix;
+    $this->cacheKey = $cache_key_prefix . ':' . $this->languageManager->getLanguage(Language::TYPE_INTERFACE)->id;
+  }
+
+  /**
+   * Set the cache tags.
+   */
+  public function setCacheTags(array $cache_tags = array()) {
+    $this->cacheTags = $cache_tags;
+  }
+
+  /**
+   * Sets the module handler.
+   */
+  public function setModuleHandler(ModuleHandlerInterface $module_handler) {
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * Sets the alter hook.
+   */
+  public function setAlterHook($alter_hook) {
+    $this->alterHook = $alter_hook;
+  }
+
+  /**
    * Initialize the cache backend.
    *
    * Plugin definitions are cached using the provided cache backend. The
@@ -124,12 +171,16 @@ public function __construct($subdir, \Traversable $namespaces, $plugin_definitio
    *   (optional) When providing a list of cache tags, the cached definitions
    *   are tagged and are used to clear the cache.
    */
-  public function setCacheBackend(CacheBackendInterface $cache_backend, LanguageManager $language_manager, $cache_key_prefix, array $cache_tags = array()) {
-    $this->languageManager = $language_manager;
+  public function setCacheBackend(CacheBackendInterface $cache_backend, LanguageManager $language_manager = NULL, $cache_key_prefix = NULL, array $cache_tags = array()) {
     $this->cacheBackend = $cache_backend;
-    $this->cacheKeyPrefix = $cache_key_prefix;
-    $this->cacheKey = $cache_key_prefix . ':' . $language_manager->getLanguage(Language::TYPE_INTERFACE)->id;
-    $this->cacheTags = $cache_tags;
+
+    if (isset($language_manager)) {
+      $this->setLanguageManager($language_manager);
+    }
+    if ($cache_key_prefix) {
+      $this->setCacheKey($cache_key_prefix);
+    }
+    $this->setCacheTags($cache_tags);
   }
 
   /**
@@ -141,8 +192,8 @@ public function setCacheBackend(CacheBackendInterface $cache_backend, LanguageMa
    *   Name of the alter hook.
    */
   protected function alterInfo(ModuleHandlerInterface $module_handler, $alter_hook) {
-    $this->moduleHandler = $module_handler;
-    $this->alterHook = $alter_hook;
+    $this->setModuleHandler($module_handler);
+    $this->setAlterHook($alter_hook);
   }
 
   /**
diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
index b586054..c2e7b98 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
@@ -23,19 +23,12 @@ class ViewsPluginManager extends DefaultPluginManager {
    *
    * @param string $type
    *   The plugin type, for example filter.
-   * @param \Traversable $namespaces
-   *   An object that implements \Traversable which contains the root paths
-   *   keyed by the corresponding namespace to look for plugin implementations,
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
    *   Cache backend instance to use.
-   * @param \Drupal\Core\Language\LanguageManager $language_manager
-   *   The language manager.
-   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   *   The module handler to invoke the alter hook with.
    */
-  public function __construct($type, \Traversable $namespaces, CacheBackendInterface $cache_backend, LanguageManager $language_manager, ModuleHandlerInterface $module_handler) {
+  public function __construct($type, CacheBackendInterface $cache_backend) {
     $plugin_definition_annotation_name = 'Drupal\views\Annotation\Views' . Container::camelize($type);
-    parent::__construct("Plugin/views/$type", $namespaces, $plugin_definition_annotation_name);
+    parent::__construct("Plugin/views/$type", NULL, $plugin_definition_annotation_name);
 
     $this->defaults += array(
       'parent' => 'parent',
@@ -43,8 +36,8 @@ public function __construct($type, \Traversable $namespaces, CacheBackendInterfa
       'register_theme' => TRUE,
     );
 
-    $this->alterInfo($module_handler, 'views_plugins_' . $type);
-    $this->setCacheBackend($cache_backend, $language_manager, 'views_' . $type . '_plugins');
+    $this->setAlterHook('views_plugins_' . $type);
+    $this->setCacheBackend($cache_backend);
   }
 
 }
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index 201780b..00a5be3 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -1,7 +1,10 @@
 services:
   plugin.manager.views.access:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [access, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [access, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_access_plugins']]
   plugin.manager.views.area:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [area, '@container.namespaces', '@views.views_data']
@@ -10,22 +13,40 @@ services:
     arguments: [argument, '@container.namespaces', '@views.views_data']
   plugin.manager.views.argument_default:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [argument_default, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [argument_default, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_argument_default_plugins']]
   plugin.manager.views.argument_validator:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [argument_validator, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [argument_validator, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_argument_validator_plugins']]
   plugin.manager.views.cache:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [cache, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [cache, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_cache_plugins']]
   plugin.manager.views.display_extender:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [display_extender, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [display_extender, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_display_extender_plugins']]
   plugin.manager.views.display:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [display, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [display, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_display_plugins']]
   plugin.manager.views.exposed_form:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [exposed_form, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [exposed_form, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_exposed_form_plugins']]
   plugin.manager.views.field:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [field, '@container.namespaces', '@views.views_data']
@@ -37,25 +58,40 @@ services:
     arguments: [join, '@container.namespaces', '@views.views_data']
   plugin.manager.views.pager:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [pager, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [pager, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_pager_plugins']]
   plugin.manager.views.query:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [query, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [query, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_query_plugins']]
   plugin.manager.views.relationship:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [relationship, '@container.namespaces', '@views.views_data']
   plugin.manager.views.row:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [row, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [row, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_row_plugins']]
   plugin.manager.views.sort:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [sort, '@container.namespaces', '@views.views_data']
   plugin.manager.views.style:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [style, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [style, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_style_plugins']]
   plugin.manager.views.wizard:
     class: Drupal\views\Plugin\ViewsPluginManager
-    arguments: [wizard, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    parent: 'plugin.manager'
+    arguments: [wizard, '@cache.views_info']
+    calls:
+      - [setCacheKey, ['views_wizard_plugins']]
   views.views_data:
     class: Drupal\views\ViewsData
     arguments: ['@cache.views_info', '@config.factory', '@module_handler', '@language_manager']
