diff --git a/servers/slapd/overlays/memberof.c b/servers/slapd/overlays/memberof.c
index 84c145769954dbc0e140e3899d2314e1c07c0e26..c3cc3cfbf02d105a6e801b02dbd0ce63bdc62766 100644
--- a/servers/slapd/overlays/memberof.c
+++ b/servers/slapd/overlays/memberof.c
@@ -817,6 +817,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 				switch ( ml->sml_op ) {
 				case LDAP_MOD_DELETE:
 				case LDAP_MOD_REPLACE:
+				case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
 					save_member = 1;
 					break;
 				}
@@ -844,6 +845,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 		
 				switch ( ml->sml_op ) {
 				case LDAP_MOD_DELETE:
+				case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
 					/* we don't care about cancellations: if the value
 					 * exists, fine; if it doesn't, we let the underlying
 					 * database fail as appropriate; */
@@ -858,6 +860,8 @@ memberof_op_modify( Operation *op, SlapReply *rs )
  					}
  
 				case LDAP_MOD_ADD:
+				case SLAP_MOD_SOFTADD: /* ITS#7487 */
+				case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
 					/* NOTE: right now, the attributeType we use
 					 * for member must have a normalized value */
 					assert( ml->sml_nvalues != NULL );
@@ -946,6 +950,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 
 		switch ( ml->sml_op ) {
 		case LDAP_MOD_DELETE:
+		case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
 			if ( ml->sml_nvalues != NULL ) {
 				AccessControlState	acl_state = ACL_STATE_INIT;
 
@@ -1056,12 +1061,15 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 				goto done2;
 			}
 
-			if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
+			if ( ml->sml_op == LDAP_MOD_DELETE || ml->sml_op == SLAP_MOD_SOFTDEL || !ml->sml_values ) {
 				break;
 			}
 			/* fall thru */
 
-		case LDAP_MOD_ADD: {
+		case LDAP_MOD_ADD:
+		case SLAP_MOD_SOFTADD: /* ITS#7487 */
+		case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
+			{
 			AccessControlState	acl_state = ACL_STATE_INIT;
 
 			for ( i = 0; !BER_BVISNULL( &ml->sml_nvalues[ i ] ); i++ ) {
@@ -1363,6 +1371,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 
 		switch ( mml->sml_op ) {
 		case LDAP_MOD_DELETE:
+		case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
 			if ( vals != NULL ) {
 				for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
 					memberof_value_modify( op,
@@ -1396,6 +1405,8 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 			/* fall thru */
 
 		case LDAP_MOD_ADD:
+		case SLAP_MOD_SOFTADD: /* ITS#7487 */
+		case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
 			assert( vals != NULL );
 
 			for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
@@ -1446,7 +1457,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 					}
 				}
 	
-				if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
+				if ( ml->sml_op == LDAP_MOD_DELETE || ml->sml_op == SLAP_MOD_SOFTDEL || !ml->sml_values ) {
 					break;
 				}
 				/* fall thru */