Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 6760)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 6786)
@@ -727,4 +727,5 @@
 	sideport(&SideportListener::DEFAULT), started(false), counter(0) {
 	dht = new DHT();
+	localDHT = new DHT();
 }
 
@@ -1913,5 +1914,5 @@
 	if (msg->getType()==OverlayMsg::typeDHTData) {
 		const ServiceID& service = msg->getService();
-		logging_debug( "Received DHT data for service " << service.toString() );
+		logging_info( "Received DHT data for service " << service.toString() );
 
 		// delegate data message
@@ -1940,5 +1941,8 @@
 
 	case OverlayMsg::typeDHTGet: {
+		logging_info("DHT-Get: key=" << dhtMsg->getKey() );
 		vector<Data> vect = dht->get(dhtMsg->getKey());
+		BOOST_FOREACH(const Data& d, vect)
+			logging_info("DHT-Get: value=" << d);
 		OverlayMsg omsg(*msg);
 		omsg.swapRoles();
@@ -1946,5 +1950,5 @@
 		DHTMessage dhtmsg(dhtMsg->getKey(), vect);
 		omsg.encapsulate(&dhtmsg);
-		this->send(&omsg, omsg.getDestinationNode());
+		dhtSend(&omsg, omsg.getDestinationNode());
 		break;
 	}
@@ -1969,23 +1973,36 @@
 /// put a value to the DHT with a ttl given in seconds
 void BaseOverlay::dhtPut( const Data& key, const Data& value, int ttl ) {
+
+	logging_info("DHT: putting key=" <<  key
+			<< " value=" << value
+			<< " ttl=" << ttl
+	);
+
+	// put into local data store (for refreshes)
+	localDHT->put(key,value,ttl);
+
 	// calculate hash
 	NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
-	OverlayMsg msg(OverlayMsg::typeDHTPut);
 	DHTMessage dhtmsg(key,value);
 	dhtmsg.setTTL(ttl);
-	msg.setDestinationNode(dest);
+
+	OverlayMsg msg(OverlayMsg::typeDHTPut);
 	msg.encapsulate( &dhtmsg );
-	send(&msg, dest);
+	dhtSend(&msg, dest);
 }
 
 /// removes a key value pair from the DHT
 void BaseOverlay::dhtRemove( const Data& key, const Data& value ) {
+	// remove from local data store
+	localDHT->remove(key,value);
+
 	// calculate hash
 	NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
+	DHTMessage dhtmsg(key,value);
+
+	// send message
 	OverlayMsg msg(OverlayMsg::typeDHTRemove);
-	DHTMessage dhtmsg(key,value);
-	msg.setDestinationNode(dest);
 	msg.encapsulate( &dhtmsg );
-	send(&msg, dest);
+	dhtSend(&msg, dest);
 }
 
@@ -1994,22 +2011,47 @@
 	// calculate hash
 	NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
+	DHTMessage dhtmsg(key);
+
+	// send message
 	OverlayMsg msg(OverlayMsg::typeDHTRemove);
-	DHTMessage dhtmsg(key);
-	msg.setDestinationNode(dest);
 	msg.encapsulate( &dhtmsg );
-	send(&msg, dest);
+	dhtSend(&msg, dest);
 }
 
 /// requests data stored using key
 void BaseOverlay::dhtGet( const Data& key, const ServiceID& service ) {
+	logging_info("DHT: trying to resolve key=" <<
+			key << " for service=" << service.toString() );
+
 	// calculate hash
 	NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
+	DHTMessage dhtmsg(key);
+
+	// send message
 	OverlayMsg msg(OverlayMsg::typeDHTGet);
-	DHTMessage dhtmsg(key);
-	msg.setDestinationNode(dest);
 	msg.setService(service);
 	msg.encapsulate( &dhtmsg );
-	send(&msg, dest);
-}
+	dhtSend(&msg, dest);
+}
+
+void BaseOverlay::dhtSend( OverlayMsg* msg, const NodeID& dest ) {
+	logging_info("DHT: sending message with key=" << dest.toString() );
+	msg->setSourceNode(this->nodeId);
+	msg->setDestinationNode(dest);
+
+	// local storage? yes-> put into DHT directly
+	if (overlayInterface->isClosestNodeTo(msg->getDestinationNode())) {
+		Data d = data_serialize(msg);
+		Message* m2 = new Message(d);
+		OverlayMsg* m3 = m2->decapsulate<OverlayMsg>();
+		handleDHTMessage(m3);
+		delete m2;
+		return;
+	}
+
+	// send message "normally"
+	send(msg, dest);
+}
+
 
 }} // namespace ariba, overlay
Index: source/ariba/overlay/BaseOverlay.h
===================================================================
--- source/ariba/overlay/BaseOverlay.h	(revision 6760)
+++ source/ariba/overlay/BaseOverlay.h	(revision 6786)
@@ -506,6 +506,8 @@
 
 	DHT* dht;
+	DHT* localDHT;
 
 	void stabilizeDHT();
+	void dhtSend( OverlayMsg* msg, const NodeID& dest );
 
 	// misc --------------------------------------------------------------------
Index: source/ariba/overlay/messages/DHTMessage.h
===================================================================
--- source/ariba/overlay/messages/DHTMessage.h	(revision 6760)
+++ source/ariba/overlay/messages/DHTMessage.h	(revision 6786)
@@ -62,9 +62,14 @@
 	X && ttl;
 
+//	std::cout << "1" << std::endl;
+
 	// key serialization
-	uint16_t key_length = key.getLength();
+	uint16_t key_length = key.isUnspecified() ? 0 : key.getLength();
 	X && key_length;
 	if (X.isDeserializer()) key.setLength( key_length );
-	X && key;
+
+//	std::cout << "2 - " << key_length << std::endl;
+	X && this->key;
+//	std::cout << "2b" << std::endl;
 
 	// store number of values
@@ -72,11 +77,17 @@
 	X && num_values;
 
+//	std::cout << "3" << std::endl;
+
 	// value serialization
 	for (size_t i=0; i<num_values; i++) {
-		Data value = values[i];
-		uint16_t value_length = value.getLength();
+//		std::cout << "4" << std::endl;
+		Data value;
+		if (X.isSerializer()) value = values[i];
+		uint16_t value_length = value.isUnspecified() ? 0 : value.getLength();
 		X && value_length;
+//		std::cout << "5" << std::endl;
 		if (X.isDeserializer()) value.setLength( value_length );
 		X && value;
+//		std::cout << "6" << std::endl;
 		if (X.isDeserializer()) values.push_back(value);
 	}
