diff --git a/modules/plugin_test_helper/src/AdvancedPluginSelectorBasePluginSelectorForm.php b/modules/plugin_test_helper/src/AdvancedPluginSelectorBasePluginSelectorForm.php
index 6233940..7bf48ec 100644
--- a/modules/plugin_test_helper/src/AdvancedPluginSelectorBasePluginSelectorForm.php
+++ b/modules/plugin_test_helper/src/AdvancedPluginSelectorBasePluginSelectorForm.php
@@ -75,7 +75,9 @@ class AdvancedPluginSelectorBasePluginSelectorForm implements ContainerInjection
       $selectable_plugin_discovery->setDiscoveryLimit(explode(',', $allowed_selectable_plugin_ids));
       $selectable_plugin_manager = new PluginManagerDecorator($this->selectablePluginType->getPluginManager(), $selectable_plugin_discovery);
       $plugin_selector = $this->pluginSelectorManager->createInstance($plugin_id);
-      $plugin_selector->setSelectablePluginType($this->selectablePluginType, $selectable_plugin_manager);
+      $plugin_selector->setSelectablePluginType($this->selectablePluginType);
+      $plugin_selector->setSelectablePluginDiscovery($selectable_plugin_manager);
+      $plugin_selector->setSelectablePluginFactory($selectable_plugin_manager);
       $plugin_selector->setRequired();
       $form_state->set('plugin_selector', $plugin_selector);
     }
diff --git a/src/Plugin/Plugin/PluginSelector/AdvancedPluginSelectorBase.php b/src/Plugin/Plugin/PluginSelector/AdvancedPluginSelectorBase.php
index aabca16..dd2750e 100644
--- a/src/Plugin/Plugin/PluginSelector/AdvancedPluginSelectorBase.php
+++ b/src/Plugin/Plugin/PluginSelector/AdvancedPluginSelectorBase.php
@@ -66,9 +66,9 @@ abstract class AdvancedPluginSelectorBase extends PluginSelectorBase implements
     }
 
     $available_plugins = [];
-    foreach ($this->selectablePluginManager->getDefinitions() as $plugin_definition) {
+    foreach ($this->selectablePluginDiscovery->getDefinitions() as $plugin_definition) {
       $plugin_id = $this->selectablePluginType->getPluginDefinitionMapper()->getPluginId($plugin_definition);
-      $available_plugins[] = $this->selectablePluginManager->createInstance($plugin_id);
+      $available_plugins[] = $this->selectablePluginFactory->createInstance($plugin_id);
     }
 
     $plugin_selector_form_state_key = static::setPluginSelector($form_state, $this);
@@ -152,7 +152,7 @@ abstract class AdvancedPluginSelectorBase extends PluginSelectorBase implements
         $this->setSelectedPlugin($this->getPreviouslySelectedPlugins()[$plugin_id]);
       }
       elseif ($plugin_id) {
-        $this->setSelectedPlugin($this->selectablePluginManager->createInstance($plugin_id));
+        $this->setSelectedPlugin($this->selectablePluginFactory->createInstance($plugin_id));
       }
       else {
         $this->resetSelectedPlugin();
diff --git a/src/Plugin/Plugin/PluginSelector/PluginSelectorBase.php b/src/Plugin/Plugin/PluginSelector/PluginSelectorBase.php
index 1c491cc..6036ab7 100644
--- a/src/Plugin/Plugin/PluginSelector/PluginSelectorBase.php
+++ b/src/Plugin/Plugin/PluginSelector/PluginSelectorBase.php
@@ -6,8 +6,9 @@
 
 namespace Drupal\plugin\Plugin\Plugin\PluginSelector;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Plugin\Factory\FactoryInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
-use Drupal\Component\Plugin\PluginManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\plugin\PluginTypeInterface;
@@ -29,11 +30,18 @@ abstract class PluginSelectorBase extends PluginBase implements PluginSelectorIn
   protected $previouslySelectedPlugins = [];
 
   /**
-   * The plugin manager of which to select plugins.
+   * The selectable plugin discovery.
    *
-   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   * @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface
    */
-  protected $selectablePluginManager;
+  protected $selectablePluginDiscovery;
+
+  /**
+   * The selectable plugin factory.
+   *
+   * @var \Drupal\Component\Plugin\Factory\FactoryInterface
+   */
+  protected $selectablePluginFactory;
 
   /**
    * The plugin type of which to select plugins.
@@ -230,8 +238,9 @@ abstract class PluginSelectorBase extends PluginBase implements PluginSelectorIn
   /**
    * {@inheritdoc}
    */
-  public function setSelectablePluginType(PluginTypeInterface $plugin_type, PluginManagerInterface $plugin_manager = NULL) {
-    $this->selectablePluginManager = $plugin_manager ?: $plugin_type->getPluginManager();
+  public function setSelectablePluginType(PluginTypeInterface $plugin_type) {
+    $this->selectablePluginDiscovery = $plugin_type->getPluginManager();
+    $this->selectablePluginFactory = $plugin_type->getPluginManager();
     $this->selectablePluginType = $plugin_type;
 
     return $this;
@@ -240,12 +249,41 @@ abstract class PluginSelectorBase extends PluginBase implements PluginSelectorIn
   /**
    * {@inheritdoc}
    */
+  public function setSelectablePluginDiscovery(DiscoveryInterface $plugin_discovery) {
+    $this->validateSelectablePluginType();
+    $this->selectablePluginDiscovery = $plugin_discovery;
+
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setSelectablePluginFactory(FactoryInterface $plugin_factory) {
+    $this->validateSelectablePluginType();
+    $this->selectablePluginFactory = $plugin_factory;
+
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function buildSelectorForm(array $form, FormStateInterface $form_state) {
+    $this->validateSelectablePluginType();
+
+    return [];
+  }
+
+  /**
+   * Validates the selectable plugin type.
+   *
+   * @throw \RuntimeException
+   */
+  protected function validateSelectablePluginType() {
     if (!$this->selectablePluginType) {
       throw new \RuntimeException('A plugin type must be set through static::setSelectablePluginType() first.');
     }
-
-    return [];
   }
 
 }
diff --git a/src/Plugin/Plugin/PluginSelector/PluginSelectorInterface.php b/src/Plugin/Plugin/PluginSelector/PluginSelectorInterface.php
index f69c54a..0dc16be 100644
--- a/src/Plugin/Plugin/PluginSelector/PluginSelectorInterface.php
+++ b/src/Plugin/Plugin/PluginSelector/PluginSelectorInterface.php
@@ -7,8 +7,9 @@
 namespace Drupal\plugin\Plugin\Plugin\PluginSelector;
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Plugin\Factory\FactoryInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
-use Drupal\Component\Plugin\PluginManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\plugin\PluginTypeInterface;
 
@@ -148,13 +149,36 @@ interface PluginSelectorInterface extends PluginInspectionInterface, Configurabl
    *
    * @param \Drupal\plugin\PluginTypeInterface $plugin_type
    *   The type of which to select plugins.
-   * @param \Drupal\Component\Plugin\PluginManagerInterface|null $plugin_manager
-   *   The plugin manager used to discover selectable plugins, or NULL to use
-   *   the plugin type's default plugin manager.
    *
    * @return $this
    */
-  public function setSelectablePluginType(PluginTypeInterface $plugin_type, PluginManagerInterface $plugin_manager = NULL);
+  public function setSelectablePluginType(PluginTypeInterface $plugin_type);
+
+  /**
+   * Overrides the plugin type's discovery.
+   *
+   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   *
+   * @return $this
+   *
+   * @throws \RuntimeException
+   *   Thrown if the plugin type was not set using
+   *   self::setSelectablePluginType().
+   */
+  public function setSelectablePluginDiscovery(DiscoveryInterface $plugin_discovery);
+
+  /**
+   * Overrides the plugin type's factory.
+   *
+   * @param \Drupal\Component\Plugin\Factory\FactoryInterface $plugin_factory
+   *
+   * @return $this
+   *
+   * @throws \RuntimeException
+   *   Thrown if the plugin type was not set using
+   *   self::setSelectablePluginType().
+   */
+  public function setSelectablePluginFactory(FactoryInterface $plugin_factory);
 
   /**
    * Builds the selector form.
@@ -164,6 +188,10 @@ interface PluginSelectorInterface extends PluginInspectionInterface, Configurabl
    *
    * @return array
    *   The form structure.
+   *
+   * @throws \RuntimeException
+   *   Thrown if the plugin type was not set using
+   *   self::setSelectablePluginType().
    */
   public function buildSelectorForm(array $form, FormStateInterface $form_state);
 
diff --git a/src/Plugin/Plugin/PluginSelector/SelectList.php b/src/Plugin/Plugin/PluginSelector/SelectList.php
index 24ca96f..46d0b76 100644
--- a/src/Plugin/Plugin/PluginSelector/SelectList.php
+++ b/src/Plugin/Plugin/PluginSelector/SelectList.php
@@ -56,7 +56,7 @@ class SelectList extends AdvancedPluginSelectorBase {
   protected function buildHierarchy() {
     $parents = [];
     $children = [];
-    $definitions = $this->selectablePluginManager->getDefinitions();
+    $definitions = $this->selectablePluginDiscovery->getDefinitions();
     uasort($definitions, array($this, 'sort'));
     foreach ($definitions as $plugin_id => $definition) {
       $parent_plugin_id = $this->selectablePluginType->getPluginDefinitionMapper()->getParentPluginId($definition);
@@ -105,7 +105,7 @@ class SelectList extends AdvancedPluginSelectorBase {
    *   Keys are plugin IDs.
    */
   protected function buildOptionsLevel(array $hierarchy, $depth = 0) {
-    $definitions = $this->selectablePluginManager->getDefinitions();
+    $definitions = $this->selectablePluginDiscovery->getDefinitions();
     $options = [];
     $prefix = $depth ? str_repeat('-', $depth) . ' ' : '';
     foreach ($hierarchy as $plugin_id => $child_plugin_ids) {
diff --git a/tests/src/Unit/Plugin/PluginSelector/PluginSelector/PluginSelectorBaseTest.php b/tests/src/Unit/Plugin/PluginSelector/PluginSelector/PluginSelectorBaseTest.php
index d101270..fb20d67 100644
--- a/tests/src/Unit/Plugin/PluginSelector/PluginSelector/PluginSelectorBaseTest.php
+++ b/tests/src/Unit/Plugin/PluginSelector/PluginSelector/PluginSelectorBaseTest.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Tests\plugin\Unit\Plugin\PluginSelector\PluginSelector;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Plugin\Factory\FactoryInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\plugin\Plugin\Plugin\PluginSelector\PluginSelectorBase;
@@ -153,6 +155,19 @@ class PluginSelectorBaseTest extends PluginSelectorBaseTestBase {
   }
 
   /**
+   * @covers ::setSelectablePluginType
+   * @covers ::setSelectablePluginDiscovery
+   * @covers ::setSelectablePluginFactory
+   */
+  public function testSetSelectablePluginType() {
+    $this->sut->setSelectablePluginType($this->selectablePluginType);
+
+    $this->sut->setSelectablePluginDiscovery($this->getMock(DiscoveryInterface::class));
+
+    $this->sut->setSelectablePluginFactory($this->getMock(FactoryInterface::class));
+  }
+
+  /**
    * @covers ::buildSelectorForm
    * @covers ::setSelectablePluginType
    */
