diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 9d6b8d64f5..f28601881e 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Field\ChangedFieldItemList;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -297,6 +298,18 @@ protected function doPreSave(EntityInterface $entity) {
 
     $id = parent::doPreSave($entity);
 
+    // We have to ensure that we detect changes after the entity presave hooks
+    // have been executed by the parent method as they still might alter field
+    // values, therefore we execute explicitly the preSave method of any
+    // changed field.
+    foreach (array_keys($entity->getTranslationLanguages()) as $langcode) {
+      foreach ($entity->getTranslation($langcode)->getFields(FALSE) as $field) {
+        if ($field instanceof ChangedFieldItemList && ($field->getFieldDefinition()->isTranslatable() || $entity->isDefaultTranslation())) {
+          $field->preSave();
+        }
+      }
+    }
+
     if (!$entity->isNew()) {
       // If the ID changed then original can't be loaded, throw an exception
       // in that case.
