diff --git a/core/modules/block_content/src/BlockContentViewsData.php b/core/modules/block_content/src/BlockContentViewsData.php
index 010ede0..c0daddb 100644
--- a/core/modules/block_content/src/BlockContentViewsData.php
+++ b/core/modules/block_content/src/BlockContentViewsData.php
@@ -34,20 +34,6 @@ public function getViewsData() {
     $data['block_content_field_revision']['table']['base']['help'] = $this->t('Block Content revision is a history of changes to block content.');
     $data['block_content_field_revision']['table']['base']['defaults']['title'] = 'info';
 
-    // @todo EntityViewsData should add these relationships by default.
-    //   https://www.drupal.org/node/2410275
-    $data['block_content_field_revision']['id']['relationship']['id'] = 'standard';
-    $data['block_content_field_revision']['id']['relationship']['base'] = 'block_content_field_data';
-    $data['block_content_field_revision']['id']['relationship']['base field'] = 'id';
-    $data['block_content_field_revision']['id']['relationship']['title'] = $this->t('Block Content');
-    $data['block_content_field_revision']['id']['relationship']['label'] = $this->t('Get the actual block content from a block content revision.');
-
-    $data['block_content_field_revision']['revision_id']['relationship']['id'] = 'standard';
-    $data['block_content_field_revision']['revision_id']['relationship']['base'] = 'block_content_field_data';
-    $data['block_content_field_revision']['revision_id']['relationship']['base field'] = 'revision_id';
-    $data['block_content_field_revision']['revision_id']['relationship']['title'] = $this->t('Block Content');
-    $data['block_content_field_revision']['revision_id']['relationship']['label'] = $this->t('Get the actual block content from a block content revision.');
-
     return $data;
   }
 
diff --git a/core/modules/node/src/NodeViewsData.php b/core/modules/node/src/NodeViewsData.php
index b5aebf4..fb9f3a2 100644
--- a/core/modules/node/src/NodeViewsData.php
+++ b/core/modules/node/src/NodeViewsData.php
@@ -219,24 +219,11 @@ public function getViewsData() {
     // @todo the NID field needs different behaviour on revision/non-revision
     //   tables. It would be neat if this could be encoded in the base field
     //   definition.
-    $data['node_field_revision']['nid']['relationship']['id'] = 'standard';
-    $data['node_field_revision']['nid']['relationship']['base'] = 'node_field_data';
-    $data['node_field_revision']['nid']['relationship']['base field'] = 'nid';
-    $data['node_field_revision']['nid']['relationship']['title'] = $this->t('Content');
-    $data['node_field_revision']['nid']['relationship']['label'] = $this->t('Get the actual content from a content revision.');
-
     $data['node_field_revision']['vid'] = [
       'argument' => [
         'id' => 'node_vid',
         'numeric' => TRUE,
       ],
-      'relationship' => [
-        'id' => 'standard',
-        'base' => 'node_field_data',
-        'base field' => 'vid',
-        'title' => $this->t('Content'),
-        'label' => $this->t('Get the actual content from a content revision.'),
-      ],
     ] + $data['node_field_revision']['vid'];
 
     $data['node_field_revision']['langcode']['help'] = $this->t('The language the original content is in.');
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 49b0af8..773f1bb 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\views;
 
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\ContentEntityType;
 use Drupal\Core\Entity\EntityHandlerInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
@@ -121,7 +122,8 @@ public function getViewsData() {
     $base_table = $this->entityType->getBaseTable() ?: $this->entityType->id();
     $views_revision_base_table = NULL;
     $revisionable = $this->entityType->isRevisionable();
-    $base_field = $this->entityType->getKey('id');
+    $entity_id_key = $this->entityType->getKey('id');
+    $base_field = $entity_id_key;
 
     $revision_table = '';
     if ($revisionable) {
@@ -142,7 +144,8 @@ public function getViewsData() {
     if ($revisionable && $translatable) {
       $revision_data_table = $this->entityType->getRevisionDataTable() ?: $this->entityType->id() . '_field_revision';
     }
-    $revision_field = $this->entityType->getKey('revision');
+    $entity_revision_key = $this->entityType->getKey('revision');
+    $revision_field = $entity_revision_key;
 
     // Setup base information of the views data.
     $data[$base_table]['table']['group'] = $this->entityType->getLabel();
@@ -200,8 +203,9 @@ public function getViewsData() {
       $data[$base_table]['table']['join'][$data_table] = [
         'left_field' => $base_field,
         'field' => $base_field,
-        'type' => 'INNER'
+        'type' => 'INNER',
       ];
+
       $data[$data_table]['table']['group'] = $this->entityType->getLabel();
       $data[$data_table]['table']['provider'] = $this->entityType->getProvider();
       $data[$data_table]['table']['entity revision'] = FALSE;
@@ -243,6 +247,22 @@ public function getViewsData() {
         'help' => $this->t('Restrict the view to only revisions that are the latest revision of their entity.'),
         'filter' => ['id' => 'latest_revision'],
       ];
+      // Add a relationship from the revision table back to the main table.
+      $entity_type_label = $this->entityType->getLabel();
+      $data[$views_revision_base_table][$entity_id_key]['relationship'] = [
+        'id' => 'standard',
+        'base' => $views_base_table,
+        'base field' => $entity_id_key,
+        'title' => $entity_type_label,
+        'help' => $this->t('Get the actual @label from a @label revision', ['@label' => $entity_type_label]),
+      ];
+      $data[$views_revision_base_table][$entity_revision_key]['relationship'] = [
+        'id' => 'standard',
+        'base' => $views_base_table,
+        'base field' => $entity_revision_key,
+        'title' => $this->t('@label revision', ['@label' => $entity_type_label]),
+        'help' => $this->t('Get the actual @label from a @label revision', ['@label' => $entity_type_label]),
+      ];
     }
 
     $this->addEntityLinks($data[$base_table]);
@@ -382,7 +402,11 @@ protected function mapFieldDefinition($table, $field_name, FieldDefinitionInterf
     $first = TRUE;
     foreach ($field_column_mapping as $field_column_name => $schema_field_name) {
       $views_field_name = ($multiple) ? $field_name . '__' . $field_column_name : $field_name;
-      $table_data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition);
+
+      // The fields might be defined before the actual table.
+      $table_data = $table_data ?: [];
+      $table_data += [$views_field_name => []];
+      $table_data[$views_field_name] = NestedArray::mergeDeep($table_data[$views_field_name], $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition));
 
       $table_data[$views_field_name]['entity field'] = $field_name;
       $first = FALSE;
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index eefc541..d6204c7 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -266,6 +266,13 @@ public function testRevisionTableWithoutDataTable() {
     $this->assertCount(1, $revision_data['table']['join']);
     $this->assertEquals(['entity_test' => ['left_field' => 'revision_id', 'field' => 'revision_id', 'type' => 'INNER']], $revision_data['table']['join']);
     $this->assertFalse(isset($data['data_table']));
+
+    $this->assertTrue(!empty($revision_data['id']['relationship']));
+    $this->assertEquals('entity_test', $revision_data['id']['relationship']['base']);
+    $this->assertEquals('id', $revision_data['id']['relationship']['base field']);
+    $this->assertTrue(!empty($revision_data['revision_id']['relationship']));
+    $this->assertEquals('entity_test', $revision_data['revision_id']['relationship']['base']);
+    $this->assertEquals('revision_id', $revision_data['revision_id']['relationship']['base field']);
   }
 
   /**
@@ -315,6 +322,13 @@ public function testRevisionTableWithRevisionDataTableAndDataTable() {
     ], $revision_base_data['table']['join']);
 
     $this->assertFalse(isset($data['data_table']));
+
+    $this->assertTrue(!empty($revision_field_data['id']['relationship']));
+    $this->assertEquals('entity_test_mul_property_data', $revision_field_data['id']['relationship']['base']);
+    $this->assertEquals('id', $revision_field_data['id']['relationship']['base field']);
+    $this->assertTrue(!empty($revision_field_data['revision_id']['relationship']));
+    $this->assertEquals('entity_test_mul_property_data', $revision_field_data['revision_id']['relationship']['base']);
+    $this->assertEquals('revision_id', $revision_field_data['revision_id']['relationship']['base field']);
   }
 
   /**
@@ -362,6 +376,13 @@ public function testRevisionTableWithRevisionDataTable() {
       ],
     ], $revision_base_data['table']['join']);
     $this->assertFalse(isset($data['data_table']));
+
+    $this->assertTrue(!empty($revision_field_data['id']['relationship']));
+    $this->assertEquals('entity_test_mulrev_field_data', $revision_field_data['id']['relationship']['base']);
+    $this->assertEquals('id', $revision_field_data['id']['relationship']['base field']);
+    $this->assertTrue(!empty($revision_field_data['revision_id']['relationship']));
+    $this->assertEquals('entity_test_mulrev_field_data', $revision_field_data['revision_id']['relationship']['base']);
+    $this->assertEquals('revision_id', $revision_field_data['revision_id']['relationship']['base field']);
   }
 
   /**
@@ -555,6 +576,7 @@ public function testDataTableFields() {
     $entity_type = $this->baseEntityType
       ->set('data_table', 'entity_test_mul_property_data')
       ->set('base_table', 'entity_test_mul')
+      ->set('translatable', TRUE)
       ->set('id', 'entity_test_mul')
       ->setKey('bundle', 'type')
     ;
@@ -702,6 +724,15 @@ public function testDataTableFields() {
         ],
       ],
     ], $data['entity_test_mul__string']['table']['join']['entity_test_mul']);
+    $this->assertEquals([
+      'left_field' => 'id',
+      'field' => 'entity_id',
+      'extra' => [[
+        'field' => 'deleted',
+        'value' => 0,
+        'numeric' => TRUE,
+      ]],
+    ], $data['entity_test_mul__string']['table']['join']['entity_test_mul_property_data']);
   }
 
   /**
@@ -856,6 +887,13 @@ public function testRevisionTableFields() {
     $this->assertNumericField($data['entity_test_mulrev_property_revision']['id']);
     $this->assertField($data['entity_test_mulrev_property_revision']['id'], 'id');
 
+    $this->assertTrue(!empty($data['entity_test_mulrev_property_revision']['id']['relationship']));
+    $this->assertEquals('entity_test_mulrev_property_data', $data['entity_test_mulrev_property_revision']['id']['relationship']['base']);
+    $this->assertEquals('id', $data['entity_test_mulrev_property_revision']['id']['relationship']['base field']);
+    $this->assertTrue(!empty($data['entity_test_mulrev_property_revision']['revision_id']['relationship']));
+    $this->assertEquals('entity_test_mulrev_property_data', $data['entity_test_mulrev_property_revision']['revision_id']['relationship']['base']);
+    $this->assertEquals('revision_id', $data['entity_test_mulrev_property_revision']['revision_id']['relationship']['base field']);
+
     $this->assertLanguageField($data['entity_test_mulrev_property_revision']['langcode']);
     $this->assertField($data['entity_test_mulrev_property_revision']['langcode'], 'langcode');
     $this->assertEquals('Translation language', $data['entity_test_mulrev_property_revision']['langcode']['title']);
diff --git a/core/modules/views/views.install b/core/modules/views/views.install
index f542416..20fb07d 100644
--- a/core/modules/views/views.install
+++ b/core/modules/views/views.install
@@ -370,3 +370,20 @@ function views_update_8200() {
 function views_update_8201() {
   // Empty update to cause a cache rebuild so that config schema get refreshed.
 }
+
+
+/**
+ * @addtogroup updates-8.3.0
+ * @{
+ */
+
+/**
+ * Clear views data cache.
+ */
+function views_update_8301() {
+  // Empty update function to rebuild the views data.
+}
+
+/**
+ * @} End of "addtogroup updates-8.3.0".
+ */
