Index: /sample/pingpong/PingPong.cpp
===================================================================
--- /sample/pingpong/PingPong.cpp	(revision 3054)
+++ /sample/pingpong/PingPong.cpp	(revision 3055)
@@ -133,5 +133,5 @@
 // node listener interface
 void PingPong::onJoinCompleted( const SpoVNetID& vid ) {
-	logging_error( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX pingpong node join completed, spovnetid=" << vid.toString() );
+	logging_info( "pingpong node join completed, spovnetid=" << vid.toString() );
 
 	// start the timer to ping every second
@@ -140,5 +140,5 @@
 
 void PingPong::onJoinFailed( const SpoVNetID& vid ) {
-	logging_error("pingpong node join failed, spovnetid=" << vid.toString() );
+	logging_error("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX pingpong node join failed, spovnetid=" << vid.toString() );
 }
 
Index: /source/ariba/AribaModule.h
===================================================================
--- /source/ariba/AribaModule.h	(revision 3054)
+++ /source/ariba/AribaModule.h	(revision 3055)
@@ -84,4 +84,5 @@
  *
  * @author Sebastian Mies <mies@tm.uka.de>
+ * @author Christoph Mayer <mayer@tm.uka.de>
  */
 class AribaModule: public Module {
@@ -129,8 +130,8 @@
 	 * bootstrap.file  = used file for bootstrap information
 	 */
-	void initialize(); ///< @see Module.h
-	void start(); ///< @see Module.h
-	void stop(); ///< @see Module.h
-	string getName() const; ///< @see Module.h
+	void initialize();                          ///< @see Module.h
+	void start();                               ///< @see Module.h
+	void stop();                                ///< @see Module.h
+	string getName() const;                     ///< @see Module.h
 	void setProperty(string key, string value); ///< @see Module.h
 	const string getProperty(string key) const; ///< @see Module.h
Index: /source/ariba/CommunicationListener.cpp
===================================================================
--- /source/ariba/CommunicationListener.cpp	(revision 3054)
+++ /source/ariba/CommunicationListener.cpp	(revision 3055)
@@ -41,34 +41,26 @@
 namespace ariba {
 
-// dummy
 CommunicationListener::CommunicationListener() {
 }
 
-// dummy
 CommunicationListener::~CommunicationListener() {
 }
 
-// dummy
 void CommunicationListener::onLinkUp(const LinkID& l, const NodeID& r) {
 }
 
-// dummy
 void CommunicationListener::onLinkDown(const LinkID& l, const NodeID& r) {
 }
 
-// dummy
 void CommunicationListener::onLinkChanged(const LinkID& l, const NodeID& r) {
 }
 
-// dummy
 void CommunicationListener::onLinkFail(const LinkID& l, const NodeID& r) {
 }
 
-// dummy
 void CommunicationListener::onLinkQoSChanged(const LinkID& l, const NodeID& r,
 		const LinkProperties& p) {
 }
 
-// dummy
 bool CommunicationListener::onLinkRequest(const NodeID& remote,
 		const DataMessage& msg) {
@@ -76,13 +68,11 @@
 }
 
-// dummy
 void CommunicationListener::onMessage(const DataMessage& msg,
 		const NodeID& remote, const LinkID& lnk) {
 }
 
-// dummy
-void CommunicationListener::onMessageSent(seqnum_t seq_num, bool failed,
-		const DataMessage& msg) {
-}
+// void CommunicationListener::onMessageSent(seqnum_t seq_num, bool failed,
+// 		const DataMessage& msg) {
+// }
 
 } // namespace ariba
Index: /source/ariba/CommunicationListener.h
===================================================================
--- /source/ariba/CommunicationListener.h	(revision 3054)
+++ /source/ariba/CommunicationListener.h	(revision 3055)
@@ -43,5 +43,4 @@
 // forward declaration
 class CommunicationListener;
-class ServiceInterfaceWrapper;
 }
 
@@ -54,9 +53,8 @@
 
 /**
- *
+ * Listener for communication events on links.
  */
 class CommunicationListener {
 	friend class Node;
-	friend class ServiceInterfaceWrapper;
 protected:
 	CommunicationListener();
@@ -76,6 +74,4 @@
 			const LinkProperties& prop);
 
-	// --- service specific events ---
-
 	virtual bool onLinkRequest(const NodeID& remote, const DataMessage& msg);
 
@@ -85,6 +81,7 @@
 			const LinkID& lnk = LinkID::UNSPECIFIED);
 
-	virtual void onMessageSent(seqnum_t seq_num, bool failed,
-			const DataMessage& msg = DataMessage::UNSPECIFIED);
+	// --- extended message functionality ---
+	//	virtual void onMessageSent(seqnum_t seq_num, bool failed,
+	//		const DataMessage& msg = DataMessage::UNSPECIFIED);
 
 	// --- dht functionality ---
Index: /source/ariba/Identifiers.h
===================================================================
--- /source/ariba/Identifiers.h	(revision 3054)
+++ /source/ariba/Identifiers.h	(revision 3055)
@@ -40,10 +40,4 @@
 #define IDENTIFIERS_H_
 
-//#include "ariba.h"
-
-// TODO: implement via variable integers to support different node id sizes!!
-//#include "ariba/utility/vtypes/vint.hpp"
-
-// hack
 #include "ariba/utility/types/NodeID.h"
 #include "ariba/utility/types/ServiceID.h"
@@ -53,11 +47,4 @@
 namespace ariba {
 
-// TODO: implement via variable integers to support different node id sizes!!
-//typedef vint<32> LinkID;
-//typedef vint<32> ServiceID;
-//typedef vint<> NodeID;
-//typedef vint<> SpoVNetID;
-
-// hack: for now, use old identifiers
 typedef utility::NodeID NodeID;
 typedef utility::LinkID LinkID;
Index: /source/ariba/Makefile.am
===================================================================
--- /source/ariba/Makefile.am	(revision 3054)
+++ /source/ariba/Makefile.am	(revision 3055)
@@ -253,21 +253,11 @@
   communication/networkinfo/NetworkInformation.h
 
-#------------> interface
-
-libariba_la_SOURCES += \
-  interface/ServiceInterface.cpp
-
-nobase_libariba_la_HEADERS += \
-  interface/ServiceInterface.h
-
 #------------> overlay
 
 libariba_la_SOURCES += \
-  overlay/BaseOverlay.cpp \
-  overlay/OverlayEvents.cpp
-
-nobase_libariba_la_HEADERS += \
-  overlay/BaseOverlay.h \
-  overlay/OverlayEvents.h
+  overlay/BaseOverlay.cpp
+
+nobase_libariba_la_HEADERS += \
+  overlay/BaseOverlay.h
 
 #------------> overlay :: messages
Index: /source/ariba/Node.cpp
===================================================================
--- /source/ariba/Node.cpp	(revision 3054)
+++ /source/ariba/Node.cpp	(revision 3055)
@@ -41,5 +41,4 @@
 #include "ariba/overlay/BaseOverlay.h"
 #include "ariba/utility/types/OverlayParameterSet.h"
-#include "ariba/interface/ServiceInterface.h"
 #include "ariba/communication/EndpointDescriptor.h"
 
@@ -47,84 +46,4 @@
 
 namespace ariba {
-
-class ServiceInterfaceWrapper: public interface::ServiceInterface {
-private:
-	NodeListener* nodeListener;
-	CommunicationListener* commListener;
-public:
-	ServiceInterfaceWrapper(NodeListener* listener) :
-		nodeListener(listener), commListener(NULL) {
-
-	}
-
-	ServiceInterfaceWrapper(CommunicationListener* listener) :
-		nodeListener(NULL), commListener(listener) {
-	}
-
-	~ServiceInterfaceWrapper() {
-	}
-
-protected:
-
-	bool isJoinAllowed(const NodeID& nodeid, const SpoVNetID& spovnetid) {
-		return true;
-	}
-
-	void onNodeJoin(const NodeID& nodeid, const SpoVNetID& spovnetid) {
-		// not handled
-	}
-
-	void onNodeLeave(const NodeID& id, const SpoVNetID& spovnetid) {
-		// not handled
-	}
-
-	void onJoinSuccess(const SpoVNetID& spovnetid) {
-		if (nodeListener != NULL) nodeListener->onJoinCompleted(spovnetid);
-	}
-
-	void onJoinFail(const SpoVNetID& spovnetid) {
-		if (nodeListener != NULL) nodeListener->onJoinFailed(spovnetid);
-	}
-
-	void onLeaveSuccess( const SpoVNetID& spovnetid ){
-		if (nodeListener != NULL) nodeListener->onLeaveCompleted(spovnetid);
-	}
-
-	void onLeaveFail( const SpoVNetID& spovnetid ){
-		if (nodeListener != NULL) nodeListener->onLeaveFailed(spovnetid);
-	}
-
-	void onLinkUp(const LinkID& link, const NodeID& local, const NodeID& remote) {
-		if (commListener != NULL) commListener->onLinkUp(link, remote);
-	}
-
-	void onLinkDown(const LinkID& link, const NodeID& local,
-			const NodeID& remote) {
-		if (commListener != NULL) commListener->onLinkDown(link, remote);
-	}
-
-	void onLinkChanged(const LinkID& link, const NodeID& local,
-			const NodeID& remote) {
-		if (commListener != NULL) commListener->onLinkChanged(link, remote);
-	}
-
-	void onLinkFail(const LinkID& id, const NodeID& local, const NodeID& remote) {
-		if (commListener != NULL) commListener->onLinkFail(id, remote);
-	}
-
-	void onLinkQoSChanged(const LinkID& id, const NodeID& local,
-			const NodeID& remote, const QoSParameterSet& qos) {
-		if (commListener != NULL) commListener->onLinkQoSChanged(id, remote,
-				LinkProperties::DEFAULT);
-	}
-
-	bool receiveMessage(const Message* message, const LinkID& link,
-			const NodeID& node) {
-		if (commListener != NULL) commListener->onMessage(
-				const_cast<Message*>(message), node, link);
-	}
-};
-
-ServiceID Node::anonymousService = ServiceID(0xFF00);
 
 Node::Node(AribaModule& ariba_mod, const Name& node_name) :
@@ -143,11 +62,10 @@
 	nodeId = generateNodeId(name);
 
-	ariba_mod.base_comm->start(ariba_mod.ip_addr, ariba_mod.tcp_port);
-	base_overlay->start( *ariba_mod.base_comm, nodeId );
-
 	const communication::EndpointDescriptor* ep =
 			ariba_mod.getBootstrapNode(vnetname);
 	if( ep == NULL ) return;
 
+	ariba_mod.base_comm->start(ariba_mod.ip_addr, ariba_mod.tcp_port);
+	base_overlay->start( *ariba_mod.base_comm, nodeId );
 	base_overlay->joinSpoVNet( spovnetId, *ep);
 }
@@ -173,5 +91,4 @@
 	base_overlay->leaveSpoVNet();
 	ariba_mod.base_comm->stop();
-
 	base_overlay->stop();
 }
@@ -222,18 +139,17 @@
 
 void Node::bind(NodeListener* listener) {
-	base_overlay->bind(new ServiceInterfaceWrapper(listener),
-			Node::anonymousService);
+	base_overlay->bind(listener);
 }
 
 void Node::unbind(NodeListener* listener) {
-	delete base_overlay->unbind(Node::anonymousService);
+	base_overlay->unbind(listener);
 }
 
 void Node::bind(CommunicationListener* listener, const ServiceID& sid) {
-	base_overlay->bind(new ServiceInterfaceWrapper(listener), sid);
+	base_overlay->bind(listener, sid);
 }
 
 void Node::unbind(CommunicationListener* listener, const ServiceID& sid) {
-	delete base_overlay->unbind(sid);
+	base_overlay->unbind(listener, sid);
 }
 
Index: /source/ariba/Node.h
===================================================================
--- /source/ariba/Node.h	(revision 3054)
+++ /source/ariba/Node.h	(revision 3055)
@@ -42,5 +42,8 @@
 // forward declarations
 namespace ariba {
-class Node;
+	class Node;
+	namespace overlay {
+		class BaseOverlay;
+	}
 }
 
@@ -55,16 +58,8 @@
 #include "DataMessage.h"
 
+using ariba::overlay::BaseOverlay;
 using std::vector;
 
 namespace ariba {
-
-// forward declaration
-namespace interface {
-class ServiceInterface;
-}
-
-namespace overlay {
-class BaseOverlay;
-}
 
 /**
@@ -338,9 +333,6 @@
 	AribaModule& ariba_mod;	               //< ariba module
 	SpoVNetID spovnetId; 	               //< current spovnet id
-	NodeID nodeId; 		                   //< current node id
+	NodeID nodeId; 		               //< current node id
 	overlay::BaseOverlay* base_overlay;    //< the base overlay
-
-	// delegates
-	static ServiceID anonymousService;
 };
 
Index: /source/ariba/NodeListener.h
===================================================================
--- /source/ariba/NodeListener.h	(revision 3054)
+++ /source/ariba/NodeListener.h	(revision 3055)
@@ -44,5 +44,4 @@
 class NodeListener;
 class Node;
-class ServiceInterfaceWrapper;
 }
 
@@ -55,13 +54,11 @@
  *
  * @author Sebastian Mies <mies@tm.uka.de>
+ * @author Christoph Mayer <mayer@tm.uka.de>
  */
 class NodeListener {
 	friend class Node;
-	friend class ServiceInterfaceWrapper;
 public:
-
 	NodeListener();
 	virtual ~NodeListener();
-
 protected:
 	/**
Index: /source/ariba/SpoVNetProperties.h
===================================================================
--- /source/ariba/SpoVNetProperties.h	(revision 3054)
+++ /source/ariba/SpoVNetProperties.h	(revision 3055)
@@ -62,4 +62,5 @@
  *
  * @author Sebastian Mies <mies@tm.uka.de>
+ * @author Christoph Mayer <mayer@tm.uka.de>
  */
 class SpoVNetProperties {
Index: /source/ariba/ariba.h
===================================================================
--- /source/ariba/ariba.h	(revision 3054)
+++ /source/ariba/ariba.h	(revision 3055)
@@ -45,7 +45,9 @@
 
 #include "AribaModule.h"
+#include "CommunicationListener.h"
 #include "DataMessage.h"
 #include "Identifiers.h"
 #include "LinkProperties.h"
+#include "Message.h"
 #include "Module.h"
 #include "Name.h"
@@ -53,6 +55,4 @@
 #include "NodeListener.h"
 #include "SpoVNetProperties.h"
-#include "CommunicationListener.h"
-#include "Message.h"
 
 #endif /* ARIBA_H_ */
Index: /source/ariba/communication/modules/transport/omnet/AribaOmnetModule.cpp
===================================================================
--- /source/ariba/communication/modules/transport/omnet/AribaOmnetModule.cpp	(revision 3054)
+++ /source/ariba/communication/modules/transport/omnet/AribaOmnetModule.cpp	(revision 3055)
@@ -40,7 +40,5 @@
 
 #include "ariba/utility/system/StartupWrapper.h" // circular inclusion
-#include "ariba/interface/ServiceInterface.h"
 using ariba::utility::StartupWrapper;
-using ariba::interface::ServiceInterface;
 
 namespace ariba {
Index: /source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- /source/ariba/overlay/BaseOverlay.cpp	(revision 3054)
+++ /source/ariba/overlay/BaseOverlay.cpp	(revision 3055)
@@ -40,5 +40,6 @@
 
 #include "ariba/utility/misc/OvlVis.h"
-using ariba::utility::OvlVis;
+#include "ariba/NodeListener.h"
+#include "ariba/CommunicationListener.h"
 
 namespace ariba {
@@ -146,5 +147,5 @@
 
 	// inform all registered services of the event
-	BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+	BOOST_FOREACH( NodeListener* i, nodeListeners ){
 		if( ret ) i->onLeaveSuccess( spovnetId );
 		else      i->onLeaveFail( spovnetId );
@@ -176,5 +177,5 @@
 
 	overlayInterface->joinOverlay();
-	BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+	BOOST_FOREACH( NodeListener* i, nodeListeners ){
 		i->onJoinSuccess( spovnetId );
 	}
@@ -221,10 +222,10 @@
 const LinkID BaseOverlay::establishLink(const EndpointDescriptor& ep, const ServiceID& service){
 
-	if( !listenerMux.contains( service ) ){
+	if( !communicationListeners.contains( service ) ){
 		logging_error( "no registered listener on serviceid " << service.toString() );
 		return LinkID::UNSPECIFIED;
 	}
 
-	ServiceInterface* receiver = listenerMux.get( service );
+	CommunicationListener* receiver = communicationListeners.get( service );
 	const LinkID link = bc->establishLink( ep );
 
@@ -308,30 +309,58 @@
 }
 
-bool BaseOverlay::bind(ServiceInterface* service, const ServiceID& sid) {
-
-	logging_debug( "binding service " << service << " on serviceid " << sid.toString() );
-
-	if( listenerMux.contains( sid ) ){
-		logging_error( "some service already registered for service id " << sid.toString() );
+void BaseOverlay::bind(CommunicationListener* listener, const ServiceID& sid){
+	logging_debug( "binding communication listener " << listener 
+		<< " on serviceid " << sid.toString() );
+
+	if( communicationListeners.contains( sid ) ){
+		logging_error( "some listener already registered for service id " 
+			<< sid.toString() );
 		return false;
 	}
 
-	listenerMux.registerItem( service, sid );
+	communicationListeners.registerItem( listener, sid );
 	return true;
 }
 
-ServiceInterface* BaseOverlay::unbind(const ServiceID& sid){
-
-	logging_debug( "unbinding service from serviceid " << sid.toString() );
-
-	if( !listenerMux.contains( sid ) ){
-		logging_warn( "cannot unbind service. no service registered on service id " << sid.toString() );
-		return NULL;
-	}
-
-	ServiceInterface* iface = listenerMux.get( sid );
-	listenerMux.unregisterItem( sid );
-
-	return NULL; //iface;
+void BaseOverlay::unbind(CommunicationListener* listener, const ServiceID& sid){
+	logging_debug( "unbinding listener " << listener 
+		<< " from serviceid " << sid.toString() );
+
+	if( !communicationListeners.contains( sid ) ){
+		logging_warn( "cannot unbind listener. no listener registered on service id " << sid.toString() );
+		return;
+	}
+
+	if( communicationListeners.get(sid) != listener ){
+		logging_warn( "listener bound to service id " << sid.toString() 
+			<< " is different than listener trying to unbind" );
+		return;
+	}
+
+	communicationListeners.unregisterItem( sid );
+}
+
+void BaseOverlay::bind(NodeListener* listener){
+	logging_debug( "binding node listener " << listener );
+
+	NodeListenerVector::iterator i = nodeListeners.find( listener );
+	if( i != nodeListeners.end() ){
+		logging_warn( "node listener " << listener << " is already bound, cannot bind" );
+		return;
+	}
+	
+	nodeListeners.push_back( listener );
+}
+
+void BaseOverlay::unbind(NodeListener* listener){
+	logging_debug( "unbinding node listener " << listener );
+
+	NodeListenerVector::iterator i = nodeListeners.find( listener );
+	if( i == nodeListeners.end() ){
+		logging_warn( "node listener " << listener << " is not bound, cannot unbind" );
+		return;
+	}
+	
+	nodeListeners.erase( i );
 }
 
@@ -501,5 +530,5 @@
 
 		const ServiceID& service = overlayMsg->getService();
-		ServiceInterface* serviceListener = listenerMux.get( service );
+		CommunicationListener* serviceListener = communicationListeners.get( service );
 
 		logging_debug( "received data for service " << service.toString() );
@@ -544,5 +573,5 @@
 		bool allow = true;
 
-		BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+		BOOST_FOREACH( NodeListener* i, nodeListeners ){
 			allow &= i->isJoinAllowed( overlayMsg->getSourceNode(), spovnetId );
 		}
@@ -615,5 +644,5 @@
 
 			// inform all registered services of the event
-			BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+			BOOST_FOREACH( NodeListener* i, nodeListeners{
 				i->onJoinFail( spovnetId );
 			}
@@ -640,5 +669,5 @@
 
 			// inform all registered services of the event
-			BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+			BOOST_FOREACH( NodeListener* i, nodeListeners ){
 				i->onJoinFail( spovnetId );
 			}
@@ -662,5 +691,5 @@
 
 		// inform all registered services of the event
-		BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+		BOOST_FOREACH( NodeListener* i, nodeListeners ){
 			i->onJoinSuccess( spovnetId );
 		}
@@ -717,10 +746,10 @@
 		//
 
-		if( !listenerMux.contains( service ) ){
+		if( !communicationListeners.contains( service ) ){
 			logging_warn( "linkup event for service that has not been registered" );
 			return false;
 		}
 
-		ServiceInterface* iface = listenerMux.get( service );
+		CommunicationListener* iface = communicationListeners.get( service );
 		if( iface == NULL ){
 			logging_warn( "linkup event for service that has been registered with a NULL interface" );
@@ -762,5 +791,5 @@
 
 			// inform all registered services of the event
-			BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+			BOOST_FOREACH( NodeListener* i, nodeListeners ){
 				i->onLeaveFail( spovnetId );
 			}
@@ -774,5 +803,5 @@
 
 			// inform all registered services of the event
-			BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+			BOOST_FOREACH( NodeListener* i, nodeListeners ){
 				i->onNodeLeave( overlayMsg->getSourceNode(), spovnetId );
 			}
@@ -879,5 +908,5 @@
 				<< node.toString() );
 
-	BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
+	BOOST_FOREACH( NodeListener* i, nodeListeners ){
 		i->onNodeJoin( node, spovnetId );
 	}
Index: /source/ariba/overlay/BaseOverlay.h
===================================================================
--- /source/ariba/overlay/BaseOverlay.h	(revision 3054)
+++ /source/ariba/overlay/BaseOverlay.h	(revision 3055)
@@ -59,6 +59,4 @@
 #include "ariba/communication/CommunicationEvents.h"
 
-#include "ariba/interface/ServiceInterface.h"
-
 #include "ariba/overlay/modules/OverlayInterface.h"
 #include "ariba/overlay/modules/OverlayFactory.h"
@@ -67,4 +65,14 @@
 #include "ariba/overlay/messages/JoinRequest.h"
 #include "ariba/overlay/messages/JoinReply.h"
+
+// forward declerations
+namespace ariba {
+	class NodeListener;
+	class CommunicationListener;
+
+	namespace utility {
+		class OvlVis;
+	}
+}
 
 using std::vector;
@@ -76,9 +84,10 @@
 using std::find;
 
+using ariba::NodeListener;
+using ariba::CommunicationListener;
+
 using ariba::communication::EndpointDescriptor;
 using ariba::communication::BaseCommunication;
 using ariba::communication::CommunicationEvents;
-
-using ariba::interface::ServiceInterface;
 
 using ariba::overlay::OverlayMsg;
@@ -101,13 +110,8 @@
 using ariba::utility::seqnum_t;
 using ariba::utility::Timer;
+using ariba::utility::OvlVis;
 
 #define ovl OvlVis::instance()
 #define ovlId OvlVis::NETWORK_ID_BASE_OVERLAY
-
-// needed for friend decleration
-// in different namespace
-namespace ariba {
-	class Node;
-}
 
 namespace ariba {
@@ -121,8 +125,5 @@
 
 	use_logging_h( BaseOverlay );
-	friend class ariba::Node;
-
 public:
-
 	/**
 	 * Constructs an empty non-functional base overlay instance
@@ -147,11 +148,14 @@
 	/**
 	 * Starts a link establishment procedure to the specfied node
+	 * for the service with id service
 	 *
-	 * @param node The node id
+	 * @param node Destination node id
+	 * @param service Service to connect to
 	 */
 	const LinkID establishLink( const NodeID& node, const ServiceID& service );
 
 	/**
-	 * TODO
+	 * Starts a link establishment procedure to the specified
+	 * endpoint and to the specified service
 	 */
 	const LinkID establishLink( const EndpointDescriptor& ep, const ServiceID& service );
@@ -176,8 +180,5 @@
 	 * Depending on the structure of the overlay, this can be very different.
 	 */
-	void broadcastMessage(
-		Message* message,
-		const ServiceID& service
-	);
+	void broadcastMessage( Message* message, const ServiceID& service );
 
 	/**
@@ -200,16 +201,22 @@
 
 	/**
-	 * Registers a receiver.
-	 *
-	 * @param receiver An implementation of the receiver interface
-	 */
-	bool bind( ServiceInterface* service, const ServiceID& sid );
-
-	/**
-	 * Unregister a receiver.
-	 *
-	 * @param sid The service id to unregister
-	 */
-	ServiceInterface* unbind( const ServiceID& sid );
+	 * TODO
+	 */
+	void bind(CommunicationListener* listener, const ServiceID& sid);
+	
+	/**
+	 * TODO
+	 */
+	void unbind(CommunicationListener* listener, const ServiceID& sid);
+	
+	/**
+	 * TODO
+	 */
+	void bind(NodeListener* listener);
+	
+	/**
+	 * TODO
+	 */
+	void unbind(NodeListener* listener);
 
 	/**
@@ -221,15 +228,12 @@
 	const NodeID& getNodeID( const LinkID& lid = LinkID::UNSPECIFIED ) const ;
 
-protected:
-
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-	void joinSpoVNet(
-		const SpoVNetID& id,
-		const EndpointDescriptor& bootstrapEp
-	);
-
+	/**
+	 * TODO
+	 */
+	void joinSpoVNet( const SpoVNetID& id, const EndpointDescriptor& bootstrapEp );
+
+	/**
+	 * TODO
+	 */
 	void createSpoVNet(
 		const SpoVNetID& id,
@@ -239,19 +243,31 @@
 	);
 
-	void leaveSpoVNet(
-	);
-
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+	/**
+	 * TODO
+	 */
+	void leaveSpoVNet();
+
+protected:
+
+	/**
+	 * TODO
+	 */
 	virtual void onLinkUp( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
+	/**
+	 * TODO
+	 */
 	virtual void onLinkDown( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
 	virtual void onLinkChanged( const LinkID& id, const NetworkLocator* oldlocal, const NetworkLocator* newlocal, const NetworkLocator* oldremote, const NetworkLocator* newremote );
 
+	/**
+	 * TODO
+	 */
 	virtual void onLinkFail( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
+	/**
+	 * TODO
+	 */
 	virtual void onLinkQoSChanged( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote, const QoSParameterSet& qos );
 
@@ -260,4 +276,7 @@
 	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+	/**
+	 * TODO
+	 */
 	virtual bool receiveMessage( const Message* message, const LinkID& link, const NodeID& ); // nodeid is not valid in this case!
 
@@ -270,11 +289,17 @@
 	 */
 	virtual void incomingRouteMessage( Message* msg );
+	
+	/**
+	 * see OverlayStructureEvents.h, called from specific OverlayInterface class
+	 */
 	virtual void onNodeJoin( const NodeID& node );
 
-	// for timer events
+	
+	/**
+	 * TODO, for timer events
+	 */
 	virtual void eventFunction();
 
 private:
-
 	/**
 	 * The BaseCommunication the BaseOverlay
@@ -295,8 +320,17 @@
 
 	/**
-	 * A demultiplexer that maps listeners to service ids
-	 * to deliver upcoming messages to the correct service.
-	 */
-	Demultiplexer<ServiceInterface*, ServiceID> listenerMux;
+	 * TODO
+	 */
+	Demultiplexer<CommunicationListener*, ServiceID> communicationListeners;
+
+	/**
+	 * TODO
+	 */
+	typedef vector<NodeListener*> NodeListenerVector;
+
+	/**
+	 * TODO
+	 */
+	NodeListenerVector nodeListeners;
 
 	/**
@@ -322,4 +356,7 @@
 	} BaseOverlayState;
 
+	/**
+	 * TODO
+	 */
 	BaseOverlayState state;
 
@@ -344,5 +381,5 @@
 
 		LinkItem( const LinkID& _link, const NodeID& _node,
-				const ServiceID& _service, ServiceInterface* _interface )
+				const ServiceID& _service, CommunicationListener* _interface )
 			: link( _link ), node( _node ), service( _service ), interface( _interface ),
 				autolink( false ), lastuse( time(NULL) ) {
@@ -354,5 +391,5 @@
 		NodeID node;
 		ServiceID service;
-		ServiceInterface* interface;
+		CommunicationListener* interface;
 
 		// information needed for auto links
@@ -370,6 +407,9 @@
 	LinkMapping linkMapping;
 
-	// nodes with pending joines. TODO: should be cleaned every some seconds
-	// add timestamps to each, and check on occasion
+	
+	/**
+	 * nodes with pending joines. TODO: should be cleaned every 
+	 * some seconds, add timestamps to each, and check on occasion
+	 */
 	typedef vector<NodeID> JoiningNodes;
 	JoiningNodes joiningNodes;
Index: urce/ariba/overlay/OverlayEvents.cpp
===================================================================
--- /source/ariba/overlay/OverlayEvents.cpp	(revision 3054)
+++ 	(revision )
@@ -1,82 +1,0 @@
-// [Licence]
-// The Ariba-Underlay Copyright
-//
-// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
-//
-// Institute of Telematics
-// UniversitÃ€t Karlsruhe (TH)
-// Zirkel 2, 76128 Karlsruhe
-// Germany
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// 1. Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// 2. Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// The views and conclusions contained in the software and documentation
-// are those of the authors and should not be interpreted as representing
-// official policies, either expressed or implied, of the Institute of
-// Telematics.
-// [Licence]
-
-#include "OverlayEvents.h"
-
-namespace ariba {
-namespace overlay {
-
-OverlayEvents::OverlayEvents(){
-}
-
-OverlayEvents::~OverlayEvents(){
-}
-
-bool OverlayEvents::isJoinAllowed( const NodeID& nodeid, const SpoVNetID& spovnetid ){
-	// default: allow all nodes to join
-	return true;
-}
-
-void OverlayEvents::onNodeJoin( const NodeID& nodeid, const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onNodeLeave( const NodeID& id, const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onJoinSuccess( const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onJoinFail( const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onLeaveSuccess( const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onLeaveFail( const SpoVNetID& spovnetid ){
-}
-
-void OverlayEvents::onLinkUp( const LinkID& link, const NodeID& local, const NodeID& remote ){
-}
-
-void OverlayEvents::onLinkDown( const LinkID& link, const NodeID& local, const NodeID& remote ){
-}
-
-void OverlayEvents::onLinkChanged( const LinkID& link, const NodeID& local, const NodeID& remote ){
-}
-
-}} // namespace ariba, overlay
Index: urce/ariba/overlay/OverlayEvents.h
===================================================================
--- /source/ariba/overlay/OverlayEvents.h	(revision 3054)
+++ 	(revision )
@@ -1,78 +1,0 @@
-// [Licence]
-// The Ariba-Underlay Copyright
-//
-// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
-//
-// Institute of Telematics
-// UniversitÃ€t Karlsruhe (TH)
-// Zirkel 2, 76128 Karlsruhe
-// Germany
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// 1. Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// 2. Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// The views and conclusions contained in the software and documentation
-// are those of the authors and should not be interpreted as representing
-// official policies, either expressed or implied, of the Institute of
-// Telematics.
-// [Licence]
-
-#ifndef __OVERLAY_EVENTS_H
-#define __OVERLAY_EVENTS_H
-
-#include "ariba/utility/types/LinkID.h"
-#include "ariba/utility/types/NodeID.h"
-#include "ariba/utility/types/SpoVNetID.h"
-
-using ariba::utility::LinkID;
-using ariba::utility::NodeID;
-using ariba::utility::SpoVNetID;
-
-namespace ariba {
-namespace overlay {
-
-class OverlayEvents {
-	friend class BaseOverlay;
-public:
-	OverlayEvents();
-	virtual ~OverlayEvents();
-
-protected:
-	/// for initiator about remote nodes
-	virtual bool isJoinAllowed( const NodeID& nodeid, const SpoVNetID& spovnetid );
-	virtual void onNodeJoin( const NodeID& nodeid, const SpoVNetID& spovnetid );
-	virtual void onNodeLeave( const NodeID& id, const SpoVNetID& spovnetid );
-
-	/// our local status
-	virtual void onJoinSuccess( const SpoVNetID& spovnetid );
-	virtual void onJoinFail( const SpoVNetID& spovnetid );
-	virtual void onLeaveSuccess( const SpoVNetID& spovnetid );
-	virtual void onLeaveFail( const SpoVNetID& spovnetid );
-
-	virtual void onLinkUp( const LinkID& link, const NodeID& local, const NodeID& remote );
-	virtual void onLinkDown( const LinkID& link, const NodeID& local, const NodeID& remote );
-	virtual void onLinkChanged( const LinkID& link, const NodeID& local, const NodeID& remote );
-};
-
-}} // namespace ariba, overlay
-
-#endif // __OVERLAY_EVENTS_H
Index: /source/ariba/overlay/modules/OverlayInterface.h
===================================================================
--- /source/ariba/overlay/modules/OverlayInterface.h	(revision 3054)
+++ /source/ariba/overlay/modules/OverlayInterface.h	(revision 3055)
@@ -40,12 +40,12 @@
 #define __OVERLAY_INTERFACE_H
 
+#include "ariba/CommunicationListener.h"
 #include "ariba/communication/EndpointDescriptor.h"
-#include "ariba/interface/ServiceInterface.h"
 #include "ariba/overlay/modules/OverlayStructureEvents.h"
 #include "ariba/utility/types/NodeID.h"
 #include "ariba/utility/types/ServiceID.h"
 
+using ariba::CommunicationListener;
 using ariba::communication::EndpointDescriptor;
-using ariba::interface::ServiceInterface;
 using ariba::overlay::OverlayStructureEvents;
 using ariba::utility::NodeID;
@@ -57,5 +57,5 @@
 class BaseOverlay;
 
-class OverlayInterface : public ServiceInterface {
+class OverlayInterface : public CommunicationListener {
 public:
 	OverlayInterface(
Index: /source/ariba/overlay/modules/onehop/OneHop.h
===================================================================
--- /source/ariba/overlay/modules/onehop/OneHop.h	(revision 3054)
+++ /source/ariba/overlay/modules/onehop/OneHop.h	(revision 3055)
@@ -85,5 +85,5 @@
 
 	//
-	// see ServiceInterface.h and OverlayInterface.h
+	// see CommunicationListener.h and OverlayInterface.h
 	//
 
