diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 2c62589..f511def 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -1361,4 +1361,22 @@ public function hasTranslationChanges() {
     return FALSE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function isLatestRevision() {
+    // New entities or entity types which are not revisionable are always
+    // considered the latest revision.
+    if ($this->isNew() || !$this->getEntityType()->isRevisionable()) {
+      return TRUE;
+    }
+    $result = $this->entityTypeManager()
+      ->getStorage($this->getEntityTypeId())
+      ->getQuery()
+      ->latestRevision()
+      ->condition($this->getEntityType()->getKey('id'), $this->id())
+      ->execute();
+    return key($result) == $this->getLoadedRevisionId();
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index dbd3b91..e628e42 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -714,4 +714,15 @@ public function getInstance(array $options) {
     return $this->container->get('entity_type.manager')->getInstance($options);
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
+   *   Use \Drupal\Core\Entity\EntityTypeRepositoryInterface::loadLatestEntityRevision()
+   *   instead.
+   */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id) {
+    return $this->container->get('entity_type.repository')->loadLatestEntityRevision($entity_type_id, $entity_id);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityRepository.php b/core/lib/Drupal/Core/Entity/EntityRepository.php
index 986cc50..af56187 100644
--- a/core/lib/Drupal/Core/Entity/EntityRepository.php
+++ b/core/lib/Drupal/Core/Entity/EntityRepository.php
@@ -79,6 +79,29 @@ public function loadEntityByConfigTarget($entity_type_id, $target) {
   /**
    * {@inheritdoc}
    */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id) {
+    $storage = $this->entityTypeManager->getStorage($entity_type_id);
+    $definition = $this->entityTypeManager->getDefinition($entity_type_id);
+    if ($definition->isRevisionable()) {
+      $result = $storage->getQuery()
+        ->latestRevision()
+        ->condition($definition->getKey('id'), $entity_id)
+        ->execute();
+      if ($result) {
+        $latest_revision_id = key($result);
+        return $storage->loadRevision($latest_revision_id);
+      }
+    }
+    else {
+      // For non-revisionable entities, the default revision is always the
+      // latest.
+      return $storage->load($entity_id);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = []) {
     $translation = $entity;
 
diff --git a/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php b/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
index d1229d4..afd80e9 100644
--- a/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
@@ -69,4 +69,17 @@ public function loadEntityByConfigTarget($entity_type_id, $target);
    */
   public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = []);
 
+  /**
+   * Loads the latest revision of an entity.
+   *
+   * @param string $entity_type_id
+   *   The entity type ID to load from.
+   * @param string|int $entity_id
+   *   The ID of the entity to load.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|null
+   *   The entity object, or NULL if there is no entity with the given ID.
+   */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id);
+
 }
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/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php
new file mode 100644
index 0000000..f505388
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestRev;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Entity\ContentEntityBase
+ *
+ * @group Entity
+ */
+class ContentEntityLatestRevisionTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['entity_test', 'user'];
+
+  /**
+   * The entity test rev storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $entityTestRevStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('entity_test_rev');
+    $this->installEntitySchema('entity_test');
+
+    $this->entityTestRevStorage = $this->container->get('entity_type.manager')->getStorage('entity_test_rev');
+  }
+
+  /**
+   * @covers ::isLatestRevision
+   */
+  public function testNonRevisionableEntityType() {
+    // New entities are always the latest revision.
+    $entity = EntityTest::create([]);
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+
+    // A non-revisionable entity will always be the latest revision.
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+  }
+
+  /**
+   * @covers ::isLatestRevision
+   */
+  public function testRevisionableEntityType() {
+    // New entities are always the latest revision.
+    $entity = EntityTestRev::create([]);
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+
+    // A new default revision will be the latest revision.
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+    $this->assertEquals(1, $entity->getLoadedRevisionId());
+
+    // A second revision will also become the default revision.
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+
+    $original_revision = $this->entityTestRevStorage->loadRevision(1);
+    $this->assertEquals(1, $original_revision->getLoadedRevisionId());
+    $this->assertEquals(FALSE, $original_revision->isLatestRevision());
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php
new file mode 100644
index 0000000..7ebb625
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestRev;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests the Entity Repository.
+ *
+ * @group Entity
+ * @coversDefaultClass \Drupal\Core\Entity\EntityRepository
+ */
+class EntityRepositoryTest extends KernelTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  protected static $modules = [
+    'entity_test',
+    'user',
+  ];
+
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  public function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('entity_test_rev');
+    $this->entityRepository = $this->container->get('entity.repository');
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNoMatchingEntity() {
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNonRevisionableEntityTypeNoMatchingEntity() {
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('entity_test', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testInvalidEntityType() {
+    $this->setExpectedException(PluginNotFoundException::class, 'The "foo" entity type does not exist.');
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('foo', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNonRevisionableEntityType() {
+    $entity = EntityTest::create([]);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(1, $this->entityRepository->loadLatestEntityRevision('entity_test', 1)->id());
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testMultipleRevisions() {
+    $entity = EntityTestRev::create([
+      'name' => 'Test Entity',
+    ]);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->getLoadedRevisionId());
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(1, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+    $this->assertEquals(2, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testPendingRevision() {
+    $entity = EntityTestRev::create([
+      'name' => 'Test Entity',
+    ]);
+    $entity->save();
+
+    $entity->isDefaultRevision(FALSE);
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+    $this->assertEquals(2, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+  }
+
+}
