diff --git a/core/lib/Drupal/Core/Entity/EntityStorageBase.php b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
index f583121..b4eee90 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
@@ -467,6 +467,9 @@ protected function doPostSave(EntityInterface $entity, $update) {
 
     // Allow code to run after saving.
     $entity->postSave($this, $update);
+    $this->invokeHook('postsave', $entity);
+    // @todo hook_entity_insert() and hook_entity_update() are deprecated,
+    //   remove this invocation once they are removed.
     $this->invokeHook($update ? 'update' : 'insert', $entity);
 
     // After saving, this is now the "original entity", and subsequent saves
diff --git a/core/lib/Drupal/Core/Entity/entity.api.php b/core/lib/Drupal/Core/Entity/entity.api.php
index 60ae741..7875d06 100644
--- a/core/lib/Drupal/Core/Entity/entity.api.php
+++ b/core/lib/Drupal/Core/Entity/entity.api.php
@@ -929,6 +929,8 @@ function hook_ENTITY_TYPE_presave(Drupal\Core\Entity\EntityInterface $entity) {
  *
  * @ingroup entity_crud
  * @see hook_ENTITY_TYPE_insert()
+ *
+ * @deprecated Use hook_entity_postsave() instead.
  */
 function hook_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
   // Insert the new entity into a fictional table of all entities.
@@ -953,6 +955,8 @@ function hook_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
  *
  * @ingroup entity_crud
  * @see hook_entity_insert()
+ *
+ * @deprecated Use hook_ENTITY_TYPE_postsave() instead.
  */
 function hook_ENTITY_TYPE_insert(Drupal\Core\Entity\EntityInterface $entity) {
   // Insert the new entity into a fictional table of this type of entity.
@@ -977,6 +981,8 @@ function hook_ENTITY_TYPE_insert(Drupal\Core\Entity\EntityInterface $entity) {
  *
  * @ingroup entity_crud
  * @see hook_ENTITY_TYPE_update()
+ *
+ * @deprecated Use hook_entity_postsave() instead.
  */
 function hook_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
   // Update the entity's entry in a fictional table of all entities.
@@ -1001,6 +1007,8 @@ function hook_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
  *
  * @ingroup entity_crud
  * @see hook_entity_update()
+ *
+ * @deprecated Use hook_ENTITY_TYPE_postsave() instead.
  */
 function hook_ENTITY_TYPE_update(Drupal\Core\Entity\EntityInterface $entity) {
   // Update the entity's entry in a fictional table of this type of entity.
@@ -1013,6 +1021,80 @@ function hook_ENTITY_TYPE_update(Drupal\Core\Entity\EntityInterface $entity) {
 }
 
 /**
+ * Respond to creation or update of an entity.
+ *
+ * This hook runs once the entity storage has been updated. Note that hook
+ * implementations may not alter the stored entity data. If the entity is being
+ * updated, get the original entity object from $entity->original.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity object.
+ *
+ * @ingroup entity_crud
+ * @see hook_ENTITY_TYPE_postsave()
+ */
+function hook_entity_postsave(\Drupal\Core\Entity\EntityInterface $entity) {
+  if ($entity->original) {
+    // Insert the new entity into a fictional table of all entities.
+    db_insert('example_entity')
+      ->fields(array(
+        'type' => $entity->getEntityTypeId(),
+        'id' => $entity->id(),
+        'created' => REQUEST_TIME,
+        'updated' => REQUEST_TIME,
+      ))
+      ->execute();
+  }
+  else {
+    // Update the entity's entry in a fictional table of all entities.
+    db_update('example_entity')
+      ->fields(array(
+        'updated' => REQUEST_TIME,
+      ))
+      ->condition('type', $entity->getEntityTypeId())
+      ->condition('id', $entity->id())
+      ->execute();
+  }
+}
+
+/**
+ * Respond to creation or update of an entity of a particular type.
+ *
+ * This hook runs once the entity storage has been updated. Note that hook
+ * implementations may not alter the stored entity data. If the entity is being
+ * updated, get the original entity object from $entity->original.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity object.
+ *
+ * @ingroup entity_crud
+ * @see hook_entity_postsave()
+ */
+function hook_ENTITY_TYPE_postsave(\Drupal\Core\Entity\EntityInterface $entity) {
+  if ($entity->original) {
+    // Insert the new entity into a fictional table of all entities.
+    db_insert('example_entity')
+      ->fields(array(
+        'type' => $entity->getEntityTypeId(),
+        'id' => $entity->id(),
+        'created' => REQUEST_TIME,
+        'updated' => REQUEST_TIME,
+      ))
+      ->execute();
+  }
+  else {
+    // Update the entity's entry in a fictional table of all entities.
+    db_update('example_entity')
+      ->fields(array(
+        'updated' => REQUEST_TIME,
+      ))
+      ->condition('type', $entity->getEntityTypeId())
+      ->condition('id', $entity->id())
+      ->execute();
+  }
+}
+
+/**
  * Acts when creating a new entity translation.
  *
  * This hook runs after a new entity translation object has just been
