diff --git a/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php b/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php
index 54c61fc..b84ce82 100644
--- a/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php
+++ b/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php
@@ -98,6 +98,9 @@ public function access(Route $route, RouteMatchInterface $route_match, AccountIn
       /* @var \Drupal\content_translation\ContentTranslationHandlerInterface $handler */
       $handler = $this->entityManager->getHandler($entity->getEntityTypeId(), 'translation');
 
+      // Reload unchanged entity to get stored translation only.
+      $entity = $this->entityManager->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
+
       // Load translation.
       $translations = $entity->getTranslationLanguages();
       $languages = $this->languageManager->getLanguages();
diff --git a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
index ebdf562..a30c191 100644
--- a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
@@ -87,8 +87,6 @@ protected function alterRoutes(RouteCollection $collection) {
         $path . '/add/{source}/{target}',
         array(
           '_controller' => '\Drupal\content_translation\Controller\ContentTranslationController::add',
-          'source' => NULL,
-          'target' => NULL,
           '_title' => 'Add',
           'entity_type_id' => $entity_type_id,
 
@@ -118,7 +116,6 @@ protected function alterRoutes(RouteCollection $collection) {
         $path . '/edit/{language}',
         array(
           '_controller' => '\Drupal\content_translation\Controller\ContentTranslationController::edit',
-          'language' => NULL,
           '_title' => 'Edit',
           'entity_type_id' => $entity_type_id,
         ),
@@ -143,7 +140,6 @@ protected function alterRoutes(RouteCollection $collection) {
         $path . '/delete/{language}',
         array(
           '_entity_form' => $entity_type_id . '.content_translation_deletion',
-          'language' => NULL,
           '_title' => 'Delete',
           'entity_type_id' => $entity_type_id,
         ),
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
index 1b79d13..f26f31f 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
@@ -113,6 +113,21 @@ protected function doTestBasicTranslation() {
       'source' => $default_langcode,
       'target' => $langcode
     ], array('language' => $language));
+
+    // Ensure that there are not 'Add' breadcrumbs.
+    $url_string = $add_url->toString();
+    $this->drupalGet($url_string);
+    $links = $this->xpath('//nav[@class="breadcrumb"]/ol/li/a[text()="Add"]');
+    $this->assert(empty($links), 'No "Add" breadcrumbs.');
+
+    // Ensure that removing the last two url parts does not yield a fatal error.
+    $url_parts = explode('/', $url_string);
+    for ($i = 0; $i < 2; $i++) {
+      array_pop($url_parts);
+      $this->drupalGet(implode('/', $url_parts));
+      $this->assertResponse(404);
+    }
+
     $this->drupalPostForm($add_url, $this->getEditValues($values, $langcode), $this->getFormSubmitActionForNewTranslation($entity, $langcode));
 
     // Assert that HTML is escaped in "all languages" in UI after SafeMarkup
diff --git a/core/modules/content_translation/tests/src/Unit/Access/ContentTranslationManageAccessCheckTest.php b/core/modules/content_translation/tests/src/Unit/Access/ContentTranslationManageAccessCheckTest.php
index 8cb5881..57c5f37 100644
--- a/core/modules/content_translation/tests/src/Unit/Access/ContentTranslationManageAccessCheckTest.php
+++ b/core/modules/content_translation/tests/src/Unit/Access/ContentTranslationManageAccessCheckTest.php
@@ -59,11 +59,49 @@ public function testCreateAccess() {
       ->method('getTranslationAccess')
       ->will($this->returnValue(AccessResult::allowed()));
 
+    // Set the mock entity. We need to use ContentEntityBase for mocking due to
+    // issues with phpunit and multiple interfaces.
+    $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity->expects($this->exactly(2))
+      ->method('getEntityTypeId')
+      ->willReturn('node');
+    $entity->expects($this->once())
+      ->method('getTranslationLanguages')
+      ->with()
+      ->will($this->returnValue(array()));
+    $entity->expects($this->once())
+      ->method('getCacheContexts')
+      ->willReturn([]);
+    $entity->expects($this->once())
+      ->method('getCacheMaxAge')
+      ->willReturn(Cache::PERMANENT);
+    $entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will($this->returnValue(array('node:1337')));
+    $entity->expects($this->once())
+      ->method('getCacheContexts')
+      ->willReturn(array());
+    $entity->expects($this->once())
+      ->method('id')
+      ->willReturn(1337);
+
+    $entity_storage = $this->getMock('\Drupal\Core\Entity\EntityStorageInterface');
+    $entity_storage->expects($this->once())
+      ->method('loadUnchanged')
+      ->with(1337)
+      ->willReturn($entity);
+
     $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
     $entity_manager->expects($this->once())
       ->method('getHandler')
       ->withAnyParameters()
       ->will($this->returnValue($translation_handler));
+    $entity_manager->expects($this->once())
+      ->method('getStorage')
+      ->with('node')
+      ->willReturn($entity_storage);
 
     // Set our source and target languages.
     $source = 'en';
@@ -87,30 +125,6 @@ public function testCreateAccess() {
       ->with($this->equalTo($target))
       ->will($this->returnValue(new Language(array('id' => 'it'))));
 
-    // Set the mock entity. We need to use ContentEntityBase for mocking due to
-    // issues with phpunit and multiple interfaces.
-    $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
-      ->disableOriginalConstructor()
-      ->getMock();
-    $entity->expects($this->once())
-      ->method('getEntityTypeId');
-    $entity->expects($this->once())
-      ->method('getTranslationLanguages')
-      ->with()
-      ->will($this->returnValue(array()));
-    $entity->expects($this->once())
-      ->method('getCacheContexts')
-      ->willReturn([]);
-    $entity->expects($this->once())
-      ->method('getCacheMaxAge')
-      ->willReturn(Cache::PERMANENT);
-    $entity->expects($this->once())
-      ->method('getCacheTags')
-      ->will($this->returnValue(array('node:1337')));
-    $entity->expects($this->once())
-      ->method('getCacheContexts')
-      ->willReturn(array());
-
     // Set the route requirements.
     $route = new Route('test_route');
     $route->setRequirement('_access_content_translation_manage', 'create');
diff --git a/core/modules/node/src/Controller/NodeViewController.php b/core/modules/node/src/Controller/NodeViewController.php
index ee84e6b..d6e6cdd 100644
--- a/core/modules/node/src/Controller/NodeViewController.php
+++ b/core/modules/node/src/Controller/NodeViewController.php
@@ -22,6 +22,11 @@ public function view(EntityInterface $node, $view_mode = 'full', $langcode = NUL
     $build = parent::view($node, $view_mode, $langcode);
 
     foreach ($node->uriRelationships() as $rel) {
+      // Whitelist links to remove content translation links.
+      if (!in_array($rel, ['canonical', 'delete-form', 'edit-form', 'version-history', 'revision'], TRUE)) {
+        continue;
+      }
+
       // Set the node path as the canonical URL to prevent duplicate content.
       $build['#attached']['html_head_link'][] = array(
         array(
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index a73f6fc..4ea2290 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -93,6 +93,11 @@ function taxonomy_page_attachments_alter(array &$page) {
   $route_match = \Drupal::routeMatch();
   if ($route_match->getRouteName() == 'entity.taxonomy_term.canonical' && ($term = $route_match->getParameter('taxonomy_term')) && $term instanceof TermInterface) {
     foreach ($term->uriRelationships() as $rel) {
+      // Whitelist links to remove content translation links.
+      if (!in_array($rel, ['canonical', 'delete-form', 'edit-form'], TRUE)) {
+        continue;
+      }
+
       // Set the URI relationships, like canonical.
       $page['#attached']['html_head_link'][] = array(
         array(
