diff --git a/cps.module b/cps.module
index f1c6041..b39cc84 100644
--- a/cps.module
+++ b/cps.module
@@ -739,25 +739,40 @@ function cps_entity_property_info() {
 }
 
 /**
- * Implements hook_entitycache_load_alter().
+ * Implements hook_entitycache_pre_cache_get_alter().
  */
-function cps_entitycache_load_alter(&$entities) {
-  if (cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
-    // If the state is not empty, do not let entitycache load things from cache.
-    $entities = array();
+function cps_entitycache_pre_cache_get_alter(&$ids, &$conditions, $entity_type) {
+  if (cps_disable_entitycache() || cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
+    // If entitycache is disabled or we are in a changeset, do not let
+    // entitycache load things from cache.
+    $ids = array();
   }
 }
 
 /**
- * Implements hook_entitycache_save_alter().
+ * Implements hook_entitycache_pre_cache_set_alter().
  */
-function cps_entitycache_save_alter(&$entities) {
-  if (cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
-    // If the state is not empty, do not let entitycache save things in cache.
+function cps_entitycache_pre_cache_set_alter(&$entities, $entity_type) {
+  if (cps_disable_entitycache() || cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
+    // If entitycache is disabled or we are in a changeset, do not let
+    // entitycache store things in cache.
     $entities = array();
   }
 }
 
+/**
+ * Implements hook_entitycache_pre_reset_cache_alter().
+ */
+function cps_entitycache_pre_reset_cache_alter(&$ids, $entity_type) {
+  if (cps_disable_entitycache()
+      || cps_disable_entitycache_reset()
+      || cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
+    // If entitycache is disabled or entitycache reset clearing is disabled or
+    // we are in a changeset, do not let entitycache reset the cache.
+    $ids = FALSE;
+  }
+}
+
 // -----------------------------------------------------------------------
 // Public API
 
@@ -846,11 +861,18 @@ function cps_override_changeset($changeset_id) {
 
   // We have to reset the entity static cache because changing this could poison
   // the cache.
+  // However do not clear the entitycache as we ensure that only published
+  // entities enter the cache.
+  $old_disable_entitycache_reset = cps_disable_entitycache_reset(TRUE);
+
   foreach (entity_get_info() as $entity_type => $entity_info) {
     if (cps_is_supported($entity_type)) {
       entity_get_controller($entity_type)->resetCache();
     }
   }
+
+  // Restore the old entitycache reset state.
+  cps_disable_entitycache_reset($old_disable_entitycache_reset);
 }
 
 /**
@@ -881,7 +903,12 @@ function cps_get_supported() {
  * @{inheritdoc}
  */
 function cps_make_revision_published($entity_type, $entity_id, $changeset_id) {
+  // Disable entitycache during publishing of a revision.
+  cps_disable_entitycache(TRUE);
+
+  // Now change to the published changeset.
   cps_override_changeset(CPS_PUBLISHED_CHANGESET);
+
   // Find the revision id.
   $revision_id = db_query('SELECT revision_id FROM {cps_entity} WHERE entity_type = :entity_type AND entity_id = :entity_id AND changeset_id = :changeset',
   array(
@@ -892,6 +919,17 @@ function cps_make_revision_published($entity_type, $entity_id, $changeset_id) {
 
   drafty()->publishRevision($entity_type, $entity_id, $revision_id);
   cps_purge_add_to_queue($entity_type, $entity_id, $changeset_id);
+
+  // Re-enable entitycache.
+  cps_disable_entitycache(FALSE);
+
+  // Clear the cache for the entity.
+  // @todo This could fail in the edgecase that entity saves are chained
+  //       and the internal entity is not tracked by CPS, but cached in
+  //       entitycache.
+  entity_get_controller($entity_type)->resetCache([$entity_id]);
+
+  // Now back to the old changeset.
   cps_override_changeset(NULL);
 }
 
@@ -2069,6 +2107,46 @@ function cps_move_changeset($changeset_from, $changeset_to, $entity_type, $entit
   }
 }
 
+/**
+ * Disables or enables the entitycache for CPS purposes like publishing or reverting.
+ *
+ * @param bool $new_state
+ *   The new state to set.
+ */
+function cps_disable_entitycache($new_state = NULL) {
+  $state = &drupal_static(__FUNCTION__);
+
+  if (isset($new_state)) {
+    $state = $new_state;
+  }
+
+  return $state;
+}
+
+/**
+ * Disables or enables the entitycache reset functionality for CPS purposes.
+ *
+ * Note: Callers of this function should reset the state to what it was before.
+ *
+ * @param bool $new_state
+ *   The new state to set.
+ *
+ * @return bool|NULL
+ *   The old state that this function had before.
+ */
+function cps_disable_entitycache_reset($new_state = NULL) {
+  $state = &drupal_static(__FUNCTION__, FALSE);
+
+  if (isset($new_state)) {
+    $old_state = $state;
+    $state = $new_state;
+
+    return $old_state;
+  }
+
+  return $state;
+}
+
 // -------------------------------------------------------------------------
 // Database and general entity API functions
 
