Index: /sample/testdht/DHTTest.cpp
===================================================================
--- /sample/testdht/DHTTest.cpp	(revision 6760)
+++ /sample/testdht/DHTTest.cpp	(revision 6786)
@@ -69,5 +69,5 @@
 	// bind communication and node listener
 	node->bind( this );                              /*NodeListener*/
-	//node->bind( this, DHTTest::DHTTEST_SERVICEID); /*CommunicationListener*/
+	node->bind( this, DHTTest::DHTTEST_SERVICEID); /*CommunicationListener*/
 
 	// start node module
Index: /sample/testdht/conf/settings_node1.cnf
===================================================================
--- /sample/testdht/conf/settings_node1.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_node1.cnf	(revision 6786)
@@ -0,0 +1,6 @@
+node.name = nodeone
+ariba.endpoints = tcp{5003}
+ariba.bootstrap. hints=dhttest{ip{127.0.0.1};tcp{5001}}
+
+dhttest.name = nodeone
+
Index: /sample/testdht/conf/settings_node2.cnf
===================================================================
--- /sample/testdht/conf/settings_node2.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_node2.cnf	(revision 6786)
@@ -0,0 +1,4 @@
+node.name = nodetwo
+ariba.endpoints = tcp{5003}
+ariba.bootstrap.hints=dhttest{ip{127.0.0.1};tcp{5003}}
+dhttest.name = nodetwo
Index: /sample/testdht/conf/settings_node3.cnf
===================================================================
--- /sample/testdht/conf/settings_node3.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_node3.cnf	(revision 6786)
@@ -0,0 +1,6 @@
+node.name = nodethree
+ariba.endpoints = tcp{5005}
+ariba.bootstrap.hints=dhttest{ip{127.0.0.1};tcp{5006}}
+
+dhttest.name = nodethree
+
Index: /sample/testdht/conf/settings_node4.cnf
===================================================================
--- /sample/testdht/conf/settings_node4.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_node4.cnf	(revision 6786)
@@ -0,0 +1,5 @@
+node.name = nodefour
+ariba.endpoints = tcp{5006}
+ariba.bootstrap.hints=dhttest{ip{127.0.0.1};tcp{5007}}
+
+dhttest.name = nodefour
Index: /sample/testdht/conf/settings_node5.cnf
===================================================================
--- /sample/testdht/conf/settings_node5.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_node5.cnf	(revision 6786)
@@ -0,0 +1,7 @@
+node.name = nodefive
+ariba.endpoints = tcp{5007}
+ariba.bootstrap.hints=dhttest{ip{127.0.0.1};tcp{5006}}
+
+dhttest.name=nodefive
+
+
Index: /sample/testdht/conf/settings_poolpc.cnf
===================================================================
--- /sample/testdht/conf/settings_poolpc.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_poolpc.cnf	(revision 6786)
@@ -0,0 +1,6 @@
+node.name = poolpc
+ariba.endpoints = tcp{5003}
+ariba.bootstrap.hints=dhttest{ip{141.3.161.109};tcp{5003}}
+
+dhttest.name = poolpc
+
Index: /sample/testdht/conf/settings_slon.cnf
===================================================================
--- /sample/testdht/conf/settings_slon.cnf	(revision 6786)
+++ /sample/testdht/conf/settings_slon.cnf	(revision 6786)
@@ -0,0 +1,7 @@
+node.name = slon
+ariba.endpoints = tcp{5001}
+ariba.bootstrap.hints=dhttest{ip{127.0.0.1};tcp{5003}}
+
+dhttest.name = slon
+dhttest.key = pie
+dhttest.data = Pie is a very nutritious food.
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);
 	}
Index: /source/ariba/utility/addressing/facades/address_v.hpp
===================================================================
--- /source/ariba/utility/addressing/facades/address_v.hpp	(revision 6760)
+++ /source/ariba/utility/addressing/facades/address_v.hpp	(revision 6786)
@@ -2,4 +2,5 @@
 #define ADDRESS_V_H_
 
+#include <stdint.h>
 #include <string>
 #include <iostream>
Index: /source/ariba/utility/addressing/facades/to_bytes_v.hpp
===================================================================
--- /source/ariba/utility/addressing/facades/to_bytes_v.hpp	(revision 6760)
+++ /source/ariba/utility/addressing/facades/to_bytes_v.hpp	(revision 6786)
@@ -5,4 +5,5 @@
 
 #include <memory>
+#include <stdint.h>
 #include "vfacade.hpp"
 
Index: /source/ariba/utility/addressing/port_address.hpp
===================================================================
--- /source/ariba/utility/addressing/port_address.hpp	(revision 6760)
+++ /source/ariba/utility/addressing/port_address.hpp	(revision 6786)
@@ -5,4 +5,6 @@
 
 #include<string>
+#include<cstdio>
+
 #include<boost/tr1/functional.hpp>
 
Index: /source/ariba/utility/messages/Message.h
===================================================================
--- /source/ariba/utility/messages/Message.h	(revision 6760)
+++ /source/ariba/utility/messages/Message.h	(revision 6786)
@@ -105,5 +105,5 @@
 	 * data.
 	 */
-	inline Message( const Data& data ) :
+	explicit inline Message( const Data& data ) :
 		srcAddr(NULL),destAddr(NULL), releasePayload(true) {
 		this->payload = data.clone();
Index: /source/ariba/utility/serialization/Data.hpp
===================================================================
--- /source/ariba/utility/serialization/Data.hpp	(revision 6760)
+++ /source/ariba/utility/serialization/Data.hpp	(revision 6786)
@@ -49,5 +49,5 @@
 template<typename T = uint8_t, typename DataModel = DefaultDataModel<uint8_t> > class DataTpl;
 typedef DataTpl<> Data;
-template<typename T, typename DataModel> std::ostream& operator<<(std::ostream& stream, DataTpl<T, DataModel>& data);
+template<typename T, typename DataModel> std::ostream& operator<<(std::ostream& stream, const DataTpl<T, DataModel>& data);
 
 //== internal includes ==
@@ -324,18 +324,4 @@
 };
 
-/* default human readable text output */
-template<typename T, typename DataModel>
-std::ostream& operator<<(std::ostream& stream, DataTpl<T, DataModel>& data) {
-	stream << "[" << bitstr(data.getBuffer(), data.getLength(), 4)
-			<< "|'";
-	char* buffer = (char*) data.getBuffer();
-	for (size_t i = 0; i < data.getLength() / 8; i++) {
-		char c = buffer[i] < 32 ? '.' : buffer[i];
-		stream << c;
-	}
-	stream << "']";
-	return stream;
-}
-
 /* unspecified type */
 template<typename T, typename DataModel>
@@ -397,5 +383,5 @@
 
 	finline int32_t length() const {
-		return bufferLen;
+		return (bufferLen == -1) ? 0 : bufferLen;
 	}
 
@@ -442,3 +428,16 @@
 }sznEnd();
 
+/* default human readable text output */
+template<typename T, typename DataModel>
+std::ostream& operator<<(std::ostream& stream, const DataTpl<T, DataModel>& data) {
+	stream << "[" << bitstr(data.getBuffer(), data.getLength(), 4)
+			<< "|'";
+	const char* buffer = (const char*) data.getBuffer();
+	for (size_t i = 0; i < data.getLength() / 8; i++) {
+		char c = buffer[i] < 32 ? '.' : buffer[i];
+		stream << c;
+	}
+	stream << "']";
+	return stream;
+}
 #endif /* DATA_HPP_ */
Index: /source/ariba/utility/transport/tcpip/protlib/address.cpp
===================================================================
--- /source/ariba/utility/transport/tcpip/protlib/address.cpp	(revision 6760)
+++ /source/ariba/utility/transport/tcpip/protlib/address.cpp	(revision 6786)
@@ -534,5 +534,5 @@
 	char ipstr[INET6_ADDRSTRLEN] = {0};
 	// look for /
-	i = strchr(str,'/');
+	i = strchr((char*)str,'/');
 	if (i) {
 		iplen = i-str;
