diff --git a/core/modules/field/tests/modules/field_test_views/test_views/views.view.test_view_fieldapi.yml b/core/modules/field/tests/modules/field_test_views/test_views/views.view.test_view_fieldapi.yml
index e5098e3..dbe554f 100644
--- a/core/modules/field/tests/modules/field_test_views/test_views/views.view.test_view_fieldapi.yml
+++ b/core/modules/field/tests/modules/field_test_views/test_views/views.view.test_view_fieldapi.yml
@@ -9,7 +9,7 @@ label: test_view_fieldapi
 module: views
 description: ''
 tag: default
-base_table: node
+base_table: node_field_data
 base_field: nid
 core: '8'
 display:
@@ -21,7 +21,7 @@ display:
         nid:
           field: nid
           id: nid
-          table: node
+          table: node_field_data
           plugin_id: field
           entity_type: node
           entity_field: nid
diff --git a/core/modules/node/src/NodeViewsData.php b/core/modules/node/src/NodeViewsData.php
index 939e51b..a5d7096 100644
--- a/core/modules/node/src/NodeViewsData.php
+++ b/core/modules/node/src/NodeViewsData.php
@@ -276,7 +276,7 @@ public function getViewsData() {
         'title' => t('Content'),
         'label' => t('Get the actual content from a content revision.'),
       ),
-    ) + $data['node_revision']['vid'];
+    ) + $data['node_field_revision']['vid'];
 
     $data['node_field_revision']['langcode']['help'] = t('The language the original content is in.');
 
diff --git a/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_display_field.yml b/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_display_field.yml
index 7032875..93b4c01 100644
--- a/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_display_field.yml
+++ b/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_display_field.yml
@@ -41,7 +41,7 @@ display:
       fields:
         nid:
           id: nid
-          table: node
+          table: node_field_data
           field: nid
           plugin_id: field
           entity_type: node
diff --git a/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_groupwise_term.yml b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_groupwise_term.yml
index c5ba611..4accf38 100644
--- a/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_groupwise_term.yml
+++ b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_groupwise_term.yml
@@ -55,7 +55,7 @@ display:
           subquery_namespace: ''
           subquery_order: DESC
           subquery_regenerate: true
-          subquery_sort: node.nid
+          subquery_sort: node_field_data.nid
           subquery_view: ''
           table: taxonomy_term_field_data
           plugin_id: groupwise_max
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 08d56b0..562fa266 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -213,8 +213,27 @@ public function getViewsData() {
       // @todo We should better just rely on information coming from the entity
       //   storage.
       // @todo https://drupal.org/node/2337511
+      $field_names_per_table = [];
       foreach ($table_mapping->getTableNames() as $table) {
-        foreach ($table_mapping->getFieldNames($table) as $field_name) {
+        $field_names_per_table[$table] = $table_mapping->getFieldNames($table);
+      }
+
+      foreach ($field_names_per_table as $table => $fields) {
+        foreach ($fields as $field_name) {
+          // Some fields (for example, Entity ID) appear in both the base table
+          // and data table, or in both the revision table and revision data
+          // table. With the exception of the langcode field (which is different
+          // in the two tables -- base language vs. translation language), these
+          // fields have the same values in both tables, corresponding to an
+          // entity base field. To avoid confusing duplication, only add them in
+          // the data tables.
+          if ($data_table && $table === $base_table && $field_name !== 'langcode' && in_array($field_name, $field_names_per_table[$data_table])) {
+            continue;
+          }
+          if ($revision_data_table && $table === $revision_table && $field_name !== 'langcode' && in_array($field_name, $field_names_per_table[$revision_data_table])) {
+            continue;
+          }
+
           $this->mapFieldDefinition($table, $field_name, $field_definitions[$field_name], $table_mapping, $data[$table]);
         }
       }
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index ee3cb03..1c02fcf 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -520,8 +520,7 @@ public function testDataTableFields() {
     $data = $this->viewsData->getViewsData();
 
     // Check the base fields.
-    $this->assertNumericField($data['entity_test_mul']['id']);
-    $this->assertField($data['entity_test_mul']['id'], 'id');
+    $this->assertFalse(isset($data['entity_test_mul']['id']));
     $this->assertUuidField($data['entity_test_mul']['uuid']);
     $this->assertField($data['entity_test_mul']['uuid'], 'uuid');
 
@@ -618,10 +617,8 @@ public function testRevisionTableFields() {
     $data = $this->viewsData->getViewsData();
 
     // Check the base fields.
-    $this->assertNumericField($data['entity_test_mulrev']['id']);
-    $this->assertField($data['entity_test_mulrev']['id'], 'id');
-    $this->assertNumericField($data['entity_test_mulrev']['revision_id']);
-    $this->assertField($data['entity_test_mulrev']['revision_id'], 'revision_id');
+    $this->assertFalse(isset($data['entity_test_mulrev']['id']));
+    $this->assertFalse(isset($data['entity_test_mulrev']['revision_id']));
     $this->assertUuidField($data['entity_test_mulrev']['uuid']);
     $this->assertField($data['entity_test_mulrev']['uuid'], 'uuid');
     $this->assertStringField($data['entity_test_mulrev']['type']);
@@ -637,10 +634,8 @@ public function testRevisionTableFields() {
     $this->assertFalse(isset($data['entity_test_mulrev']['user_id']));
 
     // Check the revision fields.
-    $this->assertNumericField($data['entity_test_mulrev_revision']['id']);
-    $this->assertField($data['entity_test_mulrev_revision']['id'], 'id');
-    $this->assertNumericField($data['entity_test_mulrev_revision']['revision_id']);
-    $this->assertField($data['entity_test_mulrev_revision']['revision_id'], 'revision_id');
+    $this->assertFalse(isset($data['entity_test_mulrev_revision']['id']));
+    $this->assertFalse(isset($data['entity_test_mulrev_revision']['revision_id']));
 
     $this->assertLanguageField($data['entity_test_mulrev_revision']['langcode']);
     $this->assertField($data['entity_test_mulrev_revision']['langcode'], 'langcode');
diff --git a/core/modules/views_ui/src/Tests/HandlerTest.php b/core/modules/views_ui/src/Tests/HandlerTest.php
index eebd4ed..c9524d3 100644
--- a/core/modules/views_ui/src/Tests/HandlerTest.php
+++ b/core/modules/views_ui/src/Tests/HandlerTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\views_ui\Tests;
 
 use Drupal\Component\Utility\String;
+use Drupal\views\Tests\ViewTestData;
 use Drupal\views\ViewExecutable;
 
 /**
@@ -19,11 +20,23 @@
 class HandlerTest extends UITestBase {
 
   /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['node_test_views'];
+
+  /**
    * Views used by this test.
    *
    * @var array
    */
-  public static $testViews = array('test_view_empty', 'test_view_broken');
+  public static $testViews = array('test_view_empty', 'test_view_broken', 'test_node_view');
+
+  protected function setUp() {
+    parent::setUp();
+
+    ViewTestData::createTestViews(get_class($this), array('node_test_views'));
+  }
+
 
   /**
    * Overrides \Drupal\views\Tests\ViewTestBase::schemaDefinition().
@@ -172,4 +185,18 @@ public function testBrokenHandlers() {
     }
   }
 
+  /**
+   * Ensures that neither node type or node ID appears multiple times.
+   *
+   * @see \Drupal\views\EntityViewsData
+   */
+  public function testNoDuplicateFields() {
+    $add_handler_url = "admin/structure/views/nojs/add-handler/test_node_view/default/field";
+    $this->drupalGet($add_handler_url);
+
+    $content = $this->getRawContent();
+    $this->assertEqual(1, substr_count($content, 'Content: Type'), 'Content: Type appears just once.');
+    $this->assertEqual(1, substr_count($content, 'Content: Node ID', 'Content: Node ID appears just once.'));
+  }
+
 }
