diff --git a/CHANGES b/CHANGES
index 543ff3a519871f0c78d25eb4522ff8d8e0986769..edbfcfcc3e8fc4916e4604f895a8fc5df8019674 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,7 +12,8 @@ OpenLDAP 2.4.20 Engineering
 	Fixed slapd debug handling of LDAP_DEBUG_ANY (ITS#6324)
 	Fixed slapd termination for one level DNs (ITS#6338)
 	Fixed slapd unused parameter (ITS#6356)
-	Fixed slapd-bdb cache corruption (ITS#6341)
+	Fixed slapd-bdb/hdb cache corruption (ITS#6341)
+	Fixed slapd-bdb/hdb entry cache (ITS#6360)
 	Fixed slapd-ldap leak (ITS#6326)
 	Fixed slapd-relay bind segfault (ITS#6337)
 	Fixed slapo-memberof operational attr updates (ITS#6329)
diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c
index fab4b1e09ede616cac430e7e83a422379f023feb..4e5636f73b57aba4a7954586316eef50d43f001d 100644
--- a/servers/slapd/back-bdb/cache.c
+++ b/servers/slapd/back-bdb/cache.c
@@ -972,6 +972,9 @@ load1:
 				 */
 				if ( (*eip)->bei_state & CACHE_ENTRY_NOT_CACHED ) {
 					(*eip)->bei_state &= ~CACHE_ENTRY_NOT_CACHED;
+					ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
+					++bdb->bi_cache.c_cursize;
+					ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
 				}
 				flag &= ~ID_NOCACHE;
 			}
@@ -1069,20 +1072,17 @@ load1:
 	if ( rc == 0 ) {
 		int purge = 0;
 
-		if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ||
-			( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax )) {
+		if (( load && !( flag & ID_NOCACHE )) || bdb->bi_cache.c_eimax ) {
 			ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
-			if ( !bdb->bi_cache.c_purging ) {
-				if ( load && !( flag & ID_NOCACHE )) {
-					bdb->bi_cache.c_cursize++;
-					if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) {
-						purge = 1;
-						bdb->bi_cache.c_purging = 1;
-					}
-				} else if ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
+			if ( load && !( flag & ID_NOCACHE )) {
+				bdb->bi_cache.c_cursize++;
+				if ( !bdb->bi_cache.c_purging && bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) {
 					purge = 1;
 					bdb->bi_cache.c_purging = 1;
 				}
+			} else if ( !bdb->bi_cache.c_purging && bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
+				purge = 1;
+				bdb->bi_cache.c_purging = 1;
 			}
 			ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
 		}