Index: source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- source/ariba/overlay/BaseOverlay.cpp	(revision 6954)
+++ source/ariba/overlay/BaseOverlay.cpp	(revision 6961)
@@ -360,4 +360,10 @@
 		if (!ld->up) continue;
 
+		// check if link is relayed and retry connecting directly
+		if ( ld->relayed && ld->retryCounter > 0) {
+			ld->retryCounter--;
+			ld->communicationId = bc->establishLink( ld->endpoint );
+		}
+
 		// remote used as relay flag
 		if ( ld->relaying && difftime( now, ld->timeRelaying ) > 10)
@@ -756,10 +762,9 @@
 			sideport(&SideportListener::DEFAULT), overlayInterface(NULL),
 			counter(0) {
-	dht = new DHT();
-	localDHT = new DHT();
+	initDHT();
 }
 
 BaseOverlay::~BaseOverlay() {
-	delete dht;
+	destroyDHT();
 }
 
@@ -1755,6 +1760,7 @@
 
 	// try to replace relay link with direct link
-	ldn->communicationId =
-			bc->establishLink( overlayMsg->getSourceEndpoint() );
+	ldn->retryCounter = 3;
+	ldn->endpoint = overlayMsg->getSourceEndpoint();
+	ldn->communicationId =	bc->establishLink( ldn->endpoint );
 
 	return true;
@@ -2096,6 +2102,25 @@
 // ----------------------------------------------------------------------------
 
+void BaseOverlay::initDHT() {
+	dht = new DHT();
+	localDHT = new DHT();
+	republishCounter = 0;
+}
+
+void BaseOverlay::destroyDHT() {
+	delete dht;
+	delete localDHT;
+}
+
 /// stabilize DHT state
 void BaseOverlay::stabilizeDHT() {
+
+	// do not refresh every second
+	if (republishCounter < 2) {
+		republishCounter++;
+		return;
+	}
+	republishCounter = 0;
+
 	// remove old values from DHT
 	BOOST_FOREACH( DHTEntry& entry, dht->entries ) {
Index: source/ariba/overlay/BaseOverlay.h
===================================================================
--- source/ariba/overlay/BaseOverlay.h	(revision 6954)
+++ source/ariba/overlay/BaseOverlay.h	(revision 6961)
@@ -500,5 +500,8 @@
 	DHT* dht;
 	DHT* localDHT;
-
+	int republishCounter;
+
+	void initDHT();
+	void destroyDHT();
 	void stabilizeDHT();
 	void dhtSend( OverlayMsg* msg, const NodeID& dest );
Index: source/ariba/overlay/LinkDescriptor.h
===================================================================
--- source/ariba/overlay/LinkDescriptor.h	(revision 6954)
+++ source/ariba/overlay/LinkDescriptor.h	(revision 6961)
@@ -10,4 +10,5 @@
 #include "ariba/utility/messages.h"
 #include "ariba/utility/types.h"
+#include "ariba/communication/EndpointDescriptor.h"
 #include "ariba/CommunicationListener.h"
 
@@ -23,4 +24,5 @@
 using ariba::utility::LinkID;
 using ariba::CommunicationListener;
+using ariba::communication::EndpointDescriptor;
 
 namespace ariba {
@@ -55,4 +57,5 @@
 		this->autolink = false;
 		this->lastuse = time(NULL);
+		this->retryCounter = 0;
 	}
 
@@ -78,4 +81,8 @@
 	LinkID communicationId; ///< the communication id
 	bool   communicationUp;   ///< flag, whether the communication is up
+
+	// direct link retries -----------------------------------------------------
+	EndpointDescriptor endpoint;
+	int retryCounter;
 
 	// link alive information --------------------------------------------------
