diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 7f36c11a67..aac711a322 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -375,6 +375,13 @@ protected function doSave($id, EntityInterface $entity) {
     }
 
     $this->populateAffectedRevisionTranslations($entity);
+
+    // Populate the "revision_default" flag.
+    if ($entity instanceof RevisionLogInterface) {
+      $revision_default_key = $this->entityType->getRevisionMetadataKey('revision_default');
+      $entity->set($revision_default_key, $entity->isDefaultRevision());
+    }
+
     $this->doSaveFieldItems($entity);
 
     return $return;
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php
index 0e26c3bb51..9381424723 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -54,19 +54,25 @@ protected function checkStorageClass($class) {
   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')) {
-        @trigger_error('The revision_user revision metadata key is not set.', E_USER_DEPRECATED);
-        $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') {
-        @trigger_error('The revision_created revision metadata key is not set.', E_USER_DEPRECATED);
-        $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')) {
-        @trigger_error('The revision_log_message revision metadata key is not set.', E_USER_DEPRECATED);
-        $this->revision_metadata_keys['revision_log_message'] = $revision_log;
+    if ($include_backwards_compatibility_field_names) {
+      $required_keys = [
+        'revision_user' => 'revision_uid',
+        'revision_created' => 'revision_timestamp',
+        'revision_log_message' => 'revision_log',
+        'revision_default' => 'revision_default',
+      ];
+      $missing_keys = array_diff_key($required_keys, $this->revision_metadata_keys);
+      if ($missing_keys) {
+        $base_fields = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($this->id());
+        foreach ($missing_keys as $key => $field_name) {
+          if (isset($base_fields[$field_name]) || (isset($base_fields[$key]) && $field_name = $key)) {
+            @trigger_error("The $key revision metadata key is not set.", E_USER_DEPRECATED);
+            $this->revision_metadata_keys[$key] = $field_name;
+          }
+          else {
+            $this->revision_metadata_keys[$key] = NULL;
+          }
+        }
       }
     }
     return $this->revision_metadata_keys;
diff --git a/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php b/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
index f935a8b510..20463d9caf 100644
--- a/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
+++ b/core/lib/Drupal/Core/Entity/RevisionLogEntityTrait.php
@@ -3,6 +3,7 @@
 namespace Drupal\Core\Entity;
 
 use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\user\UserInterface;
 
 /**
@@ -49,6 +50,12 @@ public static function revisionLogBaseFieldDefinitions(EntityTypeInterface $enti
         ],
       ]);
 
+    $fields[static::getRevisionMetadataKey($entity_type, 'revision_default')] = BaseFieldDefinition::create('boolean')
+      ->setLabel(new TranslatableMarkup('Default revision'))
+      ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.'))
+      ->setTranslatable(FALSE)
+      ->setRevisionable(TRUE);
+
     return $fields;
   }
 
@@ -133,9 +140,31 @@ protected static function getRevisionMetadataKey(EntityTypeInterface $entity_typ
       'revision_created' => 'revision_created',
       'revision_user' => 'revision_user',
       'revision_log_message' => 'revision_log_message',
+      'revision_default' => 'revision_default',
     ];
 
     return $revision_metadata_keys[$key];
   }
 
+  /**
+   * Implements \Drupal\Core\Entity\RevisionLogInterface::wasDefaultRevision().
+   */
+  public function wasDefaultRevision() {
+    /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */
+    $entity_type = $this->getEntityType();
+    if (!$entity_type->isRevisionable()) {
+      throw new \LogicException("Entity type {$this->getEntityTypeId()} does not support revisions.");
+    }
+
+    $revision_default_key = $entity_type->getRevisionMetadataKey('revision_default');
+    $value = $this->isNew() ? $this->isDefaultRevision() : $this->get($revision_default_key)->value;
+
+    if (isset($value)) {
+      return (bool) $value;
+    }
+    else {
+      throw new \LogicException("Missing data for the \"{$revision_default_key}\" field on the entity {$this->getEntityTypeId()}:{$this->id()}.");
+    }
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/RevisionLogInterface.php b/core/lib/Drupal/Core/Entity/RevisionLogInterface.php
index becf97c162..806c300072 100644
--- a/core/lib/Drupal/Core/Entity/RevisionLogInterface.php
+++ b/core/lib/Drupal/Core/Entity/RevisionLogInterface.php
@@ -81,4 +81,16 @@ public function getRevisionLogMessage();
    */
   public function setRevisionLogMessage($revision_log_message);
 
+  /**
+   * Checks whether the entity object was a default revision when it was saved.
+   *
+   * @return bool
+   *   TRUE if the entity object was a revision, FALSE otherwise.
+   *
+   * @throws \LogicException
+   *   If the entity type is not revisionable or the default revision data is
+   *   missing.
+   */
+  public function wasDefaultRevision();
+
 }
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index 3c8858ff88..eb10f97108 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -56,7 +56,8 @@
  *   revision_metadata_keys = {
  *     "revision_user" = "revision_user",
  *     "revision_created" = "revision_created",
- *     "revision_log_message" = "revision_log"
+ *     "revision_log_message" = "revision_log",
+ *     "revision_default" = "revision_default",
  *   },
  *   bundle_entity_type = "block_content_type",
  *   field_ui_base_route = "entity.block_content_type.edit_form",
diff --git a/core/modules/media/src/Entity/Media.php b/core/modules/media/src/Entity/Media.php
index dc8e0dcf0f..310d807d76 100644
--- a/core/modules/media/src/Entity/Media.php
+++ b/core/modules/media/src/Entity/Media.php
@@ -64,6 +64,7 @@
  *     "revision_user" = "revision_user",
  *     "revision_created" = "revision_created",
  *     "revision_log_message" = "revision_log_message",
+ *     "revision_default" = "revision_default",
  *   },
  *   bundle_entity_type = "media_type",
  *   permission_granularity = "entity_type",
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 368ce1b596..2a1907085a 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -62,7 +62,8 @@
  *   revision_metadata_keys = {
  *     "revision_user" = "revision_uid",
  *     "revision_created" = "revision_timestamp",
- *     "revision_log_message" = "revision_log"
+ *     "revision_log_message" = "revision_log",
+ *     "revision_default" = "revision_default",
  *   },
  *   bundle_entity_type = "node_type",
  *   field_ui_base_route = "entity.node_type.edit_form",
diff --git a/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php
index 5766817940..f5b3fdcc15 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php
@@ -122,6 +122,11 @@ protected function getExpectedNormalizedEntity() {
           'value' => TRUE,
         ],
       ],
+      'revision_default' => [
+        [
+          'value' => TRUE,
+        ],
+      ],
       'default_langcode' => [
         [
           'value' => TRUE,
diff --git a/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
index 1875d004a4..430b731be7 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
@@ -212,6 +212,11 @@ protected function getExpectedNormalizedEntity() {
           'value' => TRUE,
         ],
       ],
+      'revision_default' => [
+        [
+          'value' => TRUE,
+        ],
+      ],
     ];
   }
 
diff --git a/core/modules/rest/tests/src/Functional/EntityResource/Node/NodeResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/Node/NodeResourceTestBase.php
index bf0ba7a591..fc827ace16 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/Node/NodeResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/Node/NodeResourceTestBase.php
@@ -152,6 +152,11 @@ protected function getExpectedNormalizedEntity() {
           'value' => TRUE,
         ],
       ],
+      'revision_default' => [
+        [
+          'value' => TRUE,
+        ],
+      ],
       'default_langcode' => [
         [
           'value' => TRUE,
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index ef6f124f51..e1b9358bcd 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -2056,3 +2056,40 @@ function system_update_8403() {
     }
   }
 }
+
+/**
+ * Add the 'revision_default' field to all relevant entity types.
+ */
+function system_update_8501() {
+  /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
+  $field_manager = \Drupal::service('entity_field.manager');
+  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
+
+  // Get a list of entity types to process.
+  /** @var \Drupal\Core\Entity\ContentEntityTypeInterface[] $definitions */
+  $definitions = array_filter(\Drupal::entityTypeManager()->getDefinitions(), function (EntityTypeInterface $entity_type) use ($field_manager, $definition_update_manager) {
+    $entity_type_id = $entity_type->id();
+    if ($entity_type = $definition_update_manager->getEntityType($entity_type_id)) {
+      return $entity_type instanceof ContentEntityTypeInterface
+        && $entity_type->isRevisionable()
+        && ($field_name = $entity_type->getRevisionMetadataKey('revision_default'))
+        && isset($field_manager->getFieldStorageDefinitions($entity_type_id)[$field_name])
+        && !$definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id);
+    }
+    return FALSE;
+  });
+
+  $storage_definition = BaseFieldDefinition::create('boolean')
+    ->setLabel(t('Default revision'))
+    ->setDescription(t('A flag indicating whether this was a default revision when it was saved.'))
+    ->setTranslatable(FALSE)
+    ->setRevisionable(TRUE)
+    ->setInitialValue(TRUE);
+
+  // Install the 'revision_default' field.
+  foreach ($definitions as $entity_type_id => $entity_type) {
+    $field_name = $entity_type->getRevisionMetadataKey('revision_default');
+    $definition_update_manager
+      ->installFieldStorageDefinition($field_name, $entity_type_id, $entity_type_id, $storage_definition);
+  }
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php b/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php
index 73b3254630..8bdd656ad6 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php
@@ -5,7 +5,6 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog;
-use Drupal\KernelTests\KernelTestBase;
 use Drupal\user\Entity\User;
 use Drupal\user\UserInterface;
 
@@ -13,7 +12,7 @@
  * @coversDefaultClass \Drupal\Core\Entity\RevisionableContentEntityBase
  * @group Entity
  */
-class RevisionableContentEntityBaseTest extends KernelTestBase {
+class RevisionableContentEntityBaseTest extends EntityKernelTestBase {
 
   /**
    * {@inheritdoc}
@@ -25,10 +24,7 @@ class RevisionableContentEntityBaseTest extends KernelTestBase {
    */
   protected function setUp() {
     parent::setUp();
-
     $this->installEntitySchema('entity_test_mul_revlog');
-    $this->installEntitySchema('user');
-    $this->installSchema('system', 'sequences');
   }
 
   /**
@@ -89,6 +85,63 @@ public function testRevisionableContentEntity() {
     $this->assertItemsTableCount(3, $definition);
   }
 
+  /**
+   * Tests the behavior of the "revision_default" flag.
+   *
+   * @covers \Drupal\Core\Entity\RevisionLogEntityTrait::wasDefaultRevision
+   */
+  public function testWasDefaultRevision() {
+    $entity_type_id = 'entity_test_mul_revlog';
+    $entity = EntityTestMulWithRevisionLog::create([
+      'type' => $entity_type_id,
+    ]);
+
+    // Checks that in a new entity ::wasDefaultRevision() always matches
+    // ::isDefaultRevision().
+    $this->assertEquals($entity->isDefaultRevision(), $entity->wasDefaultRevision());
+    $entity->isDefaultRevision(FALSE);
+    $this->assertEquals($entity->isDefaultRevision(), $entity->wasDefaultRevision());
+
+    // Check that a new entity is always flagged as a default revision on save,
+    // regardless of its default revision status.
+    $entity->save();
+    $this->assertTrue($entity->wasDefaultRevision());
+
+    // Check that a pending revision is not flagged as default.
+    $entity->setNewRevision();
+    $entity->isDefaultRevision(FALSE);
+    $entity->save();
+    $this->assertFalse($entity->wasDefaultRevision());
+
+    // Check that a default revision is flagged as such.
+    $entity->setNewRevision();
+    $entity->isDefaultRevision(TRUE);
+    $entity->save();
+    $this->assertTrue($entity->wasDefaultRevision());
+
+    // Check that a manually set value for the "revision_default" flag is
+    // ignored on save.
+    $entity->setNewRevision();
+    $entity->isDefaultRevision(FALSE);
+    $entity->set('revision_default', TRUE);
+    $this->assertTrue($entity->wasDefaultRevision());
+    $entity->save();
+    $this->assertFalse($entity->wasDefaultRevision());
+
+    // Check that the default revision status was stored correctly.
+    $storage = $this->entityManager->getStorage($entity_type_id);
+    foreach ([TRUE, FALSE, TRUE, FALSE] as $index => $expected) {
+      /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $revision */
+      $revision = $storage->loadRevision($index + 1);
+      $this->assertEquals($expected, $revision->wasDefaultRevision());
+    }
+
+    // Check that the default revision is flagged correctly.
+    /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $entity */
+    $entity = $storage->loadUnchanged($entity->id());
+    $this->assertTrue($entity->wasDefaultRevision());
+  }
+
   /**
    * Asserts the ammount of items on entity related tables.
    *
diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
index 9ec5430697..1b401b98b5 100644
--- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
+++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
@@ -69,6 +69,7 @@ public static function getSkippedDeprecations() {
       'The revision_user revision metadata key is not set.',
       'The revision_created revision metadata key is not set.',
       'The revision_log_message revision metadata key is not set.',
+      'The revision_default revision metadata key is not set.',
       'The "entity.query" service relies on the deprecated "Drupal\Core\Entity\Query\QueryFactory" class. It should either be deprecated or its implementation upgraded.',
       'MigrateCckField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.',
       'MigrateCckFieldPluginManager is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManager instead.',
