diff --git a/core/modules/rest/src/Plugin/Deriver/ViewsEntityRow.php b/core/modules/rest/src/Plugin/Deriver/ViewsEntityRow.php
new file mode 100644
index 0000000..c5321f5
--- /dev/null
+++ b/core/modules/rest/src/Plugin/Deriver/ViewsEntityRow.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Drupal\rest\Plugin\Deriver;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Drupal\views\ViewsData;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides views row plugin definitions for rest entities.
+ *
+ * @ingroup views_row_plugins
+ *
+ * @see \Drupal\rest\Plugin\views\row\DataEntityRow
+ */
+class ViewsEntityRow implements ContainerDeriverInterface {
+
+  /**
+   * Stores all entity row plugin information.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * The base plugin ID that the derivative is for.
+   *
+   * @var string
+   */
+  protected $basePluginId;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The views data service.
+   *
+   * @var \Drupal\views\ViewsData
+   */
+  protected $viewsData;
+
+  /**
+   * Constructs a ViewsEntityRow object.
+   *
+   * @param string $base_plugin_id
+   *   The base plugin ID.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\views\ViewsData $views_data
+   *   The views data service.
+   */
+  public function __construct($base_plugin_id, EntityManagerInterface $entity_manager, ViewsData $views_data) {
+    $this->basePluginId = $base_plugin_id;
+    $this->entityManager = $entity_manager;
+    $this->viewsData = $views_data;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $base_plugin_id,
+      $container->get('entity.manager'),
+      $container->get('views.views_data')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinition($derivative_id, $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($base_plugin_definition) {
+    foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
+      // Just add support for entity types which have a views integration.
+      if (($base_table = $entity_type->getBaseTable()) && $this->viewsData->get($base_table) && $this->entityManager->hasHandler($entity_type_id, 'view_builder')) {
+        $this->derivatives[$entity_type_id] = [
+          'id' => 'data_entity:' . $entity_type_id,
+          'provider' => 'rest',
+          'title' => t('@label entity', ['@label' => $entity_type->getLabel()]),
+          'help' => t('Use the @label entity as row data', array('@label' => $entity_type->getLabel())),
+          'base' => [$entity_type->getDataTable() ?: $entity_type->getBaseTable()],
+          'entity_type' => $entity_type_id,
+        ] + $base_plugin_definition;
+      }
+    }
+
+    // Also provide a generic version, for backwards compatibility.
+    $this->derivatives[''] = [
+      'provider' => 'rest',
+      'no_ui' => TRUE,
+    ] + $base_plugin_definition;
+
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/modules/rest/src/Plugin/views/display/RestExport.php b/core/modules/rest/src/Plugin/views/display/RestExport.php
index fb58513..ec9ab0d 100644
--- a/core/modules/rest/src/Plugin/views/display/RestExport.php
+++ b/core/modules/rest/src/Plugin/views/display/RestExport.php
@@ -207,7 +207,17 @@ protected function defineOptions() {
 
     // Set the default style plugin to 'json'.
     $options['style']['contains']['type']['default'] = 'serializer';
-    $options['row']['contains']['type']['default'] = 'data_entity';
+
+    // Only set the default row type to data_entity if we are actually showing
+    // entities.
+    $entity_type = $this->view->getBaseEntityType();
+    if (!empty($entity_type)) {
+      $options['row']['contains']['type']['default'] = 'data_entity:' . $entity_type->id();
+    }
+    else {
+      $options['row']['contains']['type']['default'] = 'data_field';
+    }
+
     $options['defaults']['default']['style'] = FALSE;
     $options['defaults']['default']['row'] = FALSE;
 
diff --git a/core/modules/rest/src/Plugin/views/row/DataEntityRow.php b/core/modules/rest/src/Plugin/views/row/DataEntityRow.php
index c857676..26ad070 100644
--- a/core/modules/rest/src/Plugin/views/row/DataEntityRow.php
+++ b/core/modules/rest/src/Plugin/views/row/DataEntityRow.php
@@ -17,7 +17,8 @@
  *   id = "data_entity",
  *   title = @Translation("Entity"),
  *   help = @Translation("Use entities as row data."),
- *   display_types = {"data"}
+ *   display_types = {"data"},
+ *   deriver = "Drupal\rest\Plugin\Deriver\ViewsEntityRow"
  * )
  */
 class DataEntityRow extends RowPluginBase {
diff --git a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
index a884342..d8bd3c6 100644
--- a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
+++ b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
@@ -786,4 +786,29 @@ public function testMulEntityRows() {
     $this->assertIdentical($names, $expected, 'The translated content was found in the JSON.');
   }
 
+  /**
+   * Test creating a REST export containing non-entities.
+   */
+  public function testNonEntityView() {
+    $this->drupalLogin($this->adminUser);
+    // Create a view of non-entities.
+    $id = 'test_non_entities';
+    $edit = array(
+      'label' => $this->randomMachineName(16),
+      'id' => $id,
+      'show[wizard_key]' => 'standard:views_test_data',
+      'rest_export[create]' => TRUE,
+      'rest_export[path]' => $id,
+    );
+    $this->drupalPostForm('admin/structure/views/add', $edit, t('Save and edit'));
+
+    // Verify that data_field row type is used.
+    $view = View::load($id);
+    $display = $view->getDisplay('rest_export_1');
+    $this->assertEqual($display['display_options']['row']['type'], 'data_field');
+
+    $this->drupalGet($id);
+    $this->assertResponse(200);
+  }
+
 }
