diff --git a/core/modules/content_moderation/content_moderation.module b/core/modules/content_moderation/content_moderation.module
index 31cc6c9..48d39d6 100644
--- a/core/modules/content_moderation/content_moderation.module
+++ b/core/modules/content_moderation/content_moderation.module
@@ -63,15 +63,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/Plugin/Field/FieldWidget/ModerationStateWidget.php b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
index 74e3052..f98cbd9 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;
 
 /**
@@ -158,6 +162,27 @@ public static function updateStatus($entity_type_id, ContentEntityInterface $ent
     $element = $form_state->getTriggeringElement();
     if (isset($element['#moderation_state'])) {
       $entity->moderation_state->value = $element['#moderation_state'];
+
+      $workflow = \Drupal::service('content_moderation.moderation_information')->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()
+        || !static::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();
+      }
     }
   }
 
@@ -212,4 +237,38 @@ public static function isApplicable(FieldDefinitionInterface $field_definition)
     return $field_definition->getName() === 'moderation_state';
   }
 
+  /**
+   * 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.
+   */
+  public static function isDefaultRevisionPublished(EntityInterface $entity, WorkflowInterface $workflow) {
+    $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();
+  }
+
 }
