diff --git a/core/modules/comment/comment.views.inc b/core/modules/comment/comment.views.inc
index ae0020a..62eab44 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(array &$plugins) {
+  $plugins['entity:comment']['class'] = 'Drupal\comment\Plugin\views\row\CommentRow';
+  $plugins['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 41f1741..58316b6 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",
- *   display_types = {"normal"}
- * )
  */
 class CommentRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * {@inheritdoc}
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
@@ -37,7 +25,7 @@ protected function defineOptions() {
   }
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::buildOptionsForm().
+   * {@inheritdoc}
    */
   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().
+   * {@inheritdoc}
    */
   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 94747fe..06e68b6 100644
--- a/core/modules/node/config/views.view.frontpage.yml
+++ b/core/modules/node/config/views.view.frontpage.yml
@@ -133,7 +133,7 @@ display:
           query_comment: ''
           query_tags: {  }
       row:
-        type: node
+        type: 'entity:node'
         options:
           build_mode: teaser
           comments: '0'
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 c6b6628..5f1df9b 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",
- *   display_types = {"normal"}
- * )
  */
 class NodeRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * {@inheritdoc}
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
@@ -46,7 +33,7 @@ protected function defineOptions() {
   }
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::buildOptionsForm().
+   * {@inheritdoc}
    */
   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 644fbcf..7a75550 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..0a79fd4 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(array &$plugins) {
+  $plugins['entity:node']['class'] = 'Drupal\node\Plugin\views\row\NodeRow';
+  $plugins['entity:node']['module'] = 'node';
+}
diff --git a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_row_plugin.yml b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_row_plugin.yml
index 91ee12d..814a7d1 100644
--- a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_row_plugin.yml
+++ b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_row_plugin.yml
@@ -33,7 +33,7 @@ display:
           build_mode: teaser
           comments: '0'
           links: '1'
-        type: node
+        type: 'entity:node'
       sorts: {  }
       style:
         type: default
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 48b44e5..19e1946 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",
- *   display_types = {"normal"}
- * )
  */
 class UserRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * {@inheritdoc}
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 8a27f82..78c1ddc 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(array &$plugins) {
+  $plugins['entity:user']['class'] = 'Drupal\user\Plugin\views\row\UserRow';
+  $plugins['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 3cba318..df50800 100644
--- a/core/modules/views/config/views.view.archive.yml
+++ b/core/modules/views/config/views.view.archive.yml
@@ -105,7 +105,7 @@ display:
           row_class_special: '1'
           uses_fields: '0'
       row:
-        type: node
+        type: 'entity:node'
         options:
           view_mode: teaser
           links: '1'
diff --git a/core/modules/views/config/views.view.taxonomy_term.yml b/core/modules/views/config/views.view.taxonomy_term.yml
index 850909b..3f8ab9b 100644
--- a/core/modules/views/config/views.view.taxonomy_term.yml
+++ b/core/modules/views/config/views.view.taxonomy_term.yml
@@ -152,7 +152,7 @@ display:
           row_class_special: '1'
           uses_fields: '0'
       row:
-        type: node
+        type: 'entity:node'
         options:
           view_mode: teaser
           links: '1'
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
new file mode 100644
index 0000000..5da356b
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\Derivative\ViewsEntityRow.
+ */
+
+namespace Drupal\views\Plugin\Derivative;
+
+use Drupal\Component\Plugin\Derivative\DerivativeInterface;
+use Drupal\views\Views;
+
+/**
+ * Provides views row plugin definitions for all non-special entity types.
+ *
+ * @ingroup views_row_plugins
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+class ViewsEntityRow implements DerivativeInterface {
+
+  /**
+   * Stores all entity row plugin information.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+    if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
+      return $this->derivatives[$derivative_id];
+    }
+    $this->getDerivativeDefinitions($base_plugin_definition);
+    return $this->derivatives[$derivative_id];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions(array $base_plugin_definition) {
+    $entity_types = \Drupal::entityManager()->getDefinitions();
+
+    $views_data = Views::viewsData();
+    foreach ($entity_types as $entity_type => $entity_info) {
+      // Just add support for entity types which have a views integration.
+      if (isset($entity_info['base_table']) && $views_data->get($entity_info['base_table']) && \Drupal::entityManager()->hasController($entity_type, 'render')) {
+        $this->derivatives[$entity_type] = array(
+          'id' => 'entity:' . $entity_type,
+          'module' => 'views',
+          'title' => $entity_info['label'],
+          'help' => t('Display the @label', array('@label' => $entity_info['label'])),
+          'base' => array($entity_info['base_table']),
+          'entity_type' => $entity_type,
+          'display_types' => array('normal'),
+          'class' => $base_plugin_definition['class'],
+        );
+      }
+    }
+
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php b/core/modules/views/lib/Drupal/views/Plugin/views/row/EntityRow.php
similarity index 71%
rename from core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php
rename to core/modules/views/lib/Drupal/views/Plugin/views/row/EntityRow.php
index 0a5ef91..ef28d0d 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/views/row/EntityRow.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/row/EntityRow.php
@@ -2,17 +2,24 @@
 
 /**
  * @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\Core\Entity\EntityManager;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\ViewExecutable;
+use Drupal\Component\Annotation\Plugin;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * 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 {
 
@@ -52,18 +59,37 @@ class EntityRow extends RowPluginBase {
   protected $build = array();
 
   /**
-   * Overrides Drupal\views\Plugin\views\PluginBase::init().
+   * {@inheritdoc}
+   *
+   * @param \Drupal\Core\Entity\EntityManager $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityManager $entity_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->entityManager = $entity_manager;
+  }
+
+  /**
+   * {@inheritdoc}
    */
   public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
     parent::init($view, $display, $options);
 
     $this->entityType = $this->definition['entity_type'];
-    $this->entityInfo = entity_get_info($this->entityType);
+    $this->entityInfo = $this->entityManager->getDefinition($this->entityType);
     $this->base_table = $this->entityInfo['base_table'];
     $this->base_field = $this->entityInfo['entity_keys']['id'];
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
+    return new static($configuration, $plugin_id, $plugin_definition, $container->get('plugin.manager.entity'));
+  }
+
+  /**
    * Overrides Drupal\views\Plugin\views\row\RowPluginBase::defineOptions().
    */
   protected function defineOptions() {
@@ -107,7 +133,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/views/lib/Drupal/views/Tests/Plugin/RowEntityTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/RowEntityTest.php
new file mode 100644
index 0000000..faf1395
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/RowEntityTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Plugin\RowEntityTest.
+ */
+
+namespace Drupal\views\Tests\Plugin;
+
+use Drupal\views\Tests\ViewUnitTestBase;
+
+/**
+ * Tests the generic entity row plugin.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+class RowEntityTest extends ViewUnitTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('taxonomy', 'field', 'entity', 'system');
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_entity_row');
+
+  /**
+   * A string for assert raw and text helper methods.
+   *
+   * @var string
+   */
+  protected $content;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Row: Entity',
+      'description' => 'Tests the generic entity row plugin.',
+      'group' => 'Views Plugins',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', array('menu_router'));
+    $this->installSchema('taxonomy', array('taxonomy_term_data', 'taxonomy_term_hierarchy'));
+  }
+
+  /**
+   * Tests the entity row handler.
+   */
+  public function testEntityRow() {
+    $vocab = entity_create('taxonomy_vocabulary', array('name' => $this->randomName(), 'vid' => strtolower($this->randomName())));
+    $vocab->save();
+    $term = entity_create('taxonomy_term', array('name' => $this->randomName(), 'vid' => $vocab->id() ));
+    $term->save();
+
+    $view = views_get_view('test_entity_row');
+    $this->content = $view->preview();
+    $this->content = drupal_render($this->content);
+
+    $this->assertText($term->label(), 'The rendered entity appears as row in the view.');
+  }
+
+  /**
+   * Pass if the text is found in set string.
+   *
+   * @param string $text
+   *   Text to look for.
+   * @param string $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages: use format_string() to embed variables in the message text, not
+   *   t(). If left blank, a default message will be displayed.
+   * @param string $group
+   *   (optional) The group this message is in, which is displayed in a column
+   *   in test output. Use 'Debug' to indicate this is debugging output. Do not
+   *   translate this string. Defaults to 'Other'; most tests do not override
+   *   this default.
+   *
+   * @return bool TRUE on pass, FALSE on fail.
+   */
+  protected function assertText($text, $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Raw "@raw" found', array('@raw' => $text));
+    }
+    return $this->assert(strpos(filter_xss($this->content, array()), $text) !== FALSE, $message, $group);
+  }
+
+}
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_row.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_row.yml
new file mode 100644
index 0000000..dc66a1f
--- /dev/null
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_row.yml
@@ -0,0 +1,29 @@
+base_table: taxonomy_term_data
+core: '8'
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      defaults:
+        fields: '0'
+        pager: '0'
+        pager_options: '0'
+        sorts: '0'
+      pager:
+        options:
+          offset: '0'
+        type: none
+      pager_options: {  }
+      row:
+        type: 'entity:taxonomy_term'
+        options:
+          relationship: none
+          view_mode: full
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+label: ''
+id: test_entity_row
+tag: ''
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.api.php b/core/modules/views/views.api.php
index 6c5532b..bc7ff00 100644
--- a/core/modules/views/views.api.php
+++ b/core/modules/views/views.api.php
@@ -609,6 +609,215 @@ function hook_views_invalidate_cache() {
 }
 
 /**
+ * Modify the list of available views access plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_access_alter(array &$plugins) {
+  // Remove the available plugin because the users should not have access to it.
+  unset($plugins['role']);
+}
+
+/**
+ * Modify the list of available views default argument plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_argument_default_alter(array &$plugins) {
+  // Remove the available plugin because the users should not have access to it.
+  unset($plugins['php']);
+}
+
+/**
+ * Modify the list of available views argument validation plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_argument_validator_alter(array &$plugins) {
+  // Remove the available plugin because the users should not have access to it.
+  unset($plugins['php']);
+}
+
+/**
+ * Modify the list of available views cache plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_cache_alter(array &$plugins) {
+  // Change the title.
+  $plugins['time']['title'] = t('Custom title');
+}
+
+/**
+ * Modify the list of available views display extender plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_display_extenders_alter(array &$plugins) {
+  // Alter the title of an existing plugin.
+  $plugins['time']['title'] = t('Custom title');
+}
+
+/**
+ * Modify the list of available views display plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_display_alter(array &$plugins) {
+  // Alter the title of an existing plugin.
+  $plugins['rest_export']['title'] = t('Export');
+}
+
+/**
+ * Modify the list of available views exposed form plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_exposed_form_alter(array &$plugins) {
+  // Remove the available plugin because the users should not have access to it.
+  unset($plugins['input_required']);
+}
+
+/**
+ * Modify the list of available views join plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_join_alter(array &$plugins) {
+  // Print out all join plugin names for debugging purposes.
+  debug($plugins);
+}
+
+/**
+ * Modify the list of available views join plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_pager_alter(array &$plugins) {
+  // Remove the sql based plugin to force good performance.
+  unset($plugins['full']);
+}
+
+/**
+ * Modify the list of available views query plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_query_alter(array &$plugins) {
+  // Print out all query plugin names for debugging purposes.
+  debug($plugins);
+}
+
+/**
+ * Modify the list of available views row plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_row_alter(array &$plugins) {
+  // Change the used class of a plugin.
+  $plugins['entity:node']['class'] = 'Drupal\node\Plugin\views\row\NodeRow';
+  $plugins['entity:node']['module'] = 'node';
+}
+
+/**
+ * Modify the list of available views style plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_style_alter(array &$plugins) {
+  // Change the theme hook of a plugin.
+  $plugins['html_list']['theme'] = 'custom_views_view_list';
+}
+
+/**
+ * Modify the list of available views wizard plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugins
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\views\Plugin\ViewsPluginManager
+ */
+function hook_views_plugins_wizard_alter(array &$plugins) {
+  // Change the title of a plugin.
+  $plugins['node_revision']['title'] = t('Node revision wizard');
+}
+
+/**
  * @}
  */
 
@@ -618,3 +827,4 @@ function hook_views_invalidate_cache() {
  * Handlers exposed by various modules to Views.
  * @}
  */
+
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 61826f8..467c6f7 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -253,7 +253,7 @@ function views_preprocess_node(&$vars) {
   }
 
   // Allow to alter comments and links based on the settings in the row plugin.
-  if (!empty($vars['view']->rowPlugin) && $vars['view']->rowPlugin->getPluginId() == 'node') {
+  if (!empty($vars['view']->rowPlugin) && $vars['view']->rowPlugin->getPluginId() == 'entity:node') {
     node_row_node_view_preprocess_node($vars);
   }
 }
@@ -825,6 +825,13 @@ function views_hook_info() {
     'views_invalidate_cache',
   ), array('group' => 'views'));
 
+  // 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',
