diff --git a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
index 005001b506..4f75f8dd65 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -3,6 +3,7 @@
 namespace Drupal\content_moderation\Plugin\Field\FieldWidget;
 
 use Drupal\content_moderation\Plugin\Field\ModerationStateFieldItemList;
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
@@ -118,13 +119,27 @@ public function form(FieldItemListInterface $items, array &$form, FormStateInter
    */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
-    $entity = $items->getEntity();
-
-    $workflow = $this->moderationInformation->getWorkflowForEntity($entity);
-    $default = $items->get($delta)->value ? $workflow->getTypePlugin()->getState($items->get($delta)->value) : $workflow->getTypePlugin()->getInitialState($entity);
+    $entity = $original_entity = $items->getEntity();
+
+    $default = $this->getOriginalState($entity);
+
+    // If the entity is not new, grab the most recent revision and
+    // load it. The moderation state of the saved revision will be used
+    // to display the current state as well determine the the appropriate
+    // transitions.
+    if (!$entity->isNew()) {
+      /** @var \Drupal\Core\Entity\ContentEntityInterface $original_entity */
+      $original_entity = $this->entityTypeManager->getStorage($entity->getEntityTypeId())->loadRevision($entity->getLoadedRevisionId());
+      if (!$entity->isDefaultTranslation() && $original_entity->hasTranslation($entity->language()->getId())) {
+        $original_entity = $original_entity->getTranslation($entity->language()->getId());
+      }
+    }
+    else {
+      $original_entity->set('moderation_state', $default->id());
+    }
 
     /** @var \Drupal\workflows\Transition[] $transitions */
-    $transitions = $this->validator->getValidTransitions($entity, $this->currentUser);
+    $transitions = $this->validator->getValidTransitions($original_entity, $this->currentUser);
 
     $transition_labels = [];
     $default_value = $items->value;
@@ -189,4 +204,45 @@ public function calculateDependencies() {
     return $dependencies;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getOriginalState(ContentEntityInterface $entity) {
+    $state = NULL;
+    $workflow_type = $this->moderationInformation->getWorkflowForEntity($entity)->getTypePlugin();
+    if (!$entity->isNew() && !$this->isFirstTimeModeration($entity)) {
+      /** @var \Drupal\Core\Entity\ContentEntityInterface $original_entity */
+      $original_entity = $this->entityTypeManager->getStorage($entity->getEntityTypeId())->loadRevision($entity->getLoadedRevisionId());
+      if (!$entity->isDefaultTranslation() && $original_entity->hasTranslation($entity->language()->getId())) {
+        $original_entity = $original_entity->getTranslation($entity->language()->getId());
+      }
+      if ($workflow_type->hasState($original_entity->moderation_state->value)) {
+        $state = $workflow_type->getState($original_entity->moderation_state->value);
+      }
+    }
+    return $state ?: $workflow_type->getInitialState($entity);
+  }
+
+  /**
+   * Determines if this entity is being moderated for the first time.
+   *
+   * If the previous version of the entity has no moderation state, we assume
+   * that means it predates the presence of moderation states.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The entity being moderated.
+   *
+   * @return bool
+   *   TRUE if this is the entity's first time being moderated, FALSE otherwise.
+   */
+  protected function isFirstTimeModeration(ContentEntityInterface $entity) {
+    $original_entity = $this->moderationInformation->getLatestRevision($entity->getEntityTypeId(), $entity->id());
+
+    if ($original_entity) {
+      $original_id = $original_entity->moderation_state;
+    }
+
+    return !($entity->moderation_state && $original_entity && $original_id);
+  }
+
 }
diff --git a/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php b/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php
index 9f3c401e63..b631ffcfd0 100644
--- a/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php
@@ -110,6 +110,15 @@ public function testModerationForm() {
     $this->drupalGet($edit_path);
     $this->assertFieldByName('moderation_state[0][state]', 'published', 'The moderation default value is set correctly.');
 
+    // Preview the content while selecting the "draft" state and when the user
+    // returns to the edit form, ensure all of the available transitions are
+    // still those available from the "published" source state.
+    $this->submitForm(['moderation_state[0][state]' => 'draft'], 'Preview');
+    $this->clickLink('Back to content editing');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'draft');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'published');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'archived');
+
     // The published view should not have a moderation form, because it is the
     // live revision.
     $this->drupalGet($canonical_path);
@@ -306,6 +315,16 @@ public function testContentTranslationNodeForm() {
     $this->assertSession()->optionExists('moderation_state[0][state]', 'draft');
     $this->assertSession()->optionExists('moderation_state[0][state]', 'published');
     $this->assertSession()->optionExists('moderation_state[0][state]', 'archived');
+
+    // Preview the content while selecting the "draft" state and when the user
+    // returns to the edit form, ensure all of the available transitions are
+    // still those available from the "published" source state.
+    $this->submitForm(['moderation_state[0][state]' => 'draft'], 'Preview');
+    $this->clickLink('Back to content editing');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'draft');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'published');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'archived');
+
     $this->drupalPostForm(NULL, [
       'body[0][value]' => 'Third version of the content.',
       'moderation_state[0][state]' => 'draft',
