diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 9af0246..76bb65d 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -465,6 +465,7 @@ function comment_node_links_alter(array &$node_links, NodeInterface $node, array
           if (user_access('post comments')) {
             $links['comment-add'] = array(
               'title' => t('Add new comment'),
+              'language' => $node->language(),
               'attributes' => array('title' => t('Add a new comment to this page.')),
               'fragment' => 'comment-form',
             );
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
index 62aba31..4466a91 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
@@ -117,14 +117,14 @@ function testPathLanguageConfiguration() {
     $this->container->get('path.crud')->delete($edit);
 
     // Create language nodes to check priority of aliases.
-    $first_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1));
-    $second_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1));
+    $first_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1, 'langcode' => 'en'));
+    $second_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1, 'langcode' => Language::LANGCODE_NOT_SPECIFIED));
 
     // Assign a custom path alias to the first node with the English language.
     $edit = array(
       'source'   => 'node/' . $first_node->id(),
       'alias'    => $custom_path,
-      'langcode' => 'en',
+      'langcode' => $first_node->language()->id,
     );
     $this->container->get('path.crud')->save($edit['source'], $edit['alias'], $edit['langcode']);
 
@@ -132,7 +132,7 @@ function testPathLanguageConfiguration() {
     $edit = array(
       'source'   => 'node/' . $second_node->id(),
       'alias'    => $custom_path,
-      'langcode' => Language::LANGCODE_NOT_SPECIFIED,
+      'langcode' => $second_node->language()->id,
     );
     $this->container->get('path.crud')->save($edit['source'], $edit['alias'], $edit['langcode']);
 
diff --git a/core/modules/node/lib/Drupal/node/NodeViewBuilder.php b/core/modules/node/lib/Drupal/node/NodeViewBuilder.php
index 48fb0ff..34ca5de 100644
--- a/core/modules/node/lib/Drupal/node/NodeViewBuilder.php
+++ b/core/modules/node/lib/Drupal/node/NodeViewBuilder.php
@@ -95,7 +95,7 @@ public static function renderLinks(array $context) {
     );
 
     if (!$context['in_preview']) {
-      $entity = entity_load('node', $context['node_entity_id']);
+      $entity = entity_load('node', $context['node_entity_id'])->getTranslation($context['langcode']);
       $links['node'] = self::buildLinks($entity, $context['view_mode']);
 
       // Allow other modules to alter the node links.
@@ -132,6 +132,7 @@ protected static function buildLinks(NodeInterface $entity, $view_mode) {
           '@title' => $node_title_stripped,
         )),
         'href' => 'node/' . $entity->id(),
+        'language' => $entity->language(),
         'html' => TRUE,
         'attributes' => array(
           'rel' => 'tag',
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
index e78b5bc..f227792 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
@@ -154,6 +154,7 @@ protected function assertTaxonomyPage($is_admin) {
       $this->drupalGet("taxonomy/term/$tid");
       $this->nids_visible = array();
       foreach ($this->xpath("//a[text()='Read more']") as $link) {
+        // See also testTranslationRendering() in NodeTranslationUITest.
         $this->assertTrue(preg_match('|node/(\d+)$|', (string) $link['href'], $matches), 'Read more points to a node');
         $this->nids_visible[$matches[1]] = TRUE;
       }
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
index 7ed9f14..d639a73 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
@@ -230,12 +230,14 @@ function testTranslationRendering() {
     $default_langcode = $this->langcodes[0];
     $values[$default_langcode] = $this->getNewEntityValues($default_langcode);
     $this->entityId = $this->createEntity($values[$default_langcode], $default_langcode);
+    /** @var \Drupal\node\NodeInterface $node */
     $node = \Drupal::entityManager()->getStorageController($this->entityTypeId)->load($this->entityId);
     $node->setPromoted(TRUE);
 
     // Create translations.
     foreach (array_diff($this->langcodes, array($default_langcode)) as $langcode) {
       $values[$langcode] = $this->getNewEntityValues($langcode);
+      /** @var \Drupal\node\NodeInterface $translation */
       $translation = $node->addTranslation($langcode, $values[$langcode]);
       $translation->setPromoted(TRUE);
     }
@@ -247,6 +249,7 @@ function testTranslationRendering() {
     $this->doTestTranslations('node', $values);
 
     // Enable the translation language renderer.
+    /** @var \Drupal\views\ViewStorageInterface $view */
     $view = \Drupal::entityManager()->getStorageController('view')->load('frontpage');
     $display = &$view->getDisplay('default');
     $display['display_options']['row']['options']['rendering_language'] = 'translation_language_renderer';
@@ -259,6 +262,26 @@ function testTranslationRendering() {
       $this->assertText($values[$langcode]['title'][0]['value']);
     }
 
+    // Check the frontpage for 'Read more' links to each translation.
+    // See also assertTaxonomyPage() in NodeAccessBaseTableTest.
+    $node_href = '/node/' . $node->id();
+    foreach ($this->langcodes as $langcode) {
+      $match_found = FALSE;
+      if ($langcode == 'en') {
+        // Site default language does not have langcode prefix in the URL.
+        $expected_href = $node_href;
+      } else {
+        $expected_href = '/' . $langcode . $node_href;
+      }
+      $pattern = '|' . $expected_href . '$|';
+      foreach ($this->xpath("//a[text()='Read more']") as $link) {
+        if (preg_match($pattern, (string) $link['href'], $matches) == TRUE) {
+          $match_found = TRUE;
+        }
+      }
+      $this->assertTrue($match_found, 'There is a Read more link for the ' . $langcode . ' translation of a node on the frontpage.');
+    }
+
     // Test that the node page displays the correct translations.
     $this->doTestTranslations('node/' . $node->id(), $values);
   }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index c97851e..6ef1808 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -658,7 +658,9 @@ function template_preprocess_node(&$variables) {
   );
   $variables['name'] = drupal_render($username);
 
-  $variables['node_url'] = $node->url();
+  $variables['node_url'] = $node->url('canonical', array(
+    'language' => $node->language(),
+  ));
   $variables['label'] = $variables['elements']['title'];
   unset($variables['elements']['title']);
   $variables['page'] = $variables['view_mode'] == 'full' && node_is_page($node);
