diff --git a/core/modules/content_moderation/src/ModerationInformation.php b/core/modules/content_moderation/src/ModerationInformation.php
index abc93f403f..9b087a7c83 100644
--- a/core/modules/content_moderation/src/ModerationInformation.php
+++ b/core/modules/content_moderation/src/ModerationInformation.php
@@ -240,4 +240,45 @@ public function getUnsupportedFeatures(EntityTypeInterface $entity_type) {
     return $features;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getOriginalState(ContentEntityInterface $entity) {
+    $state = NULL;
+    $workflow_type = $this->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->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/src/ModerationInformationInterface.php b/core/modules/content_moderation/src/ModerationInformationInterface.php
index c9522a632a..99c35dd350 100644
--- a/core/modules/content_moderation/src/ModerationInformationInterface.php
+++ b/core/modules/content_moderation/src/ModerationInformationInterface.php
@@ -198,4 +198,26 @@ public function getWorkflowForEntityTypeAndBundle($entity_type_id, $bundle_id);
    */
   public function getUnsupportedFeatures(EntityTypeInterface $entity_type);
 
+  /**
+   * Gets the original or initial state of the given entity.
+   *
+   * When a state is being validated, the original state is used to validate
+   * that a valid transition exists for target state and the user has access
+   * to the transition between those two states. If the entity has been
+   * moderated before, we can load the original unmodified revision and
+   * translation for this state.
+   *
+   * If the entity is new we need to load the initial state from the workflow.
+   * Even if a value was assigned to the moderation_state field, the initial
+   * state is used to compute an appropriate transition for the purposes of
+   * validation.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The content entity to get the workflow for.
+   *
+   * @return \Drupal\content_moderation\ContentModerationState
+   *   The original or default moderation state.
+   */
+  public function getOriginalState(ContentEntityInterface $entity);
+
 }
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..a571fed7c2 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -118,13 +118,24 @@ 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->moderationInformation->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());
+      }
+    }
 
     /** @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;
diff --git a/core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php b/core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php
index c291e135e9..3288ffb07a 100644
--- a/core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php
+++ b/core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php
@@ -4,8 +4,6 @@
 
 use Drupal\content_moderation\StateTransitionValidationInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\content_moderation\ModerationInformationInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -110,7 +108,7 @@ public function validate($value, Constraint $constraint) {
     }
 
     $new_state = $workflow->getTypePlugin()->getState($entity->moderation_state->value);
-    $original_state = $this->getOriginalOrInitialState($entity);
+    $original_state = $this->moderationInformation->getOriginalState($entity);
 
     // If a new state is being set and there is an existing state, validate
     // there is a valid transition between them.
@@ -132,58 +130,4 @@ public function validate($value, Constraint $constraint) {
     }
   }
 
-  /**
-   * Gets the original or initial state of the given entity.
-   *
-   * When a state is being validated, the original state is used to validate
-   * that a valid transition exists for target state and the user has access
-   * to the transition between those two states. If the entity has been
-   * moderated before, we can load the original unmodified revision and
-   * translation for this state.
-   *
-   * If the entity is new we need to load the initial state from the workflow.
-   * Even if a value was assigned to the moderation_state field, the initial
-   * state is used to compute an appropriate transition for the purposes of
-   * validation.
-   *
-   * @return \Drupal\workflows\StateInterface
-   *   The original or default moderation state.
-   */
-  protected function getOriginalOrInitialState(ContentEntityInterface $entity) {
-    $state = NULL;
-    $workflow_type = $this->moderationInformation->getWorkflowForEntity($entity)->getTypePlugin();
-    if (!$entity->isNew() && !$this->isFirstTimeModeration($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\EntityInterface $entity
-   *   The entity being moderated.
-   *
-   * @return bool
-   *   TRUE if this is the entity's first time being moderated, FALSE otherwise.
-   */
-  protected function isFirstTimeModeration(EntityInterface $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/src/StateTransitionValidation.php b/core/modules/content_moderation/src/StateTransitionValidation.php
index 914410f798..f5fc429edf 100644
--- a/core/modules/content_moderation/src/StateTransitionValidation.php
+++ b/core/modules/content_moderation/src/StateTransitionValidation.php
@@ -42,7 +42,7 @@ public function __construct(ModerationInformationInterface $moderation_info) {
    */
   public function getValidTransitions(ContentEntityInterface $entity, AccountInterface $user) {
     $workflow = $this->moderationInfo->getWorkflowForEntity($entity);
-    $current_state = $entity->moderation_state->value ? $workflow->getTypePlugin()->getState($entity->moderation_state->value) : $workflow->getTypePlugin()->getInitialState($entity);
+    $current_state = !$entity->isNew() && $entity->moderation_state->value ? $workflow->getTypePlugin()->getState($entity->moderation_state->value) : $workflow->getTypePlugin()->getInitialState($entity);
 
     return array_filter($current_state->getTransitions(), function (Transition $transition) use ($workflow, $user) {
       return $user->hasPermission('use ' . $workflow->id() . ' transition ' . $transition->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..74403fe9f9 100644
--- a/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php
@@ -520,4 +520,135 @@ public function testWorkflowInUse() {
     }
   }
 
+  /**
+   * Test current state and available transitions after preview.
+   */
+  public function testModerationStateAfterPreview() {
+    // Create new moderated content in draft.
+    $this->drupalPostForm('node/add/moderated_content', [
+      'title[0][value]' => 'Some moderated content',
+      'body[0][value]' => 'First version of the content.',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
+
+    $node = $this->drupalGetNodeByTitle('Some moderated content');
+    $edit_path = sprintf('node/%d/edit', $node->id());
+
+    // Publish the entity.
+    $edit = ['moderation_state[0][state]' => 'published'];
+    $this->drupalPostForm($edit_path, $edit, t('Save'));
+
+    // Create pending draft revision.
+    $this->drupalPostForm($edit_path, [
+      'title[0][value]' => 'Second revision ',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
+
+    // Change state to published and preview the change.
+    $edit = ['moderation_state[0][state]' => 'published'];
+    $this->drupalPostForm($edit_path, $edit, t('Preview'));
+
+    // Go back to edit form.
+    $this->clickLink(t('Back to content editing'));
+
+    // Confirm no new transitions exist.
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'draft');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'published');
+    $this->assertSession()->optionNotExists('moderation_state[0][state]', 'archived');
+
+    // Confirm the current state is Draft and not Published.
+    $this->assertSession()->pageTextContains('Current state Draft');
+    $selected_option = $this->xpath("//select[@name='moderation_state[0][state]']/option[@selected='selected']");
+    $this->assertEquals('published', $selected_option[0]->getValue());
+
+    // Publish the entity.
+    $edit = ['moderation_state[0][state]' => 'published'];
+    $this->drupalPostForm($edit_path, $edit, t('Save'));
+
+    // Confirm the current state is Published and not Draft.
+    $this->drupalGet($edit_path);
+    $this->assertSession()->pageTextContains('Current state Published');
+
+    // Create pending draft revision.
+    $this->drupalPostForm($edit_path, [
+      'title[0][value]' => 'Third revision ',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
+
+    // Confirm the current state is Draft and not Published.
+    $this->drupalGet($edit_path);
+    $this->assertSession()->pageTextContains('Current state Draft');
+  }
+
+  /**
+   * Tests translated and moderated nodes.
+   */
+  public function testTranslatedStateAfterPreview() {
+    $this->drupalLogin($this->rootUser);
+
+    // Add French language.
+    $edit = ['predefined_langcode' => 'fr'];
+    $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Enable content translation on articles.
+    $this->drupalGet('admin/config/regional/content-language');
+    $edit = [
+      'entity_types[node]' => TRUE,
+      'settings[node][moderated_content][translatable]' => TRUE,
+      'settings[node][moderated_content][settings][language][language_alterable]' => TRUE,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save configuration'));
+
+    // Adding languages requires a container rebuild in the test running
+    // environment so that multilingual services are used.
+    $this->rebuildContainer();
+
+    // Create new moderated content in draft (revision 1).
+    $this->drupalPostForm('node/add/moderated_content', [
+      'title[0][value]' => 'Some moderated content',
+      'body[0][value]' => 'First version of the content.',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
+    $this->assertTrue($this->xpath('//ul[@class="entity-moderation-form"]'));
+
+    $node = $this->drupalGetNodeByTitle('Some moderated content');
+    $this->assertTrue($node->language(), 'en');
+    $fr_edit_path = sprintf('fr/node/%d/edit', $node->id());
+    $translate_path = sprintf('node/%d/translations/add/en/fr', $node->id());
+
+    // Add french translation (revision 2).
+    $this->drupalGet($translate_path);
+    $this->drupalPostForm(NULL, [
+      'body[0][value]' => 'Second version of the content.',
+      'moderation_state[0][state]' => 'published',
+    ], t('Save (this translation)'));
+
+    // Change state to draft and preview the change.
+    $edit = ['moderation_state[0][state]' => 'draft'];
+    $this->drupalPostForm($fr_edit_path, $edit, t('Preview'));
+
+    // Go back to edit form.
+    $this->clickLink(t('Back to content editing'));
+
+    // Confirm transitions are as expected.
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'draft');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'published');
+    $this->assertSession()->optionExists('moderation_state[0][state]', 'archived');
+
+    // Confirm the current state is Published and not Draft.
+    $this->assertSession()->pageTextContains('Current state Published');
+    $selected_option = $this->xpath("//select[@name='moderation_state[0][state]']/option[@selected='selected']");
+    $this->assertEquals('draft', $selected_option[0]->getValue());
+
+    // Create pending draft revision.
+    $this->drupalPostForm($fr_edit_path, [
+      'body[0][value]' => 'Third version of the content.',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save (this translation)'));
+
+    // Confirm the current state is Draft and not Published.
+    $this->drupalGet($fr_edit_path);
+    $this->assertSession()->pageTextContains('Current state Draft');
+  }
+
 }
