@Override
 public void presenceChanged(final org.jivesoftware.smack.packet.Presence presence) {
   String localJID;
   try {
     localJID = getLocalJid();
   } catch (FriendException e) {
     localJID = null;
   }
   if (!presence.getFrom().equals(localJID)) {
     XMPPFriendImpl friend = getFriend(presence);
     if (friend != null) {
       LOG.debugf("presence from {0} changed to {1}", presence.getFrom(), presence.getType());
       // synchronize to avoid updates or presences from being lost
       // better to replace that with a lock object private to this
       // connection class
       synchronized (friend) {
         if (presence.getType().equals(org.jivesoftware.smack.packet.Presence.Type.available)) {
           if (!friend.getPresences().containsKey(presence.getFrom())) {
             addNewPresence(friend, presence);
           } else {
             updatePresence(friend, presence);
           }
         } else if (presence
             .getType()
             .equals(org.jivesoftware.smack.packet.Presence.Type.unavailable)) {
           PresenceImpl p = (PresenceImpl) friend.getPresence(presence.getFrom());
           if (p != null) {
             p.update(presence);
             friend.removePresense(p);
           }
         }
       }
     } else {
       LOG.debugf("no friend for presence {0}", presence.getFrom());
     }
   }
 }