Index: source/ariba/overlay/messages/DHTMessage.cpp
===================================================================
--- source/ariba/overlay/messages/DHTMessage.cpp	(revision 6266)
+++ source/ariba/overlay/messages/DHTMessage.cpp	(revision 6266)
@@ -0,0 +1,40 @@
+#include "DHTMessage.h"
+
+#include<boost/foreach.hpp>
+
+namespace ariba {
+namespace overlay {
+
+vsznDefault(DHTMessage);
+
+DHTMessage::DHTMessage() {
+	this->key.setLength(0);
+	this->ttl =0 ;
+}
+
+DHTMessage::DHTMessage( const Data& key ) {
+	// calculate hash of key
+	this->hash = NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
+	this->key = key.clone();
+	this->ttl =0 ;
+}
+
+DHTMessage::DHTMessage( const Data& key, const Data& value ) {
+	// calculate hash of key
+	this->hash = NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
+	this->key = key.clone();
+	this->values.push_back(  value.clone() );
+	this->ttl =0 ;
+}
+
+DHTMessage::DHTMessage( const Data& key, const vector<Data>& values ) {
+	BOOST_FOREACH(const Data value, values )
+			this->values.push_back( value.clone() );
+}
+
+DHTMessage::~DHTMessage() {
+	this->key.release();
+	BOOST_FOREACH( Data& value, values ) value.release();
+}
+
+}}
Index: source/ariba/overlay/messages/DHTMessage.h
===================================================================
--- source/ariba/overlay/messages/DHTMessage.h	(revision 6266)
+++ source/ariba/overlay/messages/DHTMessage.h	(revision 6266)
@@ -0,0 +1,85 @@
+#ifndef DHTMESSAGE_H_
+#define DHTMESSAGE_H_
+
+#include "ariba/utility/messages.h"
+#include "ariba/utility/serialization.h"
+
+namespace ariba {
+namespace overlay {
+
+using ariba::utility::Message;
+using_serialization;
+
+class DHTMessage : public Message { VSERIALIZEABLE
+public:
+	DHTMessage();
+	DHTMessage( const Data& key );
+	DHTMessage( const Data& key, const Data& value );
+	DHTMessage( const Data& key, const vector<Data>& values );
+	virtual ~DHTMessage();
+
+	const NodeID& getHashedKey() const {
+		return hash;
+	}
+
+	const Data& getKey() const {
+		return key;
+	}
+
+	/// returns the first element of the key vector
+	const Data& getValue() const {
+		return values.at(0);
+	}
+
+	bool hasValues() const {
+		values.size() != 0;
+	}
+
+	uint16_t getTTL() const {
+		return ttl;
+	}
+
+	void setTTL( uint16_t ttl ) {
+		this->ttl = ttl;
+	}
+
+	/// return alles values for the key
+	const vector<Data>& getValues() const {
+		return values;
+	}
+
+private:
+	NodeID hash;
+	uint16_t ttl;
+	Data key;
+	vector<Data> values;
+};
+
+}} // namespace ariba::overlay
+
+sznBeginDefault( ariba::overlay::DHTMessage, X ) {
+
+	X && ttl;
+
+	// key serialization
+	uint16_t key_length = key.getLength();
+	X && key_length;
+	if (X.isDeserializer()) key.setLength( key_length );
+	X && key;
+
+	// store number of values
+	uint16_t num_values = values.size();
+	X && num_values;
+
+	// value serialization
+	for (size_t i=0; i<num_values; i++) {
+		Data value = values[i];
+		uint16_t value_length = value.getLength();
+		X && value_length;
+		if (X.isDeserializer()) value.setLength( value_length );
+		X && value;
+		if (X.isDeserializer()) values.push_back(value);
+	}
+} sznEnd();
+
+#endif /* DHTMESSAGE_H_ */
Index: source/ariba/overlay/messages/OverlayMsg.h
===================================================================
--- source/ariba/overlay/messages/OverlayMsg.h	(revision 5902)
+++ source/ariba/overlay/messages/OverlayMsg.h	(revision 6266)
@@ -88,4 +88,14 @@
 		typeLinkDirect  = 0x34, ///< direct connection has been established
 		typeLinkAlive   = 0x35, ///< keep-alive message
+
+		// DHT routed messages
+		maskDHT			= 0x40, ///< bit mask for dht messages
+		typeDHTPut      = 0x41, ///< DHT put operation
+		typeDHTGet      = 0x42, ///< DHT get operation
+		typeDHTRemove   = 0x43, ///< DHT remove operation
+
+		/// DHT response messages
+		maskDHTResponse = 0x50, ///< bit mask for dht responses
+		typeDHTData     = 0x51, ///< DHT get data
 
 		// topology signaling
@@ -179,5 +189,4 @@
 	}
 
-
 	bool containsSourceEndpoint() const {
 		return (flags & 0x20)!=0;
@@ -186,4 +195,8 @@
 	void setContainsSourceEndpoint(bool contains_endpoint) {
 		if (contains_endpoint) flags |= 0x20; else flags &= ~0x20;
+	}
+
+	bool isDHTMessage() const {
+		return hasTypeMask(maskDHT);
 	}
 
