diff --git a/CHANGES b/CHANGES
index 7ea6a594a242dffee647e18098e6ed6613582568..3f4edb8428bdf960d92abc3caf1cfa0118b95a1d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,7 @@ OpenLDAP 2.4 Change Log
 OpenLDAP 2.4.23 Engineering
 	Fixed liblutil off-by-one with delta (ITS#6541)
 	Fixed slapd syncrepl rid logging (ITS#6533)
+	Fixed slapd-bdb hasSubordinates computation (ITS#6549)
  	Fixed contrib/nssov network.c missing patch (ITS#6562)
 	Documentation
 	        slapd-config(5) note default rootdn (ITS#6546)
diff --git a/servers/slapd/back-bdb/operational.c b/servers/slapd/back-bdb/operational.c
index 33b8f93784c173386cda01572cf0f4e9080dfef9..36a0ed39734a876fb12fc833d8824c860373ee00 100644
--- a/servers/slapd/back-bdb/operational.c
+++ b/servers/slapd/back-bdb/operational.c
@@ -39,6 +39,7 @@ bdb_hasSubordinates(
 	OpExtra *oex;
 	DB_TXN		*rtxn;
 	int		rc;
+	int		release = 0;
 	
 	assert( e != NULL );
 
@@ -48,7 +49,18 @@ bdb_hasSubordinates(
 	 * let's disable the hasSubordinate feature for back-relay.
 	 */
 	if ( BEI( e ) == NULL ) {
-		return LDAP_OTHER;
+		Entry *ee = NULL;
+		rc = be_entry_get_rw( op, &e->e_nname, NULL, NULL, 0, &ee );
+		if ( rc != LDAP_SUCCESS || ee == NULL ) {
+			rc = LDAP_OTHER;
+			goto done;
+		}
+		e = ee;
+		release = 1;
+		if ( BEI( ee ) == NULL ) {
+			rc = LDAP_OTHER;
+			goto done;
+		}
 	}
 
 	/* Check for a txn in a parent op, otherwise use reader txn */
@@ -61,7 +73,10 @@ bdb_hasSubordinates(
 		rtxn = opinfo->boi_txn;
 	} else {
 		rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn);
-		if ( rc ) return LDAP_OTHER;
+		if ( rc ) {
+			rc = LDAP_OTHER;
+			goto done;
+		}
 	}
 
 retry:
@@ -92,6 +107,8 @@ retry:
 		rc = LDAP_OTHER;
 	}
 
+done:;
+	if ( release && e != NULL ) be_entry_release_r( op, e );
 	return rc;
 }