diff --git a/CHANGES b/CHANGES
index 462348207bd0e4f45a478fbd627b4897824b828c..2392ddda370e53f4deb75dbc3bf5ae0ed90f56aa 100644
--- a/CHANGES
+++ b/CHANGES
@@ -29,7 +29,7 @@ OpenLDAP 2.4.12 Release (2008/10/08)
 	Fixed slapd syncrepl runqueue interval (ITS#5719)
 	Fixed slapd-bdb entry return if attr not present (ITS#5650)
 	Fixed slapd-bdb olcDbMode syntax (ITS#5713)
-	Fixed slapd-bdb/hdb release search entries earlier (ITS#5728)
+	Fixed slapd-bdb/hdb release search entries earlier (ITS#5728,ITS#5730)
 	Fixed slapd-bdb/hdb subtree search with empty suffix (ITS#5729)
 	Fixed slapd-dnssrv memory handling (ITS#5691)
 	Fixed slapd-ldap,slapd-meta invalid filter behavior (ITS#5614)
diff --git a/servers/slapd/back-bdb/search.c b/servers/slapd/back-bdb/search.c
index bbff1f4ebe3afaa746e5a743a734ae030e666d09..aa0b5f975bf192861a32ffdb85e5a522d8a27c96 100644
--- a/servers/slapd/back-bdb/search.c
+++ b/servers/slapd/back-bdb/search.c
@@ -852,20 +852,51 @@ fetch_entry_retry:
 		if ( !manageDSAit && op->oq_search.rs_scope != LDAP_SCOPE_BASE
 			&& is_entry_referral( e ) )
 		{
+			struct bdb_op_info bois;
+			struct bdb_lock_info blis;
 			BerVarray erefs = get_entry_referrals( op, e );
 			rs->sr_ref = referral_rewrite( erefs, &e->e_name, NULL,
 				op->oq_search.rs_scope == LDAP_SCOPE_ONELEVEL
 					? LDAP_SCOPE_BASE : LDAP_SCOPE_SUBTREE );
 
-			/* free reader lock */
+			/* Must set lockinfo so that entry_release will work */
+			if (!opinfo) {
+				bois.boi_oe.oe_key = bdb;
+				bois.boi_txn = NULL;
+				bois.boi_err = 0;
+				bois.boi_acl_cache = op->o_do_not_cache;
+				bois.boi_flag = BOI_DONTFREE;
+				bois.boi_locks = &blis;
+				blis.bli_next = NULL;
+				LDAP_SLIST_INSERT_HEAD( &op->o_extra, &bois.boi_oe,
+					oe_next );
+			} else {
+				blis.bli_next = opinfo->boi_locks;
+				opinfo->boi_locks = &blis;
+			}
+			blis.bli_id = e->e_id;
+			blis.bli_lock = lock;
+			blis.bli_flag = BLI_DONTFREE;
+
+			rs->sr_flags = REP_ENTRY_MUSTRELEASE;
+
+			send_search_reference( op, rs );
+
+			if ( blis.bli_flag ) {
 #ifdef SLAP_ZONE_ALLOC
-			slap_zn_runlock(bdb->bi_cache.c_zctx, e);
+				slap_zn_runlock(bdb->bi_cache.c_zctx, e);
 #endif
-			bdb_cache_return_entry_r( bdb, e, &lock );
+				bdb_cache_return_entry_r(bdb, e, &lock);
+				if ( opinfo ) {
+					opinfo->boi_locks = blis.bli_next;
+				} else {
+					LDAP_SLIST_REMOVE( &op->o_extra, &bois.boi_oe,
+						OpExtra, oe_next );
+				}
+			}
+			rs->sr_entry = NULL;
 			e = NULL;
 
-			send_search_reference( op, rs );
-
 			ber_bvarray_free( rs->sr_ref );
 			ber_bvarray_free( erefs );
 			rs->sr_ref = NULL;