diff --git a/cps.module b/cps.module
index 11b36cc..c1f9279 100644
--- a/cps.module
+++ b/cps.module
@@ -797,25 +797,43 @@ function cps_entity_property_info() {
 }
 
 /**
- * Implements hook_entitycache_load_alter().
+ * Implements hook_entitycache_pre_cache_get_alter().
  */
-function cps_entitycache_load_alter(&$entities) {
+function cps_entitycache_pre_cache_get_alter(&$ids, &$conditions, $entity_type) {
   if (cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
-    // If the state is not empty, do not let entitycache load things from cache.
-    $entities = array();
+    // If 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) {
+function cps_entitycache_pre_cache_set_alter(&$entities, $entity_type) {
   if (cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
-    // If the state is not empty, do not let entitycache save things in cache.
+    // If 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_reset()) {
+    // Disable cache clearing if it was disabled at run-time.
+    $ids = FALSE;
+    return;
+  }
+
+  if (cps_get_current_changeset() !== CPS_PUBLISHED_CHANGESET) {
+    // Disable cache clearing while in a different changeset.
+    $ids = FALSE;
+  }
+}
+
+
 // -----------------------------------------------------------------------
 // Public API
 
@@ -928,11 +946,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);
 }
 
 /**
@@ -2398,6 +2423,30 @@ function cps_move_changeset($changeset_from, $changeset_to, $entity_type, $entit
   }
 }
 
+/**
+ * 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__);
+
+  if (isset($new_state)) {
+    $old_state = $state;
+    $state = $new_state;
+
+    return $old_state;
+  }
+
+  return $state;
+}
+
 // -------------------------------------------------------------------------
 // Database and general entity API functions
 
