diff --git a/core/modules/content_moderation/content_moderation.api.php b/core/modules/content_moderation/content_moderation.api.php
new file mode 100644
index 0000000000000000000000000000000000000000..a56813e05f3d520eaf33e3505a484e4e997fb1ec
--- /dev/null
+++ b/core/modules/content_moderation/content_moderation.api.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * API documentation for Content Moderation module.
+ */
+
+/**
+ * @defgroup content_moderation_plugin Content Moderation Workflow Type Plugin
+ * @{
+ * The Workflow Type plugin implemented by Content Moderation links revisionable
+ * entities to workflows.
+ *
+ * In the Content Moderation Workflow Type Plugin, one method requires the
+ * entity object to be passed in as a parameter, even though the interface
+ * defined by Workflows module doesn't require this:
+ * @code
+ * $workflow_type_plugin->getInitialState($entity);
+ * @endcode
+ * This is used to determine the initial moderation state based on the
+ * publishing status of the entity.
+ * @}
+ */
diff --git a/core/modules/content_moderation/src/EntityOperations.php b/core/modules/content_moderation/src/EntityOperations.php
index 22e901b03ea58ef65ce64050d95516db7dde8320..d276ad74d4fa53f0e0fba04c36d3c70086c784d5 100644
--- a/core/modules/content_moderation/src/EntityOperations.php
+++ b/core/modules/content_moderation/src/EntityOperations.php
@@ -191,7 +191,7 @@ protected function updateOrCreateFromEntity(EntityInterface $entity) {
     $moderation_state = $entity->moderation_state->value;
     /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
     if (!$moderation_state) {
-      $moderation_state = $workflow->getTypePlugin()->getInitialState($workflow, $entity)->id();
+      $moderation_state = $workflow->getTypePlugin()->getInitialState($entity)->id();
     }
 
     // @todo what if $entity->moderation_state is null at this point?
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 9a35f905d86056af3c6bce70bc21698f4a6502cc..bfdc815f4fcc5c7f23fce2d5439b95ac232891be 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -116,7 +116,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     }
 
     $workflow = $this->moderationInformation->getWorkflowForEntity($entity);
-    $default = $items->get($delta)->value ? $workflow->getTypePlugin()->getState($items->get($delta)->value) : $workflow->getTypePlugin()->getInitialState($workflow, $entity);
+    $default = $items->get($delta)->value ? $workflow->getTypePlugin()->getState($items->get($delta)->value) : $workflow->getTypePlugin()->getInitialState($entity);
 
     /** @var \Drupal\workflows\Transition[] $transitions */
     $transitions = $this->validator->getValidTransitions($entity, $this->currentUser);
diff --git a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
index 99e5f558d31f5e50fd5f40e9a000407a2c1effda..de622244b1725b8893711a7904e6cdeeb1971838 100644
--- a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
+++ b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
@@ -39,7 +39,7 @@ protected function getModerationStateId() {
     // the node type form creates a fake Node entity to get default values.
     // @see \Drupal\node\NodeTypeForm::form()
     $workflow = $moderation_info->getWorkFlowForEntity($entity);
-    return $workflow ? $workflow->getTypePlugin()->getInitialState($workflow, $entity)->id() : NULL;
+    return $workflow ? $workflow->getTypePlugin()->getInitialState($entity)->id() : NULL;
   }
 
   /**
diff --git a/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php b/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php
index aac75b98678e0ba80a803a98e638db6965431daa..ceaa565767554cd0f22f700e72a1ffd190c99967 100644
--- a/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php
+++ b/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php
@@ -4,6 +4,7 @@
 
 use Drupal\content_moderation\ModerationInformationInterface;
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\EntityPublishedInterface;
@@ -340,11 +341,19 @@ public function getConfiguration() {
   /**
    * {@inheritdoc}
    */
-  public function getInitialState(WorkflowInterface $workflow, $entity = NULL) {
+  public function getInitialState($entity = NULL) {
+    // Workflows are not tied to entities, but Content Moderation adds the
+    // relationship between Workflows and entities. Content Moderation needs the
+    // entity object to be able to determine the initial state based on
+    // publishing status.
+    if (!($entity instanceof ContentEntityInterface)) {
+      throw new \InvalidArgumentException('A content entity object must be supplied.');
+    }
     if ($entity instanceof EntityPublishedInterface) {
-      return $workflow->getTypePlugin()->getState($entity->isPublished() && !$entity->isNew() ? 'published' : 'draft');
+      return $this->getState($entity->isPublished() && !$entity->isNew() ? 'published' : 'draft');
     }
-    return parent::getInitialState($workflow);
+    // Workflows determines the initial state for non-publishable entities.
+    return parent::getInitialState();
   }
 
 }
diff --git a/core/modules/content_moderation/src/StateTransitionValidation.php b/core/modules/content_moderation/src/StateTransitionValidation.php
index aca956ffc346874d58ca4acf48dcfeaeab03b2ad..fc09e5eda68bd3ed02aa5181f1c38bae577d2bae 100644
--- a/core/modules/content_moderation/src/StateTransitionValidation.php
+++ b/core/modules/content_moderation/src/StateTransitionValidation.php
@@ -40,7 +40,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($workflow, $entity);
+    $current_state = $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/workflows/src/Plugin/WorkflowTypeBase.php b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
index b7e18d9dd972460a402c4a7ee4576320995142b1..23481a46172e2ce318645195a15bb53151a70b84 100644
--- a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
+++ b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
@@ -117,7 +117,7 @@ public function onDependencyRemoval(array $dependencies) {
   /**
    * {@inheritdoc}
    */
-  public function getInitialState(WorkflowInterface $workflow) {
+  public function getInitialState() {
     $ordered_states = $this->getStates();
     return reset($ordered_states);
   }
diff --git a/core/modules/workflows/src/WorkflowTypeInterface.php b/core/modules/workflows/src/WorkflowTypeInterface.php
index 9fd1a9a1156858d587870ca7e7f7c9adca878948..032422e04b8180ac8afc48540eef424cd3ee8253 100644
--- a/core/modules/workflows/src/WorkflowTypeInterface.php
+++ b/core/modules/workflows/src/WorkflowTypeInterface.php
@@ -80,13 +80,10 @@ public function workflowStateHasData(WorkflowInterface $workflow, StateInterface
   /**
    * Gets the initial state for the workflow.
    *
-   * @param \Drupal\workflows\WorkflowInterface $workflow
-   *   The workflow entity.
-   *
    * @return \Drupal\workflows\StateInterface
    *   The initial state.
    */
-  public function getInitialState(WorkflowInterface $workflow);
+  public function getInitialState();
 
   /**
    * Gets the required states of workflow type.
diff --git a/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php b/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php
index 49be0fc4e703ccebc2d9466ee2fae1af884867b9..b924f48b5684c1e22ad717a07f59b6f3722e6656 100644
--- a/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php
+++ b/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php
@@ -189,11 +189,11 @@ public function testWorkflowCreation() {
 
     // Ensure that weight changes the state ordering.
     $workflow = $workflow_storage->loadUnchanged('test');
-    $this->assertEquals('published', $workflow->getTypePlugin()->getInitialState($workflow)->id());
+    $this->assertEquals('published', $workflow->getTypePlugin()->getInitialState()->id());
     $this->drupalGet('admin/config/workflow/workflows/manage/test');
     $this->submitForm(['states[draft][weight]' => '-1'], 'Save');
     $workflow = $workflow_storage->loadUnchanged('test');
-    $this->assertEquals('draft', $workflow->getTypePlugin()->getInitialState($workflow)->id());
+    $this->assertEquals('draft', $workflow->getTypePlugin()->getInitialState()->id());
 
     // Verify that we are still on the workflow edit page.
     $this->assertSession()->addressEquals('admin/config/workflow/workflows/manage/test');
diff --git a/core/modules/workflows/workflows.api.php b/core/modules/workflows/workflows.api.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca55c87789e9f08335586d5ff6e29d0a9d782751
--- /dev/null
+++ b/core/modules/workflows/workflows.api.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * API documentation for Workflows module.
+ */
+
+/**
+ * @defgroup workflow_type_plugins Workflow Type Plugins
+ * @{
+ * Any module harnessing Workflows module must define a Workflow Type Plugin.
+ * This allows the module to tailor the workflow to its specific need. For
+ * example, Content Moderation module uses its the Workflow Type Plugin to link
+ * workflows to entities. On their own, workflows are a stand-alone concept. It
+ * takes a module such as Content Moderation to give the workflow context.
+ * @}
+ */