void Handle (DHT& dht, const Host& host, const Packet& pckt)
	{
		Key k = pckt.GetArg<Key>(DHT_GET_KEY);
		pf_log[W_DHT] << "Get received with key " << k;

		if(dht.GetStorage()->hasKey(k))
		{
			pf_log[W_DHT] << "Answer with data " << dht.GetStorage()->getInfo(k)->GetStr();
			Packet get_ack(DHTGetAckType, dht.GetMe(), host.GetKey());
			get_ack.SetArg(DHT_GET_ACK_KEY, k);
			get_ack.SetArg(DHT_GET_ACK_DATA, dht.GetStorage()->getInfo(k));
			if(!dht.GetChimera()->Send(host, get_ack))
				pf_log[W_DHT] << "Send get ACK message failed!";
			return;
		}

		pf_log[W_DHT] << "Data not in cache, try to relay to a closest host.";
		if(!dht.GetChimera()->Route(pckt))
		{
			pf_log[W_DHT] << "I'm the owner and the key is unknow, answer with GET_NACK.";
			Packet get_nack(DHTGetNAckType, dht.GetMe(), host.GetKey());
			get_nack.SetArg(DHT_GET_NACK_KEY, k);
			if(!dht.GetChimera()->Send(host, get_nack))
				pf_log[W_DHT] << "Send get NACK message failed!";
			return;
		}
		pf_log[W_DHT] << "GET relayed.";
	}
	void Handle (DHT& dht, const Host&, const Packet& pckt)
	{
		Key k = pckt.GetArg<Key>(DHT_UNPUBLISH_KEY);
		pf_log[W_DHT] << "Got Unpublish message for key " << k;

		Data *data = pckt.GetArg<Data*>(DHT_UNPUBLISH_DATA);
		pf_log[W_DHT] << "Data: " << data->GetStr();

		try {
			dht.GetStorage()->removeInfo(k, data);
		}
		catch(Storage::WrongDataType e) {
			pf_log[W_DHT] << "Asked to remove wrong data type, abord.";
			return;
		}

		/* Repeat unpublish on redondancy hosts */
		Packet replicate(DHTRepeatUType, dht.GetMe());
		replicate.SetArg(DHT_REPEAT_U_KEY, k);
		replicate.SetArg(DHT_REPEAT_U_DATA, data);
		dht.GetChimera()->SendToNeighbours(dht.REDONDANCY, replicate);
	}