diff --git a/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php b/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php
new file mode 100644
index 0000000..3a1e0df
--- /dev/null
+++ b/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\content_moderation\Entity;
+
+/**
+ * Provides a trait for getting labels.
+ */
+trait EntityUniqueLabelTrait {
+
+  /**
+   * Filters the labels.
+   *
+   * @return array
+   *   Unique labels.
+   */
+  public static function getNonUniqueLabels() {
+    $labels = [];
+
+    foreach (static::loadMultiple() as $moderation_state) {
+      $label = $moderation_state->label(FALSE);
+      $labels[$label] = isset($labels[$label]);
+    }
+
+    return array_filter($labels);
+  }
+
+  /**
+   * Returns modified label if non-unique.
+   *
+   * @returns string
+   *   If TRUE appends machine name to the label.
+   */
+  public function label($unique = TRUE) {
+    $label = parent::label();
+    if ($unique) {
+      if (isset(static::getNonUniqueLabels()[$label])) {
+        return $label . ' (' . $this->id() . ')';
+      }
+    }
+    return $label;
+  }
+
+}
diff --git a/core/modules/content_moderation/src/Entity/ModerationState.php b/core/modules/content_moderation/src/Entity/ModerationState.php
index 379ff60..b1ada3a 100644
--- a/core/modules/content_moderation/src/Entity/ModerationState.php
+++ b/core/modules/content_moderation/src/Entity/ModerationState.php
@@ -47,6 +47,7 @@
  * )
  */
 class ModerationState extends ConfigEntityBase implements ModerationStateInterface {
+  use EntityUniqueLabelTrait;
 
   /**
    * The Moderation state ID.
diff --git a/core/modules/content_moderation/src/Entity/ModerationStateTransition.php b/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
index 95a115b..4f54d0f 100644
--- a/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
+++ b/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
@@ -39,6 +39,7 @@
  * )
  */
 class ModerationStateTransition extends ConfigEntityBase implements ModerationStateTransitionInterface {
+  use EntityUniqueLabelTrait;
 
   /**
    * The Moderation state transition ID.
diff --git a/core/modules/content_moderation/src/Form/ModerationStateForm.php b/core/modules/content_moderation/src/Form/ModerationStateForm.php
index 32d7a48..db1dc7e 100644
--- a/core/modules/content_moderation/src/Form/ModerationStateForm.php
+++ b/core/modules/content_moderation/src/Form/ModerationStateForm.php
@@ -23,7 +23,8 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
       '#maxlength' => 255,
-      '#default_value' => $moderation_state->label(),
+      // Skip checking if the label is unique when creating a new moderation state.
+      '#default_value' => $moderation_state->label(FALSE),
       '#description' => $this->t('Label for the Moderation state.'),
       '#required' => TRUE,
     );
diff --git a/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php b/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
index 8322c18..8db2d12 100644
--- a/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
+++ b/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
@@ -61,7 +61,8 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
       '#maxlength' => 255,
-      '#default_value' => $moderation_state_transition->label(),
+      // Skip checkin the uniqueness when creating a new transition.
+      '#default_value' => $moderation_state_transition->label(FALSE),
       '#description' => $this->t('Label for the Moderation state transition.'),
       '#required' => TRUE,
     ];
diff --git a/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php b/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
index 577283e..86725b5 100644
--- a/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
+++ b/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
@@ -82,7 +82,7 @@ public function buildHeader() {
    */
   public function buildRow(EntityInterface $entity) {
     $row['to']['#markup'] = $this->stateStorage->load($entity->getToState())->label();
-    $row['label'] = $entity->label();
+    $row['label'] = $entity->label(FALSE);
     $row['roles']['#markup'] = implode(', ', user_role_names(FALSE, 'use ' . $entity->id() . ' transition'));
 
     return $row + parent::buildRow($entity);
diff --git a/core/modules/content_moderation/src/Permissions.php b/core/modules/content_moderation/src/Permissions.php
index 027684c..6f83ec4 100644
--- a/core/modules/content_moderation/src/Permissions.php
+++ b/core/modules/content_moderation/src/Permissions.php
@@ -28,7 +28,8 @@ public function transitionPermissions() {
     foreach (ModerationStateTransition::loadMultiple() as $id => $transition) {
       $perms['use ' . $id . ' transition'] = [
         'title' => $this->t('Use the %transition_name transition', [
-          '%transition_name' => $transition->label(),
+          // Not adding machine name to transitions.
+          '%transition_name' => $transition->label(FALSE),
         ]),
         'description' => $this->t('Move content from %from state to %to state.', [
           '%from' => $states[$transition->getFromState()]->label(),
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 d6dc89d..1807bf5 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -163,7 +163,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $target_states = [];
     /** @var \Drupal\content_moderation\Entity\ModerationStateTransition $transition */
     foreach ($transitions as $transition) {
-      $target_states[$transition->getToState()] = $transition->label();
+      $target_states[$transition->getToState()] = $transition->label(FALSE);
     }
 
     // @todo https://www.drupal.org/node/2779933 write a test for this.
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateDuplicateLabelTest.php b/core/modules/content_moderation/src/Tests/ModerationStateDuplicateLabelTest.php
new file mode 100644
index 0000000..a0cb630
--- /dev/null
+++ b/core/modules/content_moderation/src/Tests/ModerationStateDuplicateLabelTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Drupal\content_moderation\Tests;
+
+use Drupal\content_moderation\Entity\ModerationState;
+
+/**
+ * Tests the Unique/Duplicate labels form "Moderation states" screen and "Add Moderation state transition".
+ *
+ * @group workbench_moderation
+ */
+class ModerationStateDuplicateLabelTest extends ModerationStateTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+  }
+
+  /**
+   * Tests administration of moderation state transition entity.
+   */
+  public function testDuplicateLabel() {
+    $duplicate_label = 'Duplicate Label';
+    $unique_label = 'Unique Label';
+
+    $this->drupalLogin($this->adminUser);
+    $this->drupalGet('admin/config/workflow/moderation');
+    $this->assertLink('Moderation states');
+    $this->clickLink('Moderation states');
+    $this->clickLink(t('Add Moderation state'));
+    // Add two states with the same label and one unique.
+    $this->drupalPostForm(NULL, [
+      'label' => $duplicate_label,
+      'id' => 'duplciate_one',
+    ], t('Save'));
+    $this->clickLink(t('Add Moderation state'));
+    $this->drupalPostForm(NULL, [
+      'label' => $duplicate_label,
+      'id' => 'duplicate_two',
+    ], t('Save'));
+    $this->clickLink(t('Add Moderation state'));
+    $this->drupalPostForm(NULL, [
+      'label' => $unique_label,
+      'id' => 'unique_label',
+    ], t('Save'));
+
+    $this->drupalGet('admin/config/workflow/moderation/states');
+
+    /** @var ModerationState $state */
+    $state = ModerationState::load('duplciate_one');
+    // The label includes machine_name.
+    $this->assertNotIdentical($state->label(), $duplicate_label, 'The labels are different.');
+    $this->assertIdentical($state->label(FALSE), $duplicate_label, 'The labels are identical.');
+    // Which should be displayed on the the screen.
+    $this->assertText($state->label());
+
+    /** @var ModerationState $state_u */
+    $state_u = ModerationState::load('unique_label');
+    // Unique labels don't change.
+    $this->assertTrue($state_u->label(), $unique_label, 'The labels are identical.');
+    $this->assertText($state_u->label());
+
+    $this->drupalGet('admin/config/workflow/moderation/transitions/add');
+    $this->assertOptionByText('edit-stateto', $state_u->label());
+    $this->assertOptionByText('edit-stateto', $state->label());
+  }
+
+}
diff --git a/core/modules/content_moderation/src/Tests/ModerationStateTransitionsTest.php b/core/modules/content_moderation/src/Tests/ModerationStateTransitionsTest.php
index 703561b..85329b3 100644
--- a/core/modules/content_moderation/src/Tests/ModerationStateTransitionsTest.php
+++ b/core/modules/content_moderation/src/Tests/ModerationStateTransitionsTest.php
@@ -59,7 +59,7 @@ public function testTransitionAdministration() {
     $this->drupalPostForm(NULL, [
       'label' => 'Create New Draft',
     ], t('Save'));
-    $this->assertText('Saved the Create New Draft Moderation state transition.');
+    $this->assertText('Saved the Create New Draft (draft_draft) Moderation state transition.');
 
     // Add a new state.
     $this->drupalGet('admin/config/workflow/moderation/states/add');
