diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index f63b1a0..99519dc 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -206,6 +206,15 @@ public function getRevisionId() {
    * {@inheritdoc}
    */
   public function isTranslatable() {
+    // Check that the bundle is translatable, the entity has a language defined
+    // and if we have more than one language on the site.
+    return $this->isBundleTranslatable() && empty($this->getUntranslated()->language()->locked) && \Drupal::languageManager()->isMultilingual();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isBundleTranslatable() {
     $bundles = $this->entityManager()->getBundleInfo($this->entityTypeId);
     return !empty($bundles[$this->bundle()]['translatable']);
   }
diff --git a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
index af66bfe..1827edf 100644
--- a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
@@ -91,11 +91,19 @@ public function addTranslation($langcode, array $values = array());
   public function removeTranslation($langcode);
 
   /**
-   * Returns the translation support status.
+   * Returns the translation support status of the entity.
    *
    * @return bool
    *   TRUE if the object has translation support enabled.
    */
   public function isTranslatable();
 
+  /**
+   * Returns the translation support status of the bundle.
+   *
+   * @return bool
+   *   TRUE if the bundle of the object has translation support enabled.
+   */
+  public function isBundleTranslatable();
+
 }
diff --git a/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php b/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
index bd93abb..8afbd89 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
@@ -248,7 +248,7 @@ protected static function buildLinks(CommentInterface $entity, EntityInterface $
     }
 
     // Add translations link for translation-enabled comment bundles.
-    if ($container->get('module_handler')->moduleExists('content_translation') && content_translation_translate_access($entity)) {
+    if ($container->get('module_handler')->moduleExists('content_translation') && $entity->isTranslatable() && content_translation_translate_access($entity)) {
       $links['comment-translations'] = array(
         'title' => t('Translate'),
         'href' => 'comment/' . $entity->id() . '/translations',
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 95cd875..2613b6a 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -274,9 +274,8 @@ function _content_translation_menu_strip_loaders($path) {
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity whose translation overview should be displayed.
  */
-function content_translation_translate_access(EntityInterface $entity) {
-  return $entity instanceof ContentEntityInterface && empty($entity->getUntranslated()->language()->locked) && \Drupal::languageManager()->isMultilingual() && $entity->isTranslatable() &&
-    (user_access('create content translations') || user_access('update content translations') || user_access('delete content translations'));
+function content_translation_translate_access(ContentEntityInterface $entity) {
+  return (user_access('create content translations') || user_access('update content translations') || user_access('delete content translations'));
 }
 
 /**
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php b/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php
index ef1157e..ad6784f 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php
@@ -40,7 +40,7 @@ public function __construct(EntityManagerInterface $manager) {
    */
   public function access(Route $route, Request $request, AccountInterface $account) {
     $entity_type = $request->attributes->get('_entity_type_id');
-    if ($entity = $request->attributes->get($entity_type)) {
+    if (($entity = $request->attributes->get($entity_type)) && $entity->isTranslatable()) {
       // Get entity base info.
       $bundle = $entity->bundle();
 
@@ -48,8 +48,8 @@ public function access(Route $route, Request $request, AccountInterface $account
       $definition = $this->entityManager->getDefinition($entity_type);
       $translation = $definition->get('translation');
       $access_callback = $translation['content_translation']['access_callback'];
-      if (!call_user_func($access_callback, $entity)) {
-        return static::DENY;
+      if (call_user_func($access_callback, $entity)) {
+        return static::ALLOW;
       }
 
       // Check "translate any entity" permission.
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/views/field/TranslationLink.php b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/views/field/TranslationLink.php
index 999abf4..d316b92 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/views/field/TranslationLink.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/views/field/TranslationLink.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\content_translation\Plugin\views\field;
 
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\views\Plugin\views\field\FieldPluginBase;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\views\ResultRow;
@@ -60,7 +61,7 @@ public function render(ResultRow $values) {
    *   The actual rendered text (without the link) of this field.
    */
   protected function renderLink(EntityInterface $entity, ResultRow $values) {
-    if (content_translation_translate_access($entity)) {
+    if ($entity instanceof ContentEntityInterface && $entity->isTranslatable() && content_translation_translate_access($entity)) {
       $text = !empty($this->options['text']) ? $this->options['text'] : t('translate');
 
       $this->options['alter']['make_link'] = TRUE;
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationContextualLinksTest.php b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationContextualLinksTest.php
index 9f4ef8f..4222c40 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationContextualLinksTest.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationContextualLinksTest.php
@@ -83,17 +83,17 @@ function setUp() {
     content_translation_set_config('node', $this->bundle, 'enabled', TRUE);
     drupal_static_reset();
     entity_info_cache_clear();
-    menu_router_rebuild();
+    \Drupal::service('router.builder')->rebuild();
 
     // Add a translatable field to the content type.
-    entity_create('field_entity', array(
+    entity_create('field_config', array(
       'name' => 'field_test_text',
       'entity_type' => 'node',
       'type' => 'text',
       'cardinality' => 1,
       'translatable' => TRUE,
     ))->save();
-    entity_create('field_instance', array(
+    entity_create('field_instance_config', array(
       'entity_type' => 'node',
       'field_name' => 'field_test_text',
       'bundle' => $this->bundle,
@@ -129,7 +129,7 @@ function setUp() {
   public function testContentTranslationContextualLinks() {
     // Create a node.
     $title = $this->randomString();
-    $this->drupalCreateNode(array('type' => $this->bundle, 'title' => $title));
+    $this->drupalCreateNode(array('type' => $this->bundle, 'title' => $title, 'langcode' => language_default()->id));
     $node = $this->drupalGetNodeByTitle($title);
 
     // Check that the translate link appears on the node page.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/OverviewTerms.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/OverviewTerms.php
index 13c8d2e..b1145b2 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/OverviewTerms.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/OverviewTerms.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\taxonomy\Form;
 
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\taxonomy\VocabularyInterface;
@@ -264,7 +265,7 @@ public function buildForm(array $form, array &$form_state, VocabularyInterface $
           'query' => $destination,
         ) + $term->urlInfo('delete-form'),
       );
-      if ($this->moduleHandler->moduleExists('content_translation') && content_translation_translate_access($term)) {
+      if ($this->moduleHandler->moduleExists('content_translation') && $term instanceof ContentEntityInterface && $term->isTranslatable() && content_translation_translate_access($term)) {
         $operations['translate'] = array(
           'title' => $this->t('translate'),
           'query' => $destination,
