diff --git a/core/core.services.yml b/core/core.services.yml
index 5e2c9e3781..ed7fc61f66 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -965,7 +965,7 @@ services:
     class: Drupal\Core\ParamConverter\EntityConverter
     tags:
       - { name: paramconverter }
-    arguments: ['@entity.manager']
+    arguments: ['@entity.manager', '@language_manager']
   paramconverter.entity_revision:
     class: Drupal\Core\ParamConverter\EntityRevisionParamConverter
     tags:
@@ -976,7 +976,7 @@ services:
     tags:
       # Use a higher priority than EntityConverter, see the class for details.
       - { name: paramconverter, priority: 5 }
-    arguments: ['@entity.manager', '@config.factory', '@router.admin_context']
+    arguments: ['@entity.manager', '@config.factory', '@router.admin_context', '@language_manager']
     lazy: true
   route_subscriber.module:
     class: Drupal\Core\EventSubscriber\ModuleRouteSubscriber
diff --git a/core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php b/core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php
index 438eaf8caa..c8cffa77b9 100644
--- a/core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php
@@ -3,6 +3,7 @@
 namespace Drupal\Core\ParamConverter;
 
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Routing\AdminContext;
 use Symfony\Component\Routing\Route;
 use Drupal\Core\Config\ConfigFactoryInterface;
@@ -48,9 +49,11 @@ class AdminPathConfigEntityConverter extends EntityConverter {
    *   The config factory.
    * @param \Drupal\Core\Routing\AdminContext $admin_context
    *   The route admin context service.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
    */
-  public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory, AdminContext $admin_context) {
-    parent::__construct($entity_manager);
+  public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory, AdminContext $admin_context, LanguageManagerInterface $language_manager) {
+    parent::__construct($entity_manager, $language_manager);
 
     $this->configFactory = $config_factory;
     $this->adminContext = $admin_context;
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
index f76b327a86..bbcbcc00d7 100644
--- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -2,9 +2,12 @@
 
 namespace Drupal\Core\ParamConverter;
 
-use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\RevisionableInterface;
+use Drupal\Core\Entity\TranslatableRevisionableInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
 use Symfony\Component\Routing\Route;
 
@@ -46,14 +49,31 @@ class EntityConverter implements ParamConverterInterface {
    */
   protected $entityManager;
 
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
   /**
    * Constructs a new EntityConverter.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
+   * @param \Drupal\Core\Language\LanguageManagerInterface|null $language_manager
+   *   (optional) The language manager. The language manager parameter has been
+   *   added to EntityConverter since version 8.5.0 and will be made required in
+   *   version 9.0.0.
+   *
+   * @see https://www.drupal.org/node/xxx FIXME
    */
-  public function __construct(EntityManagerInterface $entity_manager) {
+  public function __construct(EntityManagerInterface $entity_manager, LanguageManagerInterface $language_manager = NULL) {
     $this->entityManager = $entity_manager;
+    $this->languageManager = $language_manager ?: \Drupal::languageManager();
+    if (!isset($language_manager)) {
+      @trigger_error('The language manager parameter has been added to EntityConverter since version 8.5.0 and will be made required in version 9.0.0.', E_USER_DEPRECATED);
+    }
   }
 
   /**
@@ -68,14 +88,12 @@ public function convert($value, $definition, $name, array $defaults) {
 
     // If the entity type is revisionable and the parameter has the
     // "load_latest_revision" flag, load the latest revision.
-    if ($entity instanceof ContentEntityInterface && !empty($definition['load_latest_revision']) && $entity_definition->isRevisionable()) {
-      /** @var \Drupal\Core\Entity\ContentEntityStorageInterface  $storage */
-      $latest_revision_id = $storage->getLatestRevisionId($value);
-      // We explicitly perform a loose equality check, since a revision ID may
-      // be returned as an integer or a string.
-      if ($entity->getLoadedRevisionId() != $latest_revision_id) {
-        $entity = $storage->loadRevision($latest_revision_id);
-      }
+    if ($entity instanceof RevisionableInterface && !empty($definition['load_latest_revision']) && $entity_definition->isRevisionable()) {
+      // Retrieve the latest revision ID taking translations into account.
+      $langcode = $this->languageManager
+        ->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)
+        ->getId();
+      $entity = $this->getLatestTranslationAffectedRevision($entity, $langcode);
     }
 
     // If the entity type is translatable, ensure we return the proper
@@ -87,6 +105,78 @@ public function convert($value, $definition, $name, array $defaults) {
     return $entity;
   }
 
+  /**
+   * Returns the ID of the latest revision translation of the specified entity.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface|\Drupal\Core\Entity\RevisionableInterface $entity
+   *   The default revision of the entity being converted.
+   * @param string $langcode
+   *   The language of the revision translation to be loaded.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|\Drupal\Core\Entity\RevisionableInterface
+   *   The latest translation-affecting revision for the specified entity, or
+   *   just the latest revision, if the specified entity is not translatable or
+   *   does not have a matching translation yet.
+   */
+  protected function getLatestTranslationAffectedRevision(RevisionableInterface $entity, $langcode) {
+    $revision = NULL;
+    $storage = $this->entityManager->getStorage($entity->getEntityTypeId());
+
+    if ($entity instanceof TranslatableRevisionableInterface && $entity->isTranslatable()) {
+      /** @var \Drupal\Core\Entity\TranslatableRevisionableStorageInterface $storage */
+      $revision_id = $storage->getLatestTranslationAffectedRevisionId($entity->id(), $langcode);
+
+      // If the latest translation-affecting revision was a default revision, it
+      // is fine to load the latest revision instead, because in this case the
+      // latest revision, regardless of it being default or pending, will always
+      // contain the most up-to-date values for the specified translation. This
+      // provides a BC behavior when the route is defined by a module always
+      // expecting the latest revision to be loaded and to be the default
+      // revision. In this particular case the latest revision is always going
+      // to be the default revision, since pending revisions would not be
+      // supported.
+      /** @var \Drupal\Core\Entity\TranslatableRevisionableInterface $revision */
+      $revision = $revision_id ? $this->loadRevision($entity, $revision_id) : NULL;
+      if (!$revision || ($revision->wasDefaultRevision() && !$revision->isDefaultRevision())) {
+        $revision = NULL;
+      }
+    }
+
+    // Fall back to the latest revisions if no affected revision for the current
+    // content language could be found. This is acceptable as it means the
+    // entity is not translated. This is the correct logic also on monolingual
+    // sites.
+    if (!isset($revision)) {
+      $revision_id = $storage->getLatestRevisionId($entity->id());
+      $revision = $this->loadRevision($entity, $revision_id);
+    }
+
+    return $revision;
+  }
+
+  /**
+   * Loads the specified entity revision.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface|\Drupal\Core\Entity\RevisionableInterface $entity
+   *   The default revision of the entity being converted.
+   * @param string $revision_id
+   *   The identifier of the revision to be loaded.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|\Drupal\Core\Entity\RevisionableInterface
+   *   An entity revision object.
+   */
+  protected function loadRevision(RevisionableInterface $entity, $revision_id) {
+    // We explicitly perform a loose equality check, since a revision ID may
+    // be returned as an integer or a string.
+    if ($entity->getLoadedRevisionId() != $revision_id) {
+      $storage = $this->entityManager->getStorage($entity->getEntityTypeId());
+      return $storage->loadRevision($revision_id);
+    }
+    else {
+      return $entity;
+    }
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
index 6aae426abe..d1107eb85f 100644
--- a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
@@ -70,6 +70,7 @@ protected function alterRoutes(RouteCollection $collection) {
           'parameters' => [
             $entity_type_id => [
               'type' => 'entity:' . $entity_type_id,
+              'load_latest_revision' => TRUE,
             ],
           ],
           '_admin_route' => $is_admin,
@@ -102,6 +103,7 @@ protected function alterRoutes(RouteCollection $collection) {
             ],
             $entity_type_id => [
               'type' => 'entity:' . $entity_type_id,
+              'load_latest_revision' => TRUE,
             ],
           ],
           '_admin_route' => $is_admin,
@@ -127,6 +129,7 @@ protected function alterRoutes(RouteCollection $collection) {
             ],
             $entity_type_id => [
               'type' => 'entity:' . $entity_type_id,
+              'load_latest_revision' => TRUE,
             ],
           ],
           '_admin_route' => $is_admin,
@@ -152,6 +155,7 @@ protected function alterRoutes(RouteCollection $collection) {
             ],
             $entity_type_id => [
               'type' => 'entity:' . $entity_type_id,
+              'load_latest_revision' => TRUE,
             ],
           ],
           '_admin_route' => $is_admin,
diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml
index db6a1c13b3..96001e6ff7 100644
--- a/core/modules/layout_builder/layout_builder.services.yml
+++ b/core/modules/layout_builder/layout_builder.services.yml
@@ -20,7 +20,7 @@ services:
       - { name: paramconverter, priority: 10 }
   layout_builder.section_storage_param_converter.overrides:
     class: Drupal\layout_builder\Routing\SectionStorageOverridesParamConverter
-    arguments: ['@entity.manager']
+    arguments: ['@entity.manager', '@language_manager']
   cache_context.layout_builder_is_active:
     class: Drupal\layout_builder\Cache\LayoutBuilderIsActiveCacheContext
     arguments: ['@current_route_match']
diff --git a/core/modules/layout_builder/tests/src/Unit/SectionStorageOverridesParamConverterTest.php b/core/modules/layout_builder/tests/src/Unit/SectionStorageOverridesParamConverterTest.php
index f0c01468e5..b9cac1d197 100644
--- a/core/modules/layout_builder/tests/src/Unit/SectionStorageOverridesParamConverterTest.php
+++ b/core/modules/layout_builder/tests/src/Unit/SectionStorageOverridesParamConverterTest.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityType;
 use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\layout_builder\Routing\SectionStorageOverridesParamConverter;
 use Drupal\Tests\UnitTestCase;
 use Prophecy\Argument;
@@ -31,6 +32,13 @@ class SectionStorageOverridesParamConverterTest extends UnitTestCase {
    */
   protected $entityManager;
 
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
   /**
    * {@inheritdoc}
    */
@@ -38,7 +46,8 @@ protected function setUp() {
     parent::setUp();
 
     $this->entityManager = $this->prophesize(EntityManagerInterface::class);
-    $this->converter = new SectionStorageOverridesParamConverter($this->entityManager->reveal());
+    $this->languageManager = $this->prophesize(LanguageManagerInterface::class);
+    $this->converter = new SectionStorageOverridesParamConverter($this->entityManager->reveal(), $this->languageManager->reveal());
   }
 
   /**
diff --git a/core/modules/views_ui/src/ParamConverter/ViewUIConverter.php b/core/modules/views_ui/src/ParamConverter/ViewUIConverter.php
index fb19d18a39..360ec1eeef 100644
--- a/core/modules/views_ui/src/ParamConverter/ViewUIConverter.php
+++ b/core/modules/views_ui/src/ParamConverter/ViewUIConverter.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\ParamConverter\AdminPathConfigEntityConverter;
 use Drupal\Core\Routing\AdminContext;
 use Symfony\Component\Routing\Route;
@@ -43,8 +44,10 @@ class ViewUIConverter extends AdminPathConfigEntityConverter implements ParamCon
    *   The entity manager.
    * @param \Drupal\Core\TempStore\SharedTempStoreFactory $temp_store_factory
    *   The factory for the temp store object.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
    */
-  public function __construct(EntityManagerInterface $entity_manager, SharedTempStoreFactory $temp_store_factory, ConfigFactoryInterface $config_factory = NULL, AdminContext $admin_context = NULL) {
+  public function __construct(EntityManagerInterface $entity_manager, SharedTempStoreFactory $temp_store_factory, ConfigFactoryInterface $config_factory = NULL, AdminContext $admin_context = NULL, LanguageManagerInterface $language_manager = NULL) {
     // The config factory and admin context are new arguments due to changing
     // the parent. Avoid an error on updated sites by falling back to getting
     // them from the container.
@@ -55,7 +58,10 @@ public function __construct(EntityManagerInterface $entity_manager, SharedTempSt
     if (!$admin_context) {
       $admin_context = \Drupal::service('router.admin_context');
     }
-    parent::__construct($entity_manager, $config_factory, $admin_context);
+    if ($language_manager) {
+      $language_manager = \Drupal::languageManager();
+    }
+    parent::__construct($entity_manager, $config_factory, $admin_context, $language_manager);
 
     $this->tempStoreFactory = $temp_store_factory;
   }
diff --git a/core/modules/views_ui/views_ui.services.yml b/core/modules/views_ui/views_ui.services.yml
index adf87e61a2..da7a2ed457 100644
--- a/core/modules/views_ui/views_ui.services.yml
+++ b/core/modules/views_ui/views_ui.services.yml
@@ -1,7 +1,7 @@
 services:
   paramconverter.views_ui:
     class: Drupal\views_ui\ParamConverter\ViewUIConverter
-    arguments: ['@entity.manager', '@tempstore.shared', '@config.factory', '@router.admin_context']
+    arguments: ['@entity.manager', '@tempstore.shared', '@config.factory', '@router.admin_context', '@language_manager']
     tags:
       - { name: paramconverter, priority: 10 }
     lazy: true
diff --git a/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php b/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php
index d2fd2f5241..7933d9a4c1 100644
--- a/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php
+++ b/core/tests/Drupal/KernelTests/Core/ParamConverter/EntityConverterLatestRevisionTest.php
@@ -80,8 +80,12 @@ public function testEntityWithPendingRevision() {
     $entity = EntityTestMulRev::create();
     $entity->save();
 
-    $entity->isDefaultRevision(FALSE);
-    $entity->setNewRevision(TRUE);
+    /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
+    $storage = $this->container->get('entity_type.manager')
+      ->getStorage($entity->getEntityTypeId());
+
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    $entity = $storage->createRevision($entity, FALSE);
     $entity->save();
 
     $converted = $this->converter->convert(1, [
diff --git a/core/tests/Drupal/Tests/Core/ParamConverter/EntityConverterTest.php b/core/tests/Drupal/Tests/Core/ParamConverter/EntityConverterTest.php
index 54fcfbd73d..ce2233e8d8 100644
--- a/core/tests/Drupal/Tests/Core/ParamConverter/EntityConverterTest.php
+++ b/core/tests/Drupal/Tests/Core/ParamConverter/EntityConverterTest.php
@@ -22,6 +22,13 @@ class EntityConverterTest extends UnitTestCase {
    */
   protected $entityManager;
 
+  /**
+   * The mocked language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $languageManager;
+
   /**
    * The tested entity converter.
    *
@@ -36,8 +43,9 @@ protected function setUp() {
     parent::setUp();
 
     $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
+    $this->languageManager = $this->createMock('Drupal\Core\Language\LanguageManagerInterface');
 
-    $this->entityConverter = new EntityConverter($this->entityManager);
+    $this->entityConverter = new EntityConverter($this->entityManager, $this->languageManager);
   }
 
   /**
@@ -130,4 +138,18 @@ public function testConvertWithInvalidDynamicEntityType() {
     $this->entityConverter->convert('id', ['type' => 'entity:{invalid_id}'], 'foo', ['foo' => 'id']);
   }
 
+  /**
+   * Tests that skipping the language manager triggers a deprecation error.
+   *
+   * @group legacy
+   *
+   * @expectedDeprecation The language manager parameter has been added to EntityConverter since version 8.5.0 and will be made required in version 9.0.0.
+   */
+  public function testDeprecatedOptionalLanguageManager() {
+    /** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */
+    $container = $this->createMock('Symfony\Component\DependencyInjection\ContainerInterface');
+    \Drupal::setContainer($container);
+    $this->entityConverter = new EntityConverter($this->entityManager);
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
index f5aa40a6ef..cf1c9259a3 100644
--- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
+++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
@@ -325,6 +325,7 @@ public static function getSkippedDeprecations() {
       'The "session_handler.write_check" service relies on the deprecated "Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHandler" class. It should either be deprecated or its implementation upgraded.',
       'Not setting the strict option of the Choice constraint to true is deprecated since Symfony 3.4 and will throw an exception in 4.0.',
       'Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated since Symfony 3.4 as it will be removed in 4.0. Quote your keys when they are evaluable instead.',
+      'The language manager parameter has been added to EntityConverter since version 8.5.0 and will be made required in version 9.0.0.',
     ];
   }
 
