diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php
index 6d8d619..26c92b7 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -8,6 +8,13 @@
 class ContentEntityType extends EntityType implements ContentEntityTypeInterface {
 
   /**
+   * An array of entity revision metadata keys.
+   *
+   * @var array
+   */
+  protected $revision_metadata_keys = [];
+
+  /**
    * {@inheritdoc}
    */
   public function __construct($definition) {
@@ -41,4 +48,41 @@ protected function checkStorageClass($class) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getRevisionMetadataKeys($include_backwards_compatibility_field_names = TRUE) {
+    // Provide backwards compatibility in case the revision metadata keys are
+    // not defined in the entity annotation.
+    if (!$this->revision_metadata_keys && $include_backwards_compatibility_field_names) {
+      $base_fields = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($this->id());
+      if ((isset($base_fields['revision_uid']) && $revision_user = 'revision_uid') || (isset($base_fields['revision_user']) && $revision_user = 'revision_user')) {
+        $this->revision_metadata_keys['revision_user'] = $revision_user;
+      }
+      if ((isset($base_fields['revision_timestamp']) && $revision_timestamp = 'revision_timestamp') || (isset($base_fields['revision_created'])) && $revision_timestamp = 'revision_created') {
+        $this->revision_metadata_keys['revision_created'] = $revision_timestamp;
+      }
+      if ((isset($base_fields['revision_log']) && $revision_log = 'revision_log') || (isset($base_fields['revision_log_message']) && $revision_log = 'revision_log_message')) {
+        $this->revision_metadata_keys['revision_log_message'] = $revision_log;
+      }
+    }
+    return $this->revision_metadata_keys;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRevisionMetadataKey($key) {
+    $keys = $this->getRevisionMetadataKeys();
+    return isset($keys[$key]) ? $keys[$key] : FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasRevisionMetadataKey($key) {
+    $keys = $this->getRevisionMetadataKeys();
+    return isset($keys[$key]);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
index f9ef160..4c9e890 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
@@ -6,4 +6,50 @@
  * Provides an interface for a content entity type and its metadata.
  */
 interface ContentEntityTypeInterface extends EntityTypeInterface {
+
+  /**
+   * Gets an array of entity revision metadata keys.
+   *
+   * @param bool $include_backwards_compatibility_field_names
+   *   (optional and deprecated) Whether to provide the revision keys on a
+   *   best-effort basis by looking at the base fields defined by the entity
+   *   type. Note that this parameter will be removed in Drupal 9.0.0. Defaults
+   *   to TRUE.
+   *
+   * @return array
+   *   An array describing how the Field API can extract revision metadata
+   *   information of this entity type:
+   *   - revision_log_message: The name of the property that contains description
+   *     of the changes that were made in the current revision.
+   *   - revision_user: The name of the property that contains the user ID of
+   *     the author of the current revision.
+   *   - revision_created: The name of the property that contains the timestamp
+   *     of the current revision.
+   */
+  public function getRevisionMetadataKeys($include_backwards_compatibility_field_names = TRUE);
+
+  /**
+   * Gets a specific entity revision metadata key.
+   *
+   * @param string $key
+   *   The name of the entity revision metadata key to return.
+   *
+   * @return string|bool
+   *   The entity revision metadata key, or FALSE if it does not exist.
+   *
+   * @see self::getRevisionMetadataKeys()
+   */
+  public function getRevisionMetadataKey($key);
+
+  /**
+   * Indicates if a given entity revision metadata key exists.
+   *
+   * @param string $key
+   *   The name of the entity revision metadata key to check.
+   *
+   * @return bool
+   *   TRUE if a given entity revision metadata key exists, FALSE otherwise.
+   */
+  public function hasRevisionMetadataKey($key);
+
 }
diff --git a/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php b/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
index 7392858..7dd0b4e 100644
--- a/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
+++ b/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
@@ -25,18 +25,18 @@
    * @see \Drupal\Core\Entity\FieldableEntityInterface::baseFieldDefinitions()
    */
   public static function revisionLogBaseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['revision_created'] = BaseFieldDefinition::create('created')
+    $fields[static::getRevisionMetadataKey($entity_type, 'revision_created')] = BaseFieldDefinition::create('created')
       ->setLabel(t('Revision create time'))
       ->setDescription(t('The time that the current revision was created.'))
       ->setRevisionable(TRUE);
 
-    $fields['revision_user'] = BaseFieldDefinition::create('entity_reference')
+    $fields[static::getRevisionMetadataKey($entity_type, 'revision_user')] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Revision user'))
       ->setDescription(t('The user ID of the author of the current revision.'))
       ->setSetting('target_type', 'user')
       ->setRevisionable(TRUE);
 
-    $fields['revision_log_message'] = BaseFieldDefinition::create('string_long')
+    $fields[static::getRevisionMetadataKey($entity_type, 'revision_log_message')] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Revision log message'))
       ->setDescription(t('Briefly describe the changes you have made.'))
       ->setRevisionable(TRUE)
@@ -56,14 +56,14 @@ public static function revisionLogBaseFieldDefinitions(EntityTypeInterface $enti
    * Implements \Drupal\Core\Entity\RevisionLogInterface::getRevisionCreationTime().
    */
   public function getRevisionCreationTime() {
-    return $this->revision_created->value;
+    return $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_created')}->value;
   }
 
   /**
    * Implements \Drupal\Core\Entity\RevisionLogInterface::setRevisionCreationTime().
    */
   public function setRevisionCreationTime($timestamp) {
-    $this->revision_created->value = $timestamp;
+    $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_created')}->value = $timestamp;
     return $this;
   }
 
@@ -71,14 +71,14 @@ public function setRevisionCreationTime($timestamp) {
    * Implements \Drupal\Core\Entity\RevisionLogInterface::getRevisionUser().
    */
   public function getRevisionUser() {
-    return $this->revision_user->entity;
+    return $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_user')}->entity;
   }
 
   /**
    * Implements \Drupal\Core\Entity\RevisionLogInterface::setRevisionUser().
    */
   public function setRevisionUser(UserInterface $account) {
-    $this->revision_user->entity = $account;
+    $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_user')}->entity = $account;
     return $this;
   }
 
@@ -86,14 +86,14 @@ public function setRevisionUser(UserInterface $account) {
    * Implements \Drupal\Core\Entity\RevisionLogInterface::getRevisionUserId().
    */
   public function getRevisionUserId() {
-    return $this->revision_user->target_id;
+    return $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_user')}->target_id;
   }
 
   /**
    * Implements \Drupal\Core\Entity\RevisionLogInterface::setRevisionUserId().
    */
   public function setRevisionUserId($user_id) {
-    $this->revision_user->target_id = $user_id;
+    $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_user')}->target_id = $user_id;
     return $this;
   }
 
@@ -101,15 +101,38 @@ public function setRevisionUserId($user_id) {
    * Implements \Drupal\Core\Entity\RevisionLogInterface::getRevisionLogMessage().
    */
   public function getRevisionLogMessage() {
-    return $this->revision_log_message->value;
+    return $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_log_message')}->value;
   }
 
   /**
    * Implements \Drupal\Core\Entity\RevisionLogInterface::setRevisionLogMessage().
    */
   public function setRevisionLogMessage($revision_log_message) {
-    $this->revision_log_message->value = $revision_log_message;
+    $this->{static::getRevisionMetadataKey($this->getEntityType(), 'revision_log_message')}->value = $revision_log_message;
     return $this;
   }
 
+  /**
+   * Gets the name of a revision metadata field.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   A content entity type definition.
+   * @param string $key
+   *   The revision metadata key to get, must be one of 'revision_created',
+   *   'revision_user' or 'revision_log_message'.
+   *
+   * @return string
+   *   The name of the field for the specified $key.
+   */
+  protected static function getRevisionMetadataKey(EntityTypeInterface $entity_type, $key) {
+    /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */
+    $revision_metadata_keys = $entity_type->getRevisionMetadataKeys(FALSE) + [
+      'revision_created' => 'revision_created',
+      'revision_user' => 'revision_user',
+      'revision_log_message' => 'revision_log_message',
+    ];
+
+    return $revision_metadata_keys[$key];
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index 0854220..a6ac273 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -294,17 +294,11 @@ public function getTableMapping(array $storage_definitions = NULL) {
       // Make sure the key fields come first in the list of fields.
       $all_fields = array_merge($key_fields, array_diff($all_fields, $key_fields));
 
-      // Nodes have all three of these fields, while custom blocks only have
-      // log.
-      // @todo Provide automatic definitions for revision metadata fields in
-      //   https://www.drupal.org/node/2248983.
-      $revision_metadata_fields = array_intersect(array(
-        'revision_timestamp',
-        'revision_uid',
-        'revision_log',
-      ), $all_fields);
-
+      // If the entity is revisionable, gather the fields that need to be put
+      // in the revision table.
       $revisionable = $this->entityType->isRevisionable();
+      $revision_metadata_fields = $revisionable ? array_values($this->entityType->getRevisionMetadataKeys()) : [];
+
       $translatable = $this->entityType->isTranslatable();
       if (!$revisionable && !$translatable) {
         // The base layout stores all the base field values in the base table.
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index 13af342..277f82f 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -50,6 +50,11 @@
  *     "langcode" = "langcode",
  *     "uuid" = "uuid"
  *   },
+ *   revision_metadata_keys = {
+ *     "revision_user" = "revision_user",
+ *     "revision_created" = "revision_created",
+ *     "revision_log_message" = "revision_log"
+ *   },
  *   bundle_entity_type = "block_content_type",
  *   field_ui_base_route = "entity.block_content_type.edit_form",
  *   render_cache = FALSE,
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index d4e4715..aadf508 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -58,6 +58,11 @@
  *     "status" = "status",
  *     "uid" = "uid",
  *   },
+ *   revision_metadata_keys = {
+ *     "revision_user" = "revision_uid",
+ *     "revision_created" = "revision_timestamp",
+ *     "revision_log_message" = "revision_log"
+ *   },
  *   bundle_entity_type = "node_type",
  *   field_ui_base_route = "entity.node_type.edit_form",
  *   common_reference_target = TRUE,
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 6dc2663..045a026 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -12,6 +12,7 @@
 use Drupal\Core\Path\AliasStorage;
 use Drupal\Core\Url;
 use Drupal\Core\Database\Database;
+use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\DrupalKernel;
 use Drupal\Core\Site\Settings;
 use Drupal\Core\StreamWrapper\PrivateStream;
@@ -1794,3 +1795,105 @@ function system_update_8203() {
     ->set('logging', 1)
     ->save(TRUE);
 }
+
+/**
+ * @addtogroup updates-8.3.0
+ * @{
+ */
+
+/**
+ * Move revision metadata fields to the revision table.
+ */
+function __system_update_8300(&$sandbox) {
+  // Due to the fields from RevisionLogEntityTrait not being explicitly
+  // mentioned in the storage they might have been installed wrongly in the base
+  // table for revisionable untranslatable entities and in the data and revision
+  // data tables for revisionable and translatable entities.
+  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
+  $database = \Drupal::database();
+  $database_schema = $database->schema();
+
+  foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type_id => $entity_type) {
+    if (is_subclass_of($entity_type->getClass(), FieldableEntityInterface::class) && $entity_type->isRevisionable()) {
+      /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */
+      $base_fields = $base_fields = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($entity_type_id);
+      $revision_metadata_fields = $entity_type->getRevisionMetadataKeys();
+      $fields_to_update = array_intersect_key($base_fields, array_flip($revision_metadata_fields));
+
+      if (!empty($fields_to_update)) {
+        // Initialize the entity table names.
+        // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout()
+        $base_table = $entity_type->getBaseTable() ?: $entity_type_id;
+        $data_table = $entity_type->getDataTable() ?: $entity_type_id . '_field_data';
+        $revision_table = $entity_type->getRevisionTable() ?: $entity_type_id . '_revision';
+        $revision_data_table = $entity_type->getRevisionDataTable() ?: $entity_type_id . '_field_revision';
+        $revision_field = $entity_type->getKey('revision');
+
+        // Collect the revision IDs for an entity type.
+        $revisions = array_keys(\Drupal::entityQuery($entity_type_id)
+          ->allRevisions()
+          ->execute());
+
+        foreach ($fields_to_update as $revision_metadata_field_name => $definition) {
+          // If the revision metadata field is present in the data and the
+          // revision data table, install its definition again with the updated
+          // storage code in order for the field to be installed in the
+          // revision table. Afterwards, copy over the field values and remove
+          // the field from the data and the revision data tables.
+          if ($database_schema->fieldExists($base_table, $revision_metadata_field_name) || ($database_schema->fieldExists($data_table, $revision_metadata_field_name) && $database_schema->fieldExists($revision_data_table, $revision_metadata_field_name))) {
+            // Install the field in the revision table.
+            $entity_definition_update_manager->installFieldStorageDefinition($revision_metadata_field_name, $entity_type_id, $entity_type->getProvider(), $definition);
+
+            // No data needs to be migrated if the entity type is not
+            // translatable.
+            if ($entity_type->isTranslatable()) {
+              if (!isset($sandbox['progress'])) {
+                // This must be the first run. Initialize the sandbox.
+                $sandbox['progress'] = 0;
+                $sandbox['current'] = 0;
+                $sandbox['max'] = count($revisions);
+              }
+
+              // Apply the field value from the revision data table to the
+              // revision table.
+              $current = $sandbox['current'];
+              for ($i = $current; ($i < $current + 100) && ($i < $sandbox['max']); $i++) {
+                $rev_id = $revisions[$i];
+                $field_value = $database->select($revision_data_table, 't')
+                  ->fields('t', [$revision_metadata_field_name])
+                  ->condition($revision_field, $rev_id)
+                  ->execute()
+                  ->fetchField();
+                $database->update($revision_table)
+                  ->condition($revision_field, $rev_id)
+                  ->fields([$revision_metadata_field_name => $field_value])
+                  ->execute();
+
+                $sandbox['current']++;
+              }
+            }
+
+            $sandbox['#finished'] = $entity_type->isTranslatable() ? $sandbox['current'] == $sandbox['max'] : TRUE;
+
+            if ($sandbox['#finished']) {
+              // Drop the field from the base, data and revision data tables.
+              if ($entity_type->isTranslatable()) {
+                $database_schema->dropField($data_table, $revision_metadata_field_name);
+                $database_schema->dropField($revision_data_table, $revision_metadata_field_name);
+              }
+              else {
+                $database_schema->dropField($base_table, $revision_metadata_field_name);
+              }
+
+              unset($sandbox['progress'], $sandbox['#finished']);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-8.3.0".
+ */
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestWithRevisionLog.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestWithRevisionLog.php
index 4f4f4f1..d9b8274 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestWithRevisionLog.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestWithRevisionLog.php
@@ -2,7 +2,9 @@
 
 namespace Drupal\entity_test\Entity;
 
+use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\RevisionableContentEntityBase;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Defines the test entity class.
@@ -11,13 +13,13 @@
  *   id = "entity_test_revlog",
  *   label = @Translation("Test entity - revisions log"),
  *   handlers = {
- *     "access" = "Drupal\entity_test\EntityTestAccessControlHandler",
+ *     "list_builder" = "Drupal\entity_test\EntityTestListBuilder",
  *     "view_builder" = "Drupal\entity_test\EntityTestViewBuilder",
+ *     "access" = "Drupal\entity_test\EntityTestAccessControlHandler",
  *     "form" = {
  *       "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",
  *     "route_provider" = {
@@ -35,6 +37,11 @@
  *     "label" = "name",
  *     "langcode" = "langcode",
  *   },
+ *   revision_metadata_keys = {
+ *     "revision_user" = "revision_user",
+ *     "revision_created" = "revision_created",
+ *     "revision_log_message" = "revision_log_message"
+ *   },
  *   links = {
  *     "canonical" = "/entity_test_revlog/manage/{entity_test_revlog}",
  *     "delete-form" = "/entity_test/delete/entity_test_revlog/{entity_test_revlog}",
@@ -45,4 +52,29 @@
  */
 class EntityTestWithRevisionLog extends RevisionableContentEntityBase {
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
+    $fields = parent::baseFieldDefinitions($entity_type);
+
+    $fields['name'] = BaseFieldDefinition::create('string')
+      ->setLabel(t('Name'))
+      ->setDescription(t('The name of the test entity.'))
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE)
+      ->setSetting('max_length', 32)
+      ->setDisplayOptions('view', array(
+        'label' => 'hidden',
+        'type' => 'string',
+        'weight' => -5,
+      ))
+      ->setDisplayOptions('form', array(
+        'type' => 'string_textfield',
+        'weight' => -5,
+      ));
+
+    return $fields;
+  }
+
 }
diff --git a/core/modules/views/src/Entity/View.php b/core/modules/views/src/Entity/View.php
index 1e9fac1..e7ceb38 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\views\Views;
 use Drupal\views\ViewEntityInterface;
@@ -290,10 +291,35 @@ public function calculateDependencies() {
   public function preSave(EntityStorageInterface $storage) {
     parent::preSave($storage);
 
+    $displays = $this->get('display');
+
+    // Fix wrong table names for entity revision metadata fields.
+//    foreach ($displays as $display => &$display_data) {
+//      if (isset($display_data['display_options']['fields'])) {
+//        foreach ($display_data['display_options']['fields'] as $property_name => &$property_data) {
+//          if (isset($property_data['entity_type']) && isset($property_data['field']) && isset($property_data['table'])) {
+//            $entity_type = $this->entityTypeManager()->getDefinition($property_data['entity_type']);
+//            // We only need to update the table name for revisionable and
+//            // translatable entity types, otherwise the view is already using
+//            // the correct table.
+//            if (is_subclass_of($entity_type->getClass(), FieldableEntityInterface::class) && $entity_type->isRevisionable() && $entity_type->isTranslatable()) {
+//              $revision_metadata_fields = $entity_type->getRevisionMetadataKeys();
+//              $revision_table = $entity_type->getRevisionTable();
+//
+//              // Check if this is a revision metadata field and if it uses the
+//              // wrong table.
+//              if (in_array($property_data['field'], array_keys($revision_metadata_fields)) && $property_data['table'] != $revision_table) {
+//                $property_data['table'] = $revision_table;
+//              }
+//            }
+//          }
+//        }
+//      }
+//    }
+
     // Sort the displays.
-    $display = $this->get('display');
-    ksort($display);
-    $this->set('display', array('default' => $display['default']) + $display);
+    ksort($displays);
+    $this->set('display', array('default' => $displays['default']) + $displays);
 
     // @todo Check whether isSyncing is needed.
     if (!$this->isSyncing()) {
diff --git a/core/modules/views/views.post_update.php b/core/modules/views/views.post_update.php
index a4da940..bb04357 100644
--- a/core/modules/views/views.post_update.php
+++ b/core/modules/views/views.post_update.php
@@ -239,3 +239,24 @@ function views_post_update_boolean_filter_values() {
 /**
  * @} End of "addtogroup updates-8.2.x".
  */
+
+/**
+ * @addtogroup updates-8.3.x
+ * @{
+ */
+
+/**
+ * Fix table names for revision matadata fields.
+ */
+function views_post_update_revision_metadata_fields() {
+  // The table names are fixed automatically in
+  // \Drupal\views\Entity\View::preSave(), so we just need to re-save all views.
+  $views = View::loadMultiple();
+  array_walk($views, function(View $view) {
+    $view->save();
+  });
+}
+
+/**
+ * @} End of "addtogroup updates-8.3.x".
+ */
diff --git a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
index 56b4b00..153691f 100644
--- a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
@@ -533,6 +533,9 @@ public function testGetTableMappingRevisionable(array $entity_keys) {
         array('bundle', $entity_keys['bundle']),
         array('revision', $entity_keys['revision']),
       )));
+    $this->entityType->expects($this->any())
+      ->method('getRevisionMetadataKeys')
+      ->will($this->returnValue([]));
 
     $this->setUpEntityStorage();
 
@@ -573,13 +576,13 @@ public function testGetTableMappingRevisionableWithFields(array $entity_keys) {
     // PHPUnit does not allow for multiple data providers.
     $test_cases = array(
       array(),
-      array('revision_timestamp'),
-      array('revision_uid'),
-      array('revision_log'),
-      array('revision_timestamp', 'revision_uid'),
-      array('revision_timestamp', 'revision_log'),
-      array('revision_uid', 'revision_log'),
-      array('revision_timestamp', 'revision_uid', 'revision_log'),
+      array('revision_created' => 'revision_timestamp'),
+      array('revision_user' => 'revision_uid'),
+      array('revision_log_message' => 'revision_log'),
+      array('revision_created' => 'revision_timestamp', 'revision_user' => 'revision_uid'),
+      array('revision_created' => 'revision_timestamp', 'revision_log_message' => 'revision_log'),
+      array('revision_user' => 'revision_uid', 'revision_log_message' => 'revision_log'),
+      array('revision_created' => 'revision_timestamp', 'revision_user' => 'revision_uid', 'revision_log_message' => 'revision_log'),
     );
     foreach ($test_cases as $revision_metadata_field_names) {
       $this->setUp();
@@ -590,7 +593,7 @@ public function testGetTableMappingRevisionableWithFields(array $entity_keys) {
 
       $revisionable_field_names = array('description', 'owner');
       $field_names = array_merge($field_names, $revisionable_field_names);
-      $this->fieldDefinitions += $this->mockFieldDefinitions(array_merge($revisionable_field_names, $revision_metadata_field_names), array('isRevisionable' => TRUE));
+      $this->fieldDefinitions += $this->mockFieldDefinitions(array_merge($revisionable_field_names, array_values($revision_metadata_field_names)), array('isRevisionable' => TRUE));
 
       $this->entityType->expects($this->exactly(2))
         ->method('isRevisionable')
@@ -604,6 +607,10 @@ public function testGetTableMappingRevisionableWithFields(array $entity_keys) {
           array('revision', $entity_keys['revision']),
         )));
 
+      $this->entityType->expects($this->any())
+        ->method('getRevisionMetadataKeys')
+        ->will($this->returnValue($revision_metadata_field_names));
+
       $this->setUpEntityStorage();
 
       $mapping = $this->entityStorage->getTableMapping();
@@ -615,7 +622,7 @@ public function testGetTableMappingRevisionableWithFields(array $entity_keys) {
       $expected = array_merge(
         array($entity_keys['id'], $entity_keys['revision']),
         $revisionable_field_names,
-        $revision_metadata_field_names
+        array_values($revision_metadata_field_names)
       );
       $this->assertEquals($expected, $mapping->getFieldNames('entity_test_revision'));
 
@@ -760,6 +767,11 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys)
       'uuid' => $entity_keys['uuid'],
       'langcode' => 'langcode',
     );
+    $revision_metadata_keys = array(
+      'revision_created' => 'revision_timestamp',
+      'revision_user' => 'revision_uid',
+      'revision_log_message' => 'revision_log'
+    );
 
     $this->entityType->expects($this->atLeastOnce())
       ->method('isRevisionable')
@@ -779,6 +791,9 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys)
         array('revision', $entity_keys['revision']),
         array('langcode', $entity_keys['langcode']),
       )));
+    $this->entityType->expects($this->any())
+      ->method('getRevisionMetadataKeys')
+      ->will($this->returnValue($revision_metadata_keys));
 
     $this->setUpEntityStorage();
 
@@ -809,6 +824,7 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys)
       $entity_keys['revision'],
       $entity_keys['langcode'],
     )));
+    $expected = array_merge($expected, array_values($revision_metadata_keys));
     $actual = $mapping->getFieldNames('entity_test_revision');
     $this->assertEquals($expected, $actual);
     // The UUID is not stored on the data table.
@@ -864,13 +880,13 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent
     // PHPUnit does not allow for multiple data providers.
     $test_cases = array(
       array(),
-      array('revision_timestamp'),
-      array('revision_uid'),
-      array('revision_log'),
-      array('revision_timestamp', 'revision_uid'),
-      array('revision_timestamp', 'revision_log'),
-      array('revision_uid', 'revision_log'),
-      array('revision_timestamp', 'revision_uid', 'revision_log'),
+      array('revision_created' => 'revision_timestamp'),
+      array('revision_user' => 'revision_uid'),
+      array('revision_log_message' => 'revision_log'),
+      array('revision_created' => 'revision_timestamp', 'revision_user' => 'revision_uid'),
+      array('revision_created' => 'revision_timestamp', 'revision_log_message' => 'revision_log'),
+      array('revision_user' => 'revision_uid', 'revision_log_message' => 'revision_log'),
+      array('revision_created' => 'revision_timestamp', 'revision_user' => 'revision_uid', 'revision_log_message' => 'revision_log'),
     );
     foreach ($test_cases as $revision_metadata_field_names) {
       $this->setUp();
@@ -880,7 +896,7 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent
       $this->fieldDefinitions = $this->mockFieldDefinitions($field_names);
 
       $revisionable_field_names = array('description', 'owner');
-      $this->fieldDefinitions += $this->mockFieldDefinitions(array_merge($revisionable_field_names, $revision_metadata_field_names), array('isRevisionable' => TRUE));
+      $this->fieldDefinitions += $this->mockFieldDefinitions(array_merge($revisionable_field_names, array_values($revision_metadata_field_names)), array('isRevisionable' => TRUE));
 
       $this->entityType->expects($this->atLeastOnce())
         ->method('isRevisionable')
@@ -900,6 +916,9 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent
           array('revision', $entity_keys['revision']),
           array('langcode', $entity_keys['langcode']),
         )));
+      $this->entityType->expects($this->any())
+        ->method('getRevisionMetadataKeys')
+        ->will($this->returnValue($revision_metadata_field_names));
 
       $this->setUpEntityStorage();
 
@@ -937,7 +956,7 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent
         $entity_keys['id'],
         $entity_keys['revision'],
         $entity_keys['langcode'],
-      )), $revision_metadata_field_names);
+      )), array_values($revision_metadata_field_names));
       $actual = $mapping->getFieldNames('entity_test_revision');
       $this->assertEquals($expected, $actual);
       // The UUID is not stored on the data table.
