diff --git a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
index bca8f68..e78a758 100644
--- a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
@@ -50,10 +50,30 @@ public function onRoutingRouteAlterSetType(RouteBuildEvent $event) {
   }
 
   /**
+   * Set the latest revision flag for entity forms.
+   *
+   * @param \Drupal\Core\Routing\RouteBuildEvent $event
+   *   The event to process.
+   */
+  public function onRoutingRouteAlterSetLatestRevision(RouteBuildEvent $event) {
+    foreach ($event->getRouteCollection() as $route) {
+      if (!$route->getDefault('_entity_form')) {
+        continue;
+      }
+      $parameters = $route->getOption('parameters') ?: [];
+      foreach ($parameters as &$parameter) {
+        $parameter['_load_latest_revision'] = TRUE;
+      }
+      $route->setOption('parameters', $parameters);
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public static function getSubscribedEvents() {
     $events[RoutingEvents::ALTER][] = ['onRoutingRouteAlterSetType', -150];
+    $events[RoutingEvents::ALTER][] = ['onRoutingRouteAlterSetLatestRevision', -150];
     return $events;
   }
 
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
index 67f6a89..ef1b19e 100644
--- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -4,7 +4,9 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\RevisionableInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\node\Entity\Node;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -62,6 +64,25 @@ public function convert($value, $definition, $name, array $defaults) {
     $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults);
     if ($storage = $this->entityManager->getStorage($entity_type_id)) {
       $entity = $storage->load($value);
+
+      // If the entity type is revisionable, load the latest revision.
+      if ($entity instanceof EntityInterface && !empty($definition['_load_latest_revision']) && $entity->getEntityType()->isRevisionable()) {
+        // @todo, replace this with query with a standardised way of getting the
+        // latest revision in https://www.drupal.org/node/2784201.
+        $entity_revisions = $storage
+          ->getQuery()
+          ->allRevisions()
+          ->condition($entity->getEntityType()->getKey('id'), $entity->id())
+          ->sort($entity->getEntityType()->getKey('revision'), 'DESC')
+          ->range(0, 1)
+          ->execute();
+        $revision_ids = array_keys($entity_revisions);
+        $latest_revision_id = array_shift($revision_ids);
+        if ($entity->getRevisionId() != $latest_revision_id) {
+          $entity = $storage->loadRevision($latest_revision_id);
+        }
+      }
+
       // If the entity type is translatable, ensure we return the proper
       // translation object for the current context.
       if ($entity instanceof EntityInterface && $entity instanceof TranslatableInterface) {
diff --git a/core/modules/content_moderation/content_moderation.services.yml b/core/modules/content_moderation/content_moderation.services.yml
index 5035b67..9f5776a 100644
--- a/core/modules/content_moderation/content_moderation.services.yml
+++ b/core/modules/content_moderation/content_moderation.services.yml
@@ -1,9 +1,4 @@
 services:
-  paramconverter.latest_revision:
-    class: Drupal\content_moderation\ParamConverter\EntityRevisionConverter
-    arguments: ['@entity.manager', '@content_moderation.moderation_information']
-    tags:
-      - { name: paramconverter, priority: 5 }
   content_moderation.state_transition_validation:
     class: \Drupal\content_moderation\StateTransitionValidation
     arguments: ['@content_moderation.moderation_information']
diff --git a/core/modules/content_moderation/src/Entity/Routing/EntityModerationRouteProvider.php b/core/modules/content_moderation/src/Entity/Routing/EntityModerationRouteProvider.php
index f72a47e..354a3ab 100644
--- a/core/modules/content_moderation/src/Entity/Routing/EntityModerationRouteProvider.php
+++ b/core/modules/content_moderation/src/Entity/Routing/EntityModerationRouteProvider.php
@@ -88,7 +88,7 @@ protected function getLatestVersionRoute(EntityTypeInterface $entity_type) {
         ->setOption('parameters', [
           $entity_type_id => [
             'type' => 'entity:' . $entity_type_id,
-            'load_pending_revision' => 1,
+            '_load_latest_revision' => 1,
           ],
         ]);
 
diff --git a/core/modules/content_moderation/src/ParamConverter/EntityRevisionConverter.php b/core/modules/content_moderation/src/ParamConverter/EntityRevisionConverter.php
deleted file mode 100644
index 8e7e361..0000000
--- a/core/modules/content_moderation/src/ParamConverter/EntityRevisionConverter.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-namespace Drupal\content_moderation\ParamConverter;
-
-use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\Core\ParamConverter\EntityConverter;
-use Drupal\Core\TypedData\TranslatableInterface;
-use Drupal\content_moderation\ModerationInformationInterface;
-use Symfony\Component\Routing\Route;
-
-/**
- * Defines a class for making sure the edit-route loads the current draft.
- */
-class EntityRevisionConverter extends EntityConverter {
-
-  /**
-   * Moderation information service.
-   *
-   * @var \Drupal\content_moderation\ModerationInformationInterface
-   */
-  protected $moderationInformation;
-
-  /**
-   * EntityRevisionConverter constructor.
-   *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager, needed by the parent class.
-   * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_info
-   *   The moderation info utility service.
-   */
-  public function __construct(EntityManagerInterface $entity_manager, ModerationInformationInterface $moderation_info) {
-    parent::__construct($entity_manager);
-    $this->moderationInformation = $moderation_info;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function applies($definition, $name, Route $route) {
-    return $this->hasPendingRevisionFlag($definition) || $this->isEditFormPage($route);
-  }
-
-  /**
-   * Determines if the route definition includes a pending revision flag.
-   *
-   * This is a custom flag defined by the Content Moderation module to load
-   * pending revisions rather than the default revision on a given route.
-   *
-   * @param array $definition
-   *   The parameter definition provided in the route options.
-   *
-   * @return bool
-   *   TRUE if the pending revision flag is set, FALSE otherwise.
-   */
-  protected function hasPendingRevisionFlag(array $definition) {
-    return (isset($definition['load_pending_revision']) && $definition['load_pending_revision']);
-  }
-
-  /**
-   * Determines if a given route is the edit-form for an entity.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route definition.
-   *
-   * @return bool
-   *   Returns TRUE if the route is the edit form of an entity, FALSE otherwise.
-   */
-  protected function isEditFormPage(Route $route) {
-    if ($default = $route->getDefault('_entity_form')) {
-      // If no operation is provided, use 'default'.
-      $default .= '.default';
-      list($entity_type_id, $operation) = explode('.', $default);
-      if (!$this->entityManager->hasDefinition($entity_type_id)) {
-        return FALSE;
-      }
-      $entity_type = $this->entityManager->getDefinition($entity_type_id);
-      return in_array($operation, ['default', 'edit']) && $entity_type && $entity_type->isRevisionable();
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function convert($value, $definition, $name, array $defaults) {
-    $entity = parent::convert($value, $definition, $name, $defaults);
-
-    if ($entity && $this->moderationInformation->isModeratedEntity($entity) && !$this->moderationInformation->isLatestRevision($entity)) {
-      $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults);
-      $latest_revision = $this->moderationInformation->getLatestRevision($entity_type_id, $value);
-
-      if ($latest_revision instanceof EntityInterface) {
-        // If the entity type is translatable, ensure we return the proper
-        // translation object for the current context.
-        if ($entity instanceof TranslatableInterface) {
-          $latest_revision = $this->entityManager->getTranslationFromContext($latest_revision, NULL, ['operation' => 'entity_upcast']);
-        }
-        $entity = $latest_revision;
-      }
-    }
-
-    return $entity;
-  }
-
-}
diff --git a/core/modules/content_moderation/tests/src/Kernel/EntityRevisionConverterTest.php b/core/modules/content_moderation/tests/src/Kernel/EntityRevisionConverterTest.php
deleted file mode 100644
index 3deaffa..0000000
--- a/core/modules/content_moderation/tests/src/Kernel/EntityRevisionConverterTest.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-namespace Drupal\Tests\content_moderation\Kernel;
-
-use Drupal\entity_test\Entity\EntityTest;
-use Drupal\entity_test\Entity\EntityTestRev;
-use Drupal\KernelTests\KernelTestBase;
-use Drupal\node\Entity\Node;
-use Drupal\node\Entity\NodeType;
-use Drupal\workflows\Entity\Workflow;
-
-/**
- * @coversDefaultClass \Drupal\content_moderation\ParamConverter\EntityRevisionConverter
- * @group content_moderation
- */
-class EntityRevisionConverterTest extends KernelTestBase {
-
-  public static $modules = [
-    'user',
-    'entity_test',
-    'system',
-    'content_moderation',
-    'node',
-    'workflows',
-  ];
-
-  /**
-   * The entity type manager.
-   *
-   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
-   */
-  protected $entityTypeManager;
-
-  /**
-   * The router without access checks.
-   *
-   * @var \Symfony\Component\Routing\RouterInterface
-   */
-  protected $router;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->installEntitySchema('entity_test');
-    $this->installEntitySchema('entity_test_rev');
-    $this->installEntitySchema('node');
-    $this->installEntitySchema('user');
-    $this->installEntitySchema('content_moderation_state');
-    $this->installSchema('system', 'router');
-    $this->installSchema('system', 'sequences');
-    $this->installSchema('node', 'node_access');
-    $this->installConfig(['content_moderation']);
-    \Drupal::service('router.builder')->rebuild();
-
-    $this->entityTypeManager = $this->container->get('entity_type.manager');
-    $this->router = $this->container->get('router.no_access_checks');
-  }
-
-  /**
-   * @covers ::convert
-   */
-  public function testConvertNonRevisionableEntityType() {
-    $entity_test = EntityTest::create([
-      'name' => 'test',
-    ]);
-
-    $entity_test->save();
-
-    $result = $this->router->match('/entity_test/' . $entity_test->id());
-
-    $this->assertInstanceOf(EntityTest::class, $result['entity_test']);
-    $this->assertEquals($entity_test->getRevisionId(), $result['entity_test']->getRevisionId());
-  }
-
-  /**
-   * @covers ::applies
-   */
-  public function testConvertNoEditFormHandler() {
-    $workflow = Workflow::load('editorial');
-    $workflow->getTypePlugin()->addEntityTypeAndBundle('entity_test_rev', 'entity_test_rev');
-    $workflow->save();
-
-    $entity_test_rev = EntityTestRev::create([
-      'name' => 'Default Revision',
-      'moderation_state' => 'published',
-    ]);
-    $entity_test_rev->save();
-
-    $entity_test_rev->name = 'Pending revision';
-    $entity_test_rev->moderation_state = 'draft';
-    $entity_test_rev->save();
-
-    // Ensure the entity type does not provide an explicit 'edit' form class.
-    $definition = $this->entityTypeManager->getDefinition($entity_test_rev->getEntityTypeId());
-    $this->assertNull($definition->getFormClass('edit'));
-
-    // Ensure the revision converter is invoked for the edit route.
-    $result = $this->router->match("/entity_test_rev/manage/{$entity_test_rev->id()}/edit");
-    $this->assertEquals($entity_test_rev->getRevisionId(), $result['entity_test_rev']->getRevisionId());
-  }
-
-  /**
-   * @covers ::convert
-   */
-  public function testConvertWithRevisionableEntityType() {
-    $node_type = NodeType::create([
-      'type' => 'article',
-    ]);
-    $node_type->save();
-    $workflow = Workflow::load('editorial');
-    $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'article');
-    $workflow->save();
-
-    $revision_ids = [];
-    $node = Node::create([
-      'title' => 'test',
-      'type' => 'article',
-    ]);
-    $node->moderation_state->value = 'published';
-    $node->save();
-
-    $revision_ids[] = $node->getRevisionId();
-
-    $node->setNewRevision(TRUE);
-    $node->save();
-    $revision_ids[] = $node->getRevisionId();
-
-    $node->setNewRevision(TRUE);
-    $node->moderation_state->value = 'draft';
-    $node->save();
-    $revision_ids[] = $node->getRevisionId();
-
-    $result = $this->router->match('/node/' . $node->id() . '/edit');
-
-    $this->assertInstanceOf(Node::class, $result['node']);
-    $this->assertEquals($revision_ids[2], $result['node']->getRevisionId());
-    $this->assertFalse($result['node']->isDefaultRevision());
-  }
-
-}
diff --git a/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php b/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php
new file mode 100644
index 0000000..8eff20a
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace Drupal\KernelTests\Core\ParamConverter;
+
+use Drupal\entity_test\Entity\EntityTestMulRev;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
+
+/**
+ * Test the entity converter when the _load_latest_revision flag is set.
+ *
+ * @group ParamConverter
+ * @coversDefaultClass \Drupal\Core\ParamConverter\EntityConverter
+ */
+class EntityConverterLatestRevisionTest extends KernelTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'entity_test',
+    'user',
+    'language',
+    'system',
+  ];
+
+  /**
+   * The entity converter service.
+   *
+   * @var \Drupal\Core\ParamConverter\EntityConverter
+   */
+  protected $converter;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('entity_test_mulrev');
+    $this->installConfig(['system', 'language']);
+
+    $this->converter = $this->container->get('paramconverter.entity');
+
+    ConfigurableLanguage::createFromLangcode('de')->save();
+  }
+
+  /**
+   * Test with no matching entity.
+   */
+  public function testNoEntity() {
+    $converted = $this->converter->convert(1, [
+      '_load_latest_revision' => TRUE,
+      'type' => 'entity:entity_test_mulrev',
+    ], 'foo', []);
+    $this->assertEquals(NULL, $converted);
+  }
+
+  /**
+   * Test with no pending revision.
+   */
+  public function testEntityNoPendingRevision() {
+    $entity = EntityTestMulRev::create();
+    $entity->save();
+
+    $converted = $this->converter->convert(1, [
+      '_load_latest_revision' => TRUE,
+      'type' => 'entity:entity_test_mulrev',
+    ], 'foo', []);
+    $this->assertEquals($entity->getLoadedRevisionId(), $converted->getLoadedRevisionId());
+  }
+
+  /**
+   * Test with a pending revision.
+   */
+  public function testEntityWithPendingRevision() {
+    $entity = EntityTestMulRev::create();
+    $entity->save();
+
+    $entity->isDefaultRevision(FALSE);
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+
+    $converted = $this->converter->convert(1, [
+      '_load_latest_revision' => TRUE,
+      'type' => 'entity:entity_test_mulrev',
+    ], 'foo', []);
+
+    $this->assertEquals($entity->getLoadedRevisionId(), $converted->getLoadedRevisionId());
+  }
+
+  /**
+   * Test with a translated pending revision.
+   */
+  public function testWithTranslatedPendingRevision() {
+    $entity = EntityTestMulRev::create();
+    $entity->save();
+
+    // Create a translated pending revision.
+    $translated_entity = $entity->addTranslation('de');
+    $translated_entity->isDefaultRevision(FALSE);
+    $translated_entity->setNewRevision(TRUE);
+    $translated_entity->save();
+
+    // Change the site language so the converters will attempt to load entities
+    // with 'de'.
+    $this->config('system.site')->set('default_langcode', 'de')->save();
+
+    // The default loaded language is still 'en'.
+    EntityTestMulRev::load($entity->id());
+    $this->assertEquals('en', $entity->language()->getId());
+
+    // The converter will load the latest revision in the correct language.
+    $converted = $this->converter->convert(1, [
+      '_load_latest_revision' => TRUE,
+      'type' => 'entity:entity_test_mulrev',
+    ], 'foo', []);
+    $this->assertEquals('de', $converted->language()->getId());
+    $this->assertEquals($translated_entity->getLoadedRevisionId(), $converted->getLoadedRevisionId());
+  }
+
+}
