Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 5901)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 5902)
@@ -132,5 +132,4 @@
 		OverlayMsg msg( OverlayMsg::typeLinkAlive,
 			OverlayInterface::OVERLAY_SERVICE_ID, nodeId, ld->remoteNode );
-		msg.setRelayed(true);
 		if (ld->relayed) msg.setRouteRecord(true);
 		send_link( &msg, ld->overlayId );
@@ -235,9 +234,12 @@
 	// exceeded time-to-live? yes-> drop message
 	if (message->getNumHops() > message->getTimeToLive()) {
-		logging_warn("Message exceeded TTL -> drop message!");
+		logging_warn("Message exceeded TTL. Dropping message and relay routes"
+				"for recovery.");
+		relay_routes.clear();
 		return;
+	}
 
 	// no-> forward message
-	} else {
+	else {
 		// destinastion myself? yes-> handle message
 		if (message->getDestinationNode() == nodeId) {
@@ -269,27 +271,39 @@
 	}
 
-	// relay path known? yes-> send over relay link
-	next_link = getRelayLinkTo( destination );
-	if (next_link != NULL) {
-		if (message->isRelayed()) next_link->setRelaying();
-		return send(message, next_link);
-	}
-
-	// no-> relay path! route over overlay path
-	LinkID next_id = overlayInterface->getNextLinkId( destination );
-	if (next_id.isUnspecified()) {
-		logging_error("Could not send message. No next hop found to " << destination );
-		return -1;
-	}
-
-	// get link descriptor, up and running? yes-> send message
-	next_link = getDescriptor(next_id);
-	if (next_link != NULL && next_link->up)
-		return send(message, next_link);
-
-	// no-> error, dropping message
+	// use relay path?
+	if (message->isRelayed()) {
+		next_link = getRelayLinkTo( destination );
+		if (next_link != NULL) {
+			next_link->setRelaying();
+			return bc->sendMessage(next_link->communicationId, message);
+		} else {
+			logging_error("Could not send message. No relay hop found to "
+					<< destination)
+			return -1;
+		}
+	}
+
+	// routed message
 	else {
-		logging_error("Could not send message. Link not known or up");
-		return -1;
+		// no-> relay path! route over overlay path
+		LinkID next_id = overlayInterface->getNextLinkId( destination );
+		if (next_id.isUnspecified()) {
+			logging_error("Could not send message. No next hop found to " <<
+				destination );
+			return -1;
+		}
+
+		// get link descriptor, up and running? yes-> send message
+		next_link = getDescriptor(next_id);
+		if (next_link != NULL && next_link->up) {
+			// send message over relayed link
+			return send(message, next_link);
+		}
+
+		// no-> error, dropping message
+		else {
+			logging_error("Could not send message. Link not known or up");
+			return -1;
+		}
 	}
 
@@ -317,6 +331,7 @@
 		logging_debug("Resolving direct link for relayed link to "
 			<< ldr->remoteNode);
-		message->setRelayed();
-		return send(message, ldr->remoteNode);
+		ld = getRelayLinkTo( ldr->remoteNode );
+		ld->setRelaying();
+		message->setRelayed(true);
 	} else
 		ld = ldr;
@@ -355,4 +370,5 @@
 
 	message->setService(ld->service);
+	message->setRelayed(ld->relayed);
 	return send( message, ld, ignore_down );
 }
@@ -401,42 +417,55 @@
 	if (ld == NULL
 		|| ld->relayed
-		|| !message->isRelayed()
-//		|| !(message->getService() == OverlayInterface::OVERLAY_SERVICE_ID)
 		|| message->getSourceNode()==nodeId ) return;
 
-	// check wheter this node is already part of the routing table
-	LinkID next_link = overlayInterface->getNextLinkId(message->getSourceNode());
-	if (next_link == ld->overlayId) return;
-	ld->setRelaying();
-
-	// try to find source node
-	BOOST_FOREACH( relay_route& route, relay_routes ) {
-
-		// relay route found? yes->
-		if ( route.node == message->getSourceNode() ) {
-
-			// refresh timer
-			route.used = time(NULL);
-
-			// route has a shorter hop count? yes-> replace
-			if (route.hops > message->getNumHops() ) {
-				logging_info("Updating relay information to node "
-					<< route.node.toString()
-					<< " reducing to " << message->getNumHops() << " hops.");
-				route.hops = message->getNumHops();
-				route.link = ld->overlayId;
+	// update usage information
+	if (message->isRelayed()) {
+		// try to find source node
+		BOOST_FOREACH( relay_route& route, relay_routes ) {
+			// relay route found? yes->
+			if ( route.node == message->getDestinationNode() ) {
+				ld->setRelaying();
+				route.used = time(NULL);
 			}
-			return;
-		}
-	}
-
-	// not found-> add new entry
-	relay_route route;
-	route.hops = message->getNumHops();
-	route.link = ld->overlayId;
-	route.node = message->getSourceNode();
-	route.used = time(NULL);
-	logging_info("Remembering relay information to node " << route.node.toString());
-	relay_routes.push_back(route);
+		}
+
+	}
+
+	// register relay path
+	if (message->isRegisterRelay()) {
+		// set relaying
+		ld->setRelaying();
+
+		// try to find source node
+		BOOST_FOREACH( relay_route& route, relay_routes ) {
+
+			// relay route found? yes->
+			if ( route.node == message->getSourceNode() ) {
+
+				// refresh timer
+				route.used = time(NULL);
+
+				// route has a shorter hop count? yes-> replace
+				if (route.hops > message->getNumHops() ) {
+					logging_info("Updating relay information to node "
+						<< route.node.toString()
+						<< " reducing to " << message->getNumHops() << " hops.");
+					route.hops = message->getNumHops();
+					route.link = ld->overlayId;
+				}
+				return;
+			}
+		}
+
+		// not found-> add new entry
+		relay_route route;
+		route.hops = message->getNumHops();
+		route.link = ld->overlayId;
+		route.node = message->getSourceNode();
+		route.used = time(NULL);
+		logging_info("Remembering relay information to node "
+			<< route.node.toString());
+		relay_routes.push_back(route);
+	}
 }
 
@@ -447,5 +476,5 @@
 		if (route.node == remote ) {
 			LinkDescriptor* ld = getDescriptor( route.link );
-			if (ld==NULL || !ld->up) return NULL; else {
+			if (ld==NULL || !ld->up || !ld->communicationUp) return NULL; else {
 				route.used = time(NULL);
 				return ld;
Index: source/ariba/overlay/messages/OverlayMsg.h
===================================================================
--- source/ariba/overlay/messages/OverlayMsg.h	(revision 5901)
+++ source/ariba/overlay/messages/OverlayMsg.h	(revision 5902)
@@ -147,10 +147,18 @@
 	}
 
+	bool isRegisterRelay() const {
+		return (flags & 0x02)!=0;
+	}
+
+	void setRegisterRelay( bool relayed = true ) {
+		if (relayed) flags |= 0x02; else flags &= ~0x02;
+	}
+
 	bool isRouteRecord() const {
-		return (flags & 0x02)!=0;
+		return (flags & 0x04)!=0;
 	}
 
 	void setRouteRecord( bool route_record = true ) {
-		if (route_record) flags |= 0x02; else flags &= ~0x02;
+		if (route_record) flags |= 0x04; else flags &= ~0x04;
 	}
 
Index: source/ariba/overlay/modules/chord/Chord.cpp
===================================================================
--- source/ariba/overlay/modules/chord/Chord.cpp	(revision 5901)
+++ source/ariba/overlay/modules/chord/Chord.cpp	(revision 5902)
@@ -104,5 +104,4 @@
 seqnum_t Chord::send( OverlayMsg* msg, const LinkID& link ) {
 	if (link.isUnspecified()) return 0;
-	msg->setRelayed(true);
 	return baseoverlay.send_link( msg, link );
 }
@@ -116,5 +115,5 @@
 
 	OverlayMsg msg( typeDiscovery );
-	msg.setRelayed(true);
+	msg.setRegisterRelay(true);
 	Discovery dmsg( Discovery::normal, (uint8_t)ttl, baseoverlay.getEndpointDescriptor() );
 	msg.encapsulate(&dmsg);
@@ -129,5 +128,5 @@
 		// send predecessor discovery
 		OverlayMsg msg( typeDiscovery );
-		msg.setRelayed(true);
+		msg.setRegisterRelay(true);
 		Discovery dmsg( Discovery::predecessor, ttl,
 			baseoverlay.getEndpointDescriptor() );
@@ -139,5 +138,5 @@
 		OverlayMsg msg( typeDiscovery );
 		msg.setSourceEndpoint( baseoverlay.getEndpointDescriptor() );
-		msg.setRelayed(true);
+		msg.setRegisterRelay(true);
 		Discovery dmsg( Discovery::successor, ttl,
 			baseoverlay.getEndpointDescriptor() );
@@ -354,5 +353,4 @@
 				omsg.encapsulate(dmsg);
 				omsg.setService(OverlayInterface::OVERLAY_SERVICE_ID);
-				omsg.setRelayed(true);
 				baseoverlay.send(&omsg, omsg.getDestinationNode());
 				break;
@@ -382,5 +380,4 @@
 			omsg.setDestinationNode(item->id);
 			omsg.setService(OverlayInterface::OVERLAY_SERVICE_ID);
-			omsg.setRelayed(true);
 			baseoverlay.send(&omsg, omsg.getDestinationNode());
 			break;
Index: source/ariba/overlay/modules/chord/detail/chord_routing_table.hpp
===================================================================
--- source/ariba/overlay/modules/chord/detail/chord_routing_table.hpp	(revision 5901)
+++ source/ariba/overlay/modules/chord/detail/chord_routing_table.hpp	(revision 5902)
@@ -267,4 +267,6 @@
 			}
 		}
+		if (best_item != NULL && distance(value, id)<distance(value, best_item->id))
+			return NULL;
 		return best_item;
 	}
