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;
                                }
                
                                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; */
                                        }
  
                                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 );
 
                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;
 
                                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++ ) {
 
                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,
                        /* 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++ ) {
                                        }
                                }
        
-                               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 */