private void processBundleMessage(final BundleMessage bundleMessage) {				
		for (final BroadcastMessage broadcastMessage : bundleMessage.getPayloadMessages())
			if (broadcastMessage instanceof ACKMessage)
				processACKMessage((ACKMessage) broadcastMessage);
		
		if (containsOnlyACKMessages(bundleMessage))
			return;
				
		//messages which does not have this node as destination are discarded
		if (!bundleMessage.getExpectedDestinations().contains(getPeerID())) {
			logger.trace("Peer " + getPeerID() +  " discarded message " + bundleMessage.getMessageID() + " because it was not intended for this peer");
			return;
		}
		
		//all received messages are responded with ACK
		sendACKMessage(bundleMessage);
		
		for (final BroadcastMessage broadcastMessage : bundleMessage.getPayloadMessages()) {
			if (!(broadcastMessage instanceof ACKMessage)) {
				//if message was not already received
				if (!receivedMessages.contains(broadcastMessage.getMessageID())) {
					// save new messages
					receivedMessages.addEntry(broadcastMessage.getMessageID());	
					msgCounter.addReceived(broadcastMessage.getClass());
					
					logger.debug("Peer " + getPeerID() + " received " + broadcastMessage.getType() + " " + broadcastMessage.getMessageID() + " from node " + broadcastMessage.getSender());
					notifyReceivingListener(broadcastMessage, System.currentTimeMillis());
				} else
					logger.trace("Peer " + getPeerID() + " discarded " + broadcastMessage + " because it was already received.");
			}
		}
	}