diff --git a/core/modules/content_moderation/content_moderation.module b/core/modules/content_moderation/content_moderation.module
index 921fe2a..0174cf5 100644
--- a/core/modules/content_moderation/content_moderation.module
+++ b/core/modules/content_moderation/content_moderation.module
@@ -65,15 +65,6 @@ function content_moderation_entity_type_alter(array &$entity_types) {
 }
 
 /**
- * Implements hook_entity_presave().
- */
-function content_moderation_entity_presave(EntityInterface $entity) {
-  return \Drupal::service('class_resolver')
-    ->getInstanceFromDefinition(EntityOperations::class)
-    ->entityPresave($entity);
-}
-
-/**
  * Implements hook_entity_insert().
  */
 function content_moderation_entity_insert(EntityInterface $entity) {
diff --git a/core/modules/content_moderation/src/Entity/Handler/ModerationHandler.php b/core/modules/content_moderation/src/Entity/Handler/ModerationHandler.php
index 62e504e..f0d46fc 100644
--- a/core/modules/content_moderation/src/Entity/Handler/ModerationHandler.php
+++ b/core/modules/content_moderation/src/Entity/Handler/ModerationHandler.php
@@ -29,20 +29,6 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
   /**
    * {@inheritdoc}
    */
-  public function onPresave(ContentEntityInterface $entity, $default_revision, $published_state) {
-    // This is probably not necessary if configuration is setup correctly.
-    $entity->setNewRevision(TRUE);
-    $entity->isDefaultRevision($default_revision);
-
-    // Update publishing status if it can be updated and if it needs updating.
-    if (($entity instanceof EntityPublishedInterface) && $entity->isPublished() !== $published_state) {
-      $published_state ? $entity->setPublished() : $entity->setUnpublished();
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function enforceRevisionsEntityFormAlter(array &$form, FormStateInterface $form_state, $form_id) {
   }
 
diff --git a/core/modules/content_moderation/src/Entity/Handler/ModerationHandlerInterface.php b/core/modules/content_moderation/src/Entity/Handler/ModerationHandlerInterface.php
index 976fbb2..cefc035 100644
--- a/core/modules/content_moderation/src/Entity/Handler/ModerationHandlerInterface.php
+++ b/core/modules/content_moderation/src/Entity/Handler/ModerationHandlerInterface.php
@@ -15,18 +15,6 @@
 interface ModerationHandlerInterface {
 
   /**
-   * Operates on moderated content entities preSave().
-   *
-   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
-   *   The entity to modify.
-   * @param bool $default_revision
-   *   Whether the new revision should be made the default revision.
-   * @param bool $published_state
-   *   Whether the state being transitioned to is a published state or not.
-   */
-  public function onPresave(ContentEntityInterface $entity, $default_revision, $published_state);
-
-  /**
    * Alters entity forms to enforce revision handling.
    *
    * @param array $form
diff --git a/core/modules/content_moderation/src/EntityOperations.php b/core/modules/content_moderation/src/EntityOperations.php
index 3f66100..c6b2cd3 100644
--- a/core/modules/content_moderation/src/EntityOperations.php
+++ b/core/modules/content_moderation/src/EntityOperations.php
@@ -90,34 +90,6 @@ public static function create(ContainerInterface $container) {
   }
 
   /**
-   * Acts on an entity and set published status based on the moderation state.
-   *
-   * @param \Drupal\Core\Entity\EntityInterface $entity
-   *   The entity being saved.
-   */
-  public function entityPresave(EntityInterface $entity) {
-    if (!$this->moderationInfo->isModeratedEntity($entity)) {
-      return;
-    }
-
-    if ($entity->moderation_state->value) {
-      $workflow = $this->moderationInfo->getWorkflowForEntity($entity);
-      /** @var \Drupal\content_moderation\ContentModerationState $current_state */
-      $current_state = $workflow->getState($entity->moderation_state->value);
-
-      // 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);
-
-      // Fire per-entity-type logic for handling the save process.
-      $this->entityTypeManager->getHandler($entity->getEntityTypeId(), 'moderation')->onPresave($entity, $update_default_revision, $current_state->isPublishedState());
-    }
-  }
-
-  /**
    * Hook bridge.
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
@@ -247,38 +219,4 @@ 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, check if any of the
-   * translations are published.
-   *
-   * @param \Drupal\Core\Entity\EntityInterface $entity
-   *   The entity being saved.
-   * @param \Drupal\workflows\WorkflowInterface $workflow
-   *   The workflow being applied to the entity.
-   *
-   * @return bool
-   *   TRUE if the default revision is published. FALSE otherwise.
-   */
-  protected function isDefaultRevisionPublished(EntityInterface $entity, WorkflowInterface $workflow) {
-    $default_revision = $this->entityTypeManager->getStorage($entity->getEntityTypeId())->load($entity->id());
-
-    // Ensure we are checking all translations of the default revision.
-    if ($default_revision instanceof TranslatableInterface && $default_revision->isTranslatable()) {
-      // 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;
-        }
-      }
-    }
-
-    return $workflow->getState($default_revision->moderation_state->value)->isPublishedState();
-  }
-
 }
diff --git a/core/modules/content_moderation/src/ModerationInformation.php b/core/modules/content_moderation/src/ModerationInformation.php
index c20be52..1294bc1 100644
--- a/core/modules/content_moderation/src/ModerationInformation.php
+++ b/core/modules/content_moderation/src/ModerationInformation.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\TypedData\TranslatableInterface;
 
 /**
  * General service for moderation-related questions about Entity API.
@@ -140,6 +141,29 @@ public function isLiveRevision(ContentEntityInterface $entity) {
   /**
    * {@inheritdoc}
    */
+  public function isDefaultRevisionPublished(ContentEntityInterface $entity) {
+    $workflow = $this->getWorkflowForEntity($entity);
+    $default_revision = \Drupal::entityTypeManager()->getStorage($entity->getEntityTypeId())->load($entity->id());
+
+    // Ensure we are checking all translations of the default revision.
+    if ($default_revision instanceof TranslatableInterface && $default_revision->isTranslatable()) {
+      // 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;
+        }
+      }
+    }
+
+    return $workflow->getState($default_revision->moderation_state->value)->isPublishedState();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getWorkflowForEntity(ContentEntityInterface $entity) {
     $bundles = $this->bundleInfo->getBundleInfo($entity->getEntityTypeId());
     if (isset($bundles[$entity->bundle()]['workflow'])) {
diff --git a/core/modules/content_moderation/src/ModerationInformationInterface.php b/core/modules/content_moderation/src/ModerationInformationInterface.php
index 862987f..cf3adce 100644
--- a/core/modules/content_moderation/src/ModerationInformationInterface.php
+++ b/core/modules/content_moderation/src/ModerationInformationInterface.php
@@ -127,6 +127,21 @@ public function hasForwardRevision(ContentEntityInterface $entity);
   public function isLiveRevision(ContentEntityInterface $entity);
 
   /**
+   * Determines 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, check if any of the
+   * translations are published.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The entity being saved.
+   *
+   * @return bool
+   *   TRUE if the default revision is published. FALSE otherwise.
+   */
+  public function isDefaultRevisionPublished(ContentEntityInterface $entity);
+
+  /**
    * Gets the workflow for the given content entity.
    *
    * @param \Drupal\Core\Entity\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 74e3052..0a9e1bb 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,8 @@
 namespace Drupal\content_moderation\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
@@ -12,6 +14,8 @@
 use Drupal\Core\Session\AccountInterface;
 use Drupal\content_moderation\ModerationInformation;
 use Drupal\content_moderation\StateTransitionValidation;
+use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\workflows\WorkflowInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
diff --git a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
index 2d93f5a..7bcc57a 100644
--- a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
+++ b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
@@ -3,6 +3,7 @@
 namespace Drupal\content_moderation\Plugin\Field;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\Core\Field\FieldItemList;
 
 /**
@@ -117,4 +118,37 @@ protected function computeModerationFieldItemList() {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function onChange($delta) {
+    $entity = $this->getEntity();
+
+    /** @var \Drupal\content_moderation\ModerationInformationInterface $content_moderation_info */
+    $content_moderation_info = \Drupal::service('content_moderation.moderation_information');
+    $workflow = $content_moderation_info->getWorkflowForEntity($entity);
+
+    /** @var \Drupal\content_moderation\ContentModerationState $current_state */
+    $current_state = $workflow->getState($entity->moderation_state->value);
+
+    // This entity is default if it is new, a new translation, the default
+    // revision state, or the default revision is not published.
+    $update_default_revision = $entity->isNew()
+      || $entity->isNewTranslation()
+      || $current_state->isDefaultRevisionState()
+      || !$content_moderation_info->isDefaultRevisionPublished($entity, $workflow);
+
+    // This is probably not necessary if configuration is setup correctly.
+    $entity->setNewRevision(TRUE);
+    $entity->isDefaultRevision($update_default_revision);
+
+    // Update publishing status if it can be updated and if it needs updating.
+    $published_state = $current_state->isPublishedState();
+    if (($entity instanceof EntityPublishedInterface) && $entity->isPublished() !== $published_state) {
+      $published_state ? $entity->setPublished() : $entity->setUnpublished();
+    }
+
+    parent::onChange($delta);
+  }
+
 }
