diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index a3bb20508f..55c218048d 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -369,6 +369,15 @@ protected function doPreSave(EntityInterface $entity) {
       $entity->updateLoadedRevisionId();
     }
 
+    // Make sure that the original entity is the revision the current entity was
+    // originated from, otherwise we would always compare the current values
+    // with the default values, which is not correct for pending revisions. If
+    // we have the default revision we let the parent populate the "original"
+    // property via a more performant entity load.
+    if (!isset($entity->original) && $this->entityType->isRevisionable() && !$entity->isDefaultRevision()) {
+      $entity->original = $this->loadRevision($entity->getLoadedRevisionId());
+    }
+
     $id = parent::doPreSave($entity);
 
     if (!$entity->isNew()) {
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php
index a42a74baae..867bb5c6dd 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityFieldTest.php
@@ -17,6 +17,7 @@
 use Drupal\Core\TypedData\Type\StringInterface;
 use Drupal\Core\TypedData\TypedDataInterface;
 use Drupal\entity_test\Entity\EntityTestComputedField;
+use Drupal\entity_test\Entity\EntityTestRev;
 use Drupal\node\Entity\Node;
 use Drupal\node\Entity\NodeType;
 
@@ -91,6 +92,38 @@ protected function createTestEntity($entity_type) {
     return $entity;
   }
 
+  /**
+   * Test setting field values on revisionable entities.
+   */
+  public function testFieldEntityRevisionWrite() {
+    $storage = \Drupal::entityTypeManager()->getStorage('entity_test_rev');
+
+    // Create a new entity, with a field value 'foo'.
+    $entity = EntityTestRev::create();
+    $entity->field_test_text->value = 'foo';
+    $entity->save();
+
+    // Create a new non-default revision and set the field value to 'bar'.
+    $entity->setNewRevision(TRUE);
+    $entity->isDefaultRevision(FALSE);
+    $entity->field_test_text->value = 'bar';
+    $entity->save();
+
+    $forward_revision_id = $entity->getRevisionId();
+
+    // Load the forward revision and set the field value to equal the value of
+    // the default revision.
+    $forward_revision = $storage->loadRevision($forward_revision_id);
+    $forward_revision->field_test_text->value = 'foo';
+    $forward_revision->save();
+
+    $storage->resetCache();
+
+    // The updated field value should have correctly saved as 'foo'.
+    $forward_revision = $storage->loadRevision($forward_revision_id);
+    $this->assertEquals('foo', $forward_revision->field_test_text->value);
+  }
+
   /**
    * Tests reading and writing properties and field items.
    */
