Index: source/ariba/CommunicationListener.cpp
===================================================================
--- source/ariba/CommunicationListener.cpp	(revision 3067)
+++ source/ariba/CommunicationListener.cpp	(revision 3071)
@@ -59,8 +59,4 @@
 }
 
-void CommunicationListener::onLinkQoSChanged(const LinkID& l, const NodeID& r,
-		const LinkProperties& p) {
-}
-
 bool CommunicationListener::onLinkRequest(const NodeID& remote,
 		const DataMessage& msg) {
@@ -73,4 +69,9 @@
 
 // --- extended message functionality ---
+//void CommunicationListener::onLinkQoSChanged(const LinkID& l, const NodeID& r,
+//		const LinkProperties& p) {
+//}
+
+// --- extended message functionality ---
 // void CommunicationListener::onMessageSent(seqnum_t seq_num, bool failed,
 // 		const DataMessage& msg) {
Index: source/ariba/CommunicationListener.h
===================================================================
--- source/ariba/CommunicationListener.h	(revision 3067)
+++ source/ariba/CommunicationListener.h	(revision 3071)
@@ -71,8 +71,5 @@
 	virtual void onLinkFail(const LinkID& lnk, const NodeID& remote);
 
-	virtual void onLinkQoSChanged(const LinkID& lnk, const NodeID& remote,
-			const LinkProperties& prop);
-
-	virtual bool onLinkRequest(const NodeID& remote, const DataMessage& msg);
+	virtual bool onLinkRequest(const NodeID& remote, const DataMessage& msg = DataMessage::UNSPECIFIED);
 
 	// --- general receive method ---
@@ -80,4 +77,8 @@
 	virtual void onMessage(const DataMessage& msg, const NodeID& remote,
 			const LinkID& lnk = LinkID::UNSPECIFIED);
+
+	// --- extended message functionality ---
+	// virtual void onLinkQoSChanged(const LinkID& lnk, const NodeID& remote,
+	//			const LinkProperties& prop);
 
 	// --- extended message functionality ---
Index: source/ariba/Node.cpp
===================================================================
--- source/ariba/Node.cpp	(revision 3067)
+++ source/ariba/Node.cpp	(revision 3071)
@@ -57,5 +57,4 @@
 }
 
-//TODO: Implement error handling: no bootstrap node available
 void Node::join(const Name& vnetname) {
 	spovnetId = vnetname.toSpoVNetId();
Index: source/ariba/Node.h
===================================================================
--- source/ariba/Node.h	(revision 3067)
+++ source/ariba/Node.h	(revision 3071)
@@ -58,6 +58,6 @@
 #include "DataMessage.h"
 
+using std::vector;
 using ariba::overlay::BaseOverlay;
-using std::vector;
 
 namespace ariba {
Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 3067)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 3071)
@@ -98,5 +98,6 @@
 
 	ovl.visShowNodeBubble ( ovlId, nodeId, "joining..." );
-	logging_info( "starting to join spovnet " << id.toString() << "...");
+	logging_info( "starting to join spovnet " << id.toString() <<
+			" with nodeid " << nodeId.toString());
 
 	//
@@ -145,5 +146,6 @@
 	logging_debug( "leaving overlay" );
 	// first, leave the overlay interface
-	overlayInterface->leaveOverlay();
+	if( overlayInterface != NULL )
+		overlayInterface->leaveOverlay();
 
 	// --> leave spovnet
@@ -177,5 +179,5 @@
 	//
 
-	logging_info("creating spovnet " + id.toString());
+	logging_info( "creating spovnet " + id.toString() << " with nodeid " << nodeId.toString() );
 
 	spovnetId = id;
@@ -502,6 +504,8 @@
 	if( i == linkMapping.end() ) return;
 
-	if( i->second.interface != NULL )
+	if( i->second.interface != NULL ){
 		i->second.interface->onLinkChanged( id, i->second.node );
+		// call onLinkQoSChanged?
+	}
 
 	i->second.markused();
@@ -537,8 +541,18 @@
 
 	// TODO: convert QoSParameterSet to the LinkProperties properties
-	if( i->second.interface != NULL )
-		i->second.interface->onLinkQoSChanged( id, i->second.node, LinkProperties::DEFAULT );
+	if( i->second.interface != NULL ){
+		// TODO: currently not in the interface: i->second.interface->onLinkQoSChanged( id, i->second.node, LinkProperties::DEFAULT );
+	}
 
 	i->second.markused();
+}
+
+bool BaseOverlay::onLinkRequest( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote ){
+
+	// also see in the receiveMessage function. there the higher layer service
+	// is asked whether to accept link requests, but there a basic link association is
+	// already built up, so we know the node id
+	logging_debug("received link request from " << remote->toString() << ", accepting");
+	return true;
 }
 
@@ -791,8 +805,20 @@
 
 		i->second.interface = iface;
-		iface->onLinkUp( link, sourcenode );
 		i->second.markused();
 
-		return true ;
+		//
+		// ask the service whether it wants to accept this link
+		//
+
+		if( iface->onLinkRequest(sourcenode) ){
+			iface->onLinkUp( link, sourcenode );
+		} else {
+			// prevent onLinkDown calls to the service
+			i->second.interface = NULL;
+			// drop the link
+			dropLink( link );
+		}
+
+		return true;
 
 	} // else if( overlayMsg->isType(OverlayMsg::OverlayMessageTypeUpdate) )
Index: source/ariba/overlay/BaseOverlay.h
===================================================================
--- source/ariba/overlay/BaseOverlay.h	(revision 3067)
+++ source/ariba/overlay/BaseOverlay.h	(revision 3071)
@@ -250,24 +250,32 @@
 
 	/**
-	 * TODO
+	 * @see ariba::communication::CommunicationEvents.h
 	 */
 	virtual void onLinkUp( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
 	/**
-	 * TODO
+	 * @see ariba::communication::CommunicationEvents.h
 	 */
 	virtual void onLinkDown( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
+	/**
+	 * @see ariba::communication::CommunicationEvents.h
+	 */
 	virtual void onLinkChanged( const LinkID& id, const NetworkLocator* oldlocal, const NetworkLocator* newlocal, const NetworkLocator* oldremote, const NetworkLocator* newremote );
 
 	/**
-	 * TODO
+	 * @see ariba::communication::CommunicationEvents.h
 	 */
 	virtual void onLinkFail( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
 	/**
-	 * TODO
+	 * @see ariba::communication::CommunicationEvents.h
 	 */
 	virtual void onLinkQoSChanged( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote, const QoSParameterSet& qos );
+
+	/**
+	 * @see ariba::communication::CommunicationEvents.h
+	 */
+	virtual bool onLinkRequest( const LinkID& id, const NetworkLocator* local, const NetworkLocator* remote );
 
 	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Index: source/ariba/utility/system/StartupWrapper.cpp
===================================================================
--- source/ariba/utility/system/StartupWrapper.cpp	(revision 3067)
+++ source/ariba/utility/system/StartupWrapper.cpp	(revision 3071)
@@ -103,5 +103,5 @@
 	{
 		log4cxx::LoggerPtr logger(log4cxx::Logger::getRootLogger());
-		logger->setLevel(log4cxx::Level::getInfo());
+		logger->setLevel(log4cxx::Level::getDebug());
 	}
 
