diff --git a/core/modules/content_moderation/config/install/workflows.workflow.editorial.yml b/core/modules/content_moderation/config/install/workflows.workflow.editorial.yml
index d8daa51..9625065 100644
--- a/core/modules/content_moderation/config/install/workflows.workflow.editorial.yml
+++ b/core/modules/content_moderation/config/install/workflows.workflow.editorial.yml
@@ -23,7 +23,7 @@ transitions:
     to: archived
     weight: 2
   archived_draft:
-    label: 'Restore to Draft'
+    label: 'Restore to draft'
     from:
       - archived
     to: draft
@@ -35,7 +35,7 @@ transitions:
     to: published
     weight: 4
   create_new_draft:
-    label: 'Create New Draft'
+    label: 'Create new draft'
     from:
       - draft
       - published
diff --git a/core/modules/content_moderation/content_moderation.libraries.yml b/core/modules/content_moderation/content_moderation.libraries.yml
index 6caaaf3..377667b 100644
--- a/core/modules/content_moderation/content_moderation.libraries.yml
+++ b/core/modules/content_moderation/content_moderation.libraries.yml
@@ -3,3 +3,8 @@ entity-moderation-form:
   css:
     layout:
       css/entity-moderation-form.css: {}
+moderation-state-widget:
+  version: VERSION
+  css:
+    layout:
+      css/moderation-state-widget.css: {}
diff --git a/core/modules/content_moderation/css/moderation-state-widget.css b/core/modules/content_moderation/css/moderation-state-widget.css
new file mode 100644
index 0000000..edb21de
--- /dev/null
+++ b/core/modules/content_moderation/css/moderation-state-widget.css
@@ -0,0 +1,6 @@
+.field--widget-moderation-state-default label {
+  display: inline;
+}
+.field--widget-moderation-state-default label:after {
+  content: ":";
+}
diff --git a/core/modules/content_moderation/src/EntityOperations.php b/core/modules/content_moderation/src/EntityOperations.php
index af87f6f..5c8d5c0 100644
--- a/core/modules/content_moderation/src/EntityOperations.php
+++ b/core/modules/content_moderation/src/EntityOperations.php
@@ -105,9 +105,10 @@ public function entityPresave(EntityInterface $entity) {
       /** @var \Drupal\content_moderation\ContentModerationState $current_state */
       $current_state = $workflow->getState($entity->moderation_state->value);
 
-      // This entity is default if it is new, the default revision, or the
-      // default revision is not published.
+      // This entity is default if it is new, a new translation, the default
+      // revision, or the default revision is not published.
       $update_default_revision = $entity->isNew()
+        || $entity->isNewTranslation()
         || $current_state->isDefaultRevisionState()
         || !$this->isDefaultRevisionPublished($entity, $workflow);
 
@@ -250,8 +251,8 @@ public function entityView(array &$build, EntityInterface $entity, EntityViewDis
    * Check if the default revision for the given entity is published.
    *
    * The default revision is the same as the entity retrieved by "default" from
-   * the storage handler. If the entity is translated, use the default revision
-   * of the same language as the given entity.
+   * the storage handler. If the entity is translated, check if any of the
+   * translations are published.
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity being saved.
@@ -262,21 +263,22 @@ public function entityView(array &$build, EntityInterface $entity, EntityViewDis
    *   TRUE if the default revision is published. FALSE otherwise.
    */
   protected function isDefaultRevisionPublished(EntityInterface $entity, WorkflowInterface $workflow) {
-    $storage = $this->entityTypeManager->getStorage($entity->getEntityTypeId());
-    $default_revision = $storage->load($entity->id());
+    $default_revision = $this->entityTypeManager->getStorage($entity->getEntityTypeId())->load($entity->id());
 
-    // Ensure we are comparing the same translation as the current entity.
+    // Ensure we are checking all translations of the default revision.
     if ($default_revision instanceof TranslatableInterface && $default_revision->isTranslatable()) {
-      // If there is no translation, then there is no default revision and is
-      // therefore not published.
-      if (!$default_revision->hasTranslation($entity->language()->getId())) {
-        return FALSE;
+      // Loop through each language that has a translation.
+      foreach ($default_revision->getTranslationLanguages() as $language) {
+        // Load the translated revision.
+        $language_revision = $default_revision->getTranslation($language->getId());
+        // Return TRUE if a translation with a published state is found.
+        if ($workflow->getState($language_revision->moderation_state->value)->isPublishedState()) {
+          return TRUE;
+        }
       }
-
-      $default_revision = $default_revision->getTranslation($entity->language()->getId());
     }
 
-    return $default_revision && $workflow->getState($default_revision->moderation_state->value)->isPublishedState();
+    return $workflow->getState($default_revision->moderation_state->value)->isPublishedState();
   }
 
 }
diff --git a/core/modules/content_moderation/src/EntityTypeInfo.php b/core/modules/content_moderation/src/EntityTypeInfo.php
index f11e471..59ce298 100644
--- a/core/modules/content_moderation/src/EntityTypeInfo.php
+++ b/core/modules/content_moderation/src/EntityTypeInfo.php
@@ -321,11 +321,11 @@ public function entityBaseFieldInfo(EntityTypeInterface $entity_type) {
       ])
       ->setDisplayOptions('form', [
         'type' => 'moderation_state_default',
-        'weight' => 5,
+        'weight' => 100,
         'settings' => [],
       ])
       ->addConstraint('ModerationState', [])
-      ->setDisplayConfigurable('form', FALSE)
+      ->setDisplayConfigurable('form', TRUE)
       ->setDisplayConfigurable('view', FALSE)
       ->setReadOnly(FALSE)
       ->setTranslatable(TRUE);
@@ -361,6 +361,14 @@ public function formAlter(array &$form, FormStateInterface $form_state, $form_id
           ->enforceRevisionsEntityFormAlter($form, $form_state, $form_id);
         // Submit handler to redirect to the latest version, if available.
         $form['actions']['submit']['#submit'][] = [EntityTypeInfo::class, 'bundleFormRedirect'];
+        // Hide the default buttons, including the specialty ones added by
+        // NodeForm.
+        foreach (['publish', 'unpublish'] as $key) {
+          $form['actions'][$key]['#access'] = FALSE;
+          unset($form['actions'][$key]['#dropbutton']);
+        }
+        // Give access to submit, because Node disables it.
+        $form['actions']['submit']['#access'] = TRUE;
       }
     }
   }
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 970ac33..3a2bd45 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\content_moderation\Plugin\Field\FieldWidget;
 
-use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\content_moderation\Plugin\Field\ModerationStateFieldItemList;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
@@ -106,7 +106,7 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
-    /** @var ContentEntityInterface $entity */
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
     $entity = $items->getEntity();
 
     /* @var \Drupal\Core\Config\Entity\ConfigEntityInterface $bundle_entity */
@@ -117,103 +117,66 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     }
 
     $workflow = $this->moderationInformation->getWorkflowForEntity($entity);
-    $default = $items->get($delta)->value ? $workflow->getState($items->get($delta)->value) : $workflow->getInitialState();
-    if (!$default) {
+    $current_state = $items->get($delta)->value ? $workflow->getState($items->get($delta)->value) : $workflow->getInitialState();
+    if (!$current_state) {
       throw new \UnexpectedValueException(sprintf('The %s bundle has an invalid moderation state configuration, moderation states are enabled but no default is set.', $bundle_entity->label()));
     }
 
     /** @var \Drupal\workflows\Transition[] $transitions */
     $transitions = $this->validator->getValidTransitions($entity, $this->currentUser);
 
-    $target_states = [];
+    $transition_labels = [];
+    $default_value = NULL;
     foreach ($transitions as $transition) {
-      $target_states[$transition->to()->id()] = $transition->label();
+      $transition_to_state = $transition->to();
+      if ($transition_to_state->id() === $current_state->id() && !$entity->isNew()) {
+        $default_value = $transition_to_state->id();
+        // Add the default transition to the top of the list.
+        $transition_labels = [
+          $transition_to_state->id() => $this->t('Keep @state', ['@state' => $transition_to_state->label()])
+        ] + $transition_labels;
+      }
+      else {
+        $transition_labels[$transition_to_state->id()] = $transition->label();
+      }
     }
 
-    // @todo https://www.drupal.org/node/2779933 write a test for this.
     $element += [
-      '#access' => FALSE,
-      '#type' => 'select',
-      '#options' => $target_states,
-      '#default_value' => $default->id(),
-      '#published' => $default->isPublishedState(),
-      '#key_column' => $this->column,
+      '#type' => 'container',
+      'current' => [
+        '#type' => 'item',
+        '#title' => $this->t('Current state'),
+        '#markup' => $current_state->label(),
+        '#access' => !$entity->isNew(),
+      ],
+      'state' => [
+        '#type' => 'select',
+        '#title' => $this->t('On save'),
+        '#key_column' => $this->column,
+        '#options' => $transition_labels,
+        '#default_value' => $default_value,
+      ],
+      '#attached' => [
+        'library' => ['content_moderation/moderation-state-widget']
+      ],
     ];
     $element['#element_validate'][] = [get_class($this), 'validateElement'];
 
-    // Use the dropbutton.
-    $element['#process'][] = [get_called_class(), 'processActions'];
     return $element;
   }
 
   /**
-   * Entity builder updating the node moderation state with the submitted value.
-   *
-   * @param string $entity_type_id
-   *   The entity type identifier.
-   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
-   *   The entity updated with the submitted values.
-   * @param array $form
-   *   The complete form array.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The current state of the form.
-   */
-  public static function updateStatus($entity_type_id, ContentEntityInterface $entity, array $form, FormStateInterface $form_state) {
-    $element = $form_state->getTriggeringElement();
-    if (isset($element['#moderation_state'])) {
-      $entity->moderation_state->value = $element['#moderation_state'];
-    }
-  }
-
-  /**
-   * Process callback to alter action buttons.
+   * {@inheritdoc}
    */
-  public static function processActions($element, FormStateInterface $form_state, array &$form) {
-
-    // We'll steal most of the button configuration from the default submit
-    // button. However, NodeForm also hides that button for admins (as it adds
-    // its own, too), so we have to restore it.
-    $default_button = $form['actions']['submit'];
-    $default_button['#access'] = TRUE;
-
-    // Add a custom button for each transition we're allowing. The #dropbutton
-    // property tells FAPI to cluster them all together into a single widget.
-    $options = $element['#options'];
-
-    $entity = $form_state->getFormObject()->getEntity();
-    $translatable = !$entity->isNew() && $entity->isTranslatable();
-    foreach ($options as $id => $label) {
-      $button = [
-        '#dropbutton' => 'save',
-        '#moderation_state' => $id,
-        '#weight' => -10,
-      ];
-
-      $button['#value'] = $translatable
-        ? t('Save and @transition (this translation)', ['@transition' => $label])
-        : t('Save and @transition', ['@transition' => $label]);
-
-      $form['actions']['moderation_state_' . $id] = $button + $default_button;
-    }
-
-    // Hide the default buttons, including the specialty ones added by
-    // NodeForm.
-    foreach (['publish', 'unpublish', 'submit'] as $key) {
-      $form['actions'][$key]['#access'] = FALSE;
-      unset($form['actions'][$key]['#dropbutton']);
-    }
-
-    // Setup a callback to translate the button selection back into field
-    // widget, so that it will get saved properly.
-    $form['#entity_builders']['update_moderation_state'] = [get_called_class(), 'updateStatus'];
-    return $element;
+  public static function validateElement(array $element, FormStateInterface $form_state) {
+    $form_state->setValueForElement($element, [$element['state']['#key_column'] => $element['state']['#value']]);
   }
 
   /**
    * {@inheritdoc}
    */
   public static function isApplicable(FieldDefinitionInterface $field_definition) {
-    return $field_definition->getName() === 'moderation_state';
+    return $field_definition->getClass() === ModerationStateFieldItemList::class;
   }
 
 }
diff --git a/core/modules/content_moderation/src/Tests/ModerationFormTest.php b/core/modules/content_moderation/src/Tests/ModerationFormTest.php
index 16da4e4..e652b31 100644
--- a/core/modules/content_moderation/src/Tests/ModerationFormTest.php
+++ b/core/modules/content_moderation/src/Tests/ModerationFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\content_moderation\Tests;
 
+use Drupal\workflows\Entity\Workflow;
+
 /**
  * Tests the moderation form, specifically on nodes.
  *
@@ -31,10 +33,15 @@ protected function setUp() {
    */
   public function testModerationForm() {
     // Create new moderated content in draft.
-    $this->drupalPostForm('node/add/moderated_content', [
+    $this->drupalGet('node/add/moderated_content');
+    // Since the node is being created there is no current state.
+    $this->assertNoText('Current state');
+
+    $this->drupalPostForm(NULL, [
       'title[0][value]' => 'Some moderated content',
       'body[0][value]' => 'First version of the content.',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
 
     $node = $this->drupalGetNodeByTitle('Some moderated content');
     $canonical_path = sprintf('node/%d', $node->id());
@@ -48,10 +55,26 @@ public function testModerationForm() {
     $this->drupalGet($latest_version_path);
     $this->assertResponse(403);
 
+    // Test what occurs when the current state is not available to transition
+    // to.
+    $workflow = Workflow::load('editorial');
+    $workflow->setTransitionFromStates('create_new_draft', ['published'])->save();
+    $this->drupalGet($edit_path);
+    $this->assertText('Current state');
+    $current_state = $this->xpath('//div[@id="edit-moderation-state-0-current"]');
+    $this->assertEqual('Draft', trim($current_state[0]));
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'published');
+    $workflow->setTransitionFromStates('create_new_draft', ['draft', 'published'])->save();
+    $this->drupalGet($edit_path);
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'draft');
+    $this->assertText("Keep Draft");
+
     // Update the draft.
+    $this->drupalGet($edit_path);
     $this->drupalPostForm($edit_path, [
       'body[0][value]' => 'Second version of the content.',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
 
     // The latest version page should not show, because there is still no
     // forward revision.
@@ -59,9 +82,33 @@ public function testModerationForm() {
     $this->assertResponse(403);
 
     // Publish the draft.
+    $this->drupalGet($edit_path);
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'draft');
+    $this->assertText("Keep Draft");
     $this->drupalPostForm($edit_path, [
       'body[0][value]' => 'Third version of the content.',
-    ], t('Save and Publish'));
+      'moderation_state[0][state]' => 'published',
+    ], t('Save'));
+
+    // Archive the published entity.
+    $this->drupalGet($edit_path);
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'published');
+    $this->assertText("Keep Published");
+    $this->assertText('Current state');
+    $current_state = $this->xpath('//div[@id="edit-moderation-state-0-current"]');
+    $this->assertEqual('Published', trim($current_state[0]));
+    $this->drupalPostForm($edit_path, [
+      'body[0][value]' => 'Fourth version of the content.',
+      'moderation_state[0][state]' => 'archived',
+    ], t('Save'));
+
+    // Then back to Published so we can add a forward revision.
+    $this->drupalGet($edit_path);
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'draft');
+    $this->drupalPostForm($edit_path, [
+      'body[0][value]' => 'Fifth version of the content.',
+      'moderation_state[0][state]' => 'published',
+    ], t('Save'));
 
     // The published view should not have a moderation form, because it is the
     // default revision.
@@ -75,9 +122,12 @@ public function testModerationForm() {
     $this->assertResponse(403);
 
     // Make a forward revision.
+    $this->drupalGet($edit_path);
+    $this->assertFieldsByValue($this->xpath('//select[@id="edit-moderation-state-0-state"]'), 'published');
     $this->drupalPostForm($edit_path, [
-      'body[0][value]' => 'Fourth version of the content.',
-    ], t('Save and Create New Draft'));
+      'body[0][value]' => 'Sixth version of the content.',
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save'));
 
     // The published view should not have a moderation form, because it is the
     // default revision.
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateBlockTest.php b/core/modules/content_moderation/src/Tests/ModerationStateBlockTest.php
index 593a9f9..a86506c 100644
--- a/core/modules/content_moderation/src/Tests/ModerationStateBlockTest.php
+++ b/core/modules/content_moderation/src/Tests/ModerationStateBlockTest.php
@@ -67,9 +67,10 @@ public function testCustomBlockModeration() {
     $body = 'Body of moderated block';
     $edit = [
       'info[0][value]' => 'Moderated block',
+      'moderation_state[0][state]' => 'draft',
       'body[0][value]' => $body,
     ];
-    $this->drupalPostForm('block/add', $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('block/add', $edit, t('Save'));
     $this->assertText(t('basic Moderated block has been created.'));
 
     // Place the block in the Sidebar First region.
@@ -91,8 +92,9 @@ public function testCustomBlockModeration() {
     $updated_body = 'This is the new body value';
     $edit = [
       'body[0][value]' => $updated_body,
+      'moderation_state[0][state]' => 'draft'
     ];
-    $this->drupalPostForm('block/' . $block->id(), $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('block/' . $block->id(), $edit, t('Save'));
     $this->assertText(t('basic Moderated block has been updated.'));
 
     // Navigate to the home page and check that the block shows the updated
@@ -102,14 +104,17 @@ public function testCustomBlockModeration() {
     $this->assertText($updated_body);
 
     // Publish the block so we can create a forward revision.
-    $this->drupalPostForm('block/' . $block->id(), [], t('Save and Publish'));
+    $this->drupalPostForm('block/' . $block->id(), [
+      'moderation_state[0][state]' => 'published'
+    ], t('Save'));
 
     // Create a forward revision.
     $forward_revision_body = 'This is the forward revision body value';
     $edit = [
       'body[0][value]' => $forward_revision_body,
+      'moderation_state[0][state]' => 'draft'
     ];
-    $this->drupalPostForm('block/' . $block->id(), $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('block/' . $block->id(), $edit, t('Save'));
     $this->assertText(t('basic Moderated block has been updated.'));
 
     // Navigate to home page and check that the forward revision doesn't show,
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateNodeTest.php b/core/modules/content_moderation/src/Tests/ModerationStateNodeTest.php
index 49eee6d..93a67e5 100644
--- a/core/modules/content_moderation/src/Tests/ModerationStateNodeTest.php
+++ b/core/modules/content_moderation/src/Tests/ModerationStateNodeTest.php
@@ -28,7 +28,8 @@ protected function setUp() {
   public function testCreatingContent() {
     $this->drupalPostForm('node/add/moderated_content', [
       'title[0][value]' => 'moderated content',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
     $node = $this->getNodeByTitle('moderated content');
     if (!$node) {
       $this->fail('Test node was not saved correctly.');
@@ -37,7 +38,9 @@ public function testCreatingContent() {
 
     $path = 'node/' . $node->id() . '/edit';
     // Set up published revision.
-    $this->drupalPostForm($path, [], t('Save and Publish'));
+    $this->drupalPostForm($path, [
+      'moderation_state[0][state]' => 'published'
+    ], t('Save'));
     \Drupal::entityTypeManager()->getStorage('node')->resetCache([$node->id()]);
     /* @var \Drupal\node\NodeInterface $node */
     $node = \Drupal::entityTypeManager()->getStorage('node')->load($node->id());
@@ -80,7 +83,8 @@ public function testFormSaveDestination() {
     $this->drupalPostForm('node/add/moderated_content', [
       'title[0][value]' => 'Some moderated content',
       'body[0][value]' => 'First version of the content.',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
 
     $node = $this->drupalGetNodeByTitle('Some moderated content');
     $edit_path = sprintf('node/%d/edit', $node->id());
@@ -94,7 +98,8 @@ public function testFormSaveDestination() {
     // URL, but viewing the second revision.
     $this->drupalPostForm($edit_path, [
       'body[0][value]' => 'Second version of the content.',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
     $this->assertUrl(Url::fromRoute('entity.node.canonical', ['node' => $node->id()]));
     $this->assertText('Second version of the content.');
 
@@ -102,7 +107,8 @@ public function testFormSaveDestination() {
     // canonical URL.
     $this->drupalPostForm($edit_path, [
       'body[0][value]' => 'Third version of the content.',
-    ], t('Save and Publish'));
+      'moderation_state[0][state]' => 'published'
+    ], t('Save'));
     $this->assertUrl(Url::fromRoute('entity.node.canonical', ['node' => $node->id()]));
     $this->assertText('Third version of the content.');
 
@@ -110,7 +116,8 @@ public function testFormSaveDestination() {
     // version" tab.
     $this->drupalPostForm($edit_path, [
       'body[0][value]' => 'Fourth version of the content.',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
     $this->assertUrl(Url::fromRoute('entity.node.latest_version', ['node' => $node->id()]));
     $this->assertText('Fourth version of the content.');
   }
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateNodeTypeTest.php b/core/modules/content_moderation/src/Tests/ModerationStateNodeTypeTest.php
index 099b4dc..f72e6c5 100644
--- a/core/modules/content_moderation/src/Tests/ModerationStateNodeTypeTest.php
+++ b/core/modules/content_moderation/src/Tests/ModerationStateNodeTypeTest.php
@@ -67,8 +67,8 @@ public function testEnablingOnExistingContent() {
     $this->assertLinkByHref('node/' . $node->id() . '/edit');
     $this->drupalGet('node/' . $node->id() . '/edit');
     $this->assertResponse(200);
-    $this->assertRaw('Save and Create New Draft');
-    $this->assertNoRaw('Save and publish');
+    $this->assertRaw('Draft');
+    $this->assertRaw('Publish');
   }
 
 }
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateTestBase.php b/core/modules/content_moderation/src/Tests/ModerationStateTestBase.php
index 8574a99..d31c6b3 100644
--- a/core/modules/content_moderation/src/Tests/ModerationStateTestBase.php
+++ b/core/modules/content_moderation/src/Tests/ModerationStateTestBase.php
@@ -41,6 +41,9 @@
     'access content overview',
     'use editorial transition create_new_draft',
     'use editorial transition publish',
+    'use editorial transition archive',
+    'use editorial transition archived_draft',
+    'use editorial transition archived_published',
   ];
 
   /**
diff --git a/core/modules/content_moderation/tests/src/Functional/ModerationLocaleTest.php b/core/modules/content_moderation/tests/src/Functional/ModerationLocaleTest.php
index a9d95f0..3523e98 100644
--- a/core/modules/content_moderation/tests/src/Functional/ModerationLocaleTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/ModerationLocaleTest.php
@@ -53,8 +53,9 @@ public function testTranslateModeratedContent() {
     $edit = [
       'title[0][value]' => 'Published English node',
       'langcode[0][value]' => 'en',
+      'moderation_state[0][state]' => 'published'
     ];
-    $this->drupalPostForm('node/add/article', $edit, t('Save and Publish'));
+    $this->drupalPostForm('node/add/article', $edit, t('Save'));
     $this->assertText(t('Article Published English node has been created.'));
     $english_node = $this->drupalGetNodeByTitle('Published English node');
 
@@ -63,8 +64,9 @@ public function testTranslateModeratedContent() {
     $this->clickLink(t('Add'));
     $edit = [
       'title[0][value]' => 'French node Draft',
+      'moderation_state[0][state]' => 'draft'
     ];
-    $this->drupalPostForm(NULL, $edit, t('Save and Create New Draft (this translation)'));
+    $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
     // Here the error has occurred "The website encountered an unexpected error.
     // Please try again later."
     // If the translation has got lost.
@@ -74,8 +76,9 @@ public function testTranslateModeratedContent() {
     $edit = [
       'title[0][value]' => 'English node',
       'langcode[0][value]' => 'en',
+      'moderation_state[0][state]' => 'draft',
     ];
-    $this->drupalPostForm('node/add/article', $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('node/add/article', $edit, t('Save'));
     $this->assertText(t('Article English node has been created.'));
     $english_node = $this->drupalGetNodeByTitle('English node');
 
@@ -84,14 +87,17 @@ public function testTranslateModeratedContent() {
     $this->clickLink(t('Add'));
     $edit = [
       'title[0][value]' => 'French node',
+      'moderation_state[0][state]' => 'draft'
     ];
-    $this->drupalPostForm(NULL, $edit, t('Save and Create New Draft (this translation)'));
+    $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
     $this->assertText(t('Article French node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('English node', TRUE);
 
     // Publish the English article and check that the translation stays
     // unpublished.
-    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [], t('Save and Publish (this translation)'));
+    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'published',
+    ], t('Save (this translation)'));
     $this->assertText(t('Article English node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('English node', TRUE);
     $french_node = $english_node->getTranslation('fr');
@@ -106,8 +112,9 @@ public function testTranslateModeratedContent() {
     // the translation first.
     $edit = [
       'title[0][value]' => 'Another node',
+      'moderation_state[0][state]' => 'draft',
     ];
-    $this->drupalPostForm('node/add/article', $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('node/add/article', $edit, t('Save'));
     $this->assertText(t('Article Another node has been created.'));
     $english_node = $this->drupalGetNodeByTitle('Another node');
 
@@ -116,14 +123,17 @@ public function testTranslateModeratedContent() {
     $this->clickLink(t('Add'));
     $edit = [
       'title[0][value]' => 'Translated node',
+      'moderation_state[0][state]' => 'draft',
     ];
-    $this->drupalPostForm(NULL, $edit, t('Save and Create New Draft (this translation)'));
+    $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
     $this->assertText(t('Article Translated node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('Another node', TRUE);
 
     // Publish the translation and check that the source language version stays
     // unpublished.
-    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [], t('Save and Publish (this translation)'));
+    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'published',
+    ], t('Save (this translation)'));
     $this->assertText(t('Article Translated node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('Another node', TRUE);
     $french_node = $english_node->getTranslation('fr');
@@ -135,8 +145,9 @@ public function testTranslateModeratedContent() {
     // Now check that we can create a new draft of the translation.
     $edit = [
       'title[0][value]' => 'New draft of translated node',
+      'moderation_state[0][state]' => 'draft',
     ];
-    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', $edit, t('Save and Create New Draft (this translation)'));
+    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', $edit, t('Save (this translation)'));
     $this->assertText(t('Article New draft of translated node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('Another node', TRUE);
     $french_node = $english_node->getTranslation('fr');
@@ -157,15 +168,21 @@ public function testTranslateModeratedContent() {
     $this->assertEqual($french_node->getTitle(), 'New draft of translated node', 'The draft has replaced the published revision.');
 
     // Publish the English article before testing the archive transition.
-    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [], t('Save and Publish (this translation)'));
+    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'published',
+    ], t('Save (this translation)'));
     $this->assertText(t('Article Another node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('Another node', TRUE);
     $this->assertEqual($english_node->moderation_state->value, 'published');
 
     // Archive the node and its translation.
-    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [], t('Save and Archive (this translation)'));
+    $this->drupalPostForm('node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'archived',
+    ], t('Save (this translation)'));
     $this->assertText(t('Article Another node has been updated.'));
-    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [], t('Save and Archive (this translation)'));
+    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'archived',
+    ], t('Save (this translation)'));
     $this->assertText(t('Article New draft of translated node has been updated.'));
     $english_node = $this->drupalGetNodeByTitle('Another node', TRUE);
     $french_node = $english_node->getTranslation('fr');
@@ -178,8 +195,9 @@ public function testTranslateModeratedContent() {
     // after creating a forward french revision.
     $edit = [
       'title[0][value]' => 'An english node',
+      'moderation_state[0][state]' => 'draft',
     ];
-    $this->drupalPostForm('node/add/article', $edit, t('Save and Create New Draft'));
+    $this->drupalPostForm('node/add/article', $edit, t('Save'));
     $this->assertText(t('Article An english node has been created.'));
     $english_node = $this->drupalGetNodeByTitle('An english node');
     $this->assertFalse($english_node->isPublished());
@@ -189,15 +207,18 @@ public function testTranslateModeratedContent() {
     $this->clickLink(t('Add'));
     $edit = [
       'title[0][value]' => 'A french node',
+      'moderation_state[0][state]' => 'published',
     ];
-    $this->drupalPostForm(NULL, $edit, t('Save and Publish (this translation)'));
+    $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
     $english_node = $this->drupalGetNodeByTitle('An english node', TRUE);
     $french_node = $english_node->getTranslation('fr');
     $this->assertTrue($french_node->isPublished());
     $this->assertFalse($english_node->isPublished());
 
     // Create a forward revision
-    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [], t('Save and Create New Draft (this translation)'));
+    $this->drupalPostForm('fr/node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'draft',
+    ], t('Save (this translation)'));
     $english_node = $this->drupalGetNodeByTitle('An english node', TRUE);
     $french_node = $english_node->getTranslation('fr');
     $this->assertTrue($french_node->isPublished());
@@ -205,7 +226,9 @@ public function testTranslateModeratedContent() {
 
     // Publish the english node and the default french node not the latest
     // french node should be used.
-    $this->drupalPostForm('/node/' . $english_node->id() . '/edit', [], t('Save and Publish (this translation)'));
+    $this->drupalPostForm('/node/' . $english_node->id() . '/edit', [
+      'moderation_state[0][state]' => 'published',
+    ], t('Save (this translation)'));
     $english_node = $this->drupalGetNodeByTitle('An english node', TRUE);
     $french_node = $english_node->getTranslation('fr');
     $this->assertTrue($french_node->isPublished());
diff --git a/core/modules/content_moderation/tests/src/Functional/NodeAccessTest.php b/core/modules/content_moderation/tests/src/Functional/NodeAccessTest.php
index 2d52421..6849289 100644
--- a/core/modules/content_moderation/tests/src/Functional/NodeAccessTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/NodeAccessTest.php
@@ -28,7 +28,8 @@ public function testPageAccess() {
     // Create a node to test with.
     $this->drupalPostForm('node/add/moderated_content', [
       'title[0][value]' => 'moderated content',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
     $node = $this->getNodeByTitle('moderated content');
     if (!$node) {
       $this->fail('Test node was not saved correctly.');
@@ -39,7 +40,9 @@ public function testPageAccess() {
     $latest_path = 'node/' . $node->id() . '/latest';
 
     // Publish the node.
-    $this->drupalPostForm($edit_path, [], t('Save and Publish'));
+    $this->drupalPostForm($edit_path, [
+      'moderation_state[0][state]' => 'published'
+    ], t('Save'));
 
     // Ensure access works correctly for anonymous users.
     $this->drupalLogout();
@@ -56,7 +59,8 @@ public function testPageAccess() {
     $this->drupalLogin($this->adminUser);
     $this->drupalPostForm($edit_path, [
       'title[0][value]' => 'moderated content revised',
-    ], t('Save and Create New Draft'));
+      'moderation_state[0][state]' => 'draft'
+    ], t('Save'));
 
     // Now make a new user and verify that the new user's access is correct.
     $user = $this->createUser([
diff --git a/core/modules/content_moderation/tests/src/Kernel/DefaultRevisionStateTest.php b/core/modules/content_moderation/tests/src/Kernel/DefaultRevisionStateTest.php
new file mode 100644
index 0000000..274e8b5
--- /dev/null
+++ b/core/modules/content_moderation/tests/src/Kernel/DefaultRevisionStateTest.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\Tests\content_moderation\Kernel;
+
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\node\Entity\Node;
+use Drupal\node\Entity\NodeType;
+use Drupal\workflows\Entity\Workflow;
+
+/**
+ * Tests the correct default revision is set.
+ *
+ * @group content_moderation
+ */
+class DefaultRevisionStateTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'entity_test',
+    'node',
+    'block_content',
+    'content_moderation',
+    'user',
+    'system',
+    'language',
+    'content_translation',
+    'text',
+    'workflows',
+  ];
+
+  /**
+   * @var \Drupal\Core\Entity\EntityTypeManager
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('node', 'node_access');
+    $this->installEntitySchema('node');
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('entity_test_with_bundle');
+    $this->installEntitySchema('entity_test_rev');
+    $this->installEntitySchema('entity_test_mulrevpub');
+    $this->installEntitySchema('block_content');
+    $this->installEntitySchema('content_moderation_state');
+    $this->installConfig('content_moderation');
+
+    $this->entityTypeManager = $this->container->get('entity_type.manager');
+  }
+
+  /**
+   * Tests a translatable Node.
+   */
+  public function testMultilingual() {
+    // Enable French.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    $node_type = NodeType::create([
+      'type' => 'example',
+    ]);
+    $node_type->save();
+
+    $this->container->get('content_translation.manager')->setEnabled('node', 'example', TRUE);
+
+    $workflow = Workflow::load('editorial');
+    $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'example');
+    $workflow->save();
+
+    $english_node = Node::create([
+      'type' => 'example',
+      'title' => 'Test title',
+    ]);
+    // Revision 1 (en).
+    $english_node
+      ->setUnpublished()
+      ->save();
+    $this->assertEquals('draft', $english_node->moderation_state->value);
+    $this->assertFalse($english_node->isPublished());
+    $this->assertTrue($english_node->isDefaultRevision());
+
+    // Revision 2 (fr)
+    $french_node = $english_node->addTranslation('fr', ['title' => 'French title']);
+    $french_node->moderation_state->value = 'published';
+    $french_node->save();
+    $this->assertTrue($french_node->isPublished());
+    $this->assertTrue($french_node->isDefaultRevision());
+
+    // Revision 3 (fr)
+    $node = Node::load($english_node->id())->getTranslation('fr');
+    $node->moderation_state->value = 'draft';
+    $node->save();
+    $this->assertFalse($node->isPublished());
+    $this->assertFalse($node->isDefaultRevision());
+
+    // Revision 4 (en)
+    $latest_revision = $this->entityTypeManager->getStorage('node')->loadRevision(3);
+    $latest_revision->moderation_state->value = 'draft';
+    $latest_revision->save();
+    $this->assertFalse($latest_revision->isPublished());
+    $this->assertFalse($latest_revision->isDefaultRevision());
+  }
+
+}
