Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 5464)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 5481)
@@ -114,5 +114,5 @@
 
 /// find a proper relay node
-const NodeID BaseOverlay::findRelayNode( const NodeID& id ) {
+const NodeID BaseOverlay::findRelayNode( const NodeID id ) {
 	LinkDescriptor* rld = NULL;
 	NodeID relayNode = NodeID::UNSPECIFIED;
@@ -133,5 +133,18 @@
 		else relayNode = rld->remoteNode;
 	}
-	logging_force( "Potential relay node " << relayNode.toString() );
+
+	// if first relay is unknown choose a arbitrary direct node as relay
+	if ( relayNode.isUnspecified() ) {
+		for (size_t i=0; i<links.size(); i++)
+			if (links[i]->up &&
+				links[i]->communicationUp &&
+				!links[i]->relay &&
+				links[i]->keepAliveMissed <= 1 &&
+				links[i]->service == OverlayInterface::OVERLAY_SERVICE_ID) {
+				relayNode = links[i]->remoteNode;
+				break;
+			}
+	}
+
 	// do not return myself or use the node as relay node
 	if (relayNode == nodeId)
@@ -189,7 +202,23 @@
 }
 
+/// routes a message over the overlay or directly sends it when a link is open
+seqnum_t BaseOverlay::sendOverlay( Message* message, const NodeID& nodeid ) {
+	for (size_t i=0; i<links.size(); i++)
+		if ( links[i]->up &&
+		links[i]->communicationUp &&
+		!links[i]->relay &&
+		links[i]->keepAliveMissed <= 1 &&
+		links[i]->remoteNode == nodeid &&
+		links[i]->service == OverlayInterface::OVERLAY_SERVICE_ID) {
+			return sendMessage( message, links[i] );
+			break;
+		}
+	overlayInterface->routeMessage(nodeid, message);
+	return 0;
+}
+
 /// creates a link descriptor, apply relay semantics if possible
 LinkDescriptor* BaseOverlay::createLinkDescriptor(
-	const NodeID& remoteNode, const ServiceID& service, const LinkID& link_id ) {
+	const NodeID remoteNode, const ServiceID service, const LinkID link_id ) {
 
 	// find listener
@@ -1321,8 +1350,8 @@
 					if (relayMsg->getRelayNode() == nodeId || relayMsg->getRelayNode().isUnspecified()) {
 						logging_info("Routing relay message to " << relayMsg->getDestNode().toString() );
-						overlayInterface->routeMessage(relayMsg->getDestNode(), &_overMsg );
+						sendOverlay( &_overMsg, relayMsg->getDestNode() );
 					} else {
 						logging_info("Routing relay message to " << relayMsg->getRelayNode().toString() );
-						overlayInterface->routeMessage(relayMsg->getRelayNode(), &_overMsg );
+						sendOverlay( &_overMsg, relayMsg->getRelayNode() );
 					}
 					return true;
@@ -1354,5 +1383,5 @@
 
 						/// this must be handled by using relay link!
-						overlayInterface->routeMessage(relayMsg->getDestNode(), &_overMsg );
+						sendOverlay(&_overMsg, relayMsg->getDestNode());
 						return true;
 					}
Index: source/ariba/overlay/BaseOverlay.h
===================================================================
--- source/ariba/overlay/BaseOverlay.h	(revision 5464)
+++ source/ariba/overlay/BaseOverlay.h	(revision 5481)
@@ -415,12 +415,15 @@
 
 	/// find a proper relay node that is directly connected to this node
-	const NodeID findRelayNode( const NodeID& id );
+	const NodeID findRelayNode( const NodeID id );
 
 	/// forwards a message over relays/overlay/directly using link descriptor
 	seqnum_t sendMessage( Message* message, const LinkDescriptor* ld );
 
+	/// routes a message over the overlay or directly sends it when a link is open
+	seqnum_t sendOverlay( Message* message, const NodeID& nodeid );
+
 	/// creates a link descriptor, applys relay semantics if possible
 	LinkDescriptor* createLinkDescriptor(
-		const NodeID& remoteNode, const ServiceID& service, const LinkID& link_id );
+		const NodeID remoteNode, const ServiceID service, const LinkID link_id );
 
 	// map of a link request map a nonce to a LinkID
