diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml
index aa26f9a..b7f0e05 100644
--- a/core/config/schema/core.entity.schema.yml
+++ b/core/config/schema/core.entity.schema.yml
@@ -241,6 +241,19 @@ field.formatter.settings.boolean:
       type: string
       label: 'Custom output for TRUE'
 
+field.formatter.settings.boolean:
+  type: mapping
+  mapping:
+    format:
+      type: string
+      label: 'Output format'
+    format_custom_false:
+      type: string
+      label: 'Custom output for FALSE'
+    format_custom_true:
+      type: string
+      label: 'Custom output for TRUE'
+
 field.formatter.settings.string:
   type: mapping
   mapping:
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
index ec9b79d..1c356bf 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
@@ -24,6 +24,7 @@
  *   label = @Translation("Plain text"),
  *   field_types = {
  *     "string",
+ *     "uri",
  *   },
  *   quickedit = {
  *     "editor" = "plain_text"
diff --git a/core/modules/block_content/src/Tests/Views/RevisionRelationshipsTest.php b/core/modules/block_content/src/Tests/Views/RevisionRelationshipsTest.php
index a7ecabe..828f124 100644
--- a/core/modules/block_content/src/Tests/Views/RevisionRelationshipsTest.php
+++ b/core/modules/block_content/src/Tests/Views/RevisionRelationshipsTest.php
@@ -59,7 +59,7 @@ public function testBlockContentRevisionRelationship() {
     $block_content_revision->save();
     $column_map = array(
       'revision_id' => 'revision_id',
-      'block_content_revision_id' => 'block_content_revision_id',
+      'id_1' => 'id_1',
       'block_content_block_content_revision_id' => 'block_content_block_content_revision_id',
     );
 
@@ -69,12 +69,12 @@ public function testBlockContentRevisionRelationship() {
     $resultset_id = array(
       array(
         'revision_id' => '1',
-        'block_content_revision_id' => '1',
+        'id_1' => '1',
         'block_content_block_content_revision_id' => '1',
       ),
       array(
         'revision_id' => '2',
-        'block_content_revision_id' => '1',
+        'id_1' => '1',
         'block_content_block_content_revision_id' => '1',
       ),
     );
@@ -86,7 +86,7 @@ public function testBlockContentRevisionRelationship() {
     $resultset_revision_id = array(
       array(
         'revision_id' => '2',
-        'block_content_revision_id' => '1',
+        'id_1' => '1',
         'block_content_block_content_revision_id' => '1',
       ),
     );
diff --git a/core/modules/comment/src/CommentViewsData.php b/core/modules/comment/src/CommentViewsData.php
index 7c68bb7..01e69da 100644
--- a/core/modules/comment/src/CommentViewsData.php
+++ b/core/modules/comment/src/CommentViewsData.php
@@ -102,9 +102,6 @@ public function getViewsData() {
 
     $data['comment_field_data']['status']['title'] = t('Approved status');
     $data['comment_field_data']['status']['help'] = t('Whether the comment is approved (or still in the moderation queue).');
-    $data['comment_field_data']['status']['field']['output formats'] = array(
-      'approved-not-approved' => array(t('Approved'), t('Not Approved')),
-    );
     $data['comment_field_data']['status']['filter']['label'] = t('Approved comment status');
     $data['comment_field_data']['status']['filter']['type'] = 'yes-no';
 
diff --git a/core/modules/field/config/schema/field.views.schema.yml b/core/modules/field/config/schema/field.views.schema.yml
index 85c501f..b1a39cc 100644
--- a/core/modules/field/config/schema/field.views.schema.yml
+++ b/core/modules/field/config/schema/field.views.schema.yml
@@ -16,53 +16,6 @@ views.argument.field_list_string:
       type: boolean
       label: 'Display list value as human readable'
 
-views.field.field:
-  type: views_field
-  label: 'Views entity field handler'
-  mapping:
-    click_sort_column:
-      type: string
-      label: 'Column used for click sorting'
-    type:
-      type: string
-      label: 'Formatter'
-    settings:
-      label: 'Settings'
-      type: field.formatter.settings.[%parent.type]
-    group_column:
-      type: string
-      label: 'Group by column'
-    group_columns:
-      type: sequence
-      label: 'Group by columns'
-      sequence:
-        - type: string
-          label: 'Column'
-    group_rows:
-      type: boolean
-      label: 'Display all values in the same row'
-    delta_limit:
-      type: integer
-      label: 'Field'
-    delta_offset:
-      type: integer
-      label: 'Offset'
-    delta_reversed:
-      type: boolean
-      label: 'Reversed'
-    delta_first_last:
-      type: boolean
-      label: 'First and last only'
-    multi_type:
-      type: string
-      label: 'Display type'
-    separator:
-      type: label
-      label: 'Separator'
-    field_api_classes:
-      type: boolean
-      label: 'Use field template'
-
 views.filter.field_list:
   type: views.filter.many_to_one
   label: 'List field'
diff --git a/core/modules/node/config/install/views.view.content.yml b/core/modules/node/config/install/views.view.content.yml
index e58eeb4..a3387be 100644
--- a/core/modules/node/config/install/views.view.content.yml
+++ b/core/modules/node/config/install/views.view.content.yml
@@ -168,10 +168,12 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_node: true
-          plugin_id: node
           entity_type: node
           entity_field: title
+          type: string
+          settings:
+            link_to_entity: true
+          plugin_id: field
         type:
           id: type
           table: node_field_data
@@ -227,11 +229,12 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          type: published-notpublished
-          type_custom_true: ''
-          type_custom_false: ''
-          not: false
-          plugin_id: boolean
+          type: boolean
+          settings:
+            format: custom
+            format_custom_true: 'Published'
+            format_custom_false: 'Unpublished'
+          plugin_id: field
           entity_type: node
           entity_field: status
         changed:
diff --git a/core/modules/node/config/install/views.view.content_recent.yml b/core/modules/node/config/install/views.view.content_recent.yml
index 0fb273d..c769ff4 100644
--- a/core/modules/node/config/install/views.view.content_recent.yml
+++ b/core/modules/node/config/install/views.view.content_recent.yml
@@ -118,8 +118,6 @@ display:
             html: false
           hide_empty: false
           empty_zero: false
-          link_to_node: true
-          plugin_id: node
           relationship: none
           group_type: group
           admin_label: ''
@@ -133,6 +131,12 @@ display:
           element_default_classes: true
           empty: ''
           hide_alter_empty: true
+          type: string
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          entity_type: node
+          entity_field: title
         name:
           id: name
           table: users_field_data
diff --git a/core/modules/node/src/NodeViewsData.php b/core/modules/node/src/NodeViewsData.php
index 57654b2..7e0b1ee 100644
--- a/core/modules/node/src/NodeViewsData.php
+++ b/core/modules/node/src/NodeViewsData.php
@@ -24,7 +24,6 @@ public function getViewsData() {
     $data['node_field_data']['table']['base']['access query tag'] = 'node_access';
     $data['node_field_data']['table']['wizard_id'] = 'node';
 
-    $data['node_field_data']['nid']['field']['id'] = 'node';
     $data['node_field_data']['nid']['field']['argument'] = [
       'id' => 'node_nid',
       'name field' => 'title',
@@ -32,7 +31,8 @@ public function getViewsData() {
       'validate type' => 'nid',
     ];
 
-    $data['node_field_data']['title']['field']['id'] = 'node';
+    $data['node_field_data']['title']['field']['default_formatter_settings'] = ['link_to_entity' => TRUE];
+
     $data['node_field_data']['title']['field']['link_to_node default'] = TRUE;
 
     $data['node_field_data']['type']['field']['id'] = 'node_type';
@@ -41,9 +41,6 @@ public function getViewsData() {
     $data['node_field_data']['langcode']['help'] = t('The language of the content or translation.');
     $data['node_field_data']['langcode']['field']['id'] = 'node_language';
 
-    $data['node_field_data']['status']['field']['output formats'] = [
-      'published-notpublished' => array(t('Published'), t('Not published')),
-    ];
     $data['node_field_data']['status']['filter']['label'] = t('Published status');
     $data['node_field_data']['status']['filter']['type'] = 'yes-no';
     // Use status = 1 instead of status <> 0 in WHERE statement.
@@ -59,15 +56,9 @@ public function getViewsData() {
       ),
     );
 
-    $data['node_field_data']['promote']['field']['output formats'] = [
-      'promoted-notpromoted' => array(t('Promoted'), t('Not promoted')),
-    ];
     $data['node_field_data']['promote']['filter']['label'] = t('Promoted to front page status');
     $data['node_field_data']['promote']['filter']['type'] = 'yes-no';
 
-    $data['node_field_data']['sticky']['field']['output formats'] = [
-      'sticky' => array(t('Sticky'), t('Not sticky')),
-    ];
     $data['node_field_data']['sticky']['filter']['label'] = t('Sticky status');
     $data['node_field_data']['sticky']['filter']['type'] = 'yes-no';
     $data['node_field_data']['sticky']['sort']['help'] = t('Whether or not the content is sticky. To list sticky content first, set this to descending.');
@@ -301,9 +292,6 @@ public function getViewsData() {
     $data['node_field_revision']['table']['join']['node_field_data']['left_field'] = 'vid';
     $data['node_field_revision']['table']['join']['node_field_data']['field'] = 'vid';
 
-    $data['node_field_revision']['status']['field']['output formats'] = [
-      'published-notpublished' => [t('Published'), t('Not published')],
-    ];
     $data['node_field_revision']['status']['filter']['label'] = t('Published');
     $data['node_field_revision']['status']['filter']['type'] = 'yes-no';
     $data['node_field_revision']['status']['filter']['use_equal'] = TRUE;
diff --git a/core/modules/node/src/Plugin/views/wizard/Node.php b/core/modules/node/src/Plugin/views/wizard/Node.php
index 829f852..8271f35 100644
--- a/core/modules/node/src/Plugin/views/wizard/Node.php
+++ b/core/modules/node/src/Plugin/views/wizard/Node.php
@@ -102,8 +102,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['title']['alter']['html'] = 0;
     $display_options['fields']['title']['hide_empty'] = 0;
     $display_options['fields']['title']['empty_zero'] = 0;
-    $display_options['fields']['title']['link_to_node'] = 1;
-    $display_options['fields']['title']['plugin_id'] = 'node';
+    $display_options['fields']['title']['settings']['link_to_entity'] = 1;
+    $display_options['fields']['title']['plugin_id'] = 'field';
 
     return $display_options;
   }
@@ -184,8 +184,8 @@ protected  function display_options_row(&$display_options, $row_plugin, $row_opt
         $display_options['fields']['title']['id'] = 'title';
         $display_options['fields']['title']['table'] = 'node_field_data';
         $display_options['fields']['title']['field'] = 'title';
-        $display_options['fields']['title']['link_to_node'] = ($row_plugin == 'titles_linked');
-        $display_options['fields']['title']['plugin_id'] = 'node';
+        $display_options['fields']['title']['settings']['link_to_entity'] = $row_plugin === 'titles_linked';
+        $display_options['fields']['title']['plugin_id'] = 'field';
         break;
     }
   }
diff --git a/core/modules/node/src/Tests/Views/RevisionRelationshipsTest.php b/core/modules/node/src/Tests/Views/RevisionRelationshipsTest.php
index e422d6e..5d33ba2 100644
--- a/core/modules/node/src/Tests/Views/RevisionRelationshipsTest.php
+++ b/core/modules/node/src/Tests/Views/RevisionRelationshipsTest.php
@@ -48,8 +48,8 @@ public function testNodeRevisionRelationship() {
     $node_revision->save();
     $column_map = array(
       'vid' => 'vid',
-      'node_field_revision_nid' => 'node_revision_nid',
       'node_field_data_node_field_revision_nid' => 'node_node_revision_nid',
+      'nid_1' => 'nid_1',
     );
 
     // Here should be two rows.
@@ -58,13 +58,14 @@ public function testNodeRevisionRelationship() {
     $resultset_nid = array(
       array(
         'vid' => '1',
-        'node_revision_nid' => '1',
         'node_node_revision_nid' => '1',
+        'nid_1' => '1',
       ),
       array(
         'vid' => '2',
         'node_revision_nid' => '1',
         'node_node_revision_nid' => '1',
+        'nid_1' => '1',
       ),
     );
     $this->assertIdenticalResultset($view_nid, $resultset_nid, $column_map);
@@ -75,8 +76,8 @@ public function testNodeRevisionRelationship() {
     $resultset_vid = array(
       array(
         'vid' => '2',
-        'node_revision_nid' => '1',
         'node_node_revision_nid' => '1',
+        'nid_1' => '1',
       ),
     );
     $this->assertIdenticalResultset($view_vid, $resultset_vid, $column_map);
diff --git a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_revision_nid.yml b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_revision_nid.yml
index 8c2c0bf..7ea3336 100644
--- a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_revision_nid.yml
+++ b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_node_revision_nid.yml
@@ -26,14 +26,14 @@ display:
           id: vid
           table: node_field_revision
           field: vid
-          plugin_id: standard
+          plugin_id: field
           entity_type: node
           entity_field: vid
         nid_1:
           id: nid_1
           table: node_field_revision
           field: nid
-          plugin_id: standard
+          plugin_id: field
           entity_type: node
           entity_field: nid
         nid:
@@ -41,7 +41,7 @@ display:
           table: node_field_data
           field: nid
           relationship: nid
-          plugin_id: node
+          plugin_id: field
           entity_type: node
           entity_field: nid
       arguments:
diff --git a/core/modules/options/src/Plugin/views/argument/NumberListField.php b/core/modules/options/src/Plugin/views/argument/NumberListField.php
index 9a3f9d3..792381c 100644
--- a/core/modules/options/src/Plugin/views/argument/NumberListField.php
+++ b/core/modules/options/src/Plugin/views/argument/NumberListField.php
@@ -10,7 +10,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Field\AllowedTagsXssTrait;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\field\Views\FieldAPIHandlerTrait;
+use Drupal\views\FieldAPIHandlerTrait;
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Plugin\views\argument\Numeric;
diff --git a/core/modules/options/src/Plugin/views/argument/StringListField.php b/core/modules/options/src/Plugin/views/argument/StringListField.php
index 1718938..da715c4 100644
--- a/core/modules/options/src/Plugin/views/argument/StringListField.php
+++ b/core/modules/options/src/Plugin/views/argument/StringListField.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Field\AllowedTagsXssTrait;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\field\Views\FieldAPIHandlerTrait;
+use Drupal\views\FieldAPIHandlerTrait;
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Plugin\views\argument\String;
diff --git a/core/modules/options/src/Plugin/views/filter/ListField.php b/core/modules/options/src/Plugin/views/filter/ListField.php
index 25fb290..f7cad30 100644
--- a/core/modules/options/src/Plugin/views/filter/ListField.php
+++ b/core/modules/options/src/Plugin/views/filter/ListField.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\options\Plugin\views\filter;
 
-use Drupal\field\Views\FieldAPIHandlerTrait;
+use Drupal\views\FieldAPIHandlerTrait;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Plugin\views\filter\ManyToOne;
 use Drupal\views\ViewExecutable;
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
index 3859a02..0eff284 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
@@ -23,6 +23,7 @@
  *       "default" = "Drupal\entity_test\EntityTestForm",
  *       "delete" = "Drupal\entity_test\EntityTestDeleteForm"
  *     },
+ *     "view_builder" = "Drupal\entity_test\EntityTestViewBuilder",
  *     "translation" = "Drupal\content_translation\ContentTranslationHandler",
  *     "views_data" = "Drupal\views\EntityViewsData"
  *   },
diff --git a/core/modules/tracker/src/Tests/Views/TrackerUserUidTest.php b/core/modules/tracker/src/Tests/Views/TrackerUserUidTest.php
index 7c9be32..e77d63a 100644
--- a/core/modules/tracker/src/Tests/Views/TrackerUserUidTest.php
+++ b/core/modules/tracker/src/Tests/Views/TrackerUserUidTest.php
@@ -29,7 +29,7 @@ class TrackerUserUidTest extends TrackerTestBase {
   public function testUserUid() {
     $map = array(
       'nid' => 'nid',
-      'node_field_data_title' => 'title',
+      'title' => 'title',
     );
 
     $expected = array(
diff --git a/core/modules/user/config/install/views.view.user_admin_people.yml b/core/modules/user/config/install/views.view.user_admin_people.yml
index f2ea8c3..01a48e8 100644
--- a/core/modules/user/config/install/views.view.user_admin_people.yml
+++ b/core/modules/user/config/install/views.view.user_admin_people.yml
@@ -292,11 +292,12 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          type: active-blocked
-          type_custom_true: ''
-          type_custom_false: ''
-          not: false
-          plugin_id: boolean
+          plugin_id: field
+          type: boolean
+          settings:
+            format: custom
+            format_custom_true: 'Active'
+            format_custom_false: 'Blocked'
           entity_type: user
           entity_field: status
         roles_target_id:
diff --git a/core/modules/user/src/UserViewsData.php b/core/modules/user/src/UserViewsData.php
index b44345e..9efde17 100644
--- a/core/modules/user/src/UserViewsData.php
+++ b/core/modules/user/src/UserViewsData.php
@@ -160,9 +160,6 @@ public function getViewsData() {
       ),
     );
 
-    $data['users_field_data']['status']['field']['output formats'] = array(
-      'active-blocked' => array(t('Active'), t('Blocked')),
-    );
     $data['users_field_data']['status']['filter']['label'] = t('Active');
     $data['users_field_data']['status']['filter']['type'] = 'yes-no';
 
diff --git a/core/modules/views/config/schema/views.field.schema.yml b/core/modules/views/config/schema/views.field.schema.yml
index de04690..a3556ef 100644
--- a/core/modules/views/config/schema/views.field.schema.yml
+++ b/core/modules/views/config/schema/views.field.schema.yml
@@ -182,3 +182,50 @@ views.field.language:
 views.field.bulk_form:
   type: views_field_bulk_form
   label: 'Bulk form'
+
+views.field.field:
+  type: views_field
+  label: 'Views entity field handler'
+  mapping:
+    click_sort_column:
+      type: string
+      label: 'Column used for click sorting'
+    type:
+      type: string
+      label: 'Formatter'
+    settings:
+      label: 'Settings'
+      type: field.formatter.settings.[%parent.type]
+    group_column:
+      type: string
+      label: 'Group by column'
+    group_columns:
+      type: sequence
+      label: 'Group by columns'
+      sequence:
+        - type: string
+          label: 'Column'
+    group_rows:
+      type: boolean
+      label: 'Display all values in the same row'
+    delta_limit:
+      type: integer
+      label: 'Field'
+    delta_offset:
+      type: integer
+      label: 'Offset'
+    delta_reversed:
+      type: boolean
+      label: 'Reversed'
+    delta_first_last:
+      type: boolean
+      label: 'First and last only'
+    multi_type:
+      type: string
+      label: 'Display type'
+    separator:
+      type: label
+      label: 'Separator'
+    field_api_classes:
+      type: boolean
+      label: 'Use field template'
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 1945cc3..6fe4807 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -138,6 +138,7 @@ public function getViewsData() {
       'field' => $base_field,
       'title' => $this->entityType->getLabel(),
     ];
+    $data[$base_table]['table']['entity revision'] = FALSE;
 
     if ($label_key = $this->entityType->getKey('label')) {
       if ($data_table) {
@@ -170,6 +171,7 @@ public function getViewsData() {
       ];
       $data[$data_table]['table']['group'] = $this->entityType->getLabel();
       $data[$data_table]['table']['provider'] = $this->entityType->getProvider();
+      $data[$data_table]['table']['entity revision'] = FALSE;
     }
     if ($revision_table) {
       $data[$revision_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
@@ -179,6 +181,7 @@ public function getViewsData() {
       if ($revision_data_table) {
         $views_revision_base_table = $revision_data_table;
       }
+      $data[$views_revision_base_table]['table']['entity revision'] = TRUE;
       $data[$views_revision_base_table]['table']['base'] = array(
         'field' => $revision_field,
         'title' => $this->t('@entity_type revisions', array('@entity_type' => $this->entityType->getLabel())),
@@ -192,6 +195,7 @@ public function getViewsData() {
 
       if ($revision_data_table) {
         $data[$revision_data_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
+        $data[$revision_data_table]['table']['entity revision'] = TRUE;
 
         $data[$revision_data_table]['table']['join'][$revision_table] = array(
           'left_field' => $revision_field,
@@ -318,21 +322,24 @@ protected function mapSingleFieldViewsData($table, $field_name, $field_type, $co
         break;
 
       case 'language':
-        $views_field['field']['id'] = 'language';
+        $views_field['field']['id'] = 'field';
         $views_field['argument']['id'] = 'language';
         $views_field['filter']['id'] = 'language';
         $views_field['sort']['id'] = 'standard';
         break;
 
       case 'boolean':
-        $views_field['field']['id'] = 'boolean';
+        $views_field['field']['id'] = 'field';
         $views_field['argument']['id'] = 'numeric';
         $views_field['filter']['id'] = 'boolean';
         $views_field['sort']['id'] = 'standard';
         break;
 
       case 'uri':
-        $views_field['field']['id'] = 'url';
+        // Let's render URIs as URIs by default, not links.
+        $views_field['field']['id'] = 'field';
+        $views_field['field']['default_formatter'] = 'string';
+
         $views_field['argument']['id'] = 'string';
         $views_field['filter']['id'] = 'string';
         $views_field['sort']['id'] = 'standard';
@@ -357,7 +364,7 @@ protected function mapSingleFieldViewsData($table, $field_name, $field_type, $co
           case 'float':
           case 'double':
           case 'decimal':
-            $views_field['field']['id'] = 'numeric';
+            $views_field['field']['id'] = 'field';
             $views_field['argument']['id'] = 'numeric';
             $views_field['filter']['id'] = 'numeric';
             $views_field['sort']['id'] = 'standard';
@@ -370,14 +377,14 @@ protected function mapSingleFieldViewsData($table, $field_name, $field_type, $co
           case 'text':
           case 'mediumtext':
           case 'longtext':
-            $views_field['field']['id'] = 'standard';
+            $views_field['field']['id'] = 'field';
             $views_field['argument']['id'] = 'string';
             $views_field['filter']['id'] = 'string';
             $views_field['sort']['id'] = 'standard';
             break;
 
           default:
-            $views_field['field']['id'] = 'standard';
+            $views_field['field']['id'] = 'field';
             $views_field['argument']['id'] = 'standard';
             $views_field['filter']['id'] = 'standard';
             $views_field['sort']['id'] = 'standard';
@@ -448,13 +455,13 @@ protected function processViewsDataForEntityReference($table, FieldDefinitionInt
           'title' => $entity_type->getLabel(),
           'id' => 'standard',
         ];
-        $views_field['field']['id'] = 'numeric';
+        $views_field['field']['id'] = 'field';
         $views_field['argument']['id'] = 'numeric';
         $views_field['filter']['id'] = 'numeric';
         $views_field['sort']['id'] = 'standard';
       }
       else {
-        $views_field['field']['id'] = 'standard';
+        $views_field['field']['id'] = 'field';
         $views_field['argument']['id'] = 'string';
         $views_field['filter']['id'] = 'string';
         $views_field['sort']['id'] = 'standard';
@@ -484,7 +491,7 @@ protected function processViewsDataForTextLong($table, FieldDefinitionInterface
     // Connect the text field to its formatter.
     if ($field_column_name == 'value') {
       $views_field['field']['format'] = $field_definition->getName() . '__format';
-      $views_field['field']['id'] = 'markup';
+      $views_field['field']['id'] = 'field';
     }
   }
 
diff --git a/core/modules/field/src/Views/FieldAPIHandlerTrait.php b/core/modules/views/src/FieldAPIHandlerTrait.php
similarity index 96%
rename from core/modules/field/src/Views/FieldAPIHandlerTrait.php
rename to core/modules/views/src/FieldAPIHandlerTrait.php
index da551cb..8a7fd12 100644
--- a/core/modules/field/src/Views/FieldAPIHandlerTrait.php
+++ b/core/modules/views/src/FieldAPIHandlerTrait.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\field\Views\FieldAPIHandlerTrait.
+ * Contains \Drupal\views\FieldAPIHandlerTrait.
  */
 
-namespace Drupal\field\Views;
+namespace Drupal\views;
 
 use Drupal\Core\Field\BaseFieldDefinition;
 
diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php
index 73e03a4..c6fe3f6 100644
--- a/core/modules/views/src/Plugin/views/field/Field.php
+++ b/core/modules/views/src/Plugin/views/field/Field.php
@@ -21,7 +21,7 @@
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\field\Views\FieldAPIHandlerTrait;
+use Drupal\views\FieldAPIHandlerTrait;
 use Drupal\views\Entity\Render\EntityTranslationRenderTrait;
 use Drupal\views\Plugin\CacheablePluginInterface;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
@@ -373,9 +373,15 @@ protected function defineOptions() {
       'default' => $default_column,
     );
 
-    $options['type'] = array(
-      'default' => isset($field_type['default_formatter']) ? $field_type['default_formatter'] : '',
-    );
+    if (isset($this->definition['default_formatter'])) {
+      $options['type'] = ['default' => $this->definition['default_formatter']];
+    }
+    elseif (isset($field_type['default_formatter'])) {
+      $options['type'] = ['default' => $field_type['default_formatter']];
+    }
+    else {
+      $options['type'] = ['default' => ''];
+    }
 
     $options['settings'] = array(
       'default' => isset($this->definition['default_formatter_settings']) ? $this->definition['default_formatter_settings'] : [],
diff --git a/core/modules/views/src/Plugin/views/filter/Bundle.php b/core/modules/views/src/Plugin/views/filter/Bundle.php
index b518354..e2e2372 100644
--- a/core/modules/views/src/Plugin/views/filter/Bundle.php
+++ b/core/modules/views/src/Plugin/views/filter/Bundle.php
@@ -123,8 +123,9 @@ public function calculateDependencies() {
     $bundle_entity_storage = $this->entityManager->getStorage($bundle_entity_type);
 
     foreach (array_keys($this->value) as $bundle) {
-      $bundle_entity = $bundle_entity_storage->load($bundle);
-      $dependencies[$bundle_entity->getConfigDependencyKey()][] = $bundle_entity->getConfigDependencyName();
+      if ($bundle_entity = $bundle_entity_storage->load($bundle)) {
+        $dependencies[$bundle_entity->getConfigDependencyKey()][] = $bundle_entity->getConfigDependencyName();
+      }
     }
 
     return $dependencies;
diff --git a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
index 1c254dc..f21bd3a 100644
--- a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
+++ b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
@@ -273,7 +273,7 @@ public function getEntityTableInfo() {
         'alias' => $base_table,
         'relationship_id' => 'none',
         'entity_type' => $base_table_data['table']['entity type'],
-        'revision' => FALSE,
+        'revision' => $base_table_data['table']['entity revision'],
       );
 
       // Include the entity provider.
@@ -291,7 +291,7 @@ public function getEntityTableInfo() {
           'relationship_id' => $relationship_id,
           'alias' => $relationship->alias,
           'entity_type' => $table_data['table']['entity type'],
-          'revision' => FALSE,
+          'revision' => $table_data['table']['entity revision'],
         );
 
         // Include the entity provider.
diff --git a/core/modules/views/src/Plugin/views/query/Sql.php b/core/modules/views/src/Plugin/views/query/Sql.php
index 47d1979..7c374f7 100644
--- a/core/modules/views/src/Plugin/views/query/Sql.php
+++ b/core/modules/views/src/Plugin/views/query/Sql.php
@@ -1255,7 +1255,7 @@ public function query($get_count = FALSE) {
 
       foreach ($entity_information as $entity_type_id => $info) {
         $entity_type = \Drupal::entityManager()->getDefinition($info['entity_type']);
-        $base_field = empty($table['revision']) ? $entity_type->getKey('id') : $entity_type->getKey('revision');
+        $base_field = !$info['revision'] ? $entity_type->getKey('id') : $entity_type->getKey('revision');
         $this->addField($info['alias'], $base_field, '', $params);
       }
     }
@@ -1465,8 +1465,11 @@ function execute(ViewExecutable $view) {
    * If the entity belongs to the base table, then it gets stored in
    * $result->_entity. Otherwise, it gets stored in
    * $result->_relationship_entities[$relationship_id];
+   *
+   * @param \Drupal\views\ResultRow[] $results
+   *   The result of the SQL query.
    */
-  function loadEntities(&$results) {
+  public function loadEntities(&$results) {
     $entity_information = $this->getEntityTableInfo();
     // No entity tables found, nothing else to do here.
     if (empty($entity_information)) {
@@ -1488,7 +1491,7 @@ function loadEntities(&$results) {
       $relationship_id = $info['relationship_id'];
       $entity_type = $info['entity_type'];
       $entity_info = $entity_types[$entity_type];
-      $id_key = empty($table['revision']) ? $entity_info->getKey('id') : $entity_info->getKey('revision');
+      $id_key = !$info['revision'] ? $entity_info->getKey('id') : $entity_info->getKey('revision');
       $id_alias = $this->getFieldAlias($info['alias'], $id_key);
 
       foreach ($results as $index => $result) {
@@ -1504,7 +1507,7 @@ function loadEntities(&$results) {
       $flat_ids = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($ids)), FALSE);
 
       // Drupal core currently has no way to load multiple revisions. Sad.
-      if (isset($entity_table_info[$entity_type]['revision']) && $entity_table_info[$entity_type]['revision'] == TRUE) {
+      if (isset($entity_information[$entity_type]['revision']) && $entity_information[$entity_type]['revision'] == TRUE) {
         $entities = array();
         foreach ($flat_ids as $revision_id) {
           $entity = entity_revision_load($entity_type, $revision_id);
diff --git a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
index cee903e..d96f666 100644
--- a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
+++ b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
@@ -147,6 +147,7 @@ public function testCalculateDependencies() {
         'ArgumentValidatorTest'
       ],
       'module' => [
+        'core',
         'node',
         'search',
         'user',
@@ -158,7 +159,7 @@ public function testCalculateDependencies() {
         'field.storage.node.body'
       ],
       'module' => [
-        'node',
+        'core',
         'text',
         'views'
       ],
diff --git a/core/modules/views/src/Tests/Handler/FieldFieldTest.php b/core/modules/views/src/Tests/Handler/FieldFieldTest.php
index 75f3878..c5b25ee 100644
--- a/core/modules/views/src/Tests/Handler/FieldFieldTest.php
+++ b/core/modules/views/src/Tests/Handler/FieldFieldTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\views\Tests\Handler;
 
 use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestRev;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\views\Plugin\views\field\Field;
@@ -30,7 +31,7 @@ class FieldFieldTest extends ViewUnitTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $testViews = ['test_field_field_test'];
+  public static $testViews = ['test_field_field_test', 'test_field_field_revision_test'];
 
   /**
    * The stored test entities.
@@ -40,12 +41,20 @@ class FieldFieldTest extends ViewUnitTestBase {
   protected $entities;
 
   /**
+   * The stored revisionable test entities.
+   *
+   * @var \Drupal\entity_test\Entity\EntityTestRev[]
+   */
+  protected $entityRevision;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
     parent::setUp();
 
     $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('entity_test_rev');
 
     // Setup a field storage and field, but also change the views data for the
     // entity_test entity type.
@@ -72,6 +81,49 @@ protected function setUp() {
       $entity->save();
     }
 
+    // Setup some test data for entities with revisions.
+    // We are testing both base field revisions and field config revisions.
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_test',
+      'type' => 'integer',
+      'entity_type' => 'entity_test_rev',
+    ]);
+    $field_storage->save();
+
+    $field = FieldConfig::create([
+      'field_name' => 'field_test',
+      'entity_type' => 'entity_test_rev',
+      'bundle' => 'entity_test_rev',
+    ]);
+    $field->save();
+
+    $this->entityRevision = [];
+    $this->entityRevision[0] = $entity = EntityTestRev::create([
+      'name' => 'base value',
+      'field_test' => 1,
+    ]);
+    $entity->save();
+
+    $entity = clone $entity;
+    $entity->setNewRevision(TRUE);
+    $entity->name->value = 'revision value1';
+    $entity->field_test->value = 2;
+    $entity->save();
+    $this->entityRevision[1] = $entity;
+
+    $entity = clone $entity;
+    $entity->setNewRevision(TRUE);
+    $entity->name->value = 'revision value2';
+    $entity->field_test->value = 3;
+    $entity->save();
+    $this->entityRevision[2] = $entity;
+
+    $this->entityRevision[0] = $entity = EntityTestRev::create([
+      'name' => 'next entity value',
+      'field_test' => 4,
+    ]);
+    $entity->save();
+
     \Drupal::state()->set('entity_test.views_data', [
       'entity_test' => [
         'id' => [
@@ -80,6 +132,13 @@ protected function setUp() {
           ],
         ],
       ],
+      'entity_test_rev_revision' => [
+        'id' => [
+          'field' => [
+            'id' => 'field',
+          ],
+        ],
+      ],
     ]);
 
     Views::viewsData()->clear();
@@ -125,4 +184,53 @@ public function testSimpleRender() {
     $this->assertEqual(6, $executable->getStyle()->getField(4, 'field_test'));
   }
 
+  /**
+   * Tests the revision result.
+   */
+  public function testRevisionExecute() {
+    $executable = Views::getView('test_field_field_revision_test');
+    $executable->execute();
+
+    $this->assertTrue($executable->field['name'] instanceof Field);
+    $this->assertTrue($executable->field['field_test'] instanceof Field);
+
+    $this->assertIdenticalResultset($executable, [
+      ['id' => 1, 'field_test' => 1, 'revision_id' => 1, 'name' => 'base value'],
+      ['id' => 1, 'field_test' => 2, 'revision_id' => 2, 'name' => 'revision value1'],
+      ['id' => 1, 'field_test' => 3, 'revision_id' => 3, 'name' => 'revision value2'],
+      ['id' => 2, 'field_test' => 4, 'revision_id' => 4, 'name' => 'next entity value'],
+    ],
+      ['entity_test_rev_revision_id' => 'id', 'revision_id' => 'revision_id', 'name' => 'name', 'field_test' => 'field_test']
+    );
+  }
+
+  /**
+   * Tests the output of a revision view with base fields and configurable fields.
+   */
+  public function testRevisionRender() {
+    $executable = Views::getView('test_field_field_revision_test');
+    $executable->execute();
+
+    $this->assertEqual(1, $executable->getStyle()->getField(0, 'id'));
+    $this->assertEqual(1, $executable->getStyle()->getField(0, 'revision_id'));
+    $this->assertEqual(1, $executable->getStyle()->getField(0, 'field_test'));
+    $this->assertEqual('base value', $executable->getStyle()->getField(0, 'name'));
+
+    $this->assertEqual(1, $executable->getStyle()->getField(1, 'id'));
+    $this->assertEqual(2, $executable->getStyle()->getField(1, 'revision_id'));
+    $this->assertEqual(2, $executable->getStyle()->getField(1, 'field_test'));
+    $this->assertEqual('revision value1', $executable->getStyle()->getField(1, 'name'));
+
+    $this->assertEqual(1, $executable->getStyle()->getField(2, 'id'));
+    $this->assertEqual(3, $executable->getStyle()->getField(2, 'revision_id'));
+    $this->assertEqual(3, $executable->getStyle()->getField(2, 'field_test'));
+    $this->assertEqual('revision value2', $executable->getStyle()->getField(2, 'name'));
+
+    $this->assertEqual(2, $executable->getStyle()->getField(3, 'id'));
+    $this->assertEqual(4, $executable->getStyle()->getField(3, 'revision_id'));
+    $this->assertEqual(4, $executable->getStyle()->getField(3, 'field_test'));
+    $this->assertEqual('next entity value', $executable->getStyle()->getField(3, 'name'));
+
+  }
+
 }
diff --git a/core/modules/views/src/Tests/Handler/FieldGroupRowsWebTest.php b/core/modules/views/src/Tests/Handler/FieldGroupRowsWebTest.php
new file mode 100644
index 0000000..b6efe31
--- /dev/null
+++ b/core/modules/views/src/Tests/Handler/FieldGroupRowsWebTest.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Handler\GroupRowsTest.
+ */
+
+namespace Drupal\views\Tests\Handler;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Tests the "Display all values in the same row" setting.
+ *
+ * @group views
+ */
+class FieldGroupRowsWebTest extends ViewTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_group_rows', 'test_ungroup_rows'];
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['node'];
+
+  /**
+   * The page node type.
+   *
+   * @var \Drupal\node\NodeTypeInterface
+   */
+  protected $nodeType;
+
+  /**
+   * The used field name in the test.
+   *
+   * @var string
+   */
+  protected $fieldName;
+
+  /**
+   * The field storage.
+   *
+   * @var \Drupal\field\Entity\FieldStorageConfig
+   */
+  protected $fieldStorage;
+
+  /**
+   * The field config.
+   *
+   * @var \Drupal\field\Entity\FieldConfig
+   */
+  protected $field;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create content type with unlimited text field.
+    $this->nodeType = $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
+
+    // Create the unlimited text field.
+    $this->fieldName = 'field_views_testing_group_rows';
+    $this->fieldStorage = FieldStorageConfig::create([
+        'field_name' => $this->fieldName,
+        'entity_type' => 'node',
+        'type' => 'text',
+        'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
+    ]);
+    $this->fieldStorage->save();
+
+    // Create an instance of the text field on the content type.
+    $this->field = FieldConfig::create([
+      'field_storage' => $this->fieldStorage,
+      'bundle' => $this->nodeType->id(),
+    ]);
+    $this->field->save();
+
+    $edit = [
+      'title' => $this->randomMachineName(),
+      $this->fieldName => ['a', 'b', 'c'],
+    ];
+    $this->drupalCreateNode($edit);
+  }
+
+  /**
+   * Testing when "Display all values in the same row" is checked.
+   */
+  public function testGroupRows() {
+    $this->drupalGet('test-group-rows');
+    $result = $this->cssSelect('div.views-field-field-views-testing-group- div');
+
+    $rendered_value = [];
+    foreach ($result as $row) {
+      $rendered_value[] = (string) $row[0];
+    }
+    $this->assertEqual(['a, b, c'], $rendered_value);
+  }
+
+  /**
+   * Testing when "Display all values in the same row" is unchecked.
+   */
+  public function testUngroupedRows() {
+    $this->drupalGet('test-ungroup-rows');
+    $result = $this->cssSelect('div.views-field-field-views-testing-group- div');
+    $rendered_value = [];
+    foreach ($result as $row) {
+      $rendered_value[] = (string) $row[0];
+    }
+    $this->assertEqual(['a', 'b', 'c'], $rendered_value);
+  }
+
+}
diff --git a/core/modules/views/src/Tests/ModuleTest.php b/core/modules/views/src/Tests/ModuleTest.php
index 1f52a19..e801a09 100644
--- a/core/modules/views/src/Tests/ModuleTest.php
+++ b/core/modules/views/src/Tests/ModuleTest.php
@@ -30,7 +30,7 @@ class ModuleTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('user', 'block');
+  public static $modules = ['field', 'user', 'block'];
 
   /**
    * Stores the last triggered error, for example via debug().
@@ -142,8 +142,8 @@ public function customErrorHandler($error_level, $message, $filename, $line, $co
    * Tests the load wrapper/helper functions.
    */
   public function testLoadFunctions() {
-    $this->enableModules(array('node'));
-    $this->installConfig(array('node'));
+    $this->enableModules(['text', 'node']);
+    $this->installConfig(['node']);
     $storage = $this->container->get('entity.manager')->getStorage('view');
 
     // Test views_view_is_enabled/disabled.
diff --git a/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php b/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
index 37c71e7..b1f34e6 100644
--- a/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
+++ b/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
@@ -28,7 +28,7 @@ class BlockDependenciesTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'block', 'user');
+  public static $modules = array('node', 'block', 'user', 'field');
 
   /**
    * Tests that exposed filter blocks have the correct dependencies.
diff --git a/core/modules/views/src/Tests/ViewResultAssertionTrait.php b/core/modules/views/src/Tests/ViewResultAssertionTrait.php
index 4f730ca..222bf25 100644
--- a/core/modules/views/src/Tests/ViewResultAssertionTrait.php
+++ b/core/modules/views/src/Tests/ViewResultAssertionTrait.php
@@ -98,7 +98,7 @@ protected function assertIdenticalResultsetHelper($view, $expected_result, $colu
         // For entity fields we don't have the raw value. Let's try to fetch it
         // using the entity itself.
         elseif (empty($value->$view_column) && isset($view->field[$expected_column]) && ($field = $view->field[$expected_column]) && $field instanceof Field) {
-          $row[$expected_column] = $field->getEntity($value)->{$field->definition['field_name']}->value;
+          $row[$expected_column] = $field->getValue($value);
         }
       }
       $result[$key] = $row;
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_dropbutton.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_dropbutton.yml
index 16e8889..880105b 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_dropbutton.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_dropbutton.yml
@@ -92,11 +92,12 @@ display:
           id: title
           table: node_field_data
           field: title
-          plugin_id: node
+          plugin_id: field
           label: ''
           alter:
             alter_text: false
-            make_link: false
+            make_link: true
+            path: node/{{nid}}
             absolute: false
             trim: false
             word_boundary: false
@@ -105,7 +106,9 @@ display:
             html: false
           hide_empty: false
           empty_zero: false
-          link_to_node: true
+          type: string
+          settings:
+            link_to_entity: false
           entity_type: node
           entity_field: title
         nothing:
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml
new file mode 100644
index 0000000..5a49a08
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml
@@ -0,0 +1,60 @@
+langcode: und
+status: true
+dependencies: {  }
+id: test_field_field_revision_test
+module: views
+description: ''
+tag: ''
+base_table: entity_test_rev_revision
+base_field: id
+core: '8'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      cache:
+        type: none
+      fields:
+        id:
+          id: id
+          table: entity_test_rev_revision
+          field: id
+          plugin_id: field
+          entity_type: entity_test_rev
+          entity_field: id
+        revision_id:
+          id: revision_id
+          table: entity_test_rev_revision
+          field: revision_id
+          plugin_id: field
+          entity_type: entity_test_rev
+          entity_field: revision_id
+        field_test:
+          id: field_test
+          table: entity_test__field_test
+          field: field_test
+          plugin_id: field
+          entity_type: entity_test_rev
+          entity_field: field_test
+        name:
+          id: name
+          table: entity_test_rev_revision
+          field: name
+          plugin_id: field
+          entity_type: entity_test_rev
+          entity_field: name
+      sorts:
+        revision_id:
+          id: revision_id
+          table: entity_test_rev_revision
+          field: revision_id
+          entity_type: entity_test_rev
+          entity_field: revision_id
+          order: ASC
+      style:
+        type: html_list
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml
index 71669eb..4c2a700 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml
@@ -4,6 +4,10 @@ dependencies:
   module:
     - field
     - node
+    - user
+  config:
+    - field.storage.node.field_views_testing_group_rows
+  module:
 id: test_group_rows
 label: test_group_rows
 module: views
@@ -40,6 +44,92 @@ display:
           id: field_group_rows
           table: node__field_group_rows
           field: field_group_rows
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: true
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: true
+            trim: true
+            preserve_tags: ''
+            html: false
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          plugin_id: node
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: true
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: true
+            trim: true
+            preserve_tags: ''
+            html: false
+        field_views_testing_group_:
+          id: field_views_testing_group_rows
+          table: node__field_views_testing_group_rows
+          field: field_views_testing_group_rows
           relationship: none
           group_type: group
           admin_label: ''
@@ -100,3 +190,11 @@ display:
           field_api_classes: false
           plugin_id: field
       display_extenders: {  }
+  page_1:
+    display_options:
+      path: test-group-rows
+      display_extenders: {  }
+    display_plugin: page
+    display_title: 'Page display'
+    id: page_1
+    position: 1
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_search.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_search.yml
index 6495dcd..91767f9 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_search.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_search.yml
@@ -73,7 +73,6 @@ display:
             html: false
           hide_empty: false
           empty_zero: false
-          link_to_node: true
           relationship: none
           group_type: group
           admin_label: ''
@@ -89,9 +88,12 @@ display:
           element_default_classes: true
           empty: ''
           hide_alter_empty: true
-          plugin_id: node
           entity_type: node
           entity_field: title
+          plugin_id: field
+          type: string
+          settings:
+            link_to_entity: true
       filters:
         status:
           value: true
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tag_cache.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tag_cache.yml
index 47df910..e589286 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tag_cache.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tag_cache.yml
@@ -53,10 +53,54 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_node: true
-          plugin_id: node
+          plugin_id: field
           entity_type: node
           entity_field: title
+          type: string
+          settings:
+            link_to_entity: true
+          plugin_id: field
+      filters:
+        type:
+          id: type
+          table: node_field_data
+          field: type
+          relationship: none
+          group_type: group
+          admin_label: ''
+          operator: in
+          value:
+            page: page
+          group: 1
+          exposed: false
+          expose:
+            operator_id: ''
+            label: ''
+            description: ''
+            use_operator: false
+            operator: ''
+            identifier: ''
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+            reduce: false
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+          plugin_id: bundle
+          entity_type: node
+          entity_field: type
       group_by: true
       pager:
         type: some
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_ungroup_rows.yml
similarity index 76%
copy from core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml
copy to core/modules/views/tests/modules/views_test_config/test_views/views.view.test_ungroup_rows.yml
index 71669eb..1673161 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_group_rows.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_ungroup_rows.yml
@@ -1,11 +1,14 @@
 langcode: und
 status: true
 dependencies:
+  config:
+    - field.storage.node.field_views_testing_group_rows
   module:
     - field
     - node
-id: test_group_rows
-label: test_group_rows
+    - user
+id: test_ungroup_rows
+label: test_ungroup_rows
 module: views
 description: ''
 tag: ''
@@ -36,10 +39,17 @@ display:
       row:
         type: fields
       fields:
-        field_group_rows:
-          id: field_group_rows
-          table: node__field_group_rows
-          field: field_group_rows
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          plugin_id: node
+        field_views_testing_group_:
+          id: field_views_testing_group_rows
+          table: node__field_views_testing_group_rows
+          field: field_views_testing_group_rows
           relationship: none
           group_type: group
           admin_label: ''
@@ -90,7 +100,7 @@ display:
             link_to_entity: false
           group_column: value
           group_columns: {  }
-          group_rows: true
+          group_rows: false
           delta_limit: 0
           delta_offset: 0
           delta_reversed: false
@@ -100,3 +110,11 @@ display:
           field_api_classes: false
           plugin_id: field
       display_extenders: {  }
+  page_1:
+    display_options:
+      path: test-ungroup-rows
+      display_extenders: {  }
+    display_plugin: page
+    display_title: 'Page display'
+    id: page_1
+    position: 1
diff --git a/core/modules/views/tests/modules/views_test_language/views_test_language.views.inc b/core/modules/views/tests/modules/views_test_language/views_test_language.views.inc
deleted file mode 100644
index b75d1f5..0000000
--- a/core/modules/views/tests/modules/views_test_language/views_test_language.views.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-/**
- * @file
- * Provides views data and hooks for views_test_language module.
- */
-
-/**
- * Implements hook_views_data_alter().
- */
-function views_test_language_views_data_alter(array &$data) {
-  // Make node titles use configurable field rendering for this test.
-  // @todo No need for this once https://www.drupal.org/node/2342045 lands.
-  $data['node_field_data']['title']['field']['id'] = 'field';
-}
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index c81a47c..dda53f2 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -160,6 +160,7 @@ public function testBaseTables() {
     $data = $this->viewsData->getViewsData();
 
     $this->assertEquals('entity_test', $data['entity_test']['table']['entity type']);
+    $this->assertEquals(FALSE, $data['entity_test']['table']['entity revision']);
     $this->assertEquals('Entity test', $data['entity_test']['table']['group']);
     $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
 
@@ -195,6 +196,7 @@ public function testDataTable() {
     $this->assertFalse(isset($data['entity_test']['table']['base']));
 
     $this->assertEquals('entity_test_mul', $data['entity_test_mul_property_data']['table']['entity type']);
+    $this->assertEquals(FALSE, $data['entity_test_mul_property_data']['table']['entity revision']);
     $this->assertEquals('Entity test', $data['entity_test_mul_property_data']['table']['group']);
     $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
     $this->assertEquals(['field' => 'label', 'table' => 'entity_test_mul_property_data'], $data['entity_test_mul_property_data']['table']['base']['defaults']);
@@ -223,7 +225,12 @@ public function testRevisionTableWithoutDataTable() {
     $this->assertEquals('Entity test revisions', $data['entity_test_mulrev_revision']['table']['base']['title']);
     $this->assertEquals('revision_id', $data['entity_test_mulrev_revision']['table']['base']['field']);
 
+    $this->assertEquals(FALSE, $data['entity_test']['table']['entity revision']);
     $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_revision']['table']['entity type']);
+    $this->assertEquals(TRUE, $data['entity_test_mulrev_revision']['table']['entity revision']);
+    $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_revision']['table']['entity type']);
+    $this->assertEquals(TRUE, $data['entity_test_mulrev_revision']['table']['entity revision']);
+
     $this->assertEquals('Entity test revision', $data['entity_test_mulrev_revision']['table']['group']);
     $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
 
@@ -710,7 +717,7 @@ protected function assertField($data, $field_name) {
    *   The views data to check.
    */
   protected function assertStringField($data) {
-    $this->assertEquals('standard', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('string', $data['filter']['id']);
     $this->assertEquals('string', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -723,7 +730,8 @@ protected function assertStringField($data) {
    *   The views data to check.
    */
   protected function assertUriField($data) {
-    $this->assertEquals('url', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
+    $this->assertEquals('string', $data['field']['default_formatter']);
     $this->assertEquals('string', $data['filter']['id']);
     $this->assertEquals('string', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -739,7 +747,7 @@ protected function assertUriField($data) {
    */
   protected function assertLongTextField($data, $field_name) {
     $value_field = $data[$field_name . '__value'];
-    $this->assertEquals('markup', $value_field['field']['id']);
+    $this->assertEquals('field', $value_field['field']['id']);
     $this->assertEquals($field_name . '__format', $value_field['field']['format']);
     $this->assertEquals('string', $value_field['filter']['id']);
     $this->assertEquals('string', $value_field['argument']['id']);
@@ -756,7 +764,7 @@ protected function assertLongTextField($data, $field_name) {
    */
   protected function assertUuidField($data) {
     // @todo Can we provide additional support for UUIDs in views?
-    $this->assertEquals('standard', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('string', $data['filter']['id']);
     $this->assertEquals('string', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -769,7 +777,7 @@ protected function assertUuidField($data) {
    *   The views data to check.
    */
   protected function assertNumericField($data) {
-    $this->assertEquals('numeric', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('numeric', $data['filter']['id']);
     $this->assertEquals('numeric', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -782,7 +790,7 @@ protected function assertNumericField($data) {
    *   The views data to check.
    */
   protected function assertLanguageField($data) {
-    $this->assertEquals('language', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('language', $data['filter']['id']);
     $this->assertEquals('language', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -792,7 +800,7 @@ protected function assertLanguageField($data) {
    * Tests views data for a entity reference field.
    */
   protected function assertEntityReferenceField($data) {
-    $this->assertEquals('numeric', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('numeric', $data['filter']['id']);
     $this->assertEquals('numeric', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
@@ -802,7 +810,7 @@ protected function assertEntityReferenceField($data) {
    * Tests views data for a bundle field.
    */
   protected function assertBundleField($data) {
-    $this->assertEquals('standard', $data['field']['id']);
+    $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('bundle', $data['filter']['id']);
     $this->assertEquals('string', $data['argument']['id']);
     $this->assertEquals('standard', $data['sort']['id']);
diff --git a/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php b/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
index b074e99..9ca73d4 100644
--- a/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
@@ -140,7 +140,35 @@ public function testDefineOptionsWithNoOptions() {
   /**
    * @covers ::defineOptions
    */
-  public function testDefineOptionsWithDefaultFormatter() {
+  public function testDefineOptionsWithDefaultFormatterOnFieldDefinition() {
+    $definition = [
+      'entity_type' => 'test_entity',
+      'field_name' => 'title',
+      'default_formatter' => 'test_example',
+      'default_formatter_settings' => ['link_to_entity' => TRUE]
+    ];
+    $handler = new Field([], 'field', $definition, $this->entityManager, $this->formatterPluginManager, $this->fieldTypePluginManager, $this->languageManager, $this->renderer);
+
+    // Setup the entity manager to allow fetching the storage definitions.
+    $title_storage = $this->getBaseFieldStorage();
+
+    $this->entityManager->expects($this->atLeastOnce())
+      ->method('getFieldStorageDefinitions')
+      ->with('test_entity')
+      ->willReturn([
+        'title' => $title_storage,
+      ]);
+
+    $options = [];
+    $handler->init($this->executable, $this->display, $options);
+
+    $this->assertEquals('test_example', $handler->options['type']);
+  }
+
+  /**
+   * @covers ::defineOptions
+   */
+  public function testDefineOptionsWithDefaultFormatterOnFieldType() {
     $definition = [
       'entity_type' => 'test_entity',
       'field_name' => 'title',
@@ -254,7 +282,7 @@ public function testAccess() {
 
     $access_control_handler->expects($this->atLeastOnce())
       ->method('fieldAccess')
-      ->with('view', $this->anything(), $account, NULL, FALSE)
+      ->with('view', $this->anything(), $account, NULL, $this->anything())
       ->willReturn(TRUE);
 
     $this->assertTrue($handler->access($account));
@@ -265,8 +293,6 @@ public function testAccess() {
    *
    * @param string $order
    *   The sort order.
-   *
-   * @covers ::clickSort
    */
   public function testClickSortWithOutConfiguredColumn($order) {
     $definition = [
diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index ea865e2..be4b6e9 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -462,7 +462,6 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
       // Provide a real field for group by.
       'real field' => $field_alias . '_' . $real_field,
       'additional fields' => $add_fields,
-      'entity_tables' => $entity_tables,
       // Default the element type to div, let the UI change it if necessary.
       'element type' => 'div',
       'is revision' => $type == EntityStorageInterface::FIELD_LOAD_REVISION,
