diff --git a/core/lib/Drupal/Core/Entity/ContentEntityForm.php b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
index 92bbbae42f..43b2569bf6 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityForm.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -309,6 +310,11 @@ protected function initFormLangcodes(FormStateInterface $form_state) {
       // working also for multilingual entities.
       $form_state->set('langcode', $this->entityManager->getTranslationFromContext($this->entity)->language()->getId());
     }
+
+    $language_check_callback = function (ContentEntityInterface $entity) {
+      return !$entity->getEntityType()->hasKey("langcode") || ($entity->language()->getId() === \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId());
+    };
+    assert('$language_check_callback($this->entity)', 'The entity language and the content language should be identical.');
   }
 
   /**
diff --git a/core/modules/book/src/BookBreadcrumbBuilder.php b/core/modules/book/src/BookBreadcrumbBuilder.php
index 90591d8d49..12f63b9caf 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::createFromRoute($parent_book->label(), 'entity.node.canonical', ['node' => $parent_book->id()], ['language' => $parent_book->language()]);
           }
         }
         $depth++;
diff --git a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
index 93e5dd595f..9f19e450cf 100644
--- a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
@@ -34,10 +34,15 @@ 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);
           $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..96bbb27df4 100644
--- a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
@@ -30,10 +30,14 @@ public function build(RouteMatchInterface $route_match) {
     if ($parents) {
       $parents = array_reverse($parents);
       foreach ($parents as $parent) {
+        $parent = $this->entityManager->getTranslationFromContext($parent);
         $breadcrumb->addCacheableDependency($parent);
         $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..51a34d6b8f 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -298,7 +298,8 @@ public function save(array $form, FormStateInterface $form_state) {
       if ($node->access('view')) {
         $form_state->setRedirect(
           'entity.node.canonical',
-          ['node' => $node->id()]
+          ['node' => $node->id()],
+          ['language' => $node->language()]
         );
       }
       else {
diff --git a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
index 73588d1f04..d25a62fd18 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::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()], ['language' => $term->language()]));
     }
 
     // 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..b601a47aa1 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,12 +230,15 @@ public function resetPassLogin($uid, $timestamp, $hash) {
       // check.
       $token = Crypt::randomBytesBase64(55);
       $_SESSION['pass_reset_' . $user->id()] = $token;
+      $interface_langcode = \Drupal::languageManager()->getCurrentLanguage();
+      $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
       return $this->redirect(
         'entity.user.edit_form',
         ['user' => $user->id()],
         [
           'query' => ['pass-reset-token' => $token],
           'absolute' => TRUE,
+          'language' => $user->language(),
         ]
       );
     }
@@ -254,7 +258,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();
+    $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+
+    return $this->redirect('entity.user.canonical', ['user' => $this->currentUser()->id()], ['language' => $user->language()]);
   }
 
   /**
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index 6b738c8c3d..6d8b3acb50 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();
+          $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->redirect('entity.user.canonical', ['user' => $this->account->id()], ['language' => $user->language()]));
             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->redirect('entity.user.edit_form', ['user' => $this->account->id()], ['language' => $user->language()]));
             break;
         }
       }
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 2d7d24a006..aad920ad86 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,14 @@ 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'] = Url::fromRoute(
+        'entity.user.canonical',
+        ['user' => $variables['uid']],
+        ['language' => $user->language()]
+      )->toString();
     }
   }
 }
@@ -1326,11 +1332,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();
+    $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
     $links = [
       'account' => [
         'title' => t('View profile'),
@@ -1341,7 +1352,7 @@ function user_toolbar() {
       ],
       'account_edit' => [
         'title' => t('Edit profile'),
-        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $user->id()]),
+        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $user->id()], ['language' => $user->language()]),
         'attributes' => [
           'title' => t('Edit user account'),
         ],
