diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 16281df..2d43dae 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -40,13 +40,17 @@ public function __construct(DiscoveryInterface $decorated) {
    *   not implement \Drupal\Component\Plugin\Derivative\DerivativeInterface.
    */
   public function getDefinition($plugin_id) {
+    $plugin_definition = $this->decorated->getDefinition($plugin_id);
     list($base_plugin_id, $derivative_id) = $this->decodePluginId($plugin_id);
-
-    $plugin_definition = $this->decorated->getDefinition($base_plugin_id);
-    if (isset($plugin_definition)) {
-      $derivative_fetcher = $this->getDerivativeFetcher($base_plugin_id, $plugin_definition);
-      if ($derivative_fetcher) {
-        $plugin_definition = $derivative_fetcher->getDerivativeDefinition($derivative_id, $plugin_definition);
+    // If this is a base plugin or no plugin defined itself as this derivative
+    // then try to find and run the deriver.
+    if (!$derivative_id || !$plugin_definition) {
+      $base_plugin_definition = $this->decorated->getDefinition($base_plugin_id);
+      if ($base_plugin_definition) {
+        $derivative_fetcher = $this->getDerivativeFetcher($base_plugin_id, $base_plugin_definition);
+        if ($derivative_fetcher) {
+          $plugin_definition = $derivative_fetcher->getDerivativeDefinition($derivative_id, $base_plugin_definition);
+        }
       }
     }
 
@@ -79,7 +83,11 @@ 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;
+          // Skip this definition if this is a derivative and a plugin already
+          // defined itself as this derivative.
+          if (!$derivative_id || !isset($base_plugin_definitions[$plugin_id])) {
+            $plugin_definitions[$plugin_id] = $derivative_definition;
+          }
         }
       }
       else {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Plugin/PluginTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Plugin/PluginTestBase.php
index 917e4e7..60249d3 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Plugin/PluginTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Plugin/PluginTestBase.php
@@ -70,6 +70,10 @@ public function setUp() {
         'label' => 'Layout Foo',
         'class' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockLayoutBlock',
       ),
+      'layout:bar' => array(
+        'label' => 'Layout Bar',
+        'class' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockLayoutBlock',
+      ),
       'user_name' => array(
         'label' => 'User name',
         'class' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockUserNameBlock',
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/MockBlockManager.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/MockBlockManager.php
index 386841b..7a5b7f6 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/MockBlockManager.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/MockBlockManager.php
@@ -65,6 +65,11 @@ public function __construct() {
       'class' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockLayoutBlock',
       'derivative' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockLayoutBlockDeriver',
     ));
+    // A plugin defining itself as a derivative.
+    $this->discovery->setDefinition('layout:bar', array(
+      'label' => t('Layout Bar'),
+      'class' => 'Drupal\plugin_test\Plugin\plugin_test\mock_block\MockLayoutBlock',
+    ));
 
     // A block plugin that requires context to function. This block requires a
     // user object in order to return the user name from the getTitle() method.
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
index dea1f29..66c0179 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
@@ -48,6 +48,9 @@ public function getDerivativeDefinitions(array $base_plugin_definition) {
       'foo' => array(
         'label' => t('Layout Foo'),
       ) + $base_plugin_definition,
+      'bar' => array(
+        'label' => t('Layout Bar Derivative'),
+      ) + $base_plugin_definition,
     );
 
     return $derivatives;
