diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 40da4b8..82f9c51 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -124,6 +124,17 @@
   protected $translationInitialize = FALSE;
 
   /**
+   * An array of entity translations marked as modified.
+   *
+   * An associative array keyed by translation language code - like $values and
+   * $translations. As soon as a language code exists as array key, we consider
+   * the translation as dirty.
+   *
+   * @var array
+   */
+  protected $dirtyTranslations = array();
+
+  /**
    * Boolean indicating whether a new revision should be created on save.
    *
    * @var bool
@@ -592,6 +603,36 @@ public function onChange($name) {
         }
         break;
     }
+
+    // @todo This detection of modifications is just a proof-of-concept
+    // and might be far away from being robust.
+    $value = $this->{$name}->getValue();
+    if (!$this->getFieldDefinition($name)->isTranslatable() ||
+      (isset($value[0]['value']) && isset($this->values[$name][$this->activeLangcode][0]['value']) &&
+      $value[0]['value'] != $this->values[$name][$this->activeLangcode][0]['value'])
+    ) {
+      // A Translation is marked dirty if the translated value of a translatable
+      // field changed. In addition we need to mark a translation as dirty if
+      // a non-translatable field has been changed during editing a translation
+      // of the entity.
+      $this->dirtyTranslations[$this->activeLangcode] = TRUE;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isTranslationDirty($langcode = NULL) {
+    if (!$langcode) {
+      $langcode = $this->activeLangcode;
+    }
+    // Ensure we always use the default language code when dealing with the
+    // original entity language.
+    elseif ($langcode != LanguageInterface::LANGCODE_DEFAULT && $langcode == $this->defaultLangcode) {
+      $langcode = LanguageInterface::LANGCODE_DEFAULT;
+    }
+
+    return isset($this->dirtyTranslations[$langcode]);
   }
 
   /**
@@ -728,6 +769,7 @@ public function addTranslation($langcode, array $values = array()) {
     $values[$this->defaultLangcodeKey] = FALSE;
 
     $this->translations[$langcode]['status'] = static::TRANSLATION_CREATED;
+    $this->dirtyTranslations[$langcode] = TRUE;
     $translation = $this->getTranslation($langcode);
     $definitions = $translation->getFieldDefinitions();
 
@@ -752,6 +794,7 @@ public function removeTranslation($langcode) {
         }
       }
       $this->translations[$langcode]['status'] = static::TRANSLATION_REMOVED;
+      unset($this->dirtyTranslations[$langcode]);
     }
     else {
       $message = 'The specified translation (@langcode) cannot be removed.';
@@ -1020,4 +1063,14 @@ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type,
     return array();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function save() {
+    $result = parent::save();
+    // Reset all dirty flags after successful save.
+    $this->dirtyTranslations = array();
+    return $result;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index 657a599..b4baa5c 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -38,4 +38,13 @@
    */
   public function initTranslation($langcode);
 
+  /**
+   * Determines if a translation has been modified.
+   *
+   * @param string $langcode
+   *   The language code identifying the translation.
+   *   If not set, the entity's internal current active language is used.
+   */
+  public function isTranslationDirty($langcode = NULL);
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityChangedInterface.php b/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
index f5ee395..b2c6bf3 100644
--- a/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
@@ -24,9 +24,12 @@
   /**
    * Returns the timestamp of the last entity change.
    *
+   * @param bool $across_translations
+   *   Whether to get the latest changed time across all translations.
+   *
    * @return int
    *   The timestamp of the last entity save operation.
    */
-  public function getChangedTime();
+  public function getChangedTime($across_translations = FALSE);
 
 }
diff --git a/core/lib/Drupal/Core/Entity/Exception/EntityChangedTranslationException.php b/core/lib/Drupal/Core/Entity/Exception/EntityChangedTranslationException.php
new file mode 100644
index 0000000..3cba3cb
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Exception/EntityChangedTranslationException.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Exception\EntityTranslationChangedException.
+ */
+
+namespace Drupal\Core\Entity\Exception;
+
+/**
+ * Exception thrown on erroneous usage of entity translation changed timestamps.
+ */
+class EntityChangedTranslationException extends \Exception {
+}
diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
index fe81a63..6085e79 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
@@ -24,7 +24,7 @@ public function validate($entity, Constraint $constraint) {
       if (!$entity->isNew()) {
         $saved_entity = \Drupal::entityManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
 
-        if ($saved_entity && $saved_entity->getChangedTime() > $entity->getChangedTime()) {
+        if ($saved_entity && $saved_entity->getChangedTime(TRUE) > $entity->getChangedTime()) {
           $this->context->addViolation($constraint->message);
         }
       }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
index 81625d4..9ac44a0 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -6,6 +6,7 @@
  */
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
+use Drupal\Core\Entity\ContentEntityInterface;
 
 /**
  * Defines the 'changed' entity field type.
@@ -30,7 +31,35 @@ class ChangedItem extends CreatedItem {
    */
   public function preSave() {
     parent::preSave();
-    $this->value = REQUEST_TIME;
+
+    $entity = $this->getEntity();
+    if ($entity->isNew() || !$this->getFieldDefinition()->isTranslatable()) {
+      $this->value = REQUEST_TIME;
+    }
+    else {
+      $field_name = $this->getFieldDefinition()->getName();
+      $original = clone $entity->original;
+      if ($this->getFieldDefinition()->isTranslatable()) {
+        $original = $original->getTranslation($entity->language()->getId());
+      }
+      // If the timestamp has not been set explicitly auto detect a modification
+      // of the current translation and set the timestamp if needed.
+      // An example of setting the timestamp explicitly is
+      // \Drupal\content_translation\ContentTranslationMetadataWrapperInterface
+      if ($this->value == $original->{$field_name}->value) {
+        if (($entity instanceof ContentEntityInterface)) {
+          if ($entity->isTranslationDirty($entity->language()->getId())) {
+            $this->value = REQUEST_TIME;
+          }
+        }
+        else {
+          // @todo is this field or its code re-usable for something else than
+          // ContentEntities? However the default behavior is to set the current
+          // REQUEST_TIME as value on save.
+          $this->value = REQUEST_TIME;
+        }
+      }
+    }
   }
 
 }
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index 046640c..6bd6afd 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\Exception\EntityChangedTranslationException;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\block_content\BlockContentInterface;
 
@@ -210,7 +211,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = TRUE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/comment/src/CommentInterface.php b/core/modules/comment/src/CommentInterface.php
index c141706..b31c04a 100644
--- a/core/modules/comment/src/CommentInterface.php
+++ b/core/modules/comment/src/CommentInterface.php
@@ -199,10 +199,13 @@ public function setCreatedTime($created);
   /**
    * Returns the timestamp of when the comment was updated.
    *
+   * @param bool $across_translations
+   *   Whether to get the latest changed time across all translations.
+   *
    * @return int
    *   The timestamp of when the comment was updated.
    */
-  public function getChangedTime();
+  public function getChangedTime($across_translations = FALSE);
 
   /**
    * Checks if the comment is published.
diff --git a/core/modules/comment/src/CommentStatistics.php b/core/modules/comment/src/CommentStatistics.php
index 588c831..34ee356 100644
--- a/core/modules/comment/src/CommentStatistics.php
+++ b/core/modules/comment/src/CommentStatistics.php
@@ -127,7 +127,7 @@ public function create(FieldableEntityInterface $entity, $fields) {
       // Default to REQUEST_TIME when entity does not have a changed property.
       $last_comment_timestamp = REQUEST_TIME;
       if ($entity instanceof EntityChangedInterface) {
-        $last_comment_timestamp = $entity->getChangedTime();
+        $last_comment_timestamp = $entity->getChangedTime(TRUE);
       }
       $query->values(array(
         'entity_id' => $entity->id(),
@@ -243,9 +243,9 @@ public function update(CommentInterface $comment) {
         ->fields(array(
           'cid' => 0,
           'comment_count' => 0,
-          // Use the created date of the entity if it's set, or default to
+          // Use the changed date of the entity if it's set, or default to
           // REQUEST_TIME.
-          'last_comment_timestamp' => ($entity instanceof EntityChangedInterface) ? $entity->getChangedTime() : REQUEST_TIME,
+          'last_comment_timestamp' => ($entity instanceof EntityChangedInterface) ? $entity->getChangedTime(TRUE) : REQUEST_TIME,
           'last_comment_name' => '',
           'last_comment_uid' => $last_comment_uid,
         ))
diff --git a/core/modules/comment/src/CommentStorage.php b/core/modules/comment/src/CommentStorage.php
index b4977fa..af8e4eb 100644
--- a/core/modules/comment/src/CommentStorage.php
+++ b/core/modules/comment/src/CommentStorage.php
@@ -337,4 +337,13 @@ public function getUnapprovedCount() {
       ->fetchField();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getChangedTimeAcrossTranslations(CommentInterface $comment) {
+    return $this->database->query('SELECT MAX(changed) FROM {comment_field_data} WHERE cid = :cid',
+      array(':cid' => $comment->id())
+    )->fetchField();
+  }
+
 }
diff --git a/core/modules/comment/src/CommentStorageInterface.php b/core/modules/comment/src/CommentStorageInterface.php
index 5be4776..a52051e 100644
--- a/core/modules/comment/src/CommentStorageInterface.php
+++ b/core/modules/comment/src/CommentStorageInterface.php
@@ -115,4 +115,15 @@ public function loadThread(EntityInterface $entity, $field_name, $mode, $comment
    */
   public function getUnapprovedCount();
 
+  /**
+   * Retrieves the latest change time for a comment across all translations.
+   *
+   * @param \Drupal\comment\CommentInterface $comment
+   *   The comment.
+   *
+   * @return int
+   *   The latest changed time across all translations.
+   */
+  public function getChangedTimeAcrossTranslations(CommentInterface $comment);
+
 }
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index 909abc3..ce6eb4a 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -516,7 +516,11 @@ public function setThread($thread) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = FALSE) {
+    if ($across_translations) {
+      return $this->entityManager()->getStorage($this->getEntityTypeId())
+        ->getChangedTimeAcrossTranslations($this);
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/comment/src/Form/CommentAdminOverview.php b/core/modules/comment/src/Form/CommentAdminOverview.php
index 8db0ed3..e20d55c 100644
--- a/core/modules/comment/src/Form/CommentAdminOverview.php
+++ b/core/modules/comment/src/Form/CommentAdminOverview.php
@@ -213,7 +213,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $type = '
             '#url' => $commented_entity->urlInfo(),
           ),
         ),
-        'changed' => $this->dateFormatter->format($comment->getChangedTime(), 'short'),
+        'changed' => $this->dateFormatter->format($comment->getChangedTime(TRUE), 'short'),
       );
       $comment_uri_options = $comment->urlInfo()->getOptions();
       $links = array();
diff --git a/core/modules/comment/src/Tests/CommentTokenReplaceTest.php b/core/modules/comment/src/Tests/CommentTokenReplaceTest.php
index a5eaad8..0d9f16f 100644
--- a/core/modules/comment/src/Tests/CommentTokenReplaceTest.php
+++ b/core/modules/comment/src/Tests/CommentTokenReplaceTest.php
@@ -61,7 +61,7 @@ function testCommentTokenReplacement() {
     $tests['[comment:url]'] = $comment->url('canonical', $url_options + array('fragment' => 'comment-' . $comment->id()));
     $tests['[comment:edit-url]'] = $comment->url('edit-form', $url_options);
     $tests['[comment:created:since]'] = \Drupal::service('date.formatter')->formatInterval(REQUEST_TIME - $comment->getCreatedTime(), 2, $language_interface->getId());
-    $tests['[comment:changed:since]'] = \Drupal::service('date.formatter')->formatInterval(REQUEST_TIME - $comment->getChangedTime(), 2, $language_interface->getId());
+    $tests['[comment:changed:since]'] = \Drupal::service('date.formatter')->formatInterval(REQUEST_TIME - $comment->getChangedTime(TRUE), 2, $language_interface->getId());
     $tests['[comment:parent:cid]'] = $comment->hasParentComment() ? $comment->getParentComment()->id() : NULL;
     $tests['[comment:parent:title]'] = SafeMarkup::checkPlain($parent_comment->getSubject());
     $tests['[comment:entity]'] = SafeMarkup::checkPlain($node->getTitle());
diff --git a/core/modules/content_translation/src/ContentTranslationMetadataWrapper.php b/core/modules/content_translation/src/ContentTranslationMetadataWrapper.php
index 4b4d43e..3de07ef 100644
--- a/core/modules/content_translation/src/ContentTranslationMetadataWrapper.php
+++ b/core/modules/content_translation/src/ContentTranslationMetadataWrapper.php
@@ -129,7 +129,13 @@ public function setCreatedTime($timestamp) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = FALSE) {
+    if ($across_translations) {
+      throw new EntityChangedTranslationException(
+        'The changed time across all translations is not accessible via the ContentTranslationMetadataWrapperInterface'
+      );
+
+    }
     return $this->translation->hasField('content_translation_changed') ? $this->translation->get('content_translation_changed')->value : $this->translation->getChangedTime();
   }
 
diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php
index 42de0ae..a571602 100644
--- a/core/modules/file/src/Entity/File.php
+++ b/core/modules/file/src/Entity/File.php
@@ -111,7 +111,14 @@ public function getCreatedTime() {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = TRUE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index 5570a2a..119ad7e 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -132,7 +132,14 @@ public function getWeight() {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = TRUE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index f3ca7d0..bfe7a46 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -751,7 +751,14 @@ function node_page_title(NodeInterface $node) {
  *       for validation, which will be done by EntityChangedConstraintValidator.
  */
 function node_last_changed($nid, $langcode = NULL) {
-  $changed = \Drupal::entityManager()->getStorage('node')->loadUnchanged($nid)->getChangedTime();
+  $changed = FALSE;
+  $node =  \Drupal::entityManager()->getStorage('node')->loadUnchanged($nid);
+  if ($langcode) {
+    $changed = $node->getTranslation($langcode)->getChangedTime();
+  }
+  else {
+    $changed = $node->getChangedTime(TRUE);
+  }
   return $changed ? $changed : FALSE;
 }
 
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 2621d82..9ca6a34 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -217,7 +217,23 @@ public function setCreatedTime($timestamp) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = FALSE) {
+    if ($across_translations) {
+      if (!$this->isNew() && !$this->isNewRevision() && $this->getRevisionId()) {
+        return $this->entityManager()->getStorage($this->getEntityTypeId())
+          ->getChangedTimeAcrossTranslations($this);
+      }
+      else {
+        $changed = $this->get('changed')->value;
+        foreach ($this->getTranslationLanguages(FALSE) as $language) {
+          $changed_tmp = $this->getTranslation($language->getId())->getChangedTime();
+          if ($changed_tmp > $changed) {
+            $changed = $changed_tmp;
+          }
+        }
+        return $changed;
+      }
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 44fccbf..dc4721b 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -289,7 +289,7 @@ protected function actions(array $form, FormStateInterface $form_state) {
   public function validate(array $form, FormStateInterface $form_state) {
     $node = parent::validate($form, $form_state);
 
-    if ($node->id() && (node_last_changed($node->id(), $this->getFormLangcode($form_state)) > $node->getChangedTime())) {
+    if ($node->id() && (node_last_changed($node->id()) > $node->getChangedTime(TRUE))) {
       $form_state->setErrorByName('changed', $this->t('The content on this page has either been modified by another user, or you have already submitted modifications using this form. As a result, your changes cannot be saved.'));
     }
 
diff --git a/core/modules/node/src/NodeStorage.php b/core/modules/node/src/NodeStorage.php
index 830fc32..0baf905 100644
--- a/core/modules/node/src/NodeStorage.php
+++ b/core/modules/node/src/NodeStorage.php
@@ -66,4 +66,13 @@ public function clearRevisionsLanguage(LanguageInterface $language) {
       ->execute();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getChangedTimeAcrossTranslations(NodeInterface $node) {
+    return $this->database->query('SELECT MAX(changed) FROM {node_field_revision} WHERE vid = :vid',
+      array(':vid' => $node->getRevisionId())
+    )->fetchField();
+  }
+
 }
diff --git a/core/modules/node/src/NodeStorageInterface.php b/core/modules/node/src/NodeStorageInterface.php
index 1ca7fab..66df1b2 100644
--- a/core/modules/node/src/NodeStorageInterface.php
+++ b/core/modules/node/src/NodeStorageInterface.php
@@ -69,4 +69,16 @@ public function updateType($old_type, $new_type);
    *  The language object.
    */
   public function clearRevisionsLanguage(LanguageInterface $language);
+
+  /**
+   * Retrieves the latest change time for a node across all translations.
+   *
+   * @param \Drupal\node\NodeInterface $node
+   *   The node.
+   *
+   * @return int
+   *   The latest changed time across all translations.
+   */
+  public function getChangedTimeAcrossTranslations(NodeInterface $node);
+
 }
diff --git a/core/modules/node/src/Tests/NodeLastChangedTest.php b/core/modules/node/src/Tests/NodeLastChangedTest.php
index 4444cc1..094631b 100644
--- a/core/modules/node/src/Tests/NodeLastChangedTest.php
+++ b/core/modules/node/src/Tests/NodeLastChangedTest.php
@@ -38,7 +38,7 @@ function testNodeLastChanged() {
 
     // Test node last changed timestamp.
     $changed_timestamp = node_last_changed($node->id());
-    $this->assertEqual($changed_timestamp, $node->getChangedTime(), 'Expected last changed timestamp returned.');
+    $this->assertEqual($changed_timestamp, $node->getChangedTime(TRUE), 'Expected last changed timestamp returned.');
 
     $changed_timestamp = node_last_changed($node->id(), $node->language()->getId());
     $this->assertEqual($changed_timestamp, $node->getChangedTime(), 'Expected last changed timestamp returned.');
diff --git a/core/modules/node/src/Tests/NodeSaveTest.php b/core/modules/node/src/Tests/NodeSaveTest.php
index c9dc9c0..d1dafb5 100644
--- a/core/modules/node/src/Tests/NodeSaveTest.php
+++ b/core/modules/node/src/Tests/NodeSaveTest.php
@@ -130,7 +130,10 @@ function testTimestamps() {
     $node->save();
     $node = $this->drupalGetNodeByTitle($edit['title'], TRUE);
     $this->assertEqual($node->getCreatedTime(), 979534800, 'Updating a node uses user-set "created" timestamp.');
-    $this->assertNotEqual($node->getChangedTime(), 280299600, 'Updating a node does not use user-set "changed" timestamp.');
+    // Allowing setting changed timestamps is required see
+    // Drupal\content_translation\ContentTranslationMetadataWrapper::setChangedTime($timestamp)
+    // for example
+    $this->assertEqual($node->getChangedTime(), 280299600, 'Updating a node uses user-set "changed" timestamp.');
   }
 
   /**
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestConstraints.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestConstraints.php
index 9f92e7a..e985a0a 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestConstraints.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestConstraints.php
@@ -47,7 +47,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = FALSE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/taxonomy/src/Entity/Term.php b/core/modules/taxonomy/src/Entity/Term.php
index 7ca9dd7..22cc50a 100644
--- a/core/modules/taxonomy/src/Entity/Term.php
+++ b/core/modules/taxonomy/src/Entity/Term.php
@@ -186,7 +186,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = TRUE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 54a268b..ef8c869 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -406,7 +406,14 @@ public function setUsername($username) {
   /**
    * {@inheritdoc}
    */
-  public function getChangedTime() {
+  public function getChangedTime($across_translations = TRUE) {
+    if (!$across_translations) {
+      throw new EntityChangedTranslationException(
+        sprintf('The changed time of the %s entity type is not translatable.',
+          $this->getEntityTypeId()
+        )
+      );
+    }
     return $this->get('changed')->value;
   }
 
