I thinks that implementation of the MemberCollection wrapper class in Group.java has a few problems:
Access to members collection needs to be synchronized.
There is overridden add method implemented but there is no remove override.
Checking that user already belongs to a group should be done against bare JID and not against full JID (that includes resource) as it is done currently.
I have modified version of the Group.java where these issues are fixed. I’'ll be happy to post it if needed.