diff --git a/core/modules/block_content/src/BlockContentViewsData.php b/core/modules/block_content/src/BlockContentViewsData.php
index 1d5d46f..1328ced 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 21e1e44..3359c60 100644
--- a/core/modules/node/src/NodeViewsData.php
+++ b/core/modules/node/src/NodeViewsData.php
@@ -219,24 +219,12 @@ 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'] = array(
       'argument' => array(
         'id' => 'node_vid',
         'numeric' => TRUE,
       ),
-      'relationship' => array(
-        '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 e41efa9..56f97a4 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;
@@ -113,7 +114,8 @@ public function getViewsData() {
 
     $base_table = $this->entityType->getBaseTable() ?: $this->entityType->id();
     $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) {
@@ -134,7 +136,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();
@@ -228,6 +231,23 @@ public function getViewsData() {
           'type' => 'INNER',
         );
       }
+
+      // 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]);
@@ -336,7 +356,10 @@ 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 e6d8f9f..5d15589 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -255,6 +255,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']);
   }
 
   /**
@@ -300,6 +307,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']);
   }
 
   /**
@@ -343,6 +357,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']);
   }
 
   /**
@@ -502,6 +523,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')
     ;
@@ -728,6 +750,7 @@ public function testRevisionTableFields() {
     $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']);
@@ -749,6 +772,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 37d03b6..81d3aec 100644
--- a/core/modules/views/views.install
+++ b/core/modules/views/views.install
@@ -363,3 +363,19 @@ function views_update_8005() {
 /**
  * @} End of "addtogroup updates-8.1.0".
  */
+
+/**
+ * @addtogroup updates-8.2.0
+ * @{
+ */
+
+/**
+ * Clear views data cache.
+ */
+function views_update_8006() {
+  // Empty update function to rebuild the views data.
+}
+
+/**
+ * @} End of "addtogroup updates-8.2.0".
+ */
