diff --git a/core/modules/comment/comment.views.inc b/core/modules/comment/comment.views.inc
index 9886c67..f7d32b6 100644
--- a/core/modules/comment/comment.views.inc
+++ b/core/modules/comment/comment.views.inc
@@ -575,3 +575,14 @@ function comment_views_data_alter(&$data) {
   );
 
 }
+
+/**
+ * Implements hook_views_plugins_row_alter().
+ *
+ * Removes the comment row plugin provided by the generic row plugin.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+function comment_views_plugins_row_alter(&$data) {
+  unset($data['entity: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 3bae06d..2b2162c 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
@@ -7,7 +7,7 @@
 
 namespace Drupal\comment\Plugin\views\row;
 
-use Drupal\system\Plugin\views\row\EntityRow;
+use Drupal\views\Plugin\views\row\EntityRow;
 use Drupal\Core\Annotation\Plugin;
 use Drupal\Core\Annotation\Translation;
 
@@ -27,7 +27,7 @@
 class CommentRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::defineOptions().
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
@@ -37,7 +37,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 +50,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/node/lib/Drupal/node/Plugin/views/row/NodeRow.php b/core/modules/node/lib/Drupal/node/Plugin/views/row/NodeRow.php
index e096fc2..8035db4 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
@@ -10,7 +10,7 @@
 use Drupal\views\ViewExecutable;
 use Drupal\Core\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.
@@ -32,7 +32,7 @@
 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 +46,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/node.views.inc b/core/modules/node/node.views.inc
index cd6575e..93b591b 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -734,3 +734,14 @@ function node_views_wizard() {
   }
 
 }
+
+/**
+ * Implements hook_views_plugins_row_alter().
+ *
+ * Removes the node row plugin provided by the generic row plugin.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+function node_views_plugins_row_alter(&$data) {
+  unset($data['entity: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 b7d1de0..0c5fea8 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
@@ -7,7 +7,7 @@
 
 namespace Drupal\user\Plugin\views\row;
 
-use Drupal\system\Plugin\views\row\EntityRow;
+use Drupal\views\Plugin\views\row\EntityRow;
 use Drupal\Core\Annotation\Plugin;
 use Drupal\Core\Annotation\Translation;
 
@@ -29,7 +29,7 @@
 class UserRow extends EntityRow {
 
   /**
-   * Overrides Drupal\system\Plugin\views\row\Entity::defineOptions().
+   * Overrides \Drupal\views\Plugin\views\row\EntityRow::defineOptions().
    */
   protected function defineOptions() {
     $options = parent::defineOptions();
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 0dbe870..64113ce 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -400,3 +400,14 @@ function user_views_query_substitutions($view) {
   global $user;
   return array('***CURRENT_USER***' => intval($user->uid));
 }
+
+/**
+ * Implements hook_views_plugins_row_alter().
+ *
+ * Removes the user row plugin provided by the generic row plugin.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+function user_views_plugins_row_alter(&$data) {
+  unset($data['entity:user']);
+}
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..e28bb41
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\Derivative\ViewsEntityRow.
+ */
+
+namespace Drupal\views\Plugin\Derivative;
+
+use Drupal\Component\Plugin\Derivative\DerivativeInterface;
+use Drupal\views\ViewsDataCache;
+
+/**
+ * Provides views row plugin definitions for all non-special entity types.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+class ViewsEntityRow implements DerivativeInterface {
+
+  /**
+   * Stores all entity row plugin information.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
+   */
+  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];
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
+   */
+  public function getDerivativeDefinitions(array $base_plugin_definition) {
+    $entity_types = entity_get_info();
+    $this->derivatives = array();
+    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']) && drupal_container()->get('views.views_data')->get($entity_info['base_table'])) {
+        $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,
+          'type' => '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 93%
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..770f186 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,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\Core\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 {
 
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..bd18387
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/RowEntityTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Plugin\RowEntityTest.
+ */
+
+namespace Drupal\views\Tests\Plugin;
+
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Tests the generic entity row plugin.
+ *
+ * @see \Drupal\views\Plugin\views\row\EntityRow
+ */
+class RowEntityTest extends ViewTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('taxonomy');
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_entity_row');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Row: Entity',
+      'description' => 'Tests the generic entity row plugin.',
+      'group' => 'Views Plugins',
+    );
+  }
+
+  /**
+   * Tests the area handler.
+   */
+  public function testEntityArea() {
+    // @todo The entity_test entity isn't rendered so let's use taxonomy term.
+    $term = entity_create('taxonomy_term', array('name' => $this->randomName()));
+    $term->save();
+
+    $view = views_get_view('test_entity_row');
+    $this->drupalSetContent($view->preview());
+
+    $this->assertText($term->label(), 'The rendered entity appears as row in the view.');
+  }
+
+}
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..3ee0097
--- /dev/null
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_row.yml
@@ -0,0 +1,35 @@
+base_table: taxonomy_term_data
+core: '8'
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      defaults:
+        fields: '0'
+        pager: '0'
+        pager_options: '0'
+        sorts: '0'
+      fields:
+        tid:
+          field: tid
+          id: tid
+          relationship: none
+          table: taxonomy_term_data
+      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'
+human_name: ''
+id: test_entity_row
+tag: ''
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 8dc5f5a..7dce487 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -827,6 +827,18 @@ function views_hook_info() {
   $hooks['views_data_alter'] = 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['views_query_substitutions'] = array(
     'group' => 'views',
   );
