diff --git a/core/modules/comment/comment.views.inc b/core/modules/comment/comment.views.inc
index ae0020a..27d9353 100644
--- a/core/modules/comment/comment.views.inc
+++ b/core/modules/comment/comment.views.inc
@@ -549,3 +549,15 @@ 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(&$data) {
+  $data['entity:comment']['class'] = 'Drupal\comment\Plugin\views\row\CommentRow';
+  $data['entity:comment']['module'] = '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 44834d2..464d169 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
@@ -2,32 +2,20 @@
 
 /**
  * @file
- * Definition of Drupal\comment\Plugin\views\row\CommentRow.
+ * Contains \Drupal\comment\Plugin\views\row\CommentRow.
  */
 
 namespace Drupal\comment\Plugin\views\row;
 
-use Drupal\system\Plugin\views\row\EntityRow;
-use Drupal\Component\Annotation\Plugin;
-use Drupal\Core\Annotation\Translation;
+use Drupal\views\Plugin\views\row\EntityRow;
 
 /**
  * Plugin which performs a comment_view on the resulting object.
- *
- * @Plugin(
- *   id = "comment",
- *   module = "comment",
- *   title = @Translation("Comment"),
- *   help = @Translation("Display the comment with standard comment view."),
- *   base = {"comment"},
- *   entity_type = "comment",
- *   type = "normal"
- * )
  */
 class CommentRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * Overrides \Drupal\system\Plugin\views\row\Entity::defineOptions().
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
@@ -37,7 +25,7 @@ protected function defineOptions() {
   }
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::buildOptionsForm().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::buildOptionsForm().
    */
   public function buildOptionsForm(&$form, &$form_state) {
     parent::buildOptionsForm($form, $form_state);
@@ -50,7 +38,7 @@ public function buildOptionsForm(&$form, &$form_state) {
   }
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::render().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::render().
    */
   function render($row) {
     $entity_id = $row->{$this->field_alias};
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/views/wizard/Comment.php b/core/modules/comment/lib/Drupal/comment/Plugin/views/wizard/Comment.php
index c45efbd..8ac3b43 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/views/wizard/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/views/wizard/Comment.php
@@ -127,7 +127,7 @@ protected function block_display_options(array $form, array &$form_state) {
   protected  function display_options_row(&$display_options, $row_plugin, $row_options) {
     switch ($row_plugin) {
       case 'comment':
-        $display_options['row']['type'] = 'comment';
+        $display_options['row']['type'] = 'entity:comment';
         $display_options['row']['options']['links'] = !empty($row_options['links']);
         break;
     }
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/Views/WizardTest.php b/core/modules/comment/lib/Drupal/comment/Tests/Views/WizardTest.php
index 83ceaee..cbdec48 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/Views/WizardTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/Views/WizardTest.php
@@ -74,7 +74,7 @@ public function testCommentWizard() {
     $view = views_get_view($view['id']);
     $view->initHandlers();
     $row = $view->display_handler->getOption('row');
-    $this->assertEqual($row['type'], 'comment');
+    $this->assertEqual($row['type'], 'entity:comment');
 
     // Check for the default filters.
     $this->assertEqual($view->filter['status']->table, 'comment');
diff --git a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_user_uid.yml b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_user_uid.yml
index 86738f6..08fba4b7 100644
--- a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_user_uid.yml
+++ b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_user_uid.yml
@@ -39,7 +39,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/node/config/views.view.frontpage.yml b/core/modules/node/config/views.view.frontpage.yml
index fb2e3c9..8c9fa5e 100644
--- a/core/modules/node/config/views.view.frontpage.yml
+++ b/core/modules/node/config/views.view.frontpage.yml
@@ -103,7 +103,7 @@ display:
           build_mode: teaser
           comments: '0'
           links: '1'
-        type: node
+        type: 'entity:node'
       sorts:
         sticky:
           admin_label: ''
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 5955fe8..08e6e21 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
@@ -2,15 +2,12 @@
 
 /**
  * @file
- * Definition of Drupal\node\Plugin\views\row\NodeRow.
+ * Contains \Drupal\node\Plugin\views\row\NodeRow.
  */
 
 namespace Drupal\node\Plugin\views\row;
 
-use Drupal\views\ViewExecutable;
-use Drupal\Component\Annotation\Plugin;
-use Drupal\Core\Annotation\Translation;
-use Drupal\system\Plugin\views\row\EntityRow;
+use Drupal\views\Plugin\views\row\EntityRow;
 
 /**
  * Plugin which performs a node_view on the resulting object.
@@ -18,21 +15,11 @@
  * Most of the code on this object is in the theme function.
  *
  * @ingroup views_row_plugins
- *
- * @Plugin(
- *   id = "node",
- *   module = "node",
- *   title = @Translation("Content"),
- *   help = @Translation("Display the content with standard node view."),
- *   base = {"node"},
- *   entity_type = "node",
- *   type = "normal"
- * )
  */
 class NodeRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::defineOptions().
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
@@ -46,7 +33,7 @@ protected function defineOptions() {
   }
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::buildOptionsForm().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::buildOptionsForm().
    */
   public function buildOptionsForm(&$form, &$form_state) {
     parent::buildOptionsForm($form, $form_state);
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
index 4f868f7..ab1785f 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
@@ -219,13 +219,13 @@ protected function block_display_options(array $form, array &$form_state) {
   protected  function display_options_row(&$display_options, $row_plugin, $row_options) {
     switch ($row_plugin) {
       case 'full_posts':
-        $display_options['row']['type'] = 'node';
+        $display_options['row']['type'] = 'entity:node';
         $display_options['row']['options']['build_mode'] = 'full';
         $display_options['row']['options']['links'] = !empty($row_options['links']);
         $display_options['row']['options']['comments'] = !empty($row_options['comments']);
         break;
       case 'teasers':
-        $display_options['row']['type'] = 'node';
+        $display_options['row']['type'] = 'entity:node';
         $display_options['row']['options']['build_mode'] = 'teaser';
         $display_options['row']['options']['links'] = !empty($row_options['links']);
         $display_options['row']['options']['comments'] = !empty($row_options['comments']);
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index 6f3320f..0f2aafb 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -642,3 +642,15 @@ 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(&$data) {
+  $data['entity:node']['class'] = 'Drupal\node\Plugin\views\row\NodeRow';
+  $data['entity:node']['module'] = 'node';
+}
diff --git a/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php b/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php
index 0a5ef91..12cf105 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php
@@ -2,17 +2,22 @@
 
 /**
  * @file
- * Definition of Drupal\system\Plugin\views\row\EntityRow.
+ * Contains \Drupal\views\Plugin\views\row\EntityRow.
  */
 
-namespace Drupal\system\Plugin\views\row;
+namespace Drupal\views\Plugin\views\row;
 
-use Drupal\views\Plugin\views\row\RowPluginBase;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\ViewExecutable;
+use Drupal\Component\Annotation\Plugin;
 
 /**
  * Generic entity row plugin to provide a common base for all entity types.
+ *
+ * @Plugin(
+ *   id = "entity",
+ *   derivative = "Drupal\views\Plugin\Derivative\ViewsEntityRow"
+ * )
  */
 class EntityRow extends RowPluginBase {
 
@@ -107,7 +112,12 @@ protected function buildViewModeOptions() {
    */
   public function summaryTitle() {
     $options = $this->buildViewModeOptions();
-    return check_plain($options[$this->options['view_mode']]);
+    if (isset($options[$this->options['view_mode']])) {
+      return check_plain($options[$this->options['view_mode']]);
+    }
+    else {
+      return t('No view mode selected');
+    }
   }
 
   /**
diff --git a/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_node_term_data.yml b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_node_term_data.yml
index e5a62c7..b347dbd 100644
--- a/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_node_term_data.yml
+++ b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_node_term_data.yml
@@ -66,7 +66,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
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 e25d1fb..1e8e1d6 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
@@ -2,34 +2,22 @@
 
 /**
  * @file
- * Definition of Drupal\user\Plugin\views\row\UserRow.
+ * Contains \Drupal\user\Plugin\views\row\UserRow.
  */
 
 namespace Drupal\user\Plugin\views\row;
 
-use Drupal\system\Plugin\views\row\EntityRow;
-use Drupal\Component\Annotation\Plugin;
-use Drupal\Core\Annotation\Translation;
+use Drupal\views\Plugin\views\row\EntityRow;
 
 /**
  * A row plugin which renders a user.
  *
  * @ingroup views_row_plugins
- *
- * @Plugin(
- *   id = "user",
- *   module = "user",
- *   title = @Translation("User"),
- *   help = @Translation("Display the user with standard user view."),
- *   base = {"users"},
- *   entity_type = "user",
- *   type = "normal"
- * )
  */
 class UserRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * Overrides \Drupal\views\Plugin\views\row\Entity::defineOptions().
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 8a27f82..729f6c4 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -377,3 +377,15 @@ 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(&$data) {
+  $data['entity:user']['class'] = 'Drupal\user\Plugin\views\row\UserRow';
+  $data['entity:user']['module'] = 'user';
+}
diff --git a/core/modules/views/config/views.view.archive.yml b/core/modules/views/config/views.view.archive.yml
index c1bfca9..a249de3 100644
--- a/core/modules/views/config/views.view.archive.yml
+++ b/core/modules/views/config/views.view.archive.yml
@@ -62,7 +62,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
   page_1:
     id: page_1
     display_title: Page
diff --git a/core/modules/views/config/views.view.taxonomy_term.yml b/core/modules/views/config/views.view.taxonomy_term.yml
index e4aaf5b..eb2075d 100644
--- a/core/modules/views/config/views.view.taxonomy_term.yml
+++ b/core/modules/views/config/views.view.taxonomy_term.yml
@@ -77,7 +77,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
   page_1:
     id: page_1
     display_title: Page
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
index e4dde6f..41e55d7 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
@@ -74,7 +74,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
         options:
           comments: '0'
           links: '1'
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_feed_display.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_feed_display.yml
index eb81e3d..31be171 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_feed_display.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_feed_display.yml
@@ -51,7 +51,7 @@ display:
           build_mode: teaser
           comments: '0'
           links: '1'
-        type: node
+        type: 'entity:node'
       sorts:
         created:
           field: created
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_filter_groups.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_filter_groups.yml
index 0b76446..9ef6ed9 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_filter_groups.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_filter_groups.yml
@@ -68,7 +68,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_get_attach_displays.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_get_attach_displays.yml
index e11cee7..6fbccaf 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_get_attach_displays.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_get_attach_displays.yml
@@ -26,7 +26,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
         options:
           build_mode: teaser
           links: '1'
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_mini_pager.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_mini_pager.yml
index bd19143..8cfdfce 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_mini_pager.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_mini_pager.yml
@@ -41,7 +41,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
         options:
           build_mode: teaser
           links: '1'
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_full.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_full.yml
index 52d8306..b93e53d 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_full.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_full.yml
@@ -20,7 +20,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_none.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_none.yml
index 1e30b26..999f40d 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_none.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_none.yml
@@ -16,7 +16,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_some.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_some.yml
index 1bc6e56..2ec3439 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_some.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_pager_some.yml
@@ -19,7 +19,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_redirect_view.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_redirect_view.yml
index dbb4621..838e74b 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_redirect_view.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_redirect_view.yml
@@ -26,7 +26,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
         options:
           build_mode: teaser
           links: '1'
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_reset_button.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_reset_button.yml
index d6564f4..9645be8 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_reset_button.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_reset_button.yml
@@ -34,7 +34,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
         options:
           comments: '0'
           links: '1'
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_store_pager_settings.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_store_pager_settings.yml
index 9da6a32..a0ea018 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_store_pager_settings.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_store_pager_settings.yml
@@ -16,7 +16,7 @@ display:
       style:
         type: default
       row:
-        type: node
+        type: 'entity:node'
     display_plugin: default
     display_title: Master
     id: default
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index de8d5fd..05cebdc 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -825,6 +825,17 @@ function views_hook_info() {
     'views_invalidate_cache',
   ), array('group' => 'views'));
 
+  // During installation the moduleHandler might call hook_hook_info without
+  // having the classloader setup properly.
+  if (class_exists('Drupal\\views\\ViewExecutable')) {
+    // Register a views_plugins alter hook for all plugin types.
+    foreach (ViewExecutable::getPluginTypes() as $type) {
+      $hooks['views_plugins_' . $type . '_alter'] = array(
+        'group' => 'views',
+      );
+    }
+  }
+
   $hooks += array_fill_keys(array(
     'views_query_substitutions',
     'views_form_substitutions',
