Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 5284)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 5316)
@@ -245,6 +245,6 @@
 BaseOverlay::BaseOverlay() :
 	bc(NULL), overlayInterface(NULL), nodeId(NodeID::UNSPECIFIED),
-	spovnetId(SpoVNetID::UNSPECIFIED), initiatorLink(LinkID::UNSPECIFIED),
-	state(BaseOverlayStateInvalid), sideport(&SideportListener::DEFAULT) {
+	spovnetId(SpoVNetID::UNSPECIFIED), state(BaseOverlayStateInvalid),
+	sideport(&SideportListener::DEFAULT), started(false) {
 }
 
@@ -268,4 +268,7 @@
 	Timer::setInterval( 500 );
 	Timer::start();
+
+	started = true;
+	state = BaseOverlayStateInvalid;
 }
 
@@ -285,4 +288,11 @@
 	bc->unregisterMessageReceiver( this );
 	bc->unregisterEventListener( this );
+
+	started = false;
+	state = BaseOverlayStateInvalid;
+}
+
+bool BaseOverlay::isStarted(){
+	return started;
 }
 
@@ -292,16 +302,40 @@
 		const EndpointDescriptor& bootstrapEp) {
 
-	ovl.visShowNodeBubble ( ovlId, nodeId, "joining..." );
+	if(id != spovnetId){
+		logging_error("attempt to join against invalid spovnet, call initiate first");
+		return;
+	}
+
+
+	//ovl.visShowNodeBubble ( ovlId, nodeId, "joining..." );
 	logging_info( "Starting to join spovnet " << id.toString() <<
 			" with nodeid " << nodeId.toString());
 
-	// contact the spovnet initiator and request to join. if the join is granted we will
-	// receive further information on the structure of the overlay that is used in the spovnet
-	// but first, we have to establish a link to the initiator...
-	spovnetId = id;
-	state = BaseOverlayStateJoinInitiated;
-
-	initiatorLink = bc->establishLink( bootstrapEp );
-	logging_info("join process initiated for " << id.toString() << "...");
+	if(bootstrapEp == EndpointDescriptor::UNSPECIFIED && state == BaseOverlayStateInvalid){
+
+		// bootstrap against ourselfs
+		logging_debug("joining spovnet locally");
+
+		overlayInterface->joinOverlay();
+		state = BaseOverlayStateCompleted;
+		BOOST_FOREACH( NodeListener* i, nodeListeners )
+			i->onJoinCompleted( spovnetId );
+
+		//ovl.visChangeNodeIcon ( ovlId, nodeId, OvlVis::ICON_ID_CAMERA );
+		//ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN );
+
+		logging_debug("starting overlay bootstrap module");
+		overlayBootstrap.start(this, spovnetId, nodeId);
+		overlayBootstrap.publish(bc->getEndpointDescriptor());
+
+	} else {
+
+		// bootstrap against another node
+		logging_debug("joining spovnet remotely against " << bootstrapEp.toString());
+
+		const LinkID& lnk = bc->establishLink( bootstrapEp );
+		bootstrapLinks.push_back(lnk);
+		logging_info("join process initiated for " << id.toString() << "...");
+	}
 }
 
@@ -310,4 +344,8 @@
 	logging_info( "Leaving spovnet " << spovnetId );
 	bool ret = ( state != this->BaseOverlayStateInvalid );
+
+	logging_debug("stopping overlay bootstrap module");
+	overlayBootstrap.stop();
+	overlayBootstrap.revoke();
 
 	logging_debug( "Dropping all auto-links" );
@@ -329,18 +367,11 @@
 		overlayInterface->leaveOverlay();
 
-	// leave spovnet
-	if( state != BaseOverlayStateInitiator ) {
-		// then, leave the spovnet baseoverlay
-		OverlayMsg overMsg( OverlayMsg::typeBye, nodeId );
-		bc->sendMessage( initiatorLink, &overMsg );
-
-		// drop the link and set to correct state
-		bc->dropLink( initiatorLink );
-		initiatorLink = LinkID::UNSPECIFIED;
-	}
+	// drop still open bootstrap links
+	BOOST_FOREACH( LinkID lnk, bootstrapLinks )
+		bc->dropLink( lnk );
 
 	// change to inalid state
 	state = BaseOverlayStateInvalid;
-	ovl.visShutdown( ovlId, nodeId, string("") );
+	//ovl.visShutdown( ovlId, nodeId, string("") );
 
 	// inform all registered services of the event
@@ -362,5 +393,4 @@
 
 	spovnetId = id;
-	state = BaseOverlayStateInitiator;
 
 	overlayInterface = OverlayFactory::create( *this, param, nodeId, this );
@@ -368,14 +398,10 @@
 		logging_fatal( "overlay structure not supported" );
 		state = BaseOverlayStateInvalid;
+
+		BOOST_FOREACH( NodeListener* i, nodeListeners )
+			i->onJoinFailed( spovnetId );
+
 		return;
 	}
-
-	// bootstrap against ourselfs
-	overlayInterface->joinOverlay();
-	BOOST_FOREACH( NodeListener* i, nodeListeners )
-		i->onJoinCompleted( spovnetId );
-
-	ovl.visChangeNodeIcon ( ovlId, nodeId, OvlVis::ICON_ID_CAMERA );
-	ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN );
 }
 
@@ -695,6 +721,6 @@
 	LinkDescriptor* ld = getDescriptor(id, true);
 
-	// handle initiator link
-	if(state == BaseOverlayStateJoinInitiated && id == initiatorLink) {
+	// handle bootstrap link we initiated
+	if( std::find(bootstrapLinks.begin(), bootstrapLinks.end(), id) != bootstrapLinks.end() ){
 		logging_info(
 			"Join has been initiated by me and the link is now up. " <<
@@ -759,4 +785,8 @@
 	const address_v* local, const address_v* remote) {
 
+	// erase bootstrap links
+	vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), id );
+	if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
+
 	// get descriptor for link
 	LinkDescriptor* ld = getDescriptor(id, true);
@@ -800,4 +830,8 @@
 	const address_v* local, const address_v* remote) {
 	logging_debug( "Link fail with base communication link id=" << id );
+
+	// erase bootstrap links
+	vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), id );
+	if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
 
 	// get descriptor for link
@@ -927,5 +961,4 @@
 			logging_debug("received join reply message");
 			JoinReply* replyMsg = overlayMsg->decapsulate<JoinReply>();
-			assert(state == BaseOverlayStateJoinInitiated);
 
 			// correct spovnet?
@@ -942,11 +975,18 @@
 
 				// drop initiator link
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
+
+				if(bcLink != LinkID::UNSPECIFIED){
+					bc->dropLink( bcLink );
+
+					vector<LinkID>::iterator it = std::find(
+							bootstrapLinks.begin(), bootstrapLinks.end(), bcLink);
+					if( it != bootstrapLinks.end() )
+						bootstrapLinks.erase(it);
+				}
 
 				// inform all registered services of the event
 				BOOST_FOREACH( NodeListener* i, nodeListeners )
 					i->onJoinFailed( spovnetId );
+
 				return true;
 			}
@@ -956,36 +996,59 @@
 					spovnetId.toString() );
 
+			logging_debug( "Using bootstrap end-point "
+				<< replyMsg->getBootstrapEndpoint().toString() );
+
+			//
 			// create overlay structure from spovnet parameter set
-			overlayInterface = OverlayFactory::create(
-				*this, replyMsg->getParam(), nodeId, this );
-
-			// overlay structure supported? no-> fail!
-			if( overlayInterface == NULL ) {
-				logging_error( "overlay structure not supported" );
-
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
+			// if we have not boostrapped yet against some other node
+			//
+
+			if( overlayInterface == NULL ){
+
+				logging_debug("first-time bootstrapping");
+
+				overlayInterface = OverlayFactory::create(
+					*this, replyMsg->getParam(), nodeId, this );
+
+				// overlay structure supported? no-> fail!
+				if( overlayInterface == NULL ) {
+					logging_error( "overlay structure not supported" );
+
+					if(bcLink != LinkID::UNSPECIFIED){
+						bc->dropLink( bcLink );
+
+						vector<LinkID>::iterator it = std::find(
+								bootstrapLinks.begin(), bootstrapLinks.end(), bcLink);
+						if( it != bootstrapLinks.end() )
+							bootstrapLinks.erase(it);
+					}
+
+					// inform all registered services of the event
+					BOOST_FOREACH( NodeListener* i, nodeListeners )
+					i->onJoinFailed( spovnetId );
+
+					return true;
+				}
+
+				// everything ok-> join the overlay!
+				state = BaseOverlayStateCompleted;
+				overlayInterface->createOverlay();
+
+				overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
+
+				// update ovlvis
+				//ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN);
 
 				// inform all registered services of the event
 				BOOST_FOREACH( NodeListener* i, nodeListeners )
-				i->onJoinFailed( spovnetId );
-
-				return true;
-			}
-
-			// everything ok-> join the overlay!
-			state = BaseOverlayStateCompleted;
-			overlayInterface->createOverlay();
-			logging_debug( "Using bootstrap end-point "
-				<< replyMsg->getBootstrapEndpoint().toString() );
-			overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
-
-			// update ovlvis
-			ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN);
-
-			// inform all registered services of the event
-			BOOST_FOREACH( NodeListener* i, nodeListeners )
-				i->onJoinCompleted( spovnetId );
+					i->onJoinCompleted( spovnetId );
+
+			} else {
+
+				// this is not the first bootstrap, just join the additional node
+				logging_debug("not first-time bootstrapping");
+				overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
+
+			} // if( overlayInterface == NULL )
 
 			return true;
@@ -1103,41 +1166,9 @@
 
 		// ---------------------------------------------------------------------
-		// handle bye messages
-		// ---------------------------------------------------------------------
-		case OverlayMsg::typeBye: {
-			logging_debug( "received bye message from " <<
-					overlayMsg->getSourceNode().toString() );
-
-			/* if we are the initiator and receive a bye from a node
-			 * the node just left. if we are a node and receive a bye
-			 * from the initiator, we have to close, too.
-			 */
-			if( overlayMsg->getSourceNode() == spovnetInitiator ) {
-
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
-
-				logging_fatal( "initiator ended spovnet" );
-
-				// inform all registered services of the event
-				BOOST_FOREACH( NodeListener* i, nodeListeners )
-					i->onLeaveFailed( spovnetId );
-
-			} else {
-				// a node that said goodbye and we are the initiator don't have to
-				// do much here, as the node also will go out of the overlay
-				// structure
-				logging_info( "node left " << overlayMsg->getSourceNode() );
-			}
-
-			return true;
-
-		}
-
-		// ---------------------------------------------------------------------
 		// handle link request forwarded through the overlay
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeLinkRequest: {
+
+			logging_debug( "received link request on link" );
 
 			// decapsulate message
@@ -1261,4 +1292,6 @@
 		case OverlayMsg::typeRelay: {
 
+			logging_debug( "received relay request on link" );
+
 			// decapsulate message
 			RelayMessage* relayMsg = overlayMsg->decapsulate<RelayMessage>();
@@ -1347,4 +1380,7 @@
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeKeepAlive: {
+
+			logging_debug( "received keep-alive on link" );
+
 			if ( ld != NULL ) {
 				//logging_force("Keep-Alive for "<< ld->overlayId);
@@ -1358,4 +1394,7 @@
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeDirectLink: {
+
+			logging_debug( "received direct link replacement request" );
+
 			LinkDescriptor* rld = getDescriptor( overlayMsg->getRelayLink() );
 			logging_force( "Received direct link convert notification for " << rld );
@@ -1380,4 +1419,5 @@
 
 	} /* switch */
+
 	return false;
 }
@@ -1398,7 +1438,7 @@
 }
 
-vector<NodeID> BaseOverlay::getOverlayNeighbors() const {
+vector<NodeID> BaseOverlay::getOverlayNeighbors(bool deep) const {
 	// the known nodes _can_ also include our node, so we remove ourself
-	vector<NodeID> nodes = overlayInterface->getKnownNodes();
+	vector<NodeID> nodes = overlayInterface->getKnownNodes(deep);
 	vector<NodeID>::iterator i = find( nodes.begin(), nodes.end(), this->nodeId );
 	if( i != nodes.end() ) nodes.erase( i );
@@ -1499,5 +1539,9 @@
 	// drop links
 	BOOST_FOREACH( const LinkDescriptor* ld, oldlinks ) {
-		if (!ld->communicationId.isUnspecified() && ld->communicationId == initiatorLink) {
+
+		vector<LinkID>::iterator it = std::find(
+				bootstrapLinks.begin(), bootstrapLinks.end(), ld->communicationId);
+
+		if (!ld->communicationId.isUnspecified() && it != bootstrapLinks.end() ){
 			logging_force( "Not dropping initiator link: " << ld );
 			continue;
Index: source/ariba/overlay/BaseOverlay.h
===================================================================
--- source/ariba/overlay/BaseOverlay.h	(revision 5284)
+++ source/ariba/overlay/BaseOverlay.h	(revision 5316)
@@ -112,6 +112,6 @@
 using ariba::utility::OvlVis;
 
-#define ovl OvlVis::instance()
-#define ovlId OvlVis::NETWORK_ID_BASE_OVERLAY
+//#define ovl OvlVis::instance()
+//#define ovlId OvlVis::NETWORK_ID_BASE_OVERLAY
 
 namespace ariba {
@@ -156,4 +156,9 @@
 
 	/**
+	 * Is the BaseOverlay instance started up yet
+	 */
+	bool isStarted();
+
+	/**
 	 * Starts a link establishment procedure to the specfied node
 	 * for the service with id service
@@ -211,5 +216,5 @@
 	 * @return A list of overlay neighbors.
 	 */
-	vector<NodeID> getOverlayNeighbors() const;
+	vector<NodeID> getOverlayNeighbors(bool deep = true) const;
 
 	/**
@@ -264,5 +269,5 @@
 	 * @param boot A bootstrap node
 	 */
-	void joinSpoVNet(const SpoVNetID& id, const EndpointDescriptor& boot);
+	void joinSpoVNet(const SpoVNetID& id, const EndpointDescriptor& boot = EndpointDescriptor::UNSPECIFIED);
 
 	/**
@@ -365,15 +370,13 @@
 	typedef enum _BaseOverlayState {
 		BaseOverlayStateInvalid = 0,
-		BaseOverlayStateInitiator = 1,
-		BaseOverlayStateJoinInitiated = 2,
-		BaseOverlayStateCompleted = 3,
+		BaseOverlayStateCompleted = 1,
 	} BaseOverlayState;
 
-	BaseOverlayState state; ///< Current Base-Overlay state
-	BaseCommunication* bc;  ///< reference to the base communication
-	NodeID nodeId;          ///< the node id of this node
-	SpoVNetID spovnetId;    ///< the spovnet id of the currently joined overlay
-	LinkID initiatorLink;   ///< the link id of the link to the initiator node
-	NodeID spovnetInitiator;///< The initiator node
+	BaseOverlayState state;          ///< Current Base-Overlay state
+	BaseCommunication* bc;           ///< reference to the base communication
+	NodeID nodeId;                   ///< the node id of this node
+	SpoVNetID spovnetId;             ///< the spovnet id of the currently joined overlay
+	vector<LinkID> bootstrapLinks;   ///< the link id of the link to the initiator node
+	NodeID spovnetInitiator;         ///< The initiator node
 
 	/// the service id communication listeners
@@ -440,4 +443,7 @@
 	 */
 	OverlayBootstrap overlayBootstrap;
+
+	/// is the base overlay started yet
+	bool started;
 };
 
Index: source/ariba/overlay/OverlayBootstrap.cpp
===================================================================
--- source/ariba/overlay/OverlayBootstrap.cpp	(revision 5284)
+++ source/ariba/overlay/OverlayBootstrap.cpp	(revision 5316)
@@ -61,6 +61,9 @@
 	nodeid = _nodeid;
 
+	logging_info("starting overlay bootstrap");
+
 	manager.registerCallback( this );
-	//manager.registerModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	manager.registerModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	//manager.registerModule( BootstrapManager::BootstrapTypeBluetoothSdp );
 }
 
@@ -70,6 +73,9 @@
 	nodeid = NodeID::UNSPECIFIED;
 
+	logging_info("stopping overlay bootstrap");
+
 	manager.unregisterCallback( this );
-	//manager.unregisterModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	manager.unregisterModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	//manager.unregisterModule( BootstrapManager::BootstrapTypeBluetoothSdp );
 }
 
@@ -83,5 +89,5 @@
 	// tell the base overlay to join using this endpoint
 	assert( overlay != NULL );
-	// TODO: overlay->joinSpoVNet( spovnetid, data->endpoint );
+	overlay->joinSpoVNet( spovnetid, data->endpoint );
 
 	delete data;
Index: source/ariba/overlay/messages/OverlayMsg.h
===================================================================
--- source/ariba/overlay/messages/OverlayMsg.h	(revision 5284)
+++ source/ariba/overlay/messages/OverlayMsg.h	(revision 5316)
@@ -70,9 +70,8 @@
 		typeJoinReply = 3, ///< join reply
 		typeUpdate = 4, ///< update message for link association
-		typeBye = 5, ///< leave (no encapsulated messages)
-		typeLinkRequest = 6, ///< link request (sent over the overlay)
-		typeRelay = 7, ///< relay message
-		typeKeepAlive = 8, ///< a keep-alive message
-		typeDirectLink = 9,
+		typeLinkRequest = 5, ///< link request (sent over the overlay)
+		typeRelay = 6, ///< relay message
+		typeKeepAlive = 7, ///< a keep-alive message
+		typeDirectLink = 8,
 	///< a direct connection has been established
 	};
Index: source/ariba/overlay/modules/OverlayInterface.h
===================================================================
--- source/ariba/overlay/modules/OverlayInterface.h	(revision 5284)
+++ source/ariba/overlay/modules/OverlayInterface.h	(revision 5316)
@@ -149,5 +149,5 @@
 	 * @return The list of all known nodes
 	 */
-	virtual NodeList getKnownNodes() const = 0;
+	virtual NodeList getKnownNodes(bool deep = true) const = 0;
 
 	/**
Index: source/ariba/overlay/modules/chord/Chord.cpp
===================================================================
--- source/ariba/overlay/modules/chord/Chord.cpp	(revision 5284)
+++ source/ariba/overlay/modules/chord/Chord.cpp	(revision 5316)
@@ -61,5 +61,4 @@
 	stabilize_counter = 0;
 	stabilize_finger = 0;
-	bootstrapLink = LinkID::UNSPECIFIED;
 }
 
@@ -112,10 +111,9 @@
 void Chord::joinOverlay(const EndpointDescriptor& boot) {
 	logging_info( "joining Chord overlay structure through end-point " <<
-			(boot == EndpointDescriptor::UNSPECIFIED ?
-					"local" : boot.toString()) );
+			(boot.isUnspecified() ? "local" : boot.toString()) );
 
 	// initiator? no->setup first link
-	if (!(boot == EndpointDescriptor::UNSPECIFIED))
-		bootstrapLink = setup(boot);
+	if (!boot.isUnspecified())
+		bootstrapLinks.push_back( setup(boot) );
 
 	// timer for stabilization management
@@ -176,10 +174,23 @@
 }
 
-OverlayInterface::NodeList Chord::getKnownNodes() const {
+OverlayInterface::NodeList Chord::getKnownNodes(bool deep) const {
 	OverlayInterface::NodeList nodelist;
-	for (size_t i = 0; i < table->size(); i++)
-		if ((*table)[i]->ref_count != 0
-				&& !(*table)[i]->info.isUnspecified())
-			nodelist.push_back((*table)[i]->id);
+
+	if( deep ){
+		// all nodes that I know, fingers, succ/pred
+		for (size_t i = 0; i < table->size(); i++){
+			if ((*table)[i]->ref_count != 0
+					&& !(*table)[i]->info.isUnspecified())
+				nodelist.push_back((*table)[i]->id);
+		}
+	} else {
+		// only succ and pred
+		if( table->get_predesessor() != NULL )
+			nodelist.push_back( *(table->get_predesessor()) );
+
+		if( table->get_successor() != NULL )
+					nodelist.push_back( *(table->get_successor()) );
+	}
+
 	return nodelist;
 }
@@ -208,7 +219,8 @@
 	}
 
-	if (!bootstrapLink.isUnspecified() && lnk == bootstrapLink) {
+	vector<LinkID>::iterator it = std::find(bootstrapLinks.begin(), bootstrapLinks.end(), lnk);
+	if( it != bootstrapLinks.end() ) {
 		send_discovery_to(nodeid);
-		bootstrapLink = LinkID::UNSPECIFIED;
+		bootstrapLinks.erase( it );
 	}
 }
Index: source/ariba/overlay/modules/chord/Chord.h
===================================================================
--- source/ariba/overlay/modules/chord/Chord.h	(revision 5284)
+++ source/ariba/overlay/modules/chord/Chord.h	(revision 5316)
@@ -76,5 +76,5 @@
 	int stabilize_counter;
 	int stabilize_finger;
-	LinkID bootstrapLink;
+	vector<LinkID> bootstrapLinks;
 	vector<NodeID> pending;
 
@@ -120,5 +120,5 @@
 
 	/// @see OverlayInterface.h
-	virtual NodeList getKnownNodes() const;
+	virtual NodeList getKnownNodes(bool deep = true) const;
 
 	/// @see CommunicationListener.h or @see OverlayInterface.h
Index: source/ariba/overlay/modules/onehop/OneHop.cpp
===================================================================
--- source/ariba/overlay/modules/onehop/OneHop.cpp	(revision 5284)
+++ source/ariba/overlay/modules/onehop/OneHop.cpp	(revision 5316)
@@ -52,7 +52,5 @@
 		OverlayStructureEvents* _eventsReceiver, const OverlayParameterSet& param)
 	: 	OverlayInterface( _baseoverlay, _nodeid, _eventsReceiver, param ),
-		state		( OneHopStateInvalid ),
-		bootstrapLink	( LinkID::UNSPECIFIED ),
-		pendingLinks	( 0 ) {
+		state( OneHopStateInvalid ) {
 
 	//
@@ -88,4 +86,9 @@
 	logging_debug( "routing message to node " << destnode.toString() );
 
+	// msg for ourselfs
+	if(destnode == nodeid)
+		baseoverlay.incomingRouteMessage( msg, LinkID::UNSPECIFIED, nodeid );
+
+	// msg for other node
 	OverlayNodeMapping::const_iterator i = overlayNodes.find( destnode );
 	if (i == overlayNodes.end()) {
@@ -116,5 +119,4 @@
 	// the create and join process is completed now.
 	logging_info( "creating onehop overlay structure" );
-	state = OneHopStateCompleted;
 }
 
@@ -123,8 +125,7 @@
 	logging_info( "deleting onehop overlay structure" );
 	state = OneHopStateInvalid;
-	pendingLinks = 0;
-}
-
-OverlayInterface::NodeList OneHop::getKnownNodes() const {
+}
+
+OverlayInterface::NodeList OneHop::getKnownNodes(bool deep) const {
 
 	OverlayInterface::NodeList retlist;
@@ -142,11 +143,7 @@
 
 	logging_info( "joining onehop overlay structure through end-point " <<
-			(bootstrapEp == EndpointDescriptor::UNSPECIFIED ?
-					"local" : bootstrapEp.toString()) );
-
-	state = OneHopStateJoinInitiated;
-	pendingLinks = 0;
-
-	if( bootstrapEp == EndpointDescriptor::UNSPECIFIED ){
+			(bootstrapEp.isUnspecified() ? "local" : bootstrapEp.toString()) );
+
+	if( bootstrapEp.isUnspecified() ){
 
 		// we are the initiator and we are to bootstrap against
@@ -156,6 +153,8 @@
 		state = OneHopStateCompleted;
 	} else {
-		bootstrapLink = baseoverlay.establishLink( bootstrapEp,
-					OverlayInterface::OVERLAY_SERVICE_ID );
+		bootstrapLinks.push_back(
+				baseoverlay.establishLink( bootstrapEp,
+					OverlayInterface::OVERLAY_SERVICE_ID )
+					);
 	}
 }
@@ -187,6 +186,4 @@
 		}
 	}
-
-	pendingLinks = 0;
 }
 
@@ -210,17 +207,10 @@
 		}
 	}
+
+	vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), lnk );
+	if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
 }
 
 void OneHop::onLinkUp(const LinkID& lnk, const NodeID& remote){
-
-	//
-	// as soon as a link goes up, we always request the node listing.
-	// and try to get connections to as much nodes as possible in a greedy way.
-	//
-
-	if( lnk != bootstrapLink ){
-		if( pendingLinks > 0 )  pendingLinks--;
-		if( pendingLinks == 0 ) state = OneHopStateCompleted;
-	}
 
 	logging_debug( "link is up, sending out node listing request" );
@@ -230,5 +220,4 @@
 	onemsg.encapsulate( &requestmsg );
 
-	state = OneHopStateJoinListingRequested;
 	baseoverlay.sendMessage( &onemsg, lnk );
 }
@@ -309,5 +298,4 @@
 		const NodeListingReply::NodeEndpointList& endpoints = reply->getList();
 		logging_debug( "received " << endpoints.size() << " nodes in listing" );
-		pendingLinks = 0;
 
 		NodeListingReply::NodeEndpointList::const_iterator i = endpoints.begin();
@@ -330,5 +318,4 @@
 
 			overlayNodes.insert( make_pair(node, link) );
-			pendingLinks++;
 
 		} // for( ; i != iend; i++ )
@@ -356,5 +343,5 @@
 	if( onemsg->isType( OneHopMessage::OneHopMessageTypeRoute) ){
 		logging_debug( "Route message arrived at destination node -> delegate to BaseOverlay" );
-		baseoverlay.incomingRouteMessage( onemsg );
+		baseoverlay.incomingRouteMessage( onemsg, lnk, remote);
 	} // OneHopMessageTypeRoute
 
Index: source/ariba/overlay/modules/onehop/OneHop.h
===================================================================
--- source/ariba/overlay/modules/onehop/OneHop.h	(revision 5284)
+++ source/ariba/overlay/modules/onehop/OneHop.h	(revision 5316)
@@ -90,5 +90,5 @@
 
 	/// @see OverlayInterface.h
-	virtual NodeList getKnownNodes() const;
+	virtual NodeList getKnownNodes(bool deep = true) const;
 
 	/// @see CommunicationListener.h or @see OverlayInterface.h
@@ -110,12 +110,9 @@
 	typedef enum _OneHopState {
 		OneHopStateInvalid = 0,
-		OneHopStateJoinInitiated = 1,
-		OneHopStateJoinListingRequested = 2,
-		OneHopStateCompleted = 3,
+		OneHopStateCompleted = 1,
 	} OneHopState;
 
 	OneHopState state;
-	uint16_t pendingLinks;
-	LinkID bootstrapLink;
+	vector<LinkID> bootstrapLinks;
 };
 
