diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index a9dd647..4c095ce 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -219,7 +219,6 @@ public function postCreate(EntityStorageInterface $storage) {
    * {@inheritdoc}
    */
   public function setNewRevision($value = TRUE) {
-
     if (!$this->getEntityType()->hasKey('revision')) {
       throw new \LogicException(SafeMarkup::format('Entity type @entity_type does not support revisions.', ['@entity_type' => $this->getEntityTypeId()]));
     }
@@ -228,7 +227,14 @@ public function setNewRevision($value = TRUE) {
       // When saving a new revision, set any existing revision ID to NULL so as
       // to ensure that a new revision will actually be created.
       $this->set($this->getEntityType()->getKey('revision'), NULL);
+
+      // Make sure that the flag tracking which translations are affected by the
+      // current revision is reset.
+      foreach ($this->translations as $langcode => $data) {
+        $this->getTranslation($langcode)->setRevisionTranslationAffected(NULL);
+      }
     }
+
     $this->newRevision = $value;
   }
 
@@ -253,6 +259,24 @@ public function isDefaultRevision($new_value = NULL) {
   /**
    * {@inheritdoc}
    */
+  public function isRevisionTranslationAffected() {
+    $field_name = 'revision_translation_affected';
+    return $this->hasField($field_name) ? $this->get($field_name)->value : TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRevisionTranslationAffected($affected) {
+    $field_name = 'revision_translation_affected';
+    if ($this->hasField($field_name)) {
+      $this->set($field_name, $affected);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isDefaultTranslation() {
     return $this->activeLangcode === LanguageInterface::LANGCODE_DEFAULT;
   }
@@ -680,6 +704,7 @@ protected function initializeTranslation($langcode) {
     $translation->fields = &$this->fields;
     $translation->translations = &$this->translations;
     $translation->enforceIsNew = &$this->enforceIsNew;
+    $translation->newRevision = &$this->newRevision;
     $translation->translationInitialize = FALSE;
     // Reset language-dependent properties.
     unset($translation->entityKeys['label']);
@@ -1012,4 +1037,54 @@ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type,
     return array();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function hasTranslationChanges() {
+    if ($this->isNew()) {
+      return TRUE;
+    }
+
+    // $this->original only exists during save. See
+    // \Drupal\Core\Entity\EntityStorageBase::save(). If it exists we re-use it
+    // here for performance reasons.
+    /** @var \Drupal\Core\Entity\ContentEntityBase $original */
+    $original = $this->original ? $this->original : NULL;
+
+    if (!$original) {
+      $id = $this->getOriginalId() !== NULL ? $this->getOriginalId() : $this->id();
+      $original = $this->entityManager()->getStorage($this->getEntityTypeId())->loadUnchanged($id);
+    }
+
+    // If the current translation has just been added, we have a change.
+    $translated = count($this->translations) > 1;
+    if ($translated && !$original->hasTranslation($this->activeLangcode)) {
+      return TRUE;
+    }
+
+    // Compare field item current values with the original ones to determine
+    // whether we have changes. If a field is not translatable and the entity is
+    // translated we skip it because, depending on the use case, it would make
+    // sense to mark all translations as changed or none of them. We skip also
+    // computed fields as comparing them with their original values might not be
+    // possible or be meaningless.
+    /** @var \Drupal\Core\Entity\ContentEntityBase $translation */
+    $translation = $original->getTranslation($this->activeLangcode);
+    foreach ($this->getFieldDefinitions() as $field_name => $definition) {
+      // @todo Allow computed fields to have regular storage. See FIXME
+      if ($field_name == 'revision_translation_affected' || $field_name == 'revision_id') {
+        continue;
+      }
+      if (!$definition->isComputed() && (!$translated || $definition->isTranslatable())) {
+        $items = $this->get($field_name)->filterEmptyItems();
+        $original_items = $translation->get($field_name)->filterEmptyItems();
+        if (!$items->equals($original_items)) {
+          return TRUE;
+        }
+      }
+    }
+
+    return FALSE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index ba973c1..cb1a671 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -26,4 +26,33 @@
  * @ingroup entity_api
  */
 interface ContentEntityInterface extends \Traversable, FieldableEntityInterface, RevisionableInterface, TranslatableInterface {
+
+  /**
+   * Determines if the current translation of the entity has unsaved changes.
+   *
+   * If the entity is translatable only translatable fields will be checked
+   * for changes.
+   *
+   * @return bool
+   *   TRUE if the current translation of the entity has changes.
+   */
+  public function hasTranslationChanges();
+
+  /**
+   * Marks the current revision translation as affected.
+   *
+   * @param bool $affected
+   *   The flag value.
+   */
+  public function setRevisionTranslationAffected($affected);
+
+  /**
+   * Checks whether the current translation is affected by the current revision.
+   *
+   * @return bool
+   *   TRUE if the entity object is affected by the current revision, FALSE
+   *   otherwise.
+   */
+  public function isRevisionTranslationAffected();
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 25d4a5a..069c326 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -238,4 +238,29 @@ protected function hasFieldValueChanged(FieldDefinitionInterface $field_definiti
     return FALSE;
   }
 
+  /**
+   * Populates the affected flag for all the revision translations.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   An entity object being saved.
+   */
+  protected function populateAffectedRevisionTranslations(ContentEntityInterface $entity) {
+    if ($this->entityType->isTranslatable() && $this->entityType->isRevisionable()) {
+      $languages = $entity->getTranslationLanguages();
+      if (count($languages) > 1) {
+        foreach ($languages as $langcode => $language) {
+          $translation = $entity->getTranslation($langcode);
+          // Avoid populating the value if it was already manually set.
+          $affected = $translation->isRevisionTranslationAffected();
+          if (!isset($affected) && $translation->hasTranslationChanges()) {
+            $translation->setRevisionTranslationAffected(TRUE);
+          }
+        }
+      }
+      else {
+        $entity->setRevisionTranslationAffected(TRUE);
+      }
+    }
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index c780267..4c8aff5 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -957,6 +957,7 @@ protected function doSave($id, EntityInterface $entity) {
         $entity->{$this->revisionKey}->value = $this->saveRevision($entity);
       }
       if ($this->dataTable) {
+        $this->populateAffectedRevisionTranslations($entity);
         $this->saveToSharedTables($entity);
       }
       if ($this->revisionDataTable) {
@@ -984,6 +985,7 @@ protected function doSave($id, EntityInterface $entity) {
         $record->{$this->revisionKey} = $this->saveRevision($entity);
       }
       if ($this->dataTable) {
+        $this->populateAffectedRevisionTranslations($entity);
         $this->saveToSharedTables($entity);
       }
       if ($this->revisionDataTable) {
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 544390d..136856a 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -36,37 +36,21 @@ public function preSave() {
       $this->value = REQUEST_TIME;
     }
     else {
-      // On an existing entity the changed timestamp will only be set to request
-      // time automatically if at least one other field value of the entity has
-      // changed. This detection doesn't run on new entities and will be turned
-      // off if the changed timestamp is set manually before save, for example
-      // during migrations or using
+      // On an existing entity translation, the changed timestamp will only be
+      // set to the request time automatically if at least one other field value
+      // of the entity has changed. This detection does not run on new entities
+      // and will be turned off if the changed timestamp is set manually before
+      // save, for example during migrations or by 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
+      /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
       $entity = $this->getEntity();
-      if (!$entity->isNew()) {
-        $field_name = $this->getFieldDefinition()->getName();
-        // Clone $entity->original to avoid modifying it when calling
-        // getTranslation().
-        $original = clone $entity->original;
-        $translatable = $this->getFieldDefinition()->isTranslatable();
-        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;
-              }
-            }
-          }
+      /** @var \Drupal\Core\Entity\ContentEntityInterface $original */
+      $original = $entity->original;
+      $langcode = $entity->language()->getId();
+      if (!$entity->isNew() && $original->hasTranslation($langcode)) {
+        $original_value = $original->getTranslation($langcode)->get($this->getFieldDefinition()->getName())->value;
+        if ($this->value == $original_value && $entity->hasTranslationChanges()) {
+          $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 cf5e21a..4e186b9 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -207,6 +207,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setTranslatable(TRUE)
       ->setRevisionable(TRUE);
 
+    $fields['revision_translation_affected'] = BaseFieldDefinition::create('boolean')
+      ->setLabel(t('Revision translation affected'))
+      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     return $fields;
   }
 
diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc
index af5c2c4..8e7dc6d 100644
--- a/core/modules/content_translation/content_translation.admin.inc
+++ b/core/modules/content_translation/content_translation.admin.inc
@@ -8,7 +8,9 @@
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
 use Drupal\Core\Entity\ContentEntityTypeInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Render\Element;
@@ -102,9 +104,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
       $fields = $entity_manager->getFieldDefinitions($entity_type_id, $bundle);
       if ($fields) {
         foreach ($fields as $field_name => $definition) {
-          // Allow to configure only fields supporting multilingual storage.
-          // We skip our own fields as they are always translatable.
-          if (!empty($storage_definitions[$field_name]) && $storage_definitions[$field_name]->isTranslatable() && $storage_definitions[$field_name]->getProvider() != 'content_translation' && $field_name != $entity_type->getKey('langcode') && $field_name != $entity_type->getKey('default_langcode')) {
+          if (!empty($storage_definitions[$field_name]) && _content_translation_is_field_translatability_configurable($entity_type, $storage_definitions[$field_name])) {
             $form['settings'][$entity_type_id][$bundle]['fields'][$field_name] = array(
               '#label' => $definition->getLabel(),
               '#type' => 'checkbox',
@@ -138,6 +138,28 @@ function _content_translation_form_language_content_settings_form_alter(array &$
   $form['#validate'][] = 'content_translation_form_language_content_settings_validate';
   $form['#submit'][] = 'content_translation_form_language_content_settings_submit';
 }
+/**
+ * Checks whether translatability should be configurable for a field.
+ *
+ * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+ *   The entity type definition.
+ * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $definition
+ *   The field storage definition.
+ *
+ * @return bool
+ *   TRUE if field translatability can be configured, FALSE otherwise.
+ *
+ * @internal
+ */
+function _content_translation_is_field_translatability_configurable(EntityTypeInterface $entity_type, FieldStorageDefinitionInterface $definition) {
+// Allow to configure only fields supporting multilingual storage. We skip our
+// own fields as they are always translatable. Additionally we skip a set of
+// well-known fields implementing entity system business logic.
+return
+  $definition->isTranslatable() &&
+  $definition->getProvider() != 'content_translation' &&
+  !in_array($definition->getName(), [$entity_type->getKey('langcode'), $entity_type->getKey('default_langcode'), 'revision_translation_affected']);
+}
 
 /**
  * (proxied) Implements hook_preprocess_HOOK();
diff --git a/core/modules/content_translation/src/Controller/ContentTranslationController.php b/core/modules/content_translation/src/Controller/ContentTranslationController.php
index 1d13630..ec884b1 100644
--- a/core/modules/content_translation/src/Controller/ContentTranslationController.php
+++ b/core/modules/content_translation/src/Controller/ContentTranslationController.php
@@ -59,6 +59,11 @@ public function prepareTranslation(ContentEntityInterface $entity, LanguageInter
     $source_translation = $entity->getTranslation($source->getId());
     $target_translation = $entity->addTranslation($target->getId(), $source_translation->toArray());
 
+    // Make sure we do not inherit the affected status from the source values.
+    if ($entity->getEntityType()->isRevisionable()) {
+      $target_translation->setRevisionTranslationAffected(NULL);
+    }
+
     /** @var \Drupal\user\UserInterface $user */
     $user = $this->entityManager()->getStorage('user')->load($this->currentUser()->id());
     $metadata = $this->manager->getTranslationMetadata($target_translation);
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 6dd1229..2f57843 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_translation_affected'] = BaseFieldDefinition::create('boolean')
+      ->setLabel(t('Revision translation affected'))
+      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     return $fields;
   }
 
diff --git a/core/modules/node/src/Form/NodeRevisionRevertForm.php b/core/modules/node/src/Form/NodeRevisionRevertForm.php
index 1fe5ee1..1081215 100644
--- a/core/modules/node/src/Form/NodeRevisionRevertForm.php
+++ b/core/modules/node/src/Form/NodeRevisionRevertForm.php
@@ -101,17 +101,14 @@ public function buildForm(array $form, FormStateInterface $form_state, $node_rev
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->revision->setNewRevision();
-    // Make this the new default revision for the node.
-    $this->revision->isDefaultRevision(TRUE);
+    $revision = $this->prepareRevertedRevision($this->revision);
 
     // The revision timestamp will be updated when the revision is saved. Keep the
     // original one for the confirmation message.
-    $original_revision_timestamp = $this->revision->getRevisionCreationTime();
+    $original_revision_timestamp = $revision->getRevisionCreationTime();
+    $revision->revision_log = t('Copy of the revision from %date.', array('%date' => format_date($original_revision_timestamp)));
 
-    $this->revision->revision_log = t('Copy of the revision from %date.', array('%date' => format_date($original_revision_timestamp)));
-
-    $this->revision->save();
+    $revision->save();
 
     $this->logger('content')->notice('@type: reverted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
     drupal_set_message(t('@type %title has been reverted to the revision from %revision-date.', array('@type' => node_get_type_label($this->revision), '%title' => $this->revision->label(), '%revision-date' => format_date($original_revision_timestamp))));
@@ -121,4 +118,40 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     );
   }
 
+  /**
+   * Prepares a revision to be reverted.
+   *
+   * @param \Drupal\node\NodeInterface $revision
+   *   The revision to be reverted.
+   *
+   * @return \Drupal\node\NodeInterface
+   *   The prepared revision ready to be stored.
+   */
+  protected function prepareRevertedRevision(NodeInterface $revision) {
+    /** @var \Drupal\node\NodeInterface $default_revision */
+    $default_revision = $this->nodeStorage->load($revision->id());
+
+    // If the entity is translated, make sure only translations affected by the
+    // specified revision are reverted.
+    $languages = $default_revision->getTranslationLanguages();
+    if (count($languages) > 1) {
+      foreach ($languages as $langcode => $language) {
+        if ($revision->hasTranslation($langcode) && !$revision->getTranslation($langcode)->isRevisionTranslationAffected()) {
+          $revision_translation = $revision->getTranslation($langcode);
+          $default_translation = $default_revision->getTranslation($langcode);
+          foreach ($default_revision->getFieldDefinitions() as $field_name => $definition) {
+            if ($definition->isTranslatable()) {
+              $revision_translation->set($field_name, $default_translation->get($field_name)->getValue());
+            }
+          }
+        }
+      }
+    }
+
+    $revision->setNewRevision();
+    $revision->isDefaultRevision(TRUE);
+
+    return $revision;
+  }
+
 }
diff --git a/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php b/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
index a9f821b..a1184f2 100644
--- a/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
+++ b/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\system\Tests\Entity;
 
+use Drupal\entity_test\Entity\EntityTestMulChanged;
+use Drupal\entity_test\Entity\EntityTestMulRevChanged;
 use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
@@ -24,6 +26,20 @@ class ContentEntityChangedTest extends EntityUnitTestBase {
   public static $modules = ['language', 'user', 'system', 'field', 'text', 'filter', 'entity_test'];
 
   /**
+   * The EntityTestMulChanged entity type storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $mulChangedStorage;
+
+  /**
+   * The EntityTestMulRevChanged entity type storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $mulRevChangedStorage;
+
+  /**
    * @inheritdoc
    */
   protected function setUp() {
@@ -34,6 +50,9 @@ protected function setUp() {
 
     $this->installEntitySchema('entity_test_mul_changed');
     $this->installEntitySchema('entity_test_mulrev_changed');
+
+    $this->mulChangedStorage = $this->entityManager->getStorage('entity_test_mul_changed');
+    $this->mulRevChangedStorage = $this->entityManager->getStorage('entity_test_mulrev_changed');
   }
 
   /**
@@ -43,8 +62,8 @@ public function testChanged() {
     $user1 = $this->createUser();
     $user2 = $this->createUser();
 
-    // Create some test entities.
-    $entity = entity_create('entity_test_mul_changed', array(
+    // Create a test entity.
+    $entity = EntityTestMulChanged::create(array(
       'name' => $this->randomString(),
       'user_id' => $user1->id(),
       'language' => 'en',
@@ -73,6 +92,7 @@ public function testChanged() {
 
     $changed_en = $entity->getChangedTime();
 
+    /** @var \Drupal\entity_test\Entity\EntityTestMulRevChanged $german */
     $german = $entity->addTranslation('de');
 
     $entity->save();
@@ -148,9 +168,7 @@ public function testChanged() {
     // At this point the changed time of the original language (en) is newer
     // than the changed time of the German translation. Now test that entity
     // queries work as expected.
-    $storage = $this->entityManager->getStorage('entity_test_mul_changed');
-
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en)->execute();
 
     $this->assertEqual(
@@ -158,7 +176,7 @@ public function testChanged() {
       'Entity query can access changed time of original language.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en, '=', 'en')->execute();
 
     $this->assertEqual(
@@ -166,7 +184,7 @@ public function testChanged() {
       'Entity query can access changed time of original language by setting the original language as condition.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_de, '=', 'en')->execute();
 
     $this->assertFalse(
@@ -174,7 +192,7 @@ public function testChanged() {
       'There\'s no original entity stored having the changed time of the German translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en)->condition('default_langcode', '1')->execute();
 
     $this->assertEqual(
@@ -182,7 +200,7 @@ public function testChanged() {
       'Entity query can access changed time of default language.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_de)->condition('default_langcode', '1')->execute();
 
     $this->assertFalse(
@@ -190,7 +208,7 @@ public function testChanged() {
       'There\'s no entity stored using the default language having the changed time of the German translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_de)->execute();
 
     $this->assertEqual(
@@ -198,7 +216,7 @@ public function testChanged() {
       'Entity query can access changed time of the German translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_de, '=', 'de')->execute();
 
     $this->assertEqual(
@@ -206,7 +224,7 @@ public function testChanged() {
       'Entity query can access changed time of the German translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en, '=', 'de')->execute();
 
     $this->assertFalse(
@@ -214,7 +232,7 @@ public function testChanged() {
       'There\'s no German translation stored having the changed time of the original language.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_de, '>')->execute();
 
     $this->assertEqual(
@@ -222,7 +240,7 @@ public function testChanged() {
       'Entity query can access changed time regardless of translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en, '<')->execute();
 
     $this->assertEqual(
@@ -230,7 +248,7 @@ public function testChanged() {
       'Entity query can access changed time regardless of translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', 0, '>')->execute();
 
     $this->assertEqual(
@@ -238,7 +256,7 @@ public function testChanged() {
       'Entity query can access changed time regardless of translation.'
     );
 
-    $query = $storage->getQuery();
+    $query = $this->mulChangedStorage->getQuery();
     $ids = $query->condition('changed', $changed_en, '>')->execute();
 
     $this->assertFalse(
@@ -254,8 +272,8 @@ public function testRevisionChanged() {
     $user1 = $this->createUser();
     $user2 = $this->createUser();
 
-    // Create some test entities.
-    $entity = entity_create('entity_test_mulrev_changed', array(
+    // Create a test entity.
+    $entity = EntityTestMulRevChanged::create(array(
       'name' => $this->randomString(),
       'user_id' => $user1->id(),
       'language' => 'en',
@@ -281,6 +299,11 @@ public function testRevisionChanged() {
       'Changed time of original language is the same as changed time across all translations.'
     );
 
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is set for a new entity.'
+    );
+
     $changed_en = $entity->getChangedTime();
 
     $entity->setNewRevision();
@@ -292,8 +315,13 @@ public function testRevisionChanged() {
       'Changed time of original language did not change.'
     );
 
-    $entity->setOwner($user2);
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is set also for new revision without changes.'
+    );
+
     $entity->setNewRevision();
+    $entity->setOwner($user2);
     $entity->save();
 
     $this->assertTrue(
@@ -301,11 +329,15 @@ public function testRevisionChanged() {
       'Changed time of original language has been updated by new revision.'
     );
 
-    $changed_en = $entity->getChangedTime();
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is set for new revision with changes.'
+    );
 
-    $entity->addTranslation('de');
+    $changed_en = $entity->getChangedTime();
 
-    $german = $entity->getTranslation('de');
+    /** @var \Drupal\entity_test\Entity\EntityTestMulRevChanged $german */
+    $german = $entity->addTranslation('de');
 
     $entity->save();
 
@@ -324,6 +356,16 @@ public function testRevisionChanged() {
       'Changed time of the German translation is the newest time across all translations.'
     );
 
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is not reset by adding a new translation.'
+    );
+
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($german),
+      'Changed flag of German translation is set when adding the translation.'
+    );
+
     $changed_de = $german->getChangedTime();
 
     $entity->setNewRevision();
@@ -340,8 +382,18 @@ public function testRevisionChanged() {
       'Changed time of the German translation did not change.'
     );
 
-    $german->setOwner($user2);
+    $this->assertFalse(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is not set for new revision without changes.'
+    );
+
+    $this->assertFalse(
+      $this->getRevisionTranslationAffectedFlag($german),
+      'Changed flag of of the German translation is not set for new revision without changes.'
+    );
+
     $entity->setNewRevision();
+    $german->setOwner($user2);
     $entity->save();
 
     $this->assertEqual(
@@ -358,6 +410,51 @@ public function testRevisionChanged() {
       $german->getChangedTime(), $entity->getChangedTimeAcrossTranslations(),
       'Changed time of the German translation is the newest time across all translations.'
     );
+
+    $this->assertFalse(
+      $this->getRevisionTranslationAffectedFlag($entity),
+      'Changed flag of original language is not set when changing the German Translation.'
+    );
+
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($german),
+      'Changed flag of German translation is set when changing the German translation.'
+    );
+
+    $entity->setNewRevision();
+    $german->setOwner($user1);
+    $german->setRevisionTranslationAffected(FALSE);
+    $entity->save();
+
+    $this->assertFalse(
+      $this->getRevisionTranslationAffectedFlag($german),
+      'German translation changed and a new revision is created but the changed flag is reset manually.'
+    );
+
+    $entity->setNewRevision();
+    $german->setRevisionTranslationAffected(TRUE);
+    $entity->save();
+
+    $this->assertTrue(
+      $this->getRevisionTranslationAffectedFlag($german),
+      'German translation is not changed and a new revision is created but the changed flag is set manually.'
+    );
+  }
+
+  /**
+   * Retrieves the revision translation affected flag value.
+   *
+   * @param \Drupal\entity_test\Entity\EntityTestMulRevChanged $entity
+   *   The entity object to be checked.
+   *
+   * @return bool
+   *   The flag value.
+   */
+  protected function getRevisionTranslationAffectedFlag(EntityTestMulRevChanged $entity) {
+    $query = $this->mulRevChangedStorage->getQuery();
+    $ids = $query->condition('revision_translation_affected', 1, '=', $entity->language()->getId())->execute();
+    $id = reset($ids);
+    return (bool) ($id == $entity->id());
   }
 
 }
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..933e55a 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_translation_affected'] = BaseFieldDefinition::create('boolean')
+      ->setLabel(t('Revision translation affected'))
+      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
+      ->setReadOnly(TRUE)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
+
     $fields['langcode']->setRevisionable(TRUE);
     $fields['name']->setRevisionable(TRUE);
     $fields['user_id']->setRevisionable(TRUE);
