Index: /source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- /source/ariba/overlay/BaseOverlay.cpp	(revision 5882)
+++ /source/ariba/overlay/BaseOverlay.cpp	(revision 5883)
@@ -360,4 +360,6 @@
 		if (ld==NULL
 			|| !ld->up
+			|| ld->keepAliveMissed != 0
+			|| !ld->communicationUp
 			|| difftime(route.used, time(NULL)) > 4) {
 			logging_info("Forgetting relay information to node "
@@ -398,5 +400,4 @@
 	LinkID next_link = overlayInterface->getNextLinkId(message->getSourceNode());
 	if (next_link == ld->overlayId) return;
-	ld->setRelaying();
 
 	// try to find source node
@@ -437,5 +438,8 @@
 		if (route.node == remote ) {
 			LinkDescriptor* ld = getDescriptor( route.link );
-			if (ld==NULL || !ld->up) return NULL; else return ld;
+			if (ld==NULL || !ld->up) return NULL; else {
+				route.used = time(NULL);
+				return ld;
+			}
 		}
 	}
Index: /source/ariba/overlay/modules/chord/Chord.cpp
===================================================================
--- /source/ariba/overlay/modules/chord/Chord.cpp	(revision 5882)
+++ /source/ariba/overlay/modules/chord/Chord.cpp	(revision 5883)
@@ -113,8 +113,9 @@
 	if ( remote == nodeid || link.isUnspecified()) return;
 	if ( table->size() == 0 ) return;
+	ttl = 2;
 
 	OverlayMsg msg( typeDiscovery );
 	msg.setRelayed(true);
-	Discovery dmsg( Discovery::normal, (uint8_t)2, baseoverlay.getEndpointDescriptor() );
+	Discovery dmsg( Discovery::normal, (uint8_t)ttl, baseoverlay.getEndpointDescriptor() );
 	msg.encapsulate(&dmsg);
 
@@ -124,5 +125,5 @@
 
 void Chord::discover_neighbors( const LinkID& link ) {
-	uint8_t ttl = 2;
+	uint8_t ttl = 1;
 	{
 		// send predecessor discovery
@@ -419,4 +420,5 @@
 
 		// updating neighbors
+		logging_debug("Discover new ring neighbors");
 		for (int i=0; i<table->size(); i++) {
 			LinkID id = (*table)[i]->info;
@@ -427,10 +429,7 @@
 		logging_debug("Sending discovery message to my neighbors and fingers");
 		stabilize_finger = ((stabilize_finger+1) % table->get_finger_table_size() );
-		const NodeID disc1 = nodeid;
-		const NodeID disc2 = table->get_finger_table(stabilize_finger).get_compare().get_center();
-		send_discovery_to(disc1);
-		if (disc1 != disc2)
-			send_discovery_to(disc2);
-
+		const NodeID disc = table->get_finger_table(stabilize_finger).get_compare().get_center();
+		if (disc != nodeid)
+			send_discovery_to(disc);
 
 		// remove orphan links
