private void handleMessage(Announcement m) {
		if (m.getPeerID() == group.getPeerId())
			return;

		RemoteHost p = group.getHostManager().getRemoteHost(m.getPeerID());
		if (p == null) {
			p = detectedRemoteHost(m);
		}

		int r = p.getReceivedMessageID();
		int s = m.getMessageID();
		if (s > p.getSeenMessageID()) {
			p.setSeenMessageID(s);
		}

		if (s == r + 1) {
			logger.debug("Received: " + m.toString());

			p.setReceivedMessageID(++r);
			group.rdeliver(m);

			Announcement stored = findMessageInHoldbackQueue(p.getHostID(),
					s + 1);
			if (stored != null) {
				holdbackQueue.remove(stored);
				receiveMessage(stored);
			}

		} else if (s > r + 1) {
			logger.debug("Received: " + m.toString());
			logger.debug("Missed message " + (r + 1) + " detected from group "
					+ m.getPeerID());
			holdbackQueue.add(m);
			for (int missedID = r + 1; missedID < p.getSeenMessageID(); missedID++) {
				if (findMessageInHoldbackQueue(p.getHostID(), missedID) == null) {
					// TODO associate miss message with timer, if timer is over
					// and h.messageid < missedID retry else message has been
					// received
					sendMiss(m.getPeerID(), missedID);
					missedTimer.schedule(new MissTimerTask(p, missedID), 5000);
				}
			}
		} else if (s <= r) {
			logger.debug("Discarded duplicate: " + m.toString());
		}
	}