Currently Openfire behaves like this: If User A deletes Contact B on his roster, then User A is also deleted on Contact B's roster.
This is due to this logic in IQRosterHandler.java:
The correct way, however is to NOT delete User A on Contact B's roster, but instead send presence stanzas of type "unsubscribe" or "unsubscribed":
suggested patch by csh
Fixed with revision 13943.