diff --git a/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php b/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
index 209030729b..115c2a223f 100644
--- a/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
+++ b/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Routing;
 
+use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
@@ -66,6 +67,25 @@ protected function redirect($route_name, array $route_parameters = [], array $op
     @trigger_error(__NAMESPACE__ . "\UrlGeneratorTrait::redirect() is deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use new RedirectResponse(Url::fromRoute()) instead. See https://www.drupal.org/node/2614344", E_USER_DEPRECATED);
     $options['absolute'] = TRUE;
     $url = $this->getUrlGenerator()->generateFromRoute($route_name, $route_parameters, $options);
+    return $this->redirectToUrl($url, $status);
+  }
+
+  /**
+   * Returns a redirect response object for the specified url.
+   *
+   * @param \Drupal\Core\Url|string $url
+   *   The url to which to redirect.
+   * @param int $status
+   *   (optional) The HTTP redirect status code for the redirect. The default is
+   *   302 Found.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse
+   *   A redirect response object that may be returned by the controller.
+   */
+  protected function redirectToUrl($url, $status = 302) {
+    if ($url instanceof Url) {
+      $url = $url->toString();
+    }
     return new RedirectResponse($url, $status);
   }
 
diff --git a/core/modules/action/src/Form/ActionDeleteForm.php b/core/modules/action/src/Form/ActionDeleteForm.php
index 0821b90a7a..1fd432b02f 100644
--- a/core/modules/action/src/Form/ActionDeleteForm.php
+++ b/core/modules/action/src/Form/ActionDeleteForm.php
@@ -3,7 +3,6 @@
 namespace Drupal\action\Form;
 
 use Drupal\Core\Entity\EntityDeleteForm;
-use Drupal\Core\Url;
 
 /**
  * Builds a form to delete an action.
@@ -16,7 +15,7 @@ class ActionDeleteForm extends EntityDeleteForm {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('entity.action.collection');
+    return $this->entity->toUrl('collection');
   }
 
 }
diff --git a/core/modules/action/src/Form/ActionFormBase.php b/core/modules/action/src/Form/ActionFormBase.php
index b73ca4c41e..517bc272b0 100644
--- a/core/modules/action/src/Form/ActionFormBase.php
+++ b/core/modules/action/src/Form/ActionFormBase.php
@@ -134,7 +134,7 @@ public function save(array $form, FormStateInterface $form_state) {
     $this->entity->save();
     $this->messenger()->addStatus($this->t('The action has been successfully saved.'));
 
-    $form_state->setRedirect('entity.action.collection');
+    $form_state->setRedirectUrl($this->entity->toUrl('collection'));
   }
 
   /**
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 8bb1bb38a5..c6461bba50 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -387,12 +387,14 @@ function template_preprocess_book_all_books_block(&$variables) {
  *     Properties used: bid, link_title, depth, pid, nid.
  */
 function template_preprocess_book_navigation(&$variables) {
+  /** @var \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository */
+  $entity_repository = \Drupal::service('entity.repository');
   $book_link = $variables['book_link'];
 
   // Provide extra variables for themers. Not needed by default.
   $variables['book_id'] = $book_link['bid'];
   $variables['book_title'] = $book_link['link_title'];
-  $variables['book_url'] = Url::fromRoute('entity.node.canonical', ['node' => $book_link['bid']])->toString();
+  $variables['book_url'] = $entity_repository->getTranslationFromContext(Node::load($book_link['bid']))->toUrl()->toString();
   $variables['current_depth'] = $book_link['depth'];
   $variables['tree'] = '';
 
@@ -405,7 +407,7 @@ function template_preprocess_book_navigation(&$variables) {
     $build = [];
 
     if ($prev = $book_outline->prevLink($book_link)) {
-      $prev_href = Url::fromRoute('entity.node.canonical', ['node' => $prev['nid']])->toString();
+      $prev_href = $entity_repository->getTranslationFromContext(Node::load($prev['nid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'prev',
         'href' => $prev_href,
@@ -417,7 +419,7 @@ function template_preprocess_book_navigation(&$variables) {
     /** @var \Drupal\book\BookManagerInterface $book_manager */
     $book_manager = \Drupal::service('book.manager');
     if ($book_link['pid'] && $parent = $book_manager->loadBookLink($book_link['pid'])) {
-      $parent_href = Url::fromRoute('entity.node.canonical', ['node' => $book_link['pid']])->toString();
+      $parent_href = $entity_repository->getTranslationFromContext(Node::load($book_link['pid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'up',
         'href' => $parent_href,
@@ -427,7 +429,7 @@ function template_preprocess_book_navigation(&$variables) {
     }
 
     if ($next = $book_outline->nextLink($book_link)) {
-      $next_href = Url::fromRoute('entity.node.canonical', ['node' => $next['nid']])->toString();
+      $next_href = $entity_repository->getTranslationFromContext(Node::load($next['nid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'next',
         'href' => $next_href,
diff --git a/core/modules/book/book.services.yml b/core/modules/book/book.services.yml
index 740252e85b..dd66782f5f 100644
--- a/core/modules/book/book.services.yml
+++ b/core/modules/book/book.services.yml
@@ -1,7 +1,7 @@
 services:
   book.breadcrumb:
     class: Drupal\book\BookBreadcrumbBuilder
-    arguments: ['@entity_type.manager', '@current_user']
+    arguments: ['@entity_type.manager', '@entity.repository','@current_user']
     tags:
       - { name: breadcrumb_builder, priority: 701 }
   book.manager:
diff --git a/core/modules/book/src/BookBreadcrumbBuilder.php b/core/modules/book/src/BookBreadcrumbBuilder.php
index db446a0651..7134889b9a 100644
--- a/core/modules/book/src/BookBreadcrumbBuilder.php
+++ b/core/modules/book/src/BookBreadcrumbBuilder.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Breadcrumb\Breadcrumb;
 use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -17,6 +18,13 @@
 class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
   use StringTranslationTrait;
 
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * The node storage.
    *
@@ -39,8 +47,9 @@ class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The current user account.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, AccountInterface $account) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository, AccountInterface $account) {
     $this->nodeStorage = $entity_type_manager->getStorage('node');
+    $this->entityRepository = $entity_repository;
     $this->account = $account;
   }
 
@@ -72,11 +81,12 @@ public function build(RouteMatchInterface $route_match) {
       $depth = 1;
       while (!empty($book['p' . ($depth + 1)])) {
         if (!empty($parent_books[$book['p' . $depth]]) && ($parent_book = $parent_books[$book['p' . $depth]])) {
+          $parent_book = $this->entityRepository->getTranslationFromContext($parent_book);
           $access = $parent_book->access('view', $this->account, TRUE);
           $breadcrumb->addCacheableDependency($access);
           if ($access->isAllowed()) {
             $breadcrumb->addCacheableDependency($parent_book);
-            $links[] = Link::createFromRoute($parent_book->label(), 'entity.node.canonical', ['node' => $parent_book->id()]);
+            $links[] = Link::fromTextAndUrl($parent_book->label(), $parent_book->toUrl());
           }
         }
         $depth++;
diff --git a/core/modules/book/src/Form/BookOutlineForm.php b/core/modules/book/src/Form/BookOutlineForm.php
index 0bf60353ce..eef8ccb42c 100644
--- a/core/modules/book/src/Form/BookOutlineForm.php
+++ b/core/modules/book/src/Form/BookOutlineForm.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
+use Drupal\node\Entity\Node;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -96,9 +97,10 @@ public function form(array $form, FormStateInterface $form_state) {
    */
   protected function actions(array $form, FormStateInterface $form_state) {
     $actions = parent::actions($form, $form_state);
+    $book = $this->entity->id() == $this->entity->book['nid'] ? $this->entity : \Drupal::service('entity.repository')->getTranslationFromContext(Node::load($this->entity->book['nid']));
     $actions['submit']['#value'] = $this->entity->book['original_bid'] ? $this->t('Update book outline') : $this->t('Add to book outline');
     $actions['delete']['#title'] = $this->t('Remove from book outline');
-    $actions['delete']['#url'] = new Url('entity.node.book_remove_form', ['node' => $this->entity->book['nid']]);
+    $actions['delete']['#url'] = $book->toUrl('book-remove-form');
     $actions['delete']['#access'] = $this->bookManager->checkNodeIsRemovable($this->entity);
     return $actions;
   }
@@ -107,10 +109,7 @@ protected function actions(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function save(array $form, FormStateInterface $form_state) {
-    $form_state->setRedirect(
-      'entity.node.canonical',
-      ['node' => $this->entity->id()]
-    );
+    $form_state->setRedirectUrl($this->entity->toUrl());
     $book_link = $form_state->getValue('book');
     if (!$book_link['bid']) {
       $this->messenger()->addStatus($this->t('No changes were made'));
diff --git a/core/modules/forum/forum.services.yml b/core/modules/forum/forum.services.yml
index 6268c2cf8a..c75bcb04c5 100644
--- a/core/modules/forum/forum.services.yml
+++ b/core/modules/forum/forum.services.yml
@@ -6,12 +6,12 @@ services:
       - { name: backend_overridable }
   forum.breadcrumb.node:
     class: Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder
-    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation']
+    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation', '@entity.repository']
     tags:
       - { name: breadcrumb_builder, priority: 1001 }
   forum.breadcrumb.listing:
     class: Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder
-    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation']
+    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation', '@entity.repository' ]
     tags:
       - { name: breadcrumb_builder, priority: 1001 }
   forum.index_storage:
diff --git a/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php b/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
index 3491874c5b..5acff8af45 100644
--- a/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
+++ b/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Breadcrumb\Breadcrumb;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\DependencyInjection\DeprecatedServicePropertyTrait;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -56,6 +57,13 @@ abstract class ForumBreadcrumbBuilderBase implements BreadcrumbBuilderInterface
    */
   protected $termStorage;
 
+  /**
+   * Entity repository interface.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * Constructs a forum breadcrumb builder object.
    *
@@ -68,12 +76,13 @@ abstract class ForumBreadcrumbBuilderBase implements BreadcrumbBuilderInterface
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation service.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, ForumManagerInterface $forum_manager, TranslationInterface $string_translation) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, ForumManagerInterface $forum_manager, TranslationInterface $string_translation, EntityRepositoryInterface $entity_repository) {
     $this->entityTypeManager = $entity_type_manager;
     $this->config = $config_factory->get('forum.settings');
     $this->forumManager = $forum_manager;
     $this->setStringTranslation($string_translation);
     $this->termStorage = $entity_type_manager->getStorage('taxonomy_term');
+    $this->entityRepository = $entity_repository;
   }
 
   /**
diff --git a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
index 91ea1a01c3..36726ea13f 100644
--- a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
@@ -34,10 +34,17 @@ public function build(RouteMatchInterface $route_match) {
     if ($parents) {
       foreach (array_reverse($parents) as $parent) {
         if ($parent->id() != $term_id) {
+          $parent = $this->entityRepository->getTranslationFromContext($parent);
           $breadcrumb->addCacheableDependency($parent);
+          // @todo set the forum.page route as link template on the term entity
+          // and use $term->toUrl('forum-page') to build the url?
           $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page', [
             'taxonomy_term' => $parent->id(),
-          ]));
+          ],
+            [
+              'language' => $parent->language()
+            ]
+          ));
         }
       }
     }
diff --git a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
index 007fb9a63c..67dfce36d1 100644
--- a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
@@ -30,10 +30,16 @@ public function build(RouteMatchInterface $route_match) {
     if ($parents) {
       $parents = array_reverse($parents);
       foreach ($parents as $parent) {
+        $parent = $this->entityRepository->getTranslationFromContext($parent);
         $breadcrumb->addCacheableDependency($parent);
+        // @todo set the forum.page route as link template on the term entity
+        // and use $term->toUrl('forum-page') to build the url?
         $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page',
           [
             'taxonomy_term' => $parent->id(),
+          ],
+          [
+            'language' => $parent->language(),
           ]
         ));
       }
diff --git a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
index 962e5f0eaa..98f4038061 100644
--- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
+++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
@@ -7,6 +7,7 @@
 use Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder;
 use Drupal\taxonomy\TermStorageInterface;
 use Drupal\Tests\UnitTestCase;
+use Prophecy\Argument;
 use Symfony\Component\DependencyInjection\Container;
 
 /**
@@ -49,6 +50,7 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
     $config_factory = $this->getConfigFactoryStub([]);
     $forum_manager = $this->createMock('Drupal\forum\ForumManagerInterface');
     $translation_manager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
 
     // Make an object to test.
     $builder = $this->getMockBuilder('Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder')
@@ -57,6 +59,7 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
         $config_factory,
         $forum_manager,
         $translation_manager,
+        $entity_repository,
       ])
       ->setMethods(NULL)
       ->getMock();
@@ -124,9 +127,14 @@ public function testBuild() {
       ->disableOriginalConstructor()
       ->getMock();
 
+    $prophecy = $this->prophesize('Drupal\Core\Language\Language');
+    $prophecy->getId()->willReturn('en');
+    $language = $prophecy->reveal();
+
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something');
     $prophecy->id()->willReturn(1);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:1']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -135,6 +143,7 @@ public function testBuild() {
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something else');
     $prophecy->id()->willReturn(2);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:2']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -181,9 +190,15 @@ public function testBuild() {
     );
 
     $forum_manager = $this->createMock('Drupal\forum\ForumManagerInterface');
+    $entity_repository = $this->getMockBuilder('Drupal\Core\Entity\EntityRepositoryInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity_repository->expects($this->any())
+      ->method('getTranslationFromContext')
+      ->will($this->returnArgument(0));
 
     // Build a breadcrumb builder to test.
-    $breadcrumb_builder = new ForumListingBreadcrumbBuilder($entity_manager, $config_factory, $forum_manager, $translation_manager);
+    $breadcrumb_builder = new ForumListingBreadcrumbBuilder($entity_manager, $config_factory, $forum_manager, $translation_manager, $entity_repository);
 
     // Add a translation manager for t().
     $translation_manager = $this->getStringTranslationStub();
@@ -209,7 +224,7 @@ public function testBuild() {
     $expected1 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected1, $breadcrumb->getLinks());
@@ -221,8 +236,8 @@ public function testBuild() {
     $expected2 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
-      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2], ['language' => $language]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected2, $breadcrumb->getLinks());
diff --git a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
index a194ecc686..62e1b1ca82 100644
--- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
+++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
@@ -54,6 +54,7 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
       ->will($this->returnValue(TRUE));
 
     $translation_manager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
 
     // Make an object to test.
     $builder = $this->getMockBuilder('Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder')
@@ -63,6 +64,7 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
           $config_factory,
           $forum_manager,
           $translation_manager,
+          $entity_repository,
         ]
       )
       ->setMethods(NULL)
@@ -132,9 +134,14 @@ public function testBuild() {
       ->disableOriginalConstructor()
       ->getMock();
 
+    $prophecy = $this->prophesize('Drupal\Core\Language\Language');
+    $prophecy->getId()->willReturn('en');
+    $language = $prophecy->reveal();
+
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something');
     $prophecy->id()->willReturn(1);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:1']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -143,6 +150,7 @@ public function testBuild() {
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something else');
     $prophecy->id()->willReturn(2);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:2']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -182,6 +190,13 @@ public function testBuild() {
         ['taxonomy_term', $term_storage],
       ]));
 
+    $entity_repository = $this->getMockBuilder('Drupal\Core\Entity\EntityRepositoryInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity_repository->expects($this->any())
+      ->method('getTranslationFromContext')
+      ->will($this->returnArgument(0));
+
     $config_factory = $this->getConfigFactoryStub(
       [
         'forum.settings' => [
@@ -194,7 +209,9 @@ public function testBuild() {
     $breadcrumb_builder = new ForumNodeBreadcrumbBuilder($entity_manager,
       $config_factory,
       $forum_manager,
-      $translation_manager);
+      $translation_manager,
+      $entity_repository
+    );
 
     // Add a translation manager for t().
     $translation_manager = $this->getStringTranslationStub();
@@ -216,7 +233,7 @@ public function testBuild() {
     $expected1 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Forums', 'forum.index'),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected1, $breadcrumb->getLinks());
@@ -228,8 +245,8 @@ public function testBuild() {
     $expected2 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Forums', 'forum.index'),
-      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2], ['language' => $language]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected2, $breadcrumb->getLinks());
diff --git a/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php b/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
index e4bde9261c..6d9a9ad719 100644
--- a/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
+++ b/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
@@ -119,13 +119,14 @@ public function testSyncedImages() {
     $edit = [$this->fieldName . '[0][alt]' => 'Scarlett Johansson image', $this->fieldName . '[0][title]' => 'Scarlett Johansson image title'];
     $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
     // This inspects the HTML after the post of the translation, the image
-    // should be displayed on the original node.
+    // should be displayed on the translated node.
+    $this->assertRaw('alt="Scarlett Johansson image"');
+    $this->assertRaw('title="Scarlett Johansson image title"');
+    $second_fid = $this->getLastFileId();
+    // View the original node.
+    $this->drupalGet('node/' . $default_language_node->id());
     $this->assertRaw('alt="Lost in translation image"');
     $this->assertRaw('title="Lost in translation image title"');
-    $second_fid = $this->getLastFileId();
-    // View the translated node.
-    $this->drupalGet('fr/node/' . $default_language_node->id());
-    $this->assertRaw('alt="Scarlett Johansson image"');
 
     \Drupal::entityTypeManager()->getStorage('file')->resetCache();
 
@@ -158,13 +159,13 @@ public function testSyncedImages() {
     $file = File::load($first_fid);
     $this->assertTrue($file->isPermanent(), 'First file still exists and is permanent.');
     // This inspects the HTML after the post of the translation, the image
-    // should be displayed on the original node.
-    $this->assertRaw('alt="Lost in translation image"');
-    $this->assertRaw('title="Lost in translation image title"');
-    // View the translated node.
-    $this->drupalGet('nl/node/' . $default_language_node->id());
+    // should be displayed on the translated node.
     $this->assertRaw('alt="Akiko Takeshita image"');
     $this->assertRaw('title="Akiko Takeshita image title"');
+    // View the original node.
+    $this->drupalGet('node/' . $default_language_node->id());
+    $this->assertRaw('alt="Lost in translation image"');
+    $this->assertRaw('title="Lost in translation image title"');
 
     // Ensure the file status of the second file is permanent.
     $file = File::load($second_fid);
diff --git a/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
index 745958f0f9..bb5bd06a7a 100644
--- a/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
+++ b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityDeleteForm;
 use Drupal\Core\Url;
+use Drupal\system\Entity\Menu;
 
 /**
  * Provides a delete form for content menu links.
@@ -17,7 +18,8 @@ class MenuLinkContentDeleteForm extends ContentEntityDeleteForm {
    */
   public function getCancelUrl() {
     if ($this->moduleHandler->moduleExists('menu_ui')) {
-      return new Url('entity.menu.edit_form', ['menu' => $this->entity->getMenuName()]);
+      $menu = Menu::load($this->entity->getMenuName());
+      return $menu->toUrl('edit-form');
     }
     return $this->entity->toUrl();
   }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 9a8d8c999c..99784a4cfc 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -17,6 +17,7 @@
 use Drupal\Core\Database\StatementInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -543,10 +544,11 @@ function node_is_page(NodeInterface $node) {
 function template_preprocess_node_add_list(&$variables) {
   $variables['types'] = [];
   if (!empty($variables['content'])) {
+    $content_language = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()] = [
         'type' => $type->id(),
-        'add_link' => Link::fromTextAndUrl($type->label(), Url::fromRoute('node.add', ['node_type' => $type->id()]))->toString(),
+        'add_link' => Link::fromTextAndUrl($type->label(), new Url('node.add', ['node_type' => $type->id()], ['language' => $content_language])),
         'description' => [
           '#markup' => $type->getDescription(),
         ],
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index 06301a3470..503f1cf021 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Datetime\DateFormatterInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Render\RendererInterface;
@@ -105,7 +106,7 @@ public function addPage() {
     // Bypass the node/add listing if only one content type is available.
     if (count($content) == 1) {
       $type = array_shift($content);
-      return $this->redirect('node.add', ['node_type' => $type->id()]);
+      return $this->redirect('node.add', ['node_type' => $type->id()], ['language' => $this->languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)]);
     }
 
     $build['#content'] = $content;
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 9ae4c198dd..3ccf9a5a34 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -309,10 +309,7 @@ public function save(array $form, FormStateInterface $form_state) {
       $form_state->setValue('nid', $node->id());
       $form_state->set('nid', $node->id());
       if ($node->access('view')) {
-        $form_state->setRedirect(
-          'entity.node.canonical',
-          ['node' => $node->id()]
-        );
+        $form_state->setRedirectUrl($node->toUrl());
       }
       else {
         $form_state->setRedirect('<front>');
diff --git a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
index ede47ad2cd..60107813c2 100644
--- a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
+++ b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
@@ -282,14 +282,12 @@ public function save(array $form, FormStateInterface $form_state) {
     // Redirect to edit form after creating a new responsive image style or
     // after selecting another breakpoint group.
     if (!$responsive_image_style->hasImageStyleMappings()) {
-      $form_state->setRedirect(
-        'entity.responsive_image_style.edit_form',
-        ['responsive_image_style' => $responsive_image_style->id()]
-      );
+      $link = 'edit-form';
     }
     else {
-      $form_state->setRedirectUrl($this->entity->toUrl('collection'));
+      $link = 'collection';
     }
+    $form_state->setRedirectUrl($responsive_image_style->toUrl($link));
   }
 
 }
diff --git a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
index d235c78b92..43a9bd4bac 100644
--- a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
+++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
@@ -90,7 +90,7 @@ public function build(RouteMatchInterface $route_match) {
     foreach (array_reverse($parents) as $term) {
       $term = $this->entityRepository->getTranslationFromContext($term);
       $breadcrumb->addCacheableDependency($term);
-      $breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]));
+      $breadcrumb->addLink(Link::fromTextAndUrl($term->getName(), $term->toUrl()));
     }
 
     // This breadcrumb builder is based on a route parameter, and hence it
diff --git a/core/modules/user/src/Controller/UserController.php b/core/modules/user/src/Controller/UserController.php
index 7516da93c6..d417e809ee 100644
--- a/core/modules/user/src/Controller/UserController.php
+++ b/core/modules/user/src/Controller/UserController.php
@@ -6,6 +6,9 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\user\Entity\User;
 use Drupal\Core\Flood\FloodInterface;
 use Drupal\Core\Url;
 use Drupal\user\Form\UserPasswordResetForm;
@@ -71,7 +74,7 @@ class UserController extends ControllerBase {
    * @param \Drupal\Core\Flood\FloodInterface $flood
    *   The flood service.
    */
-  public function __construct(DateFormatterInterface $date_formatter, UserStorageInterface $user_storage, UserDataInterface $user_data, LoggerInterface $logger, FloodInterface $flood = NULL) {
+  public function __construct(DateFormatterInterface $date_formatter, UserStorageInterface $user_storage, UserDataInterface $user_data, LoggerInterface $logger, FloodInterface $flood = NULL, LanguageManagerInterface $language_manager) {
     $this->dateFormatter = $date_formatter;
     $this->userStorage = $user_storage;
     $this->userData = $user_data;
@@ -81,6 +84,7 @@ public function __construct(DateFormatterInterface $date_formatter, UserStorageI
       $flood = \Drupal::service('flood');
     }
     $this->flood = $flood;
+    $this->languageManager = $language_manager;
   }
 
   /**
@@ -92,7 +96,8 @@ public static function create(ContainerInterface $container) {
       $container->get('entity_type.manager')->getStorage('user'),
       $container->get('user.data'),
       $container->get('logger.factory')->get('user'),
-      $container->get('flood')
+      $container->get('flood'),
+      $container->get('language_manager')
     );
   }
 
@@ -253,14 +258,12 @@ public function resetPassLogin($uid, $timestamp, $hash) {
       $_SESSION['pass_reset_' . $user->id()] = $token;
       // Clear any flood events for this user.
       $this->flood->clear('user.password_request_user', $uid);
-      return $this->redirect(
-        'entity.user.edit_form',
-        ['user' => $user->id()],
-        [
-          'query' => ['pass-reset-token' => $token],
-          'absolute' => TRUE,
-        ]
-      );
+      $user = \Drupal::service('entity.repository')->getTranslationFromContext($user);
+      $url = $user->toUrl('edit-form', [
+        'query' => ['pass-reset-token' => $token],
+        'absolute' => TRUE,
+      ]);
+      return $this->redirectToUrl($url);
     }
 
     $this->messenger()->addError($this->t('You have tried to use a one-time login link that has either been used or is no longer valid. Please request a new one using the form below.'));
@@ -278,7 +281,11 @@ public function resetPassLogin($uid, $timestamp, $hash) {
    *   Returns a redirect to the profile of the currently logged in user.
    */
   public function userPage() {
-    return $this->redirect('entity.user.canonical', ['user' => $this->currentUser()->id()]);
+    $user = $this->currentUser()->id();
+    $user = User::load($user);
+    $user = \Drupal::service('entity.repository')->getTranslationFromContext($user);
+
+    return $this->redirectToUrl($user->toUrl('canonical', ['language' => $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)]));
   }
 
   /**
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index d443effc30..c755bb890e 100644
--- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
+++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
@@ -2,9 +2,12 @@
 
 namespace Drupal\user\EventSubscriber;
 
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Url;
+use Drupal\user\Entity\User;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
@@ -48,17 +51,24 @@ public function onException(GetResponseForExceptionEvent $event) {
     $exception = $event->getException();
     if ($exception instanceof AccessDeniedHttpException) {
       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
+      $language = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
       $redirect_url = NULL;
       if ($this->account->isAuthenticated()) {
+        $user = $this->account;
+        if (!$this->account instanceof EntityInterface) {
+          $user = User::load($this->account->id());
+          $user = \Drupal::service('entity.repository')->getTranslationFromContext($user);
+        }
+
         switch ($route_name) {
           case 'user.login';
             // Redirect an authenticated user to the profile page.
-            $redirect_url = Url::fromRoute('entity.user.canonical', ['user' => $this->account->id()], ['absolute' => TRUE]);
+            $redirect_url = $user->toUrl('canonical', ['language' => $language]);
             break;
 
           case 'user.register';
             // Redirect an authenticated user to the profile form.
-            $redirect_url = Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()], ['absolute' => TRUE]);
+            $redirect_url = $user->toUrl('edit-form', ['language' => $language]);
             break;
         }
       }
diff --git a/core/modules/user/src/Form/UserLoginForm.php b/core/modules/user/src/Form/UserLoginForm.php
index 6f1a19fc04..1db3dafa60 100644
--- a/core/modules/user/src/Form/UserLoginForm.php
+++ b/core/modules/user/src/Form/UserLoginForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Flood\FloodInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Url;
 use Drupal\user\UserAuthInterface;
@@ -132,13 +133,11 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $account = $this->userStorage->load($form_state->get('uid'));
+    $account = \Drupal::service('entity.repository')->getTranslationFromContext($account);
 
     // A destination was set, probably on an exception controller,
     if (!$this->getRequest()->request->has('destination')) {
-      $form_state->setRedirect(
-        'entity.user.canonical',
-        ['user' => $account->id()]
-      );
+      $form_state->setRedirectUrl($account->toUrl('canonical', ['language' => \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)]));
     }
     else {
       $this->getRequest()->query->set('destination', $this->getRequest()->request->get('destination'));
diff --git a/core/modules/user/src/ToolbarLinkBuilder.php b/core/modules/user/src/ToolbarLinkBuilder.php
index b278db6dba..7e8fa95d3f 100644
--- a/core/modules/user/src/ToolbarLinkBuilder.php
+++ b/core/modules/user/src/ToolbarLinkBuilder.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\user;
 
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Security\TrustedCallbackInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -17,18 +20,27 @@ class ToolbarLinkBuilder implements TrustedCallbackInterface {
   /**
    * The current user.
    *
-   * @var \Drupal\Core\Session\AccountProxyInterface
+   * @var \Drupal\user\UserInterface
    */
-  protected $account;
+  protected $currentUser;
 
   /**
    * ToolbarHandler constructor.
    *
    * @param \Drupal\Core\Session\AccountProxyInterface $account
    *   The current user.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(AccountProxyInterface $account) {
-    $this->account = $account;
+  public function __construct(AccountProxyInterface $account, EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository) {
+    $this->currentUser = $account->getAccount();
+    if (!$this->currentUser instanceof ContentEntityInterface) {
+      $this->currentUser = $entity_type_manager->getStorage('user')
+        ->load($this->currentUser->id());
+    }
+    $this->currentUser = $entity_repository->getTranslationFromContext($this->currentUser);
   }
 
   /**
@@ -48,7 +60,7 @@ public function renderToolbarLinks() {
       ],
       'account_edit' => [
         'title' => $this->t('Edit profile'),
-        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()]),
+        'url' => $this->currentUser->toUrl('edit-form'),
         'attributes' => [
           'title' => $this->t('Edit user account'),
         ],
@@ -80,7 +92,7 @@ public function renderToolbarLinks() {
    */
   public function renderDisplayName() {
     return [
-      '#markup' => $this->account->getDisplayName(),
+      '#markup' => $this->currentUser->getDisplayName(),
     ];
   }
 
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 7c18443ef1..3c598085f8 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -11,6 +11,7 @@
 use Drupal\Core\Access\AccessibleInterface;
 use Drupal\Core\Asset\AttachedAssetsInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -531,9 +532,9 @@ function template_preprocess_username(&$variables) {
         ->toString();
     }
     else {
-      $variables['attributes']['href'] = Url::fromRoute('entity.user.canonical', [
-        'user' => $variables['uid'],
-      ])->toString();
+      $user = $account instanceof EntityInterface ? $account : User::load($account->id());
+      $user = \Drupal::service('entity.repository')->getTranslationFromContext($user);
+      $variables['attributes']['href'] = $user->toUrl()->toString();
     }
   }
 }
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index fa369e5ef3..1d6ff8421c 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -70,4 +70,4 @@ services:
       - { name: 'context_provider' }
   user.toolbar_link_builder:
     class: Drupal\user\ToolbarLinkBuilder
-    arguments: ['@current_user']
+    arguments: ['@current_user', '@entity_type.manager', '@entity.repository']
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 078d2adc80..ae70804948 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -7,6 +7,7 @@
 
 use Drupal\Core\Url;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\media\MediaForm;
 
 /**
@@ -60,10 +61,11 @@ function seven_preprocess_menu_local_task(&$variables) {
  */
 function seven_preprocess_node_add_list(&$variables) {
   if (!empty($variables['content'])) {
+    $content_language = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
     /** @var \Drupal\node\NodeTypeInterface $type */
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()]['label'] = $type->label();
-      $variables['types'][$type->id()]['url'] = Url::fromRoute('node.add', ['node_type' => $type->id()])->toString();
+      $variables['types'][$type->id()]['url'] = Url::fromRoute('node.add', ['node_type' => $type->id()], ['language' => $content_language])->toString();
     }
   }
 }
