diff --git a/core/lib/Drupal/Core/Entity/EntityChangedInterface.php b/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
index 5f031a3..2285da4 100644
--- a/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityChangedInterface.php
@@ -37,4 +37,21 @@ public function getChangedTime();
    *   translations.
    */
   public function getChangedTimeAcrossTranslations();
+
+  /**
+   * Determines if the entity has changes.
+   *
+   * @return bool
+   *   TRUE if the entity has changes, FALSE otherwise.
+   */
+  public function hasChanges();
+
+  /**
+   * Determines if the entity has changes across all translations.
+   *
+   * @return bool
+   *   TRUE if the entity has changes across translations, FALSE otherwise.
+   */
+  public function hasChangesAcrossTranslations();
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityChangedTrait.php b/core/lib/Drupal/Core/Entity/EntityChangedTrait.php
index 5b34d1a..9b735f9 100644
--- a/core/lib/Drupal/Core/Entity/EntityChangedTrait.php
+++ b/core/lib/Drupal/Core/Entity/EntityChangedTrait.php
@@ -28,4 +28,67 @@ public function getChangedTimeAcrossTranslations() {
     return $changed;
   }
 
+  /**
+   * Determines if the entity has changes.
+   *
+   * @return bool
+   *   TRUE if the entity has changes, FALSE otherwise.
+   */
+  public function hasChanges() {
+    static $original = NULL;
+
+    if ($this->isNew()) {
+      return TRUE;
+    }
+
+    if ($this->original) {
+      // This property only exists during save. See
+      // Drupal\Core\Entity\EntityStorageBase::save(). Clone $entity->original
+      // to avoid modifying it when calling getTranslation() later within this
+      // method. We always have to replace the static $original because we could
+      // not detected here if the entity is stored multiple times.
+      $original = clone $this->original;
+    }
+
+    if (!$original) {
+      $id = ($this->getOriginalId() !== NULL) ? $this->getOriginalId() : $this->id();
+      // $original will be reset if $this->original is set during save().
+      $original = \Drupal::entityManager()->getStorage($this->getEntityTypeId())->loadUnchanged($id);
+    }
+
+    $translatable = $this->isTranslatable();
+    if ($translatable) {
+      $original = $original->getTranslation($this->language()->getId());
+    }
+
+    foreach ($this->getFieldDefinitions() as $other_field_name => $other_field_definition) {
+      if (!$other_field_definition->isComputed() && (!$translatable || $other_field_definition->isTranslatable())) {
+        $items = $this->get($other_field_name)->filterEmptyItems();
+        $original_items = $original->get($other_field_name)->filterEmptyItems();
+        if (!$items->equals($original_items)) {
+          return TRUE;
+        }
+      }
+    }
+
+    return FALSE;
+  }
+
+  /**
+   * Determines if the entity has changes across all translations.
+   *
+   * @return bool
+   *   TRUE if the entity has changes across translations, FALSE otherwise.
+   */
+  public function hasChangesAcrossTranslations() {
+    foreach ($this->getTranslations() as $language) {
+      $translation = $this->getTranslation($language->getId());
+      if ($translation->hasChanges()) {
+        return TRUE;
+      }
+    }
+
+    return FALSE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedFlagItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedFlagItem.php
new file mode 100644
index 0000000..114826f
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedFlagItem.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Plugin\Field\FieldType\ChangedFlagItem.
+ */
+
+namespace Drupal\Core\Field\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldItemBase;
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\TypedData\DataDefinition;
+
+/**
+ * Defines the 'changed_flag' field type.
+ *
+ * @FieldType(
+ *   id = "changed_flag",
+ *   label = @Translation("Changed Flag"),
+ *   description = @Translation("Indicates if a translation is edited in a revision."),
+ *   no_ui = TRUE,
+ *   default_formatter = "boolean"
+ * )
+ */
+class ChangedFlagItem extends FieldItemBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave() {
+    parent::preSave();
+
+    $entity = $this->getEntity();
+
+    if ($entity->isNew()) {
+      $this->value = 1;
+    }
+    elseif (!$this->value || $entity->isNewRevision()) {
+      $this->value = $entity->hasChanges();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    $properties['value'] = DataDefinition::create('boolean')
+      ->setLabel(t('Changed'))
+      ->setRequired(TRUE);
+
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldStorageDefinitionInterface $field_definition) {
+    return array(
+      'columns' => array(
+        'value' => array(
+          'type' => 'int',
+          'size' => 'tiny',
+        ),
+      ),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    parent::applyDefaultValue($notify);
+    // Created fields default to the current timestamp.
+    $this->setValue(array('value' => 0), $notify);
+    return $this;
+  }
+
+}
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 1a120f8..a474250 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -42,10 +42,6 @@ public function preSave() {
       // off if the changed timestamp is set manually before save, for example
       // during migrations or using
       // \Drupal\content_translation\ContentTranslationMetadataWrapperInterface::setChangedTime().
-      // @todo Knowing if the current translation was modified or not is
-      //   generally useful. There's a follow-up issue to reduce the nesting
-      //   here and to offer an accessor for this information. See
-      //   https://www.drupal.org/node/2453153
       $entity = $this->getEntity();
       if (!$entity->isNew()) {
         $field_name = $this->getFieldDefinition()->getName();
@@ -56,17 +52,9 @@ public function preSave() {
         if ($translatable) {
           $original = $original->getTranslation($entity->language()->getId());
         }
-        if ($this->value == $original->get($field_name)->value) {
-          foreach ($entity->getFieldDefinitions() as $other_field_name => $other_field_definition) {
-            if ($other_field_name != $field_name && !$other_field_definition->isComputed() && (!$translatable || $other_field_definition->isTranslatable())) {
-              $items = $entity->get($other_field_name)->filterEmptyItems();
-              $original_items = $original->get($other_field_name)->filterEmptyItems();
-              if (!$items->equals($original_items)) {
-                $this->value = REQUEST_TIME;
-                break;
-              }
-            }
-          }
+
+        if ($this->value == $original->get($field_name)->value && $entity->hasChanges()) {
+          $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 82e16f5..5105c2e 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -208,6 +208,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setTranslatable(TRUE)
       ->setRevisionable(TRUE);
 
+    $fields['revision_last_affected'] = BaseFieldDefinition::create('changed_flag')
+      ->setLabel(t('Revision last affected'))
+      ->setDescription(t('Indicates if the last edit belongs to current revison.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     return $fields;
   }
 
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 6dd1229..c5f4f5c 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -494,6 +494,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         ),
       ));
 
+    $fields['revision_last_affected'] = BaseFieldDefinition::create('changed_flag')
+      ->setLabel(t('Revision last affected'))
+      ->setDescription(t('Indicates if the last edit belongs to current revison.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     return $fields;
   }
 
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index dd44c1f..f3409d0 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -185,7 +185,7 @@ function entity_test_entity_bundle_info() {
   $entity_types = \Drupal::entityManager()->getDefinitions();
   foreach ($entity_types as $entity_type_id => $entity_type) {
     if ($entity_type->getProvider() == 'entity_test') {
-      $bundles[$entity_type_id] = \Drupal::state()->get($entity_type_id . '.bundles') ?: array($entity_type_id => array('label' => 'Entity Test Bundle'));
+      $bundles[$entity_type_id] = \Drupal::state()->get($entity_type_id . '.bundles') ?: array($entity_type_id => array('label' => 'Entity Test Bundle', 'translatable' => strpos($entity_type_id, '_mul')));
     }
   }
   return $bundles;
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
index c2f572f..517514b 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
@@ -61,6 +61,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
+    $fields['revision_last_affected'] = BaseFieldDefinition::create('changed_flag')
+      ->setLabel(t('Revision last affected'))
+      ->setDescription(t('Indicates if the last edit belongs to current revison.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     $fields['langcode']->setRevisionable(TRUE);
     $fields['name']->setRevisionable(TRUE);
     $fields['user_id']->setRevisionable(TRUE);
