diff --git a/CHANGES b/CHANGES
index 325cce44a2203f816fc4e6a3881484f6a2213282..c6c2340a707e3cb95497c95bb82cd866eb3df45e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,7 @@ OpenLDAP 2.4.11 Engineering
 	Fixed slapd-meta link to slapd-ldap (ITS#5355)
 	Fixed slapd-sock, back-shell buffer count (ITS#5558)
 	Fixed slapo-dynlist dg attrs lookup (ITS#5583)
+	Fixed slapo-memberof replace handling (ITS#5584)
 	Added slapo-nssov contrib module
 	Fixed slapo-pcache handling of negative search caches (ITS#5546)
 	Fixed slapo-ppolicy DNs with whitespaces (ITS#5552)
diff --git a/servers/slapd/overlays/memberof.c b/servers/slapd/overlays/memberof.c
index 09edce82b7f6f662703849bf90c0132c9c61f8a2..f289b82470b3f53e323b56bf132dbf8ff34252c0 100644
--- a/servers/slapd/overlays/memberof.c
+++ b/servers/slapd/overlays/memberof.c
@@ -843,6 +843,12 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 					break;
 		
 				case LDAP_MOD_REPLACE:
+ 					/* Handle this just like a delete (see above) */
+ 					if ( !ml->sml_values ) {
+ 						mlp = &ml->sml_next;
+ 						break;
+ 					}
+ 
 				case LDAP_MOD_ADD:
 					/* NOTE: right now, the attributeType we use
 					 * for member must have a normalized value */
@@ -1038,7 +1044,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 				goto done2;
 			}
 
-			if ( ml->sml_op == LDAP_MOD_DELETE ) {
+			if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
 				break;
 			}
 			/* fall thru */
@@ -1305,7 +1311,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 				ber_bvarray_free_x( vals, op->o_tmpmemctx );
 			}
 
-			if ( ml->sml_op == LDAP_MOD_DELETE ) {
+			if ( ml->sml_op == LDAP_MOD_DELETE || !mml->sml_values ) {
 				break;
 			}
 			/* fall thru */
@@ -1362,7 +1368,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 					ber_bvarray_free_x( vals, op->o_tmpmemctx );
 				}
 	
-				if ( ml->sml_op == LDAP_MOD_DELETE ) {
+				if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
 					break;
 				}
 				/* fall thru */