diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index c5421ed..25caf3f 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -122,6 +122,13 @@
   protected $isDefaultRevision = TRUE;
 
   /**
+   * Indicates whether this is the latest revision.
+   *
+   * @var bool
+   */
+  protected $isLatestRevision = FALSE;
+
+  /**
    * Holds untranslatable entity keys such as the ID, bundle, and revision ID.
    *
    * @var array
@@ -321,6 +328,13 @@ public function isDefaultRevision($new_value = NULL) {
   /**
    * {@inheritdoc}
    */
+  public function isLatestRevision() {
+    return (bool) $this->isLatestRevision;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isRevisionTranslationAffected() {
     $field_name = $this->getEntityType()->getKey('revision_translation_affected');
     return $this->hasField($field_name) ? $this->get($field_name)->value : TRUE;
@@ -831,6 +845,7 @@ protected function initializeTranslation($langcode) {
     $translation->typedData = NULL;
     $translation->loadedRevisionId = &$this->loadedRevisionId;
     $translation->isDefaultRevision = &$this->isDefaultRevision;
+    $translation->isLatestRevision = &$this->isLatestRevision;
 
     return $translation;
   }
@@ -1121,6 +1136,9 @@ public function __clone() {
     $default_revision = $this->isDefaultRevision;
     $this->isDefaultRevision = &$default_revision;
 
+    $latest_revision = $this->isLatestRevision;
+    $this->isLatestRevision = &$latest_revision;
+
     foreach ($this->fields as $name => $fields_by_langcode) {
       $this->fields[$name] = [];
       // Untranslatable fields may have multiple references for the same field
diff --git a/core/lib/Drupal/Core/Entity/RevisionableInterface.php b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
index 14690e3..e25bc25 100644
--- a/core/lib/Drupal/Core/Entity/RevisionableInterface.php
+++ b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
@@ -52,6 +52,14 @@ public function getRevisionId();
   public function isDefaultRevision($new_value = NULL);
 
   /**
+   * Checks if this entity is the latest revision.
+   *
+   * @return bool
+   *   TRUE if the entity is the latest revision, FALSE otherwise.
+   */
+  public function isLatestRevision();
+
+  /**
    * Acts on a revision before it gets saved.
    *
    * @param EntityStorageInterface $storage
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index d615e0c..2dde085 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -720,6 +720,10 @@ protected function buildQuery($ids, $revision_id = FALSE) {
       // Compare revision ID of the base and revision table, if equal then this
       // is the default revision.
       $query->addExpression('CASE base.' . $this->revisionKey . ' WHEN revision.' . $this->revisionKey . ' THEN 1 ELSE 0 END', 'isDefaultRevision');
+
+      // Compare revision ID to a set of latest revision IDs, if it's in the set
+      // then this is the latest revision.
+      $query->addExpression('CASE WHEN :revisionId IN (SELECT MAX(' . $this->revisionKey . ') FROM ' . $this->database->escapeTable($this->revisionTable) . ' revision GROUP BY revision.' . $this->idKey . ') THEN 1 ELSE 0 END', 'isLatestRevision', [':revisionId' => $revision_id]);
     }
 
     $query->fields('base', $entity_fields);
