diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index a9dd647..a3134e6 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -213,13 +213,13 @@ protected function getLanguages() {
    */
   public function postCreate(EntityStorageInterface $storage) {
     $this->newRevision = TRUE;
+    $this->loadingCompleted = TRUE;
   }
 
   /**
    * {@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 +228,13 @@ 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);
+
+      // TODO
+      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,48 @@ 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. But we need to clone $entity->original to
+    // avoid modifying it when calling getTranslation().
+    /** @var static $original */
+    $original = ($this->original) ? clone $this->original : NULL;
+
+    if (!$original) {
+      $id = ($this->getOriginalId() !== NULL) ? $this->getOriginalId() : $this->id();
+      $original = \Drupal::entityManager()->getStorage($this->getEntityTypeId())->loadUnchanged($id);
+    }
+
+    $translated = count($this->translations) > 1;
+    if ($translated && !$original->hasTranslation($this->activeLangcode)) {
+      return TRUE;
+    }
+
+    $translation = ($translated) ? $original->getTranslation($this->activeLangcode) : $original;
+
+    foreach ($this->getFieldDefinitions() as $field_name => $field_definition) {
+      // TODO
+      if ($field_name == 'revision_translation_affected') {
+        continue;
+      }
+      if (!$field_definition->isComputed() && (!$this->isTranslatable() || $field_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..abacd32 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -26,4 +26,30 @@
  * @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();
+
+  /**
+   * TODO
+   *
+   * @param bool $affected
+   */
+  public function setRevisionTranslationAffected($affected);
+
+  /**
+   * TODO
+   *
+   * @return bool
+   */
+  public function isRevisionTranslationAffected();
+
 }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 25d4a5a..d372b44 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -238,4 +238,26 @@ protected function hasFieldValueChanged(FieldDefinitionInterface $field_definiti
     return FALSE;
   }
 
+  /**
+   * TODO
+   */
+  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);
+          // TODO
+          $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..f9a8777 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -458,6 +458,11 @@ protected function getFromStorage(array $ids = NULL) {
           $function = $module . '_' . $this->entityTypeId . '_storage_load';
           $function($entities);
         }
+
+        foreach ($entities as $entity) {
+          // Set a flag that entity loading from storage is completed.
+          $entity->loadingCompleted = TRUE;
+        }
       }
     }
 
@@ -957,6 +962,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 +990,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..a395877 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -26,6 +26,23 @@
 class ChangedItem extends CreatedItem {
 
   /**
+   * Flag that indicates if the field value is set manually via API.
+   *
+   * @var bool
+   */
+  protected $manuallySet = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function onChange($property_name, $notify = TRUE) {
+    parent::onChange($property_name, $notify);
+    if (isset($this->getEntity()->loadingCompleted)) {
+      $this->manuallySet = TRUE;
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function preSave() {
@@ -35,41 +52,31 @@ public function preSave() {
     if (!$this->value) {
       $this->value = REQUEST_TIME;
     }
-    else {
+    elseif (!$this->manuallySet) {
       // 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
       // \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();
         // Clone $entity->original to avoid modifying it when calling
         // getTranslation().
         $original = clone $entity->original;
-        $translatable = $this->getFieldDefinition()->isTranslatable();
-        if ($translatable) {
+        if ($this->getFieldDefinition()->isTranslatable()) {
           $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->hasTranslationChanges()) {
+          $this->value = REQUEST_TIME;
         }
       }
     }
-  }
+
+    // Reset the manuallySet flag.
+    $this->manuallySet = FALSE;
+ }
 
 }
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..53475d5 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());
 
+    // TODO
+    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/system/src/Tests/Entity/ContentEntityChangedTest.php b/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
index a9f821b..3f6e478 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;
 
 /**
@@ -34,6 +36,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 +48,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',
@@ -148,9 +153,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 +161,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 +169,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 +177,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 +185,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 +193,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 +201,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 +209,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 +217,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 +225,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 +233,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 +241,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 +257,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 +284,11 @@ public function testRevisionChanged() {
       'Changed time of original language is the same as changed time across all translations.'
     );
 
+    $this->assertTrue(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is set for a new entity.'
+    );
+
     $changed_en = $entity->getChangedTime();
 
     $entity->setNewRevision();
@@ -292,6 +300,11 @@ public function testRevisionChanged() {
       'Changed time of original language did not change.'
     );
 
+    $this->assertFalse(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is not set for new revision without changes.'
+    );
+
     $entity->setOwner($user2);
     $entity->setNewRevision();
     $entity->save();
@@ -301,6 +314,11 @@ public function testRevisionChanged() {
       'Changed time of original language has been updated by new revision.'
     );
 
+    $this->assertTrue(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is set for new revision with changes.'
+    );
+
     $changed_en = $entity->getChangedTime();
 
     $entity->addTranslation('de');
@@ -324,6 +342,16 @@ public function testRevisionChanged() {
       'Changed time of the German translation is the newest time across all translations.'
     );
 
+    $this->assertTrue(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is not resettet by adding a new translation.'
+    );
+
+    $this->assertTrue(
+      $this->getChangedFlag($german),
+      'Changed flag of German translation is set when adding the translation.'
+    );
+
     $changed_de = $german->getChangedTime();
 
     $entity->setNewRevision();
@@ -340,6 +368,16 @@ public function testRevisionChanged() {
       'Changed time of the German translation did not change.'
     );
 
+    $this->assertFalse(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is not set for new revision without changes.'
+    );
+
+    $this->assertFalse(
+      $this->getChangedFlag($german),
+      'Changed flag of of the German translation is not set for new revision without changes.'
+    );
+
     $german->setOwner($user2);
     $entity->setNewRevision();
     $entity->save();
@@ -358,6 +396,48 @@ public function testRevisionChanged() {
       $german->getChangedTime(), $entity->getChangedTimeAcrossTranslations(),
       'Changed time of the German translation is the newest time across all translations.'
     );
+
+    $this->assertFalse(
+      $this->getChangedFlag($entity),
+      'Changed flag of original language is not set when changing the German Translation.'
+    );
+
+    $this->assertTrue(
+      $this->getChangedFlag($german),
+      'Changed flag of German translation is set when changing the German translation.'
+    );
+
+    $german->setOwner($user1);
+    $german->revision_translation_affected->value = 0;
+    $entity->setNewRevision();
+    $entity->save();
+
+    $this->assertFalse(
+      $this->getChangedFlag($german),
+      'German translation changed and a new revison is created but the changed flag is reset manually.'
+    );
+
+    $german->revision_translation_affected->value = 1;
+    $entity->setNewRevision();
+    $entity->save();
+
+    $this->assertTrue(
+      $this->getChangedFlag($german),
+      'German translation is not changed and a new revision is created but the changed flag is set manually.'
+    );
+  }
+
+  /**
+   * TODO
+   *
+   * @param $entity
+   * @return int
+   */
+  protected function getChangedFlag($entity) {
+    $query = $this->mulRevChangedStorage->getQuery();
+    $ids = $query->condition('revision_translation_affected', 1, '=', $entity->language()->getId())->execute();
+    $id = reset($ids);
+    return (int) ($id == $entity->id());
   }
 
 }
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..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);
