diff --git a/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php b/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
index 7854a0ac96..a5b428561c 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;
 
 /**
@@ -61,6 +62,25 @@ protected function url($route_name, $route_parameters = [], $options = []) {
   protected function redirect($route_name, array $route_parameters = [], array $options = [], $status = 302) {
     $options['absolute'] = TRUE;
     $url = $this->url($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/book/src/BookBreadcrumbBuilder.php b/core/modules/book/src/BookBreadcrumbBuilder.php
index 90591d8d49..3178a67682 100644
--- a/core/modules/book/src/BookBreadcrumbBuilder.php
+++ b/core/modules/book/src/BookBreadcrumbBuilder.php
@@ -17,6 +17,13 @@
 class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
   use StringTranslationTrait;
 
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
   /**
    * The node storage.
    *
@@ -40,6 +47,7 @@ class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    *   The current user account.
    */
   public function __construct(EntityManagerInterface $entity_manager, AccountInterface $account) {
+    $this->entityManager = $entity_manager;
     $this->nodeStorage = $entity_manager->getStorage('node');
     $this->account = $account;
   }
@@ -72,11 +80,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->entityManager->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/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
index 93e5dd595f..b0e105ea3b 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->entityManager->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 1a359010a8..d3142354a4 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->entityManager->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/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 0ad34ad242..80462a5883 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -296,10 +296,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/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
index 73588d1f04..75d02715ee 100644
--- a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
+++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
@@ -68,7 +68,7 @@ public function build(RouteMatchInterface $route_match) {
     foreach (array_reverse($parents) as $term) {
       $term = $this->entityManager->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 be15fac4ab..5300e3402e 100644
--- a/core/modules/user/src/Controller/UserController.php
+++ b/core/modules/user/src/Controller/UserController.php
@@ -6,6 +6,7 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\user\Entity\User;
 use Drupal\user\Form\UserPasswordResetForm;
 use Drupal\user\UserDataInterface;
 use Drupal\user\UserInterface;
@@ -229,14 +230,14 @@ public function resetPassLogin($uid, $timestamp, $hash) {
       // check.
       $token = Crypt::randomBytesBase64(55);
       $_SESSION['pass_reset_' . $user->id()] = $token;
-      return $this->redirect(
-        'entity.user.edit_form',
-        ['user' => $user->id()],
-        [
-          'query' => ['pass-reset-token' => $token],
-          'absolute' => TRUE,
-        ]
-      );
+      $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+      $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+
+      $url = $user->toUrl('edit-form', [
+        'query' => ['pass-reset-token' => $token],
+        'absolute' => TRUE,
+      ]);
+      return $this->redirectToUrl($url);
     }
 
     drupal_set_message($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.'), 'error');
@@ -254,7 +255,12 @@ 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);
+    $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+    $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+
+    return $this->redirectToUrl($user->toUrl());
   }
 
   /**
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index 6b738c8c3d..21b1947f78 100644
--- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
+++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\user\EventSubscriber;
 
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\UrlGeneratorTrait;
 use Drupal\Core\Routing\UrlGeneratorInterface;
+use Drupal\user\Entity\User;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
@@ -54,15 +56,22 @@ public function onException(GetResponseForExceptionEvent $event) {
     if ($exception instanceof AccessDeniedHttpException) {
       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
       if ($this->account->isAuthenticated()) {
+        $user = $this->account;
+        if (!$this->account instanceof EntityInterface) {
+          $user = User::load($this->account->id());
+          $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+          $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+        }
+
         switch ($route_name) {
           case 'user.login';
             // Redirect an authenticated user to the profile page.
-            $event->setResponse($this->redirect('entity.user.canonical', ['user' => $this->account->id()]));
+            $event->setResponse($this->redirectToUrl($user->toUrl()));
             break;
 
           case 'user.register';
             // Redirect an authenticated user to the profile form.
-            $event->setResponse($this->redirect('entity.user.edit_form', ['user' => $this->account->id()]));
+            $event->setResponse($this->redirectToUrl($user->toUrl('edit-form')));
             break;
         }
       }
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 2d7d24a006..40b5517410 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -11,6 +11,7 @@
 use Drupal\Core\Asset\AttachedAssetsInterface;
 use Drupal\Core\Cache\Cache;
 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;
@@ -527,9 +528,10 @@ 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());
+      $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+      $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+      $variables['attributes']['href'] = $user->toUrl()->toString();
     }
   }
 }
@@ -1326,11 +1328,16 @@ function user_cookie_delete($cookie_name) {
  * Implements hook_toolbar().
  */
 function user_toolbar() {
-  $user = \Drupal::currentUser();
+  $user = \Drupal::currentUser()->getAccount();
 
   // Add logout & user account links or login link.
   $links_cache_contexts = [];
   if ($user->isAuthenticated()) {
+    if (!$user instanceof EntityInterface) {
+      $user = User::load($user->id());
+    }
+    $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+    $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
     $links = [
       'account' => [
         'title' => t('View profile'),
@@ -1341,7 +1348,7 @@ function user_toolbar() {
       ],
       'account_edit' => [
         'title' => t('Edit profile'),
-        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $user->id()]),
+        'url' => $user->toUrl('edit-form'),
         'attributes' => [
           'title' => t('Edit user account'),
         ],
