diff --git a/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_id.yml b/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_id.yml
index efcabc3..2aafa05 100644
--- a/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_id.yml
+++ b/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_id.yml
@@ -31,7 +31,7 @@ display:
           entity_field: revision_id
         id_1:
           id: id_1
-          table: block_content_revision
+          table: block_content_field_revision
           field: id
           plugin_id: field
           entity_type: block_content
diff --git a/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_revision_id.yml b/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_revision_id.yml
index 566f2c5..7539397 100644
--- a/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_revision_id.yml
+++ b/core/modules/block_content/tests/modules/block_content_test_views/test_views/views.view.test_block_content_revision_revision_id.yml
@@ -33,7 +33,7 @@ display:
           entity_field: revision_id
         id_1:
           id: id_1
-          table: block_content_revision
+          table: block_content_field_revision
           field: id
           plugin_id: field
           entity_type: block_content
diff --git a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_rest.yml b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_rest.yml
index 851edfd..d150c6b 100644
--- a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_rest.yml
+++ b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_rest.yml
@@ -338,7 +338,7 @@ display:
       arguments:
         nid:
           id: nid
-          table: node
+          table: node_field_data
           field: nid
           relationship: node
           group_type: group
diff --git a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_argument_datetime.yml b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_argument_datetime.yml
index e22ad30..7f3abec 100644
--- a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_argument_datetime.yml
+++ b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_argument_datetime.yml
@@ -27,7 +27,7 @@ display:
           field: nid
           id: nid
           relationship: none
-          table: node
+          table: node_field_data
           plugin_id: numeric
       pager:
         options:
@@ -39,7 +39,7 @@ display:
           id: nid
           order: ASC
           relationship: none
-          table: node
+          table: node_field_data
           plugin_id: numeric
     display_plugin: default
     display_title: Master
diff --git a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_filter_datetime.yml b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_filter_datetime.yml
index c9b23de..abd0e4f 100644
--- a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_filter_datetime.yml
+++ b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_filter_datetime.yml
@@ -24,7 +24,7 @@ display:
         nid:
           field: nid
           id: nid
-          table: node
+          table: node_field_data
           plugin_id: node
       filters:
         field_date_value:
@@ -38,7 +38,7 @@ display:
           id: nid
           order: ASC
           relationship: none
-          table: node
+          table: node_field_data
           plugin_id: numeric
       pager:
         type: full
diff --git a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_sort_datetime.yml b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_sort_datetime.yml
index 8b8d052..de80830 100644
--- a/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_sort_datetime.yml
+++ b/core/modules/datetime/tests/modules/datetime_test/test_views/views.view.test_sort_datetime.yml
@@ -24,7 +24,7 @@ display:
         nid:
           field: nid
           id: nid
-          table: node
+          table: node_field_data
           plugin_id: node
       sorts:
         field_date_value:
@@ -39,7 +39,7 @@ display:
           id: nid
           order: ASC
           relationship: none
-          table: node
+          table: node_field_data
           plugin_id: numeric
       pager:
         type: full
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 869e441..ab39c27 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 3c0d509..895008e 100644
--- a/core/modules/node/src/NodeViewsData.php
+++ b/core/modules/node/src/NodeViewsData.php
@@ -240,7 +240,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/node/tests/modules/node_test_views/test_views/views.view.test_nid_argument.yml b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_nid_argument.yml
index b61f1ad..f521093 100644
--- a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_nid_argument.yml
+++ b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_nid_argument.yml
@@ -56,7 +56,7 @@ display:
       fields:
         nid:
           id: nid
-          table: node
+          table: node_field_data
           field: nid
           relationship: none
           group_type: group
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 ab50920..7699fb1 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 a802762..5ba97e0 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
@@ -59,7 +59,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/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_term_relationship.yml b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_term_relationship.yml
index 22521bc..96195e8 100644
--- a/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_term_relationship.yml
+++ b/core/modules/taxonomy/tests/modules/taxonomy_test_views/test_views/views.view.test_taxonomy_term_relationship.yml
@@ -156,7 +156,7 @@ display:
           plugin_id: field
         nid:
           id: nid
-          table: node
+          table: node_field_data
           field: nid
           entity_type: node
           entity_field: nid
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index a9bc03e..e0493b0 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -217,6 +217,12 @@ public function getViewsData() {
       // @todo https://www.drupal.org/node/2337511
       foreach ($table_mapping->getTableNames() as $table) {
         foreach ($table_mapping->getFieldNames($table) as $field_name) {
+          // Some fields (for example, Entity ID) appear in both the base table
+          // and data table. With the exception of the uuid field. To avoid
+          // confusing duplication, only add them in the data tables.
+          if ($data_table && ($table === $base_table || $table === $revision_table) && $field_name != 'uuid') {
+            continue;
+          }
           $this->mapFieldDefinition($table, $field_name, $field_definitions[$field_name], $table_mapping, $data[$table]);
         }
       }
diff --git a/core/modules/views/src/Tests/Update/FieldHandlersUpdateTest.php b/core/modules/views/src/Tests/Update/FieldHandlersUpdateTest.php
new file mode 100644
index 0000000..be3d179
--- /dev/null
+++ b/core/modules/views/src/Tests/Update/FieldHandlersUpdateTest.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Update\FieldHandlersUpdateTest.
+ */
+
+namespace Drupal\views\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+use Drupal\views\Entity\View;
+
+/**
+ * Tests the upgrade path for views field handlers.
+ *
+ * @see https://www.drupal.org/node/2458223
+ * @see views_update_8003
+ *
+ * @group Update
+ */
+class FieldHandlersUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../tests/fixtures/update/duplicate-field-handler.php',
+    ];
+  }
+
+  /**
+   * Tests that field handlers are updated properly.
+   */
+  public function testUpdateHookN() {
+    $this->runUpdates();
+
+    // Load and initialize our test view.
+    $view = View::load('test_duplicate_field_handlers');
+    $data = $view->toArray();
+    // Check that the field is using the expected base table.
+    $this->assertEqual('node_field_data', $data['display']['default']['display_options']['fields']['nid']['table']);
+  }
+
+}
diff --git a/core/modules/views/tests/fixtures/update/duplicate-field-handler.php b/core/modules/views/tests/fixtures/update/duplicate-field-handler.php
new file mode 100644
index 0000000..2b78f12
--- /dev/null
+++ b/core/modules/views/tests/fixtures/update/duplicate-field-handler.php
@@ -0,0 +1,11 @@
+<?php
+
+$connection = Drupal\Core\Database\Database::getConnection();
+
+$connection->insert('config')
+  ->fields(array(
+    'collection' => '',
+    'name' => 'views.view.test_duplicate_field_handlers',
+    'data' => serialize(\Drupal\Component\Serialization\Yaml::decode(file_get_contents('core/modules/views/tests/modules/views_test_config/test_views/views.view.test_duplicate_field_handlers.yml'))),
+  ))
+  ->execute();
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_duplicate_field_handlers.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_duplicate_field_handlers.yml
new file mode 100644
index 0000000..cc508f5
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_duplicate_field_handlers.yml
@@ -0,0 +1,180 @@
+uuid: 98e7af3d-4601-4ec2-9204-4a39e9c6d370
+langcode: en
+status: true
+dependencies:
+  module:
+    - node
+    - user
+id: test_duplicate_field_handlers
+label: 'Test Duplicate Field Handlers'
+module: views
+description: ''
+tag: ''
+base_table: node
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          items_per_page: null
+          offset: 0
+      style:
+        type: default
+      row:
+        type: fields
+      fields:
+        nid:
+          id: nid
+          table: node
+          field: nid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            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: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          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: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: node
+          entity_field: nid
+          plugin_id: field
+      filters:
+        status:
+          value: true
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+      sorts:
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          order: DESC
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      title: 'Test Duplicate Field Handlers'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      cacheable: false
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: test-duplicate-field-handlers
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      cacheable: false
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_row_render_cache.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_row_render_cache.yml
index 28a1812..e800da0 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_row_render_cache.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_row_render_cache.yml
@@ -130,7 +130,7 @@ display:
       fields:
         nid:
           id: nid
-          table: node
+          table: node_field_data
           field: nid
           relationship: none
           group_type: group
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index 9a65d6e..1267abd 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -526,10 +526,19 @@ public function testDataTableFields() {
     $table_mapping->expects($this->any())
       ->method('getFieldNames')
       ->willReturnMap([
-        ['entity_test_mul', ['id', 'uuid', 'type', 'langcode']],
-        ['entity_test_mul_property_data', ['id', 'langcode', 'name', 'description', 'homepage', 'user_id']],
+        ['entity_test_mul', ['uuid']],
+        ['entity_test_mul_property_data', ['id', 'type', 'langcode', 'name', 'description', 'homepage', 'user_id']],
       ]);
 
+    $table_mapping->expects($this->any())
+      ->method('getFieldTableName')
+      ->willReturnCallback(function($field) {
+        if ($field == 'uuid') {
+          return 'entity_test_mul';
+        }
+        return 'entity_test_mul_property_data';
+      });
+
     $this->entityStorage->expects($this->once())
       ->method('getTableMapping')
       ->willReturn($table_mapping);
@@ -547,17 +556,13 @@ 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->assertFalse(isset($data['entity_test_mul']['type']));
     $this->assertUuidField($data['entity_test_mul']['uuid']);
     $this->assertField($data['entity_test_mul']['uuid'], 'uuid');
 
-    $this->assertBundleField($data['entity_test_mul']['type']);
-    $this->assertField($data['entity_test_mul']['type'], 'type');
     $this->assertFalse(isset($data['entity_test_mul']['type']['relationship']));
 
-    $this->assertLanguageField($data['entity_test_mul']['langcode']);
-    $this->assertField($data['entity_test_mul']['langcode'], 'langcode');
     // Also ensure that field_data only fields don't appear on the base table.
     $this->assertFalse(isset($data['entity_test_mul']['name']));
     $this->assertFalse(isset($data['entity_test_mul']['description']));
@@ -570,6 +575,9 @@ public function testDataTableFields() {
     $this->assertNumericField($data['entity_test_mul_property_data']['id']);
     $this->assertField($data['entity_test_mul_property_data']['id'], 'id');
 
+    $this->assertBundleField($data['entity_test_mul_property_data']['type']);
+    $this->assertField($data['entity_test_mul_property_data']['type'], 'type');
+
     $this->assertLanguageField($data['entity_test_mul_property_data']['langcode']);
     $this->assertField($data['entity_test_mul_property_data']['langcode'], 'langcode');
     $this->assertEquals('Translation language', $data['entity_test_mul_property_data']['langcode']['title']);
@@ -645,6 +653,15 @@ public function testRevisionTableFields() {
         ['entity_test_mulrev_property_revision', ['id', 'revision_id', 'langcode', 'name', 'description', 'homepage', 'user_id']],
       ]);
 
+    $table_mapping->expects($this->any())
+      ->method('getFieldTableName')
+      ->willReturnCallback(function($field) {
+        if ($field == 'uuid') {
+          return 'entity_test_mulrev';
+        }
+        return 'entity_test_mulrev_property_data';
+      });
+
     $this->entityStorage->expects($this->once())
       ->method('getTableMapping')
       ->willReturn($table_mapping);
@@ -654,14 +671,11 @@ 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']['type']));
+    $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']);
-    $this->assertField($data['entity_test_mulrev']['type'], 'type');
 
     // Also ensure that field_data only fields don't appear on the base table.
     $this->assertFalse(isset($data['entity_test_mulrev']['name']));
@@ -672,17 +686,12 @@ public function testRevisionTableFields() {
     $this->assertFalse(isset($data['entity_test_mulrev']['langcode']));
     $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->assertLanguageField($data['entity_test_mulrev_revision']['langcode']);
-    $this->assertField($data['entity_test_mulrev_revision']['langcode'], 'langcode');
-    $this->assertEquals('Original language', $data['entity_test_mulrev_revision']['langcode']['title']);
+    // Check the revision fields. The revision id should only appear in the data
+    // table.
+    $this->assertFalse(isset($data['entity_test_mulrev_revision']['revision_id']));
 
     // Also ensure that field_data only fields don't appear on the revision table.
+    $this->assertFalse(isset($data['entity_test_mulrev_revision']['id']));
     $this->assertFalse(isset($data['entity_test_mulrev_revision']['name']));
     $this->assertFalse(isset($data['entity_test_mulrev_revision']['description']));
     $this->assertFalse(isset($data['entity_test_mulrev_revision']['description__value']));
@@ -693,6 +702,8 @@ public function testRevisionTableFields() {
     // Check the data fields.
     $this->assertNumericField($data['entity_test_mulrev_property_data']['id']);
     $this->assertField($data['entity_test_mulrev_property_data']['id'], 'id');
+    $this->assertNumericField($data['entity_test_mulrev_property_data']['revision_id']);
+    $this->assertField($data['entity_test_mulrev_property_data']['revision_id'], 'revision_id');
     $this->assertLanguageField($data['entity_test_mulrev_property_data']['langcode']);
     $this->assertField($data['entity_test_mulrev_property_data']['langcode'], 'langcode');
     $this->assertStringField($data['entity_test_mulrev_property_data']['name']);
diff --git a/core/modules/views/views.install b/core/modules/views/views.install
index fd49684..887cb18 100644
--- a/core/modules/views/views.install
+++ b/core/modules/views/views.install
@@ -311,5 +311,80 @@ function _views_update_argument_map($displays) {
 }
 
 /**
+ * Verify that no fields of the previous duplicated types is used in views.
+ */
+function views_update_8003(&$sandbox) {
+  $config_factory = \Drupal::configFactory();
+  $ids = [];
+  $message = NULL;
+  $data_tables = [];
+  $base_tables = [];
+  $revision_tables = [];
+  $entities_by_table = [];
+  // Some special fields are not relevant here.
+  $update_exceptions = [
+    'user_bulk_form',
+    'operations',
+    'node_bulk_form',
+  ];
+
+  $entity_manager = \Drupal::service('entity.manager');
+  // This will allow us to create an index of all entity types of the site.
+  foreach ($entity_manager->getDefinitions() as $entity_type_name => $entity) {
+    // Store the entity keyed by base table. If it has a data table, use that as
+    // well.
+    if ($data_table = $entity->getDataTable()) {
+      $entities_by_table[$data_table] = $entity;
+    }
+    if ($base_table = $entity->getBaseTable()) {
+      $entities_by_table[$base_table] = $entity;
+    }
+    $entity_type_name = $entity->id();
+    $data_tables[$entity_type_name] = $entity->getDataTable();
+    $base_tables[$entity_type_name] = $entity->getBaseTable();
+    $revision_tables[$entity_type_name] = $entity->getRevisionTable();
+  }
+
+  foreach ($config_factory->listAll('views.view.') as $view_config_name) {
+    $changed = FALSE;
+    $view = $config_factory->getEditable($view_config_name);
+
+    $displays = $view->get('display');
+    $entity_type = $entities_by_table[$view->get('base_table')];
+    $entity_type_name = $entity_type->id();
+    $data_table = $data_tables[$entity_type_name];
+    $base_table = $base_tables[$entity_type_name];
+    $revision_table  = $revision_tables[$entity_type_name];
+
+    if ($data_table) {
+      foreach ($displays as $display_name => &$display) {
+        if (!empty($display['display_options']['fields'])) {
+          foreach ($display['display_options']['fields'] as $field_name => &$field) {
+            $table = $field['table'];
+            if (($table === $base_table || $table === $revision_table) && $field_name != 'uuid') {
+              if (in_array($field['field'], $update_exceptions)) {
+                continue;
+              }
+              $field['table'] = $data_table;
+              $changed = TRUE;
+            }
+          }
+        }
+      }
+    }
+    if ($changed) {
+      $view->set('display', $displays);
+      $view->save();
+      $ids[] = $view->get('id');
+    }
+  }
+  if (!empty($ids)) {
+    $message = \Drupal::translation()->translate('Updated tables for field handlers for views: @ids', ['@ids' => implode(', ', array_unique($ids))]);
+  }
+
+  return $message;
+}
+
+/**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
diff --git a/core/modules/views_ui/src/Tests/HandlerTest.php b/core/modules/views_ui/src/Tests/HandlerTest.php
index 6f1ed39..b2cb233 100644
--- a/core/modules/views_ui/src/Tests/HandlerTest.php
+++ b/core/modules/views_ui/src/Tests/HandlerTest.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\views\Tests\ViewTestData;
 use Drupal\views\ViewExecutable;
 
 /**
@@ -21,11 +22,22 @@
 class HandlerTest extends UITestBase {
 
   /**
+   * {@inheritdoc}
+   */
+  public static $modules = array('node_test_views');
+
+  /**
    * Views used by this test.
    *
    * @var array
    */
-  public static $testViews = array('test_view_empty', 'test_view_broken', 'node');
+  public static $testViews = array('test_view_empty', 'test_view_broken', 'node', 'test_node_view');
+
+  protected function setUp() {
+    parent::setUp();
+
+    ViewTestData::createTestViews(get_class($this), array('node_test_views'));
+  }
 
   /**
    * Overrides \Drupal\views\Tests\ViewTestBase::schemaDefinition().
@@ -208,4 +220,20 @@ 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.');
+    $this->assertEqual(1, substr_count($content, 'Content: UUID'), 'Content: UUID appears just once.');
+    $this->assertEqual(1, substr_count($content, 'Content: Revision ID'), 'Content: Revision ID appears just once.');
+  }
+
 }
