diff --git a/CHANGES b/CHANGES
index 3ae2fcec64dc83e912b11ebe4b4681de57bb896c..e9a5924518bae3c181e9f04d02d1df5ea0155a49 100644
--- a/CHANGES
+++ b/CHANGES
@@ -74,6 +74,7 @@ OpenLDAP 2.4.24 Engineering
 	Fixed slapd-meta with SASL/EXTERNAL (ITS#6642)
 	Fixed slapd-meta matchedDN return code (ITS#6774)
 	Fixed slapd-monitor hasSubordinates generation (ITS#6712)
+	Fixed slapd-monitor abandon processing (ITS#6783)
 	Fixed slapd-sql with null objectClass (ITS#6616)
 	Fixed slapd-sql hasSubordinates generation (ITS#6712)
 	Fixed slapo-accesslog with controls (ITS#6652)
diff --git a/servers/slapd/back-monitor/search.c b/servers/slapd/back-monitor/search.c
index a1b35862bcdaf52d977e662ba5e3ebbd9d811acf..1e3ed37eef436b991fc332bf374557bc11f70ae8 100644
--- a/servers/slapd/back-monitor/search.c
+++ b/servers/slapd/back-monitor/search.c
@@ -60,7 +60,7 @@ monitor_send_children(
 		if ( e == NULL ) {
 			return LDAP_SUCCESS;
 		}
-	
+
 	/* volatile entries */
 	} else {
 		/* if no persistent, return only volatile */
@@ -87,47 +87,41 @@ monitor_send_children(
 	for ( monitor_cache_lock( e ); e != NULL; ) {
 		monitor_entry_update( op, rs, e );
 
-		if ( op->o_abandon ) {
-			/* FIXME: may leak generated children */
-			if ( nonvolatile == 0 ) {
-				for ( e_tmp = e; e_tmp != NULL; ) {
-					mp = ( monitor_entry_t * )e_tmp->e_private;
-					e = e_tmp;
-					e_tmp = mp->mp_next;
-					monitor_cache_release( mi, e );
-
-					if ( e_tmp == e_nonvolatile ) {
-						break;
-					}
-				}
+		if ( e == e_nonvolatile )
+			nonvolatile = 1;
 
-			} else {
-				monitor_cache_release( mi, e );
-			}
+		mp = ( monitor_entry_t * )e->e_private;
+		e_tmp = mp->mp_next;
 
-			return SLAPD_ABANDON;
+		if ( op->o_abandon ) {
+			monitor_cache_release( mi, e );
+			rc = SLAPD_ABANDON;
+			goto freeout;
 		}
-		
+
 		rc = test_filter( op, e, op->oq_search.rs_filter );
 		if ( rc == LDAP_COMPARE_TRUE ) {
 			rs->sr_entry = e;
 			rs->sr_flags = 0;
 			rc = send_search_entry( op, rs );
 			rs->sr_entry = NULL;
+			if ( rc ) {
+				monitor_cache_release( mi, e );
+				goto freeout;
+			}
 		}
 
-		mp = ( monitor_entry_t * )e->e_private;
-		e_tmp = mp->mp_next;
-
 		if ( sub ) {
 			rc = monitor_send_children( op, rs, e, sub );
 			if ( rc ) {
+freeout:
 				/* FIXME: may leak generated children */
 				if ( nonvolatile == 0 ) {
 					for ( ; e_tmp != NULL; ) {
 						mp = ( monitor_entry_t * )e_tmp->e_private;
 						e = e_tmp;
 						e_tmp = mp->mp_next;
+						monitor_cache_lock( e );
 						monitor_cache_release( mi, e );
 	
 						if ( e_tmp == e_nonvolatile ) {
@@ -150,9 +144,6 @@ monitor_send_children(
 		}
 
 		e = e_tmp;
-		if ( e == e_nonvolatile ) {
-			nonvolatile = 1;
-		}
 	}
 	
 	return LDAP_SUCCESS;