diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php
index 6d8d619..cdcb4ae 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -8,6 +8,13 @@
 class ContentEntityType extends EntityType implements ContentEntityTypeInterface {
 
   /**
+   * An array of entity metadata keys.
+   *
+   * @var array
+   */
+  protected $entity_metadata_keys = [];
+
+  /**
    * {@inheritdoc}
    */
   public function __construct($definition) {
@@ -41,4 +48,33 @@ protected function checkStorageClass($class) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getEntityMetadataKey($key) {
+    $metadata_key = isset($this->entity_metadata_keys[$key]) ? $this->entity_metadata_keys[$key] : FALSE;
+    if (!$metadata_key) {
+      if ($key == 'changed' && (($class = $this->getClass()) && is_subclass_of($class, EntityChangedInterface::class))) {
+        @trigger_error('The changed entity metadata key is not set.', E_USER_DEPRECATED);
+        /** @var \Drupal\Core\Field\BaseFieldDefinition[] $base_field_definitions */
+        $base_field_definitions = $class::baseFieldDefinitions($this);
+        foreach ($base_field_definitions as $name => $base_field_definition) {
+          if ($base_field_definition->getType() == 'changed') {
+            $metadata_key = $name;
+            break;
+          }
+        }
+      }
+    }
+    return $metadata_key;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setEntityMetadataKey($key, $value) {
+    $this->entity_metadata_keys[$key] = $value;
+    return $this;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
index f9ef160..5382889 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityTypeInterface.php
@@ -6,4 +6,28 @@
  * Provides an interface for a content entity type and its metadata.
  */
 interface ContentEntityTypeInterface extends EntityTypeInterface {
+
+  /**
+   * Gets a specific entity metadata key.
+   *
+   * @param string $key
+   *   The name of the entity metadata key to return.
+   *
+   * @return string|bool
+   *   The entity key, or FALSE if it does not exist.
+   */
+  public function getEntityMetadataKey($key);
+
+  /**
+   * Sets a specific entity metadata key.
+   *
+   * @param string $key
+   *   The name of the entity metadata key to set.
+   * @param string $value
+   *   The value of the entity metadata key to set.
+   *
+   * @return $this
+   */
+  public function setEntityMetadataKey($key, $value);
+
 }
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 b1fee2a..0972559 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
@@ -15,12 +15,25 @@ class EntityChangedConstraintValidator extends ConstraintValidator {
    */
   public function validate($entity, Constraint $constraint) {
     if (isset($entity)) {
-      /** @var \Drupal\Core\Entity\EntityInterface $entity */
+      /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
       if (!$entity->isNew()) {
-        $saved_entity = \Drupal::entityManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
+        if ($changed_field_name = $entity->getEntityType()->getEntityMetadataKey('changed')) {
+          $saved_newer_entity = \Drupal::entityTypeManager()
+            ->getStorage($entity->getEntityTypeId())
+            ->getQuery()
+            ->condition($entity->getEntityType()->getKey('id'), $entity->id())
+            ->condition($changed_field_name, $entity->getChangedTimeAcrossTranslations(), '>')
+            ->count()
+            ->execute();
+        }
+        else {
+          @trigger_error('The changed entity metadata key is not set.', E_USER_DEPRECATED);
+          $saved_entity = \Drupal::entityManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
+          $saved_newer_entity = $saved_entity && $saved_entity->getChangedTimeAcrossTranslations() > $entity->getChangedTimeAcrossTranslations();
+        }
         // A change to any other translation must add a violation to the current
         // translation because there might be untranslatable shared fields.
-        if ($saved_entity && $saved_entity->getChangedTimeAcrossTranslations() > $entity->getChangedTimeAcrossTranslations()) {
+        if ($saved_newer_entity) {
           $this->context->addViolation($constraint->message);
         }
       }
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index 51ae6f6..758cf31 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -51,6 +51,9 @@
  *     "langcode" = "langcode",
  *     "uuid" = "uuid"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   bundle_entity_type = "block_content_type",
  *   field_ui_base_route = "entity.block_content_type.edit_form",
  *   render_cache = FALSE,
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index d52f04d..e244ee7 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -53,6 +53,9 @@
  *     "uuid" = "uuid",
  *     "published" = "status",
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   links = {
  *     "canonical" = "/comment/{comment}",
  *     "delete-form" = "/comment/{comment}/delete",
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 70413d9..43f4a02 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -119,7 +119,7 @@ function content_translation_language_types_info_alter(array &$language_types) {
  */
 function content_translation_entity_type_alter(array &$entity_types) {
   // Provide defaults for translation info.
-  /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
+  /** @var $entity_types \Drupal\Core\Entity\ContentEntityTypeInterface[] */
   foreach ($entity_types as $entity_type) {
     if ($entity_type->isTranslatable()) {
       if (!$entity_type->hasHandlerClass('translation')) {
@@ -153,6 +153,18 @@ function content_translation_entity_type_alter(array &$entity_types) {
         );
       }
       $entity_type->set('translation', $translation);
+
+      // Set the "changed" entity metadata key if not yet set.
+      if (!$entity_type->getEntityMetadataKey('changed')) {
+        $class = $entity_type->getClass();
+        // Retrieve base field definitions.
+        /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $base_field_definitions */
+        $base_field_definitions = $class::baseFieldDefinitions($entity_type);
+        if (!isset($base_field_definitions['changed'])) {
+          $entity_type->setEntityMetadataKey('changed', 'content_translation_changed');
+        }
+      }
+
     }
   }
 }
diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php
index cd7a658..c03dc25 100644
--- a/core/modules/file/src/Entity/File.php
+++ b/core/modules/file/src/Entity/File.php
@@ -30,6 +30,9 @@
  *     "label" = "filename",
  *     "langcode" = "langcode",
  *     "uuid" = "uuid"
+ *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
  *   }
  * )
  */
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index d23f876..75f0837 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -39,6 +39,9 @@
  *     "uuid" = "uuid",
  *     "bundle" = "bundle"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   links = {
  *     "canonical" = "/admin/structure/menu/item/{menu_link_content}/edit",
  *     "edit-form" = "/admin/structure/menu/item/{menu_link_content}/edit",
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 68afc83..d5984b6 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -60,6 +60,9 @@
  *     "published" = "status",
  *     "uid" = "uid",
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   bundle_entity_type = "node_type",
  *   field_ui_base_route = "entity.node_type.edit_form",
  *   common_reference_target = TRUE,
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 a91e2cb..de2c8ae 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
@@ -19,6 +19,9 @@
  *     "bundle" = "type",
  *     "label" = "name"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   base_table = "entity_test_constraints",
  *   persistent_cache = FALSE,
  *   constraints = {
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulChanged.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulChanged.php
index 5fbc408..c955796 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulChanged.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulChanged.php
@@ -36,6 +36,9 @@
  *     "label" = "name",
  *     "langcode" = "langcode"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   links = {
  *     "add-form" = "/entity_test_mul_changed/add",
  *     "canonical" = "/entity_test_mul_changed/manage/{entity_test_mul_changed}",
diff --git a/core/modules/taxonomy/src/Entity/Term.php b/core/modules/taxonomy/src/Entity/Term.php
index c8ef06e..462c436 100644
--- a/core/modules/taxonomy/src/Entity/Term.php
+++ b/core/modules/taxonomy/src/Entity/Term.php
@@ -39,6 +39,9 @@
  *     "langcode" = "langcode",
  *     "uuid" = "uuid"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   bundle_entity_type = "taxonomy_vocabulary",
  *   field_ui_base_route = "entity.taxonomy_vocabulary.overview_form",
  *   common_reference_target = TRUE,
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 062af44..6355be2 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -46,6 +46,9 @@
  *     "langcode" = "langcode",
  *     "uuid" = "uuid"
  *   },
+ *   entity_metadata_keys = {
+ *     "changed" = "changed",
+ *   },
  *   links = {
  *     "canonical" = "/user/{user}",
  *     "edit-form" = "/user/{user}/edit",
