diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 3effe8b3c2..e7c235d76d 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -331,6 +331,23 @@ public function isDefaultRevision($new_value = NULL) {
     return $this->isNew() || $return;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  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->hasField($revision_default_key) ? $this->get($revision_default_key)->value : NULL;
+    if (isset($value)) {
+      return (bool) $value;
+    }
+    throw new \LogicException("Missing data for the \"{$revision_default_key}\" field on the entity {$this->getEntityTypeId()}:{$this->id()}.");
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index 3053d23694..e85a299312 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -106,4 +106,16 @@ public function getLoadedRevisionId();
    */
   public function updateLoadedRevisionId();
 
+  /**
+   * 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/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index a3bb20508f..e402a174f4 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -334,6 +334,12 @@ protected function doSave($id, EntityInterface $entity) {
     }
 
     $this->populateAffectedRevisionTranslations($entity);
+
+    // Populate the "revision_default" flag.
+    if ($this->entityType->isRevisionable() && ($revision_default_key = $this->entityType->getRevisionMetadataKey('revision_default')) && $entity->hasField($revision_default_key)) {
+      $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..1c2b391015 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -54,7 +54,7 @@ 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) {
+    if ($include_backwards_compatibility_field_names && count($this->revision_metadata_keys) < 4) {
       $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);
@@ -68,6 +68,10 @@ public function getRevisionMetadataKeys($include_backwards_compatibility_field_n
         @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 (isset($base_fields['revision_default'])) {
+        @trigger_error('The revision_default revision metadata key is not set.', E_USER_DEPRECATED);
+        $this->revision_metadata_keys['revision_default'] = 'revision_default';
+      }
     }
     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..57ddb167dd 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,6 +140,7 @@ 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];
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php
index 60712eeb21..24f9d67ed9 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php
@@ -246,6 +246,7 @@ protected function copyData(array &$sandbox) {
 
     $revision_id_key = $temporary_entity_type->getKey('revision');
     $revision_translation_affected_key = $temporary_entity_type->getKey('revision_translation_affected');
+    $revision_default_key = $temporary_entity_type->getRevisionMetadataKey('revision_default');
 
     // If 'progress' is not set, then this will be the first run of the batch.
     if (!isset($sandbox['progress'])) {
@@ -283,6 +284,8 @@ protected function copyData(array &$sandbox) {
     $storage->setEntityType($temporary_entity_type);
     $storage->setTableMapping($temporary_table_mapping);
 
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    $has_revision_default_key = TRUE;
     foreach ($entities as $entity_id => $entity) {
       try {
         // Set the revision ID to be same as the entity ID.
@@ -293,6 +296,12 @@ protected function copyData(array &$sandbox) {
         // returned was always TRUE.
         $entity->set($revision_translation_affected_key, TRUE);
 
+        // We cannot know what type the revision was so we assume the core
+        // default behavior of always creating a default revision.
+        if ($has_revision_default_key && ($has_revision_default_key = $entity->hasField($revision_default_key))) {
+          $entity->set($revision_default_key, TRUE);
+        }
+
         // Treat the entity as new in order to make the storage do an INSERT
         // rather than an UPDATE.
         $entity->enforceIsNew(TRUE);
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 49f7283f7e..6fa4067d5a 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 5d7329feb9..71632761d9 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/BlockContent/BlockContentResourceTestBase.php
@@ -121,6 +121,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 492ff642e4..0592cab547 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/serialization/tests/src/Kernel/EntitySerializationTest.php b/core/modules/serialization/tests/src/Kernel/EntitySerializationTest.php
index 5b71b93b7a..f389336621 100644
--- a/core/modules/serialization/tests/src/Kernel/EntitySerializationTest.php
+++ b/core/modules/serialization/tests/src/Kernel/EntitySerializationTest.php
@@ -129,6 +129,9 @@ public function testNormalize() {
       'revision_translation_affected' => [
         ['value' => TRUE],
       ],
+      'revision_default' => [
+        ['value' => TRUE],
+      ],
       'non_rev_field' => [],
       'field_test_text' => [
         [
@@ -201,6 +204,7 @@ public function testSerialize() {
       'revision_id' => '<revision_id><value>' . $this->entity->getRevisionId() . '</value></revision_id>',
       'default_langcode' => '<default_langcode><value>1</value></default_langcode>',
       'revision_translation_affected' => '<revision_translation_affected><value>1</value></revision_translation_affected>',
+      'revision_default' => '<revision_default><value>1</value></revision_default>',
       'non_rev_field' => '<non_rev_field/>',
       'field_test_text' => '<field_test_text><value>' . $this->values['field_test_text']['value'] . '</value><format>' . $this->values['field_test_text']['format'] . '</format></field_test_text>',
     ];
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/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
index c73b6e59df..59bb84eea1 100644
--- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
+++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
@@ -57,6 +57,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.',
