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..474ae94 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,11 @@ public function getDerivativeDefinitions(array $base_plugin_definition) {
       'foo' => array(
         'label' => t('Layout Foo'),
       ) + $base_plugin_definition,
+      // This definition is not going to be used because layout:bar is defined
+      // as a base plugin.
+      'bar' => array(
+        'label' => t('Layout Bar Derivative'),
+      ) + $base_plugin_definition,
     );
 
     return $derivatives;
diff --git a/core/modules/comment/comment.views.inc b/core/modules/comment/comment.views.inc
index 63b9b48..ac80d13 100644
--- a/core/modules/comment/comment.views.inc
+++ b/core/modules/comment/comment.views.inc
@@ -676,15 +676,3 @@ function comment_views_data_alter(&$data) {
     }
   }
 }
-
-/**
- * Implements hook_views_plugins_row_alter().
- *
- * Replaces the generic row plugin by a custom one for comments.
- *
- * @see \Drupal\views\Plugin\views\row\EntityRow
- */
-function comment_views_plugins_row_alter(array &$plugins) {
-  $plugins['entity:comment']['class'] = 'Drupal\comment\Plugin\views\row\CommentRow';
-  $plugins['entity:comment']['provider'] = 'comment';
-}
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/views/row/CommentRow.php b/core/modules/comment/lib/Drupal/comment/Plugin/views/row/CommentRow.php
index 6da8161..32ebfa3 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/views/row/CommentRow.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/views/row/CommentRow.php
@@ -11,6 +11,15 @@
 
 /**
  * Plugin which performs a comment_view on the resulting object.
+ *
+ * @ViewsRow(
+ *   id = "entity:comment",
+ *   title = @Translation("Comment"),
+ *   help = @Translation("Display the comment"),
+ *   base = {"comment"},
+ *   entity_type = "comment",
+ *   display_type = {"normal"}
+ * )
  */
 class CommentRow extends EntityRow {
 
diff --git a/core/modules/migrate/lib/Drupal/migrate/Plugin/migrate/entity_field/File.php b/core/modules/migrate/lib/Drupal/migrate/Plugin/migrate/entity_field/File.php
deleted file mode 100644
index bbbe9b3..0000000
--- a/core/modules/migrate/lib/Drupal/migrate/Plugin/migrate/entity_field/File.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\migrate\Plugin\migrate\entity_field\File.
- */
-
-namespace Drupal\migrate\Plugin\migrate\entity_field;
-
-use Drupal\field\Entity\FieldInstance;
-use Drupal\migrate\Plugin\MigrateEntityDestinationFieldInterface;
-
-/**
- * @PluginID{"file")
- */
-class File implements MigrateEntityDestinationFieldInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function import(FieldInstance $instance, array $values = NULL) {
-    if ($values) {
-
-    }
-  }
-}
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/row/NodeRow.php b/core/modules/node/lib/Drupal/node/Plugin/views/row/NodeRow.php
index 01ea81b..f8dc5a1 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/views/row/NodeRow.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/row/NodeRow.php
@@ -15,6 +15,15 @@
  * Most of the code on this object is in the theme function.
  *
  * @ingroup views_row_plugins
+ *
+ * @ViewsRow(
+ *   id = "entity:node",
+ *   title = @Translation("Content"),
+ *   help = @Translation("Display the content"),
+ *   base = {"node"},
+ *   entity_type = "node",
+ *   display_type = {"normal"}
+ * )
  */
 class NodeRow extends EntityRow {
 
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index cdeb8a0..da541ca 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -651,15 +651,3 @@ function node_views_wizard() {
   }
 
 }
-
-/**
- * Implements hook_views_plugins_row_alter().
- *
- * Replaces the generic row plugin by a custom one for nodes.
- *
- * @see \Drupal\views\Plugin\views\row\EntityRow
- */
-function node_views_plugins_row_alter(array &$plugins) {
-  $plugins['entity:node']['class'] = 'Drupal\node\Plugin\views\row\NodeRow';
-  $plugins['entity:node']['provider'] = 'node';
-}
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/row/UserRow.php b/core/modules/user/lib/Drupal/user/Plugin/views/row/UserRow.php
index 19e1946..06b1d5f 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/row/UserRow.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/row/UserRow.php
@@ -13,6 +13,15 @@
  * A row plugin which renders a user.
  *
  * @ingroup views_row_plugins
+ *
+ * @ViewsRow(
+ *   id = "entity:user",
+ *   title = @Translation("User"),
+ *   help = @Translation("Display the user"),
+ *   base = {"users"},
+ *   entity_type = "user",
+ *   display_type = {"normal"}
+ * )
  */
 class UserRow extends EntityRow {
 
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 45a76d0..a5c5699 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -373,15 +373,3 @@ function user_views_data() {
 
   return $data;
 }
-
-/**
- * Implements hook_views_plugins_row_alter().
- *
- * Replaces the generic row plugin by a custom one for users.
- *
- * @see \Drupal\views\Plugin\views\row\EntityRow
- */
-function user_views_plugins_row_alter(array &$plugins) {
-  $plugins['entity:user']['class'] = 'Drupal\user\Plugin\views\row\UserRow';
-  $plugins['entity:user']['provider'] = 'user';
-}
