Index: source/ariba/overlay/modules/OverlayInterface.h
===================================================================
--- source/ariba/overlay/modules/OverlayInterface.h	(revision 5151)
+++ 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 5151)
+++ 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 5151)
+++ 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 5151)
+++ 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 5151)
+++ 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;
 };
 
