diff --git a/src/EntityOperations.php b/src/EntityOperations.php
index f41e69d..e41cf7f 100644
--- a/src/EntityOperations.php
+++ b/src/EntityOperations.php
@@ -60,6 +60,55 @@ class EntityOperations {
   }
 
   /**
+   * Hook bridge.
+   *
+   * @see hook_entity_storage_load().
+   *
+   * @param EntityInterface[] $entities
+   *   An array of entity objects that have just been loaded.
+   * @param string $entity_type_id
+   *   The type of entity being loaded, such as "node" or "user".
+   */
+  public function entityStorageLoad(array $entities, $entity_type_id) {
+    $needs_default = array_filter($entities, function(EntityInterface $entity) {
+      return $this->moderationInfo->isModeratableEntity($entity)
+        && $entity->moderation_state->target_id == NULL;
+    });
+
+    // Because objects pass by handle, this will modify each in place
+    // appropriately.
+    array_map(function(ContentEntityInterface $entity) {
+      $entity->moderation_state->target_id = $this->getDefaultLoadStateId($entity);
+    }, $needs_default);
+  }
+
+  /**
+   * Determines the default moderation state on load for an entity.
+   *
+   * This method is only applicable when an entity is loaded that has
+   * no moderation state on it, but should. In those cases, failing to set
+   * one may result in NULL references elsewhere when other code tries to check
+   * the moderation state of the entity.
+   *
+   * The amount of indirection here makes performance a concern, but
+   * given how Entity API works I don't know how else to do it.
+   * This reliably gets us *A* valid state. However, that state may be
+   * not the ideal one. Suggestions on how to better select the default
+   * state here are welcome.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The entity for which we want a default state.
+   *
+   * @return string
+   *   The default state for the given entity.
+   */
+  protected function getDefaultLoadStateId(ContentEntityInterface $entity) {
+    return $this->moderationInfo
+      ->loadBundleEntity($entity->getEntityType()->getBundleEntityType(), $entity->bundle())
+      ->getThirdPartySetting('workbench_moderation', 'default_moderation_state');
+  }
+
+  /**
    * Acts on an entity and set published status based on the moderation state.
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
diff --git a/src/Plugin/Validation/Constraint/ModerationStateValidator.php b/src/Plugin/Validation/Constraint/ModerationStateValidator.php
index 77f4210..3601b3a 100644
--- a/src/Plugin/Validation/Constraint/ModerationStateValidator.php
+++ b/src/Plugin/Validation/Constraint/ModerationStateValidator.php
@@ -107,7 +107,7 @@ class ModerationStateValidator extends ConstraintValidator implements ContainerI
 
     $original_id = $original_entity->moderation_state->target_id;
 
-    return !($original_entity && $original_id);
+    return !($entity->moderation_state->target_id && $original_entity && $original_id);
   }
 
 }
diff --git a/tests/src/Kernel/EntityStateChangeValidationTest.php b/tests/src/Kernel/EntityStateChangeValidationTest.php
index 4328027..0f013c1 100644
--- a/tests/src/Kernel/EntityStateChangeValidationTest.php
+++ b/tests/src/Kernel/EntityStateChangeValidationTest.php
@@ -5,6 +5,7 @@ namespace Drupal\Tests\workbench_moderation\Kernel;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\node\Entity\Node;
 use Drupal\node\Entity\NodeType;
+use Drupal\node\NodeInterface;
 
 /**
  * @coversDefaultClass \Drupal\workbench_moderation\Plugin\Validation\Constraint\ModerationStateValidator
@@ -23,6 +24,7 @@ class EntityStateChangeValidationTest extends KernelTestBase {
   protected function setUp() {
     parent::setUp();
 
+    $this->installSchema('node', 'node_access');
     $this->installEntitySchema('node');
     $this->installEntitySchema('user');
     $this->installConfig('workbench_moderation');
@@ -82,12 +84,15 @@ class EntityStateChangeValidationTest extends KernelTestBase {
       'type' => 'example',
     ]);
     $node_type->save();
+    /** @var NodeInterface $node */
     $node = Node::create([
       'type' => 'example',
       'title' => 'Test title',
     ]);
     $node->save();
 
+    $nid = $node->id();
+
     // Enable moderation for Articles.
     /** @var NodeType $node_type */
     $node_type = NodeType::load('example');
@@ -96,10 +101,16 @@ class EntityStateChangeValidationTest extends KernelTestBase {
     $node_type->setThirdPartySetting('workbench_moderation', 'default_moderation_state', 'draft');
     $node_type->save();
 
+    $node = Node::load($nid);
+
     // Having no previous state should not break validation.
     $violations = $node->validate();
 
     $this->assertCount(0, $violations);
+
+    // Having no previous state should not break saving the node.
+    $node->setTitle('New');
+    $node->save();
   }
 
 }
diff --git a/workbench_moderation.module b/workbench_moderation.module
index b969db0..a4239ef 100644
--- a/workbench_moderation.module
+++ b/workbench_moderation.module
@@ -82,6 +82,13 @@ function workbench_moderation_entity_bundle_field_info_alter(&$fields, EntityTyp
 }
 
 /**
+ * Implements hook_entity_load().
+ */
+function workbench_moderation_entity_storage_load(array $entities, $entity_type_id) {
+  return \Drupal::service('workbench_moderation.entity_operations')->entityStorageLoad($entities, $entity_type_id);
+}
+
+/**
  * Implements hook_entity_presave().
  */
 function workbench_moderation_entity_presave(EntityInterface $entity) {
