equals is based on the address of the member, but the status might be changed; replace = remove + add
`val newMembers = (localMembers -- changedMembers) ++ changedMembers`