Index: /sample/pingpong/PingPong.cpp
===================================================================
--- /sample/pingpong/PingPong.cpp	(revision 5308)
+++ /sample/pingpong/PingPong.cpp	(revision 5316)
@@ -33,26 +33,25 @@
 	ariba = new AribaModule();
 
-	// get the configuration object
-	Configuration& config = Configuration::instance();
-
-	// generate spovnet name
 	Name spovnetName("pingpong");
-
-	// get initiator flag
-	this->isInitiator = Configuration::instance().read<bool>("node.initiator");
-
+	Name nodeName = Name::UNSPECIFIED;
 	this->name = string("<ping>");
 
-	// get node name
-	Name nodeName = Name::UNSPECIFIED;
-	if (config.exists("node.name")) nodeName = config.read<string> ("node.name");
-
-	// configure ariba module
-	if (config.exists("ariba.endpoints"))
-		ariba->setProperty("endpoints", config.read<string>("ariba.endpoints"));
-	if (config.exists("ariba.bootstrap.hints"))
-		ariba->setProperty("bootstrap.hints", config.read<string>("ariba.bootstrap.hints"));
-	if (config.exists("pingpong.name"))
-		name = config.read<string>("pingpong.name");
+	// get settings from configuration object
+	if( Configuration::haveConfig() ){
+		Configuration& config = Configuration::instance();
+
+		// get node name
+		if (config.exists("node.name"))
+			nodeName = config.read<string> ("node.name");
+
+		// configure ariba module
+		if (config.exists("ariba.endpoints"))
+			ariba->setProperty("endpoints", config.read<string>("ariba.endpoints"));
+		if (config.exists("ariba.bootstrap.hints"))
+			ariba->setProperty("bootstrap.hints", config.read<string>("ariba.bootstrap.hints"));
+		if (config.exists("pingpong.name"))
+			name = config.read<string>("pingpong.name");
+
+	} // if( Configuration::haveConfig() )
 
 	// start ariba module
@@ -73,7 +72,11 @@
 	//params.setBaseOverlayType( SpoVNetProperties::ONE_HOP_OVERLAY ); // alternative: OneHop
 
-	// initiate or join the spovnet
-	if (!isInitiator) node->join(spovnetName);
-	else node->initiate(spovnetName, params);
+	// initiate the spovnet
+	logging_info("initiating spovnet");
+	node->initiate(spovnetName, params);
+
+	// join the spovnet
+	logging_info("joining spovnet");
+	node->join(spovnetName);
 
 	// ping pong started up...
@@ -122,6 +125,5 @@
 	// function that is implemented further down in PingPong::onLinkUp
 
-//	logging_info( "pinging overlay neighbors with ping id " << ++pingId );
-
+	logging_info( "pinging overlay neighbors with ping id " << ++pingId );
 	PingPongMessage pingmsg( pingId, name );
 
@@ -140,6 +142,8 @@
 		names.clear();
 	}
+
 	vector<NodeID> nodes = node->getNeighborNodes();
 	BOOST_FOREACH( NodeID nid, nodes ){
+		logging_info( "sending ping message to " << nid.toString() );
 		node->sendMessage( pingmsg, nid, PingPong::PINGPONG_SERVICEID );
 	}
@@ -176,7 +180,7 @@
 	for (int i=0;i<names.size(); i++) if (names[i]==pingmsg->getName()) found=true;
 	if (!found) names.push_back(pingmsg->getName());
-//	logging_info( "received ping message on link " << lnk.toString()
-//			<< " from node " << remote.toString()
-//			<< ": " << pingmsg->info() );
+	logging_info( "received ping message on link " << lnk.toString()
+			<< " from node " << remote.toString()
+			<< ": " << pingmsg->info() );
 }
 
Index: /sample/pingpong/PingPong.h
===================================================================
--- /sample/pingpong/PingPong.h	(revision 5308)
+++ /sample/pingpong/PingPong.h	(revision 5316)
@@ -68,7 +68,4 @@
 	vector<string> names;
 
-	// flag, whether this node initiates or just joins the spovnet
-	bool isInitiator;
-
 	// the ping pong service id
 	static ServiceID PINGPONG_SERVICEID;
Index: /source/ariba/AribaModule.cpp
===================================================================
--- /source/ariba/AribaModule.cpp	(revision 5308)
+++ /source/ariba/AribaModule.cpp	(revision 5316)
@@ -61,4 +61,10 @@
 AribaModule::AribaModule()
 	: base_comm(NULL), sideport_sniffer(NULL), started(false) {
+
+	endpoints = "tcp{41322}";
+
+	//srand( time(NULL) );
+	//uint16_t tcpport = (rand() + 1024) % 50000;
+	//uint16_t udpport = (rand() + 1024) % 50000;
 }
 
Index: /source/ariba/AribaModule.h
===================================================================
--- /source/ariba/AribaModule.h	(revision 5308)
+++ /source/ariba/AribaModule.h	(revision 5316)
@@ -42,6 +42,7 @@
 #include <string>
 #include <vector>
+#include <ctime>
+#include <cstdlib>
 #include "ariba/utility/logging/Logging.h"
-
 
 using std::vector;
Index: /source/ariba/Node.cpp
===================================================================
--- /source/ariba/Node.cpp	(revision 5308)
+++ /source/ariba/Node.cpp	(revision 5316)
@@ -63,11 +63,18 @@
 	const communication::EndpointDescriptor* ep =
 			ariba_mod.getBootstrapNode(vnetname);
-	if( ep == NULL ) {
-		std::cout << "no bootstrap node defined" << std::endl;
-		return;
-	}
-	ariba_mod.base_comm->start();
-	base_overlay->start( *ariba_mod.base_comm, nodeId );
-	base_overlay->joinSpoVNet( spovnetId, *ep);
+
+	// start base comm if not started
+	if( !ariba_mod.base_comm->isStarted() )
+		ariba_mod.base_comm->start();
+
+	// start base overlay if not started
+	// join against ourselfs
+	if( !base_overlay->isStarted() )
+		base_overlay->start( *ariba_mod.base_comm, nodeId );
+	base_overlay->joinSpoVNet( spovnetId );
+
+	// join against further nodes
+	if( ep != NULL && *ep != EndpointDescriptor::UNSPECIFIED )
+		base_overlay->joinSpoVNet( spovnetId, *ep);
 }
 
@@ -82,11 +89,13 @@
 	nodeId = generateNodeId(name);
 
-	ariba_mod.base_comm->start();
-
-	base_overlay->start( *ariba_mod.base_comm, nodeId );
+	// start base comm if not started
+	if( !ariba_mod.base_comm->isStarted() )
+		ariba_mod.base_comm->start();
+
+	// start base overlay if not started
+	if( !base_overlay->isStarted() )
+		base_overlay->start( *ariba_mod.base_comm, nodeId );
+
 	base_overlay->createSpoVNet( spovnetId, ovrpset );
-
-	ariba_mod.addBootstrapNode(vnetname,
-		new EndpointDescriptor(ariba_mod.base_comm->getEndpointDescriptor()));
 }
 
Index: /source/ariba/SideportListener.cpp
===================================================================
--- /source/ariba/SideportListener.cpp	(revision 5308)
+++ /source/ariba/SideportListener.cpp	(revision 5316)
@@ -74,4 +74,11 @@
 }
 
+vector<NodeID> SideportListener::getOverlayNeighbors(bool deep){
+	vector<NodeID> nodes;
+	if( overlay == NULL ) return nodes;
+
+	overlay->getOverlayNeighbors(deep);
+}
+
 bool SideportListener::isRelayedNode(const NodeID& node){
 
Index: /source/ariba/SideportListener.h
===================================================================
--- /source/ariba/SideportListener.h	(revision 5308)
+++ /source/ariba/SideportListener.h	(revision 5316)
@@ -135,4 +135,10 @@
 
 	/**
+	 * Get the neighbots in the overlay structure
+	 * @return A vector of NodeIDs of the neighbors
+	 */
+	vector<NodeID> getOverlayNeighbors(bool deep = true);
+
+	/**
 	 * Is this node acting as a relay for us
 	 *
Index: /source/ariba/SpoVNetProperties.h
===================================================================
--- /source/ariba/SpoVNetProperties.h	(revision 5308)
+++ /source/ariba/SpoVNetProperties.h	(revision 5316)
@@ -70,5 +70,4 @@
 		CHORD_OVERLAY = 1,
 	};
-
 
 	/**
Index: /source/ariba/overlay/BaseOverlay.cpp
===================================================================
--- /source/ariba/overlay/BaseOverlay.cpp	(revision 5308)
+++ /source/ariba/overlay/BaseOverlay.cpp	(revision 5316)
@@ -245,6 +245,6 @@
 BaseOverlay::BaseOverlay() :
 	bc(NULL), overlayInterface(NULL), nodeId(NodeID::UNSPECIFIED),
-	spovnetId(SpoVNetID::UNSPECIFIED), initiatorLink(LinkID::UNSPECIFIED),
-	state(BaseOverlayStateInvalid), sideport(&SideportListener::DEFAULT) {
+	spovnetId(SpoVNetID::UNSPECIFIED), state(BaseOverlayStateInvalid),
+	sideport(&SideportListener::DEFAULT), started(false) {
 }
 
@@ -268,4 +268,7 @@
 	Timer::setInterval( 500 );
 	Timer::start();
+
+	started = true;
+	state = BaseOverlayStateInvalid;
 }
 
@@ -285,4 +288,11 @@
 	bc->unregisterMessageReceiver( this );
 	bc->unregisterEventListener( this );
+
+	started = false;
+	state = BaseOverlayStateInvalid;
+}
+
+bool BaseOverlay::isStarted(){
+	return started;
 }
 
@@ -292,16 +302,40 @@
 		const EndpointDescriptor& bootstrapEp) {
 
-	ovl.visShowNodeBubble ( ovlId, nodeId, "joining..." );
+	if(id != spovnetId){
+		logging_error("attempt to join against invalid spovnet, call initiate first");
+		return;
+	}
+
+
+	//ovl.visShowNodeBubble ( ovlId, nodeId, "joining..." );
 	logging_info( "Starting to join spovnet " << id.toString() <<
 			" with nodeid " << nodeId.toString());
 
-	// contact the spovnet initiator and request to join. if the join is granted we will
-	// receive further information on the structure of the overlay that is used in the spovnet
-	// but first, we have to establish a link to the initiator...
-	spovnetId = id;
-	state = BaseOverlayStateJoinInitiated;
-
-	initiatorLink = bc->establishLink( bootstrapEp );
-	logging_info("join process initiated for " << id.toString() << "...");
+	if(bootstrapEp == EndpointDescriptor::UNSPECIFIED && state == BaseOverlayStateInvalid){
+
+		// bootstrap against ourselfs
+		logging_debug("joining spovnet locally");
+
+		overlayInterface->joinOverlay();
+		state = BaseOverlayStateCompleted;
+		BOOST_FOREACH( NodeListener* i, nodeListeners )
+			i->onJoinCompleted( spovnetId );
+
+		//ovl.visChangeNodeIcon ( ovlId, nodeId, OvlVis::ICON_ID_CAMERA );
+		//ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN );
+
+		logging_debug("starting overlay bootstrap module");
+		overlayBootstrap.start(this, spovnetId, nodeId);
+		overlayBootstrap.publish(bc->getEndpointDescriptor());
+
+	} else {
+
+		// bootstrap against another node
+		logging_debug("joining spovnet remotely against " << bootstrapEp.toString());
+
+		const LinkID& lnk = bc->establishLink( bootstrapEp );
+		bootstrapLinks.push_back(lnk);
+		logging_info("join process initiated for " << id.toString() << "...");
+	}
 }
 
@@ -310,4 +344,8 @@
 	logging_info( "Leaving spovnet " << spovnetId );
 	bool ret = ( state != this->BaseOverlayStateInvalid );
+
+	logging_debug("stopping overlay bootstrap module");
+	overlayBootstrap.stop();
+	overlayBootstrap.revoke();
 
 	logging_debug( "Dropping all auto-links" );
@@ -329,18 +367,11 @@
 		overlayInterface->leaveOverlay();
 
-	// leave spovnet
-	if( state != BaseOverlayStateInitiator ) {
-		// then, leave the spovnet baseoverlay
-		OverlayMsg overMsg( OverlayMsg::typeBye, nodeId );
-		bc->sendMessage( initiatorLink, &overMsg );
-
-		// drop the link and set to correct state
-		bc->dropLink( initiatorLink );
-		initiatorLink = LinkID::UNSPECIFIED;
-	}
+	// drop still open bootstrap links
+	BOOST_FOREACH( LinkID lnk, bootstrapLinks )
+		bc->dropLink( lnk );
 
 	// change to inalid state
 	state = BaseOverlayStateInvalid;
-	ovl.visShutdown( ovlId, nodeId, string("") );
+	//ovl.visShutdown( ovlId, nodeId, string("") );
 
 	// inform all registered services of the event
@@ -362,5 +393,4 @@
 
 	spovnetId = id;
-	state = BaseOverlayStateInitiator;
 
 	overlayInterface = OverlayFactory::create( *this, param, nodeId, this );
@@ -368,14 +398,10 @@
 		logging_fatal( "overlay structure not supported" );
 		state = BaseOverlayStateInvalid;
+
+		BOOST_FOREACH( NodeListener* i, nodeListeners )
+			i->onJoinFailed( spovnetId );
+
 		return;
 	}
-
-	// bootstrap against ourselfs
-	overlayInterface->joinOverlay();
-	BOOST_FOREACH( NodeListener* i, nodeListeners )
-		i->onJoinCompleted( spovnetId );
-
-	ovl.visChangeNodeIcon ( ovlId, nodeId, OvlVis::ICON_ID_CAMERA );
-	ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN );
 }
 
@@ -695,6 +721,6 @@
 	LinkDescriptor* ld = getDescriptor(id, true);
 
-	// handle initiator link
-	if(state == BaseOverlayStateJoinInitiated && id == initiatorLink) {
+	// handle bootstrap link we initiated
+	if( std::find(bootstrapLinks.begin(), bootstrapLinks.end(), id) != bootstrapLinks.end() ){
 		logging_info(
 			"Join has been initiated by me and the link is now up. " <<
@@ -759,4 +785,8 @@
 	const address_v* local, const address_v* remote) {
 
+	// erase bootstrap links
+	vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), id );
+	if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
+
 	// get descriptor for link
 	LinkDescriptor* ld = getDescriptor(id, true);
@@ -800,4 +830,8 @@
 	const address_v* local, const address_v* remote) {
 	logging_debug( "Link fail with base communication link id=" << id );
+
+	// erase bootstrap links
+	vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), id );
+	if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
 
 	// get descriptor for link
@@ -927,5 +961,4 @@
 			logging_debug("received join reply message");
 			JoinReply* replyMsg = overlayMsg->decapsulate<JoinReply>();
-			assert(state == BaseOverlayStateJoinInitiated);
 
 			// correct spovnet?
@@ -942,11 +975,18 @@
 
 				// drop initiator link
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
+
+				if(bcLink != LinkID::UNSPECIFIED){
+					bc->dropLink( bcLink );
+
+					vector<LinkID>::iterator it = std::find(
+							bootstrapLinks.begin(), bootstrapLinks.end(), bcLink);
+					if( it != bootstrapLinks.end() )
+						bootstrapLinks.erase(it);
+				}
 
 				// inform all registered services of the event
 				BOOST_FOREACH( NodeListener* i, nodeListeners )
 					i->onJoinFailed( spovnetId );
+
 				return true;
 			}
@@ -956,36 +996,59 @@
 					spovnetId.toString() );
 
+			logging_debug( "Using bootstrap end-point "
+				<< replyMsg->getBootstrapEndpoint().toString() );
+
+			//
 			// create overlay structure from spovnet parameter set
-			overlayInterface = OverlayFactory::create(
-				*this, replyMsg->getParam(), nodeId, this );
-
-			// overlay structure supported? no-> fail!
-			if( overlayInterface == NULL ) {
-				logging_error( "overlay structure not supported" );
-
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
+			// if we have not boostrapped yet against some other node
+			//
+
+			if( overlayInterface == NULL ){
+
+				logging_debug("first-time bootstrapping");
+
+				overlayInterface = OverlayFactory::create(
+					*this, replyMsg->getParam(), nodeId, this );
+
+				// overlay structure supported? no-> fail!
+				if( overlayInterface == NULL ) {
+					logging_error( "overlay structure not supported" );
+
+					if(bcLink != LinkID::UNSPECIFIED){
+						bc->dropLink( bcLink );
+
+						vector<LinkID>::iterator it = std::find(
+								bootstrapLinks.begin(), bootstrapLinks.end(), bcLink);
+						if( it != bootstrapLinks.end() )
+							bootstrapLinks.erase(it);
+					}
+
+					// inform all registered services of the event
+					BOOST_FOREACH( NodeListener* i, nodeListeners )
+					i->onJoinFailed( spovnetId );
+
+					return true;
+				}
+
+				// everything ok-> join the overlay!
+				state = BaseOverlayStateCompleted;
+				overlayInterface->createOverlay();
+
+				overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
+
+				// update ovlvis
+				//ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN);
 
 				// inform all registered services of the event
 				BOOST_FOREACH( NodeListener* i, nodeListeners )
-				i->onJoinFailed( spovnetId );
-
-				return true;
-			}
-
-			// everything ok-> join the overlay!
-			state = BaseOverlayStateCompleted;
-			overlayInterface->createOverlay();
-			logging_debug( "Using bootstrap end-point "
-				<< replyMsg->getBootstrapEndpoint().toString() );
-			overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
-
-			// update ovlvis
-			ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN);
-
-			// inform all registered services of the event
-			BOOST_FOREACH( NodeListener* i, nodeListeners )
-				i->onJoinCompleted( spovnetId );
+					i->onJoinCompleted( spovnetId );
+
+			} else {
+
+				// this is not the first bootstrap, just join the additional node
+				logging_debug("not first-time bootstrapping");
+				overlayInterface->joinOverlay( replyMsg->getBootstrapEndpoint() );
+
+			} // if( overlayInterface == NULL )
 
 			return true;
@@ -1103,41 +1166,9 @@
 
 		// ---------------------------------------------------------------------
-		// handle bye messages
-		// ---------------------------------------------------------------------
-		case OverlayMsg::typeBye: {
-			logging_debug( "received bye message from " <<
-					overlayMsg->getSourceNode().toString() );
-
-			/* if we are the initiator and receive a bye from a node
-			 * the node just left. if we are a node and receive a bye
-			 * from the initiator, we have to close, too.
-			 */
-			if( overlayMsg->getSourceNode() == spovnetInitiator ) {
-
-				bc->dropLink( initiatorLink );
-				initiatorLink = LinkID::UNSPECIFIED;
-				state = BaseOverlayStateInvalid;
-
-				logging_fatal( "initiator ended spovnet" );
-
-				// inform all registered services of the event
-				BOOST_FOREACH( NodeListener* i, nodeListeners )
-					i->onLeaveFailed( spovnetId );
-
-			} else {
-				// a node that said goodbye and we are the initiator don't have to
-				// do much here, as the node also will go out of the overlay
-				// structure
-				logging_info( "node left " << overlayMsg->getSourceNode() );
-			}
-
-			return true;
-
-		}
-
-		// ---------------------------------------------------------------------
 		// handle link request forwarded through the overlay
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeLinkRequest: {
+
+			logging_debug( "received link request on link" );
 
 			// decapsulate message
@@ -1261,4 +1292,6 @@
 		case OverlayMsg::typeRelay: {
 
+			logging_debug( "received relay request on link" );
+
 			// decapsulate message
 			RelayMessage* relayMsg = overlayMsg->decapsulate<RelayMessage>();
@@ -1347,4 +1380,7 @@
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeKeepAlive: {
+
+			logging_debug( "received keep-alive on link" );
+
 			if ( ld != NULL ) {
 				//logging_force("Keep-Alive for "<< ld->overlayId);
@@ -1358,4 +1394,7 @@
 		// ---------------------------------------------------------------------
 		case OverlayMsg::typeDirectLink: {
+
+			logging_debug( "received direct link replacement request" );
+
 			LinkDescriptor* rld = getDescriptor( overlayMsg->getRelayLink() );
 			logging_force( "Received direct link convert notification for " << rld );
@@ -1380,4 +1419,5 @@
 
 	} /* switch */
+
 	return false;
 }
@@ -1398,7 +1438,7 @@
 }
 
-vector<NodeID> BaseOverlay::getOverlayNeighbors() const {
+vector<NodeID> BaseOverlay::getOverlayNeighbors(bool deep) const {
 	// the known nodes _can_ also include our node, so we remove ourself
-	vector<NodeID> nodes = overlayInterface->getKnownNodes();
+	vector<NodeID> nodes = overlayInterface->getKnownNodes(deep);
 	vector<NodeID>::iterator i = find( nodes.begin(), nodes.end(), this->nodeId );
 	if( i != nodes.end() ) nodes.erase( i );
@@ -1499,5 +1539,9 @@
 	// drop links
 	BOOST_FOREACH( const LinkDescriptor* ld, oldlinks ) {
-		if (!ld->communicationId.isUnspecified() && ld->communicationId == initiatorLink) {
+
+		vector<LinkID>::iterator it = std::find(
+				bootstrapLinks.begin(), bootstrapLinks.end(), ld->communicationId);
+
+		if (!ld->communicationId.isUnspecified() && it != bootstrapLinks.end() ){
 			logging_force( "Not dropping initiator link: " << ld );
 			continue;
Index: /source/ariba/overlay/BaseOverlay.h
===================================================================
--- /source/ariba/overlay/BaseOverlay.h	(revision 5308)
+++ /source/ariba/overlay/BaseOverlay.h	(revision 5316)
@@ -112,6 +112,6 @@
 using ariba::utility::OvlVis;
 
-#define ovl OvlVis::instance()
-#define ovlId OvlVis::NETWORK_ID_BASE_OVERLAY
+//#define ovl OvlVis::instance()
+//#define ovlId OvlVis::NETWORK_ID_BASE_OVERLAY
 
 namespace ariba {
@@ -156,4 +156,9 @@
 
 	/**
+	 * Is the BaseOverlay instance started up yet
+	 */
+	bool isStarted();
+
+	/**
 	 * Starts a link establishment procedure to the specfied node
 	 * for the service with id service
@@ -211,5 +216,5 @@
 	 * @return A list of overlay neighbors.
 	 */
-	vector<NodeID> getOverlayNeighbors() const;
+	vector<NodeID> getOverlayNeighbors(bool deep = true) const;
 
 	/**
@@ -264,5 +269,5 @@
 	 * @param boot A bootstrap node
 	 */
-	void joinSpoVNet(const SpoVNetID& id, const EndpointDescriptor& boot);
+	void joinSpoVNet(const SpoVNetID& id, const EndpointDescriptor& boot = EndpointDescriptor::UNSPECIFIED);
 
 	/**
@@ -365,15 +370,13 @@
 	typedef enum _BaseOverlayState {
 		BaseOverlayStateInvalid = 0,
-		BaseOverlayStateInitiator = 1,
-		BaseOverlayStateJoinInitiated = 2,
-		BaseOverlayStateCompleted = 3,
+		BaseOverlayStateCompleted = 1,
 	} BaseOverlayState;
 
-	BaseOverlayState state; ///< Current Base-Overlay state
-	BaseCommunication* bc;  ///< reference to the base communication
-	NodeID nodeId;          ///< the node id of this node
-	SpoVNetID spovnetId;    ///< the spovnet id of the currently joined overlay
-	LinkID initiatorLink;   ///< the link id of the link to the initiator node
-	NodeID spovnetInitiator;///< The initiator node
+	BaseOverlayState state;          ///< Current Base-Overlay state
+	BaseCommunication* bc;           ///< reference to the base communication
+	NodeID nodeId;                   ///< the node id of this node
+	SpoVNetID spovnetId;             ///< the spovnet id of the currently joined overlay
+	vector<LinkID> bootstrapLinks;   ///< the link id of the link to the initiator node
+	NodeID spovnetInitiator;         ///< The initiator node
 
 	/// the service id communication listeners
@@ -440,4 +443,7 @@
 	 */
 	OverlayBootstrap overlayBootstrap;
+
+	/// is the base overlay started yet
+	bool started;
 };
 
Index: /source/ariba/overlay/OverlayBootstrap.cpp
===================================================================
--- /source/ariba/overlay/OverlayBootstrap.cpp	(revision 5308)
+++ /source/ariba/overlay/OverlayBootstrap.cpp	(revision 5316)
@@ -61,6 +61,9 @@
 	nodeid = _nodeid;
 
+	logging_info("starting overlay bootstrap");
+
 	manager.registerCallback( this );
-	//manager.registerModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	manager.registerModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	//manager.registerModule( BootstrapManager::BootstrapTypeBluetoothSdp );
 }
 
@@ -70,6 +73,9 @@
 	nodeid = NodeID::UNSPECIFIED;
 
+	logging_info("stopping overlay bootstrap");
+
 	manager.unregisterCallback( this );
-	//manager.unregisterModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	manager.unregisterModule( BootstrapManager::BootstrapTypePeriodicBroadcast );
+	//manager.unregisterModule( BootstrapManager::BootstrapTypeBluetoothSdp );
 }
 
@@ -83,5 +89,5 @@
 	// tell the base overlay to join using this endpoint
 	assert( overlay != NULL );
-	// TODO: overlay->joinSpoVNet( spovnetid, data->endpoint );
+	overlay->joinSpoVNet( spovnetid, data->endpoint );
 
 	delete data;
Index: /source/ariba/overlay/messages/OverlayMsg.h
===================================================================
--- /source/ariba/overlay/messages/OverlayMsg.h	(revision 5308)
+++ /source/ariba/overlay/messages/OverlayMsg.h	(revision 5316)
@@ -70,9 +70,8 @@
 		typeJoinReply = 3, ///< join reply
 		typeUpdate = 4, ///< update message for link association
-		typeBye = 5, ///< leave (no encapsulated messages)
-		typeLinkRequest = 6, ///< link request (sent over the overlay)
-		typeRelay = 7, ///< relay message
-		typeKeepAlive = 8, ///< a keep-alive message
-		typeDirectLink = 9,
+		typeLinkRequest = 5, ///< link request (sent over the overlay)
+		typeRelay = 6, ///< relay message
+		typeKeepAlive = 7, ///< a keep-alive message
+		typeDirectLink = 8,
 	///< a direct connection has been established
 	};
Index: /source/ariba/overlay/modules/OverlayInterface.h
===================================================================
--- /source/ariba/overlay/modules/OverlayInterface.h	(revision 5308)
+++ /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 5308)
+++ /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 5308)
+++ /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 5308)
+++ /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 5308)
+++ /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;
 };
 
Index: /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.cpp
===================================================================
--- /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.cpp	(revision 5308)
+++ /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.cpp	(revision 5316)
@@ -41,19 +41,19 @@
 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
 
-// Attribute descriptors for SDP
-// base was chosen randomly
-#define SDP_SPOVNET_BASE 			0x4000
-#define SDP_ATTR_SPOVNET_NAME		0x0000 + SDP_SPOVNET_BASE
-#define SDP_ATTR_SPOVNET_INFO1		0x0001 + SDP_SPOVNET_BASE
-#define SDP_ATTR_SPOVNET_INFO2		0x0002 + SDP_SPOVNET_BASE
-#define SDP_ATTR_SPOVNET_INFO3		0x0003 + SDP_SPOVNET_BASE
-
-// The SpoVNet unique identifier, this should be the same for all SpoVNet implementations
-const uint8_t svc_uuid_int[] = {0x59, 0x29, 0x24, 0x34, 0x69, 0x42, 0x11, 0xde, 0x94,
-	0x3e, 0x00, 0x21, 0x5d, 0xb4, 0xd8, 0x54};
-
-const char *service_name = "SpoVNet";
-const char *svc_dsc = "Spontaneous Virtual Network";
-const char *service_prov = "ITM Uni Karlsruhe";
+	// Attribute descriptors for SDP
+	// base was chosen randomly
+	#define SDP_SPOVNET_BASE 			0x4000
+	#define SDP_ATTR_SPOVNET_NAME		0x0000 + SDP_SPOVNET_BASE
+	#define SDP_ATTR_SPOVNET_INFO1		0x0001 + SDP_SPOVNET_BASE
+	#define SDP_ATTR_SPOVNET_INFO2		0x0002 + SDP_SPOVNET_BASE
+	#define SDP_ATTR_SPOVNET_INFO3		0x0003 + SDP_SPOVNET_BASE
+
+	// The SpoVNet unique identifier, this should be the same for all SpoVNet implementations
+	const uint8_t svc_uuid_int[] = {0x59, 0x29, 0x24, 0x34, 0x69, 0x42, 0x11, 0xde, 0x94,
+		0x3e, 0x00, 0x21, 0x5d, 0xb4, 0xd8, 0x54};
+
+	const char *service_name = "SpoVNet";
+	const char *svc_dsc = "www.ariba-underlay.org";
+	const char *service_prov = "ITM Uni Karlsruhe";
 
 #endif // HAVE_BLUETOOTH_BLUETOOTH_H
@@ -66,4 +66,5 @@
 BluetoothSdp::BluetoothSdp(BootstrapInformationCallback* _callback) :
 	BootstrapModule(_callback), scan_timer_(io_service_) {
+	srand( time(NULL) );
 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
 
@@ -88,5 +89,5 @@
 bool BluetoothSdp::isFunctional() {
 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
-	return true; // Not tested yet :)
+	return true;
 #else
 	return false;
@@ -118,4 +119,7 @@
 	t_.join();
 
+	if(sdp_session_ != NULL)
+		sdp_close(sdp_session_);
+
 #endif // HAVE_BLUETOOTH_BLUETOOTH_H
 }
@@ -130,5 +134,5 @@
 	 */
 
-	logging_info("Registering SDP service");
+	logging_debug("registering SDP service");
 
 	uint8_t rfcomm_channel = channel_;
@@ -142,7 +146,4 @@
 	sdp_session_ = 0;
 
-	bdaddr_t bdaddr_any = (bdaddr_t) { {0, 0, 0, 0, 0, 0}};
-	bdaddr_t bdaddr_local = (bdaddr_t) { {0, 0, 0, 0xff, 0xff, 0xff}};
-
 	// prepare the info attribute buffers
 	//string namebuf, info1buf, info2buf, info3buf;
@@ -155,19 +156,7 @@
 
 	if((namelen > 256) || (info1len > 256) || (info2len > 256) || (info3len > 256)) {
-		logging_error("String Argument too long, max size is 256!");
+		logging_error("string argument too long, max size is 256!");
 		return;
 	}
-
-	// we need to save the string len for sdp; do we?
-	/*
-	namebuf = (char)namelen;
-	namebuf.append(name);
-	info1buf = (char)info1len;
-	info1buf.append(info1);
-	info2buf = (char)info2len;
-	info2buf.append(info2);
-	info3buf = (char)info3len;
-	info3buf.append(info3);
-	*/
 
 	// set the general service ID
@@ -222,12 +211,19 @@
 			info3.data());
 
-	// connect to the local SDP server, register the service record,
-	// and disconnect
-	sdp_session_ = sdp_connect(&bdaddr_any, &bdaddr_local, SDP_RETRY_IF_BUSY);
-
-	if (sdp_session_ == 0) {
-		logging_error( "Something is wrong with your SDP server, nothing registered" );
+	// connect to the local SDP server, register the service record
+	if( sdp_session_ == NULL ){
+		sdp_session_ = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
+	}
+
+	if (sdp_session_ == NULL) {
+		logging_error( "something is wrong with your SDP server, nothing registered" );
 	} else {
-		sdp_record_register(sdp_session_, &record, 0);
+		int ret = sdp_record_register(sdp_session_, &record, 0);
+
+		if(ret < 0){
+			logging_error("failed registering sdp record");
+		}else{
+			logging_debug("sdp record registered using session " << sdp_session_);
+		}
 	}
 
@@ -247,5 +243,5 @@
 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
 
-	logging_info("Unregistering SDP service");
+	logging_debug("unregistering SDP service");
 	sdp_close(sdp_session_);
 
@@ -256,12 +252,9 @@
 
 void BluetoothSdp::bt_scan() {
-
-
 	/*
 	 * Scans for other bluetooth devices and starts a SDP search on them.
-	 * Repeats 20 seconds after the end of the scan.
-	 */
-
-	logging_info("Scanning for peers");
+	 */
+
+	logging_debug("scanning for peers");
 
 	inquiry_info *ii = NULL;
@@ -276,6 +269,6 @@
 	sock = hci_open_dev(dev_id);
 	if (dev_id < 0 || sock < 0) {
-		logging_error("opening socket");
-		exit(1);
+		logging_error("opening socket for device " << dev_id << " failed. can not scan for peers");
+		return;
 	}
 
@@ -287,19 +280,10 @@
 	num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
 	if (num_rsp < 0)
-		logging_error("hci_inquiry");
+		logging_error("hci_inquiry failed with " << num_rsp);
 
 	for (i = 0; i < num_rsp; i++) {
-		/*
-		 ba2str(&(ii + i)->bdaddr, addr);
-		 memset(name, 0, sizeof(name));
-		 if (hci_read_remote_name(sock, &(ii + i)->bdaddr, sizeof(name),
-		 name, 0) < 0)
-		 strcpy(name, "[unknown]");
-		 printf("%s  %s\n", addr, name);
-		 */
 
 		address = (ii + i)->bdaddr;
-
-		logging_info("Found peer " << ba2string(&address) << ", querying SDP.")
+		logging_debug("found peer " << ba2string(&address) << ", querying SDP.")
 
 		// TODO: sdp_search can be very slow, fork it!
@@ -310,7 +294,8 @@
 	close(sock);
 
-	logging_info("Next scan in 20 seconds");
-
-	scan_timer_.expires_from_now(boost::posix_time::seconds(20));
+	int nextscan = (rand() % 40) + 5;
+	logging_debug("Next sdp scan in " << nextscan << " seconds");
+
+	scan_timer_.expires_from_now(boost::posix_time::seconds(nextscan));
 	scan_timer_.async_wait(boost::bind(&BluetoothSdp::bt_scan, this));
 }
@@ -326,8 +311,7 @@
 	uuid_t svc_uuid;
 	sdp_list_t *response_list, *search_list, *attrid_list;
-	sdp_session_t *session = 0;
+	sdp_session_t *session = NULL;
 	uint32_t range = 0x0000ffff;
 	uint8_t port = 0;
-	bdaddr_t any_addr = (bdaddr_t) { {0, 0, 0, 0, 0, 0}};
 
 	// prepare the buffers for the attributes
@@ -335,8 +319,9 @@
 
 	// connect to the SDP server running on the remote machine
-	session = sdp_connect(&any_addr, &target, 0);
-
-	if (session == 0) {
-		logging_error("Failed to connect to SDP server at " << ba2string(&target) <<".");
+	logging_debug("querying services from bt device " << ba2string(&target));
+	session = sdp_connect(BDADDR_ANY, &target, 0);
+
+	if (session == NULL) {
+		logging_error("failed to connect to SDP server at " << ba2string(&target) <<".");
 		return;
 	}
@@ -356,5 +341,5 @@
 
 		// go through each of the service records
-		for (; r; r = r->next) {
+		for ( ; r != NULL; r = r->next) {
 			sdp_record_t *rec = (sdp_record_t*) r->data;
 
@@ -368,7 +353,7 @@
 
 				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_NAME, (char*)&name, 256);
-				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO1, (char*)&name, 256);
-				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO2, (char*)&name, 256);
-				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO3, (char*)&name, 256);
+				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO1, (char*)&info1, 256);
+				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO2, (char*)&info2, 256);
+				sdp_get_string_attr(rec, SDP_ATTR_SPOVNET_INFO3, (char*)&info3, 256);
 
 				logging_info("Remote peer name is: " << name);
@@ -379,14 +364,15 @@
 				// Callback
 				callback->onBootstrapServiceFound(name, info1, info2, info3);
-
 			}
 			sdp_record_free(rec);
 		}
-	}
+	} else {
+		logging_error("sdp_service_search_attr_req failed with timeout");
+	}
+
 	sdp_list_free(response_list, 0);
 	sdp_list_free(search_list, 0);
 	sdp_list_free(attrid_list, 0);
 	sdp_close(session);
-
 }
 
@@ -395,5 +381,6 @@
 	 * Returns a string holding the bt adress in human readable form.
 	 */
-	char *str;
+	char addr[32] = { 0 };
+	char str[32] = { 0 };
 	ba2str(ba, str);
 	string result = str;
Index: /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.h
===================================================================
--- /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.h	(revision 5308)
+++ /source/ariba/utility/bootstrap/modules/bluetoothsdp/BluetoothSdp.h	(revision 5316)
@@ -44,4 +44,5 @@
 #include <iostream>
 #include <string>
+#include <ctime>
 #include <boost/bind.hpp>
 #include <boost/asio.hpp>
@@ -94,5 +95,4 @@
 	boost::asio::deadline_timer scan_timer_;
 	boost::thread t_;
-
 };
 
Index: /source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp
===================================================================
--- /source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp	(revision 5308)
+++ /source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp	(revision 5316)
@@ -66,5 +66,4 @@
 	: BootstrapModule(_callback),
 	server(io_service, &newRemoteServices, &newRemoteServicesMutex) {
-
 }
 
Index: /source/ariba/utility/configuration/Configuration.cpp
===================================================================
--- /source/ariba/utility/configuration/Configuration.cpp	(revision 5308)
+++ /source/ariba/utility/configuration/Configuration.cpp	(revision 5316)
@@ -51,9 +51,18 @@
 void Configuration::setConfigFilename(string filename){
 	CONFIG_FILE = filename;
-	instance().reload();
+	if(haveConfig())
+		instance().reload();
 }
 
 Configuration::~Configuration(){
 	delete config;
+}
+
+bool Configuration::haveConfig(){
+	std::ifstream in( CONFIG_FILE.c_str() );
+	if( !in ) return false;
+
+	in.close();
+	return true;
 }
 
@@ -64,4 +73,5 @@
 
 bool Configuration::exists(const string& name){
+	if(config == NULL) return false;
 	return config->keyExists( name );
 }
Index: /source/ariba/utility/configuration/Configuration.h
===================================================================
--- /source/ariba/utility/configuration/Configuration.h	(revision 5308)
+++ /source/ariba/utility/configuration/Configuration.h	(revision 5316)
@@ -63,4 +63,5 @@
 	static Configuration& instance();
 	static void setConfigFilename(string filename);
+	static bool haveConfig();
 
 	/**
Index: /source/ariba/utility/misc/OvlVis.cpp
===================================================================
--- /source/ariba/utility/misc/OvlVis.cpp	(revision 5308)
+++ /source/ariba/utility/misc/OvlVis.cpp	(revision 5316)
@@ -50,4 +50,5 @@
 OvlVis::OvlVis() : socket(io_service), socketOpened(false) {
 
+	if( ! Configuration::haveConfig() ) return;
 	if( ! Configuration::instance().exists("DEMO_OvlVisIP") )   return;
 	if( ! Configuration::instance().exists("DEMO_OvlVisPort") ) return;
Index: /source/ariba/utility/system/StartupWrapper.cpp
===================================================================
--- /source/ariba/utility/system/StartupWrapper.cpp	(revision 5308)
+++ /source/ariba/utility/system/StartupWrapper.cpp	(revision 5316)
@@ -98,5 +98,5 @@
 	{
 		log4cxx::LoggerPtr logger(log4cxx::Logger::getRootLogger());
-		logger->setLevel(log4cxx::Level::getError());
+		logger->setLevel(log4cxx::Level::getWarn());
 	}
 
@@ -107,10 +107,10 @@
 	}
 	{
-		log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("BaseCommunication"));
-		logger->setLevel(log4cxx::Level::getError());
+//		log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("BaseCommunication"));
+//		logger->setLevel(log4cxx::Level::getError());
 	}
 
 	//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
-	// DON'T SVN COMMIT YOUR CHANTED LOGGING! THE ABOVE CODE MUST REMAIN AS IS!
+	// DON'T SVN COMMIT YOUR CHANGED LOGGING! THE ABOVE CODE MUST REMAIN AS IS!
 	//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 }
Index: /source/ariba/utility/system/SystemQueue.cpp
===================================================================
--- /source/ariba/utility/system/SystemQueue.cpp	(revision 5308)
+++ /source/ariba/utility/system/SystemQueue.cpp	(revision 5316)
@@ -226,5 +226,7 @@
 			// call the queue and this will
 			// call the actual event handler
+			obj->queueMutex.unlock();
 			obj->onNextQueueItem( ev );
+			obj->queueMutex.lock();
 
 		} // !obj->eventsQueue.empty() )
