diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 16281df..0a0ff0d 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -79,7 +79,9 @@ protected function getDerivatives(array $base_plugin_definitions) {
         $derivative_definitions = $derivative_fetcher->getDerivativeDefinitions($plugin_definition);
         foreach ($derivative_definitions as $derivative_id => $derivative_definition) {
           $plugin_id = $this->encodePluginId($base_plugin_id, $derivative_id);
-          $plugin_definitions[$plugin_id] = $derivative_definition;
+          if (!isset($base_plugin_definitions[$plugin_id])) {
+            $plugin_definitions[$plugin_id] = $derivative_definition;
+          }
         }
       }
       else {
@@ -153,8 +155,8 @@ protected function encodePluginId($base_plugin_id, $derivative_id) {
   protected function getDerivativeFetcher($base_plugin_id, array $base_definition) {
     if (!isset($this->derivativeFetchers[$base_plugin_id])) {
       $this->derivativeFetchers[$base_plugin_id] = FALSE;
-      $class = $this->getDerivativeClass($base_definition);
-      if ($class) {
+      list(, $derivative_id) = $this->decodePluginId($base_plugin_id);
+      if (!$derivative_id && ($class = $this->getDerivativeClass($base_definition))) {
         $this->derivativeFetchers[$base_plugin_id] = new $class($base_plugin_id);
       }
     }
