Index: sample/pingpong/PingPong.cpp
===================================================================
--- sample/pingpong/PingPong.cpp	(revision 3056)
+++ sample/pingpong/PingPong.cpp	(revision 3071)
@@ -87,10 +87,10 @@
 	Timer::stop();
 
+	// leave spovnet
+	node->leave();
+
 	// unbind communication and node listener
 	node->unbind( this );                               /*NodeListener*/
 	node->unbind( this, PingPong::PINGPONG_SERVICEID ); /*CommunicationListener*/
-
-	// leave spovnet
-	node->leave();
 
 	// stop the ariba module
@@ -111,4 +111,10 @@
 	// this can be all nodes (OneHop) overlay or just some neighbors
 	// in case of a Chord or Kademlia structure
+
+	// in this sample we use auto-links: we just send out our message
+	// to the node and the link is established automatically. for more
+	// control we would use the node->establishLink function to create
+	// a link and start using the link in the CommunicationListener::onLinkUp
+	// function that is implemented further down in PingPong::onLinkUp
 
 	logging_info( "pinging overlay neighbors with ping id " << ++pingId );
@@ -139,5 +145,5 @@
 
 void PingPong::onJoinFailed( const SpoVNetID& vid ) {
-	logging_error("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX pingpong node join failed, spovnetid=" << vid.toString() );
+	logging_error("pingpong node join failed, spovnetid=" << vid.toString() );
 }
 
@@ -150,12 +156,5 @@
 }
 
-// communication listener
-bool PingPong::onLinkRequest(const NodeID& remote, const DataMessage& msg) {
-	logging_debug( "node " << remote.toString() << " wants to build up a link with us ... allowing" );
-	return true;
-}
-
 void PingPong::onMessage(const DataMessage& msg, const NodeID& remote, const LinkID& lnk) {
-
 	PingPongMessage* pingmsg = msg.getMessage()->convert<PingPongMessage> ();
 
@@ -176,6 +175,11 @@
 
 void PingPong::onLinkChanged(const LinkID& lnk, const NodeID& remote){
-	logging_info( "received link-changed event for link " << lnk.toString()
+	logging_info( "link-changed event for link " << lnk.toString()
 			<< " and node " << remote.toString() );
+}
+
+bool PingPong::onLinkRequest(const NodeID& remote, const DataMessage& msg) {
+	logging_info( "node " << remote.toString() << " wants to build up a link with us ... allowing" );
+	return true;
 }
 
@@ -185,9 +189,3 @@
 }
 
-void PingPong::onLinkQoSChanged(const LinkID& lnk, const NodeID& remote, const LinkProperties& prop){
-	logging_info( "received link-qos-changed event for link " << lnk.toString()
-				<< " and node " << remote.toString()
-				<< " with link properties " << prop.toString() );
-}
-
 }}} // namespace ariba, application, pingpong
Index: sample/pingpong/PingPong.h
===================================================================
--- sample/pingpong/PingPong.h	(revision 3056)
+++ sample/pingpong/PingPong.h	(revision 3071)
@@ -35,5 +35,5 @@
 protected:
 	// communication listener interface
-	virtual bool onLinkRequest(const NodeID& remote, const DataMessage& msg);
+	virtual bool onLinkRequest(const NodeID& remote, const DataMessage& msg = DataMessage::UNSPECIFIED);
 	virtual void onMessage(const DataMessage& msg, const NodeID& remote, const LinkID& lnk= LinkID::UNSPECIFIED);
 	virtual void onLinkUp(const LinkID& lnk, const NodeID& remote);
@@ -41,5 +41,4 @@
 	virtual void onLinkChanged(const LinkID& lnk, const NodeID& remote);
 	virtual void onLinkFail(const LinkID& lnk, const NodeID& remote);
-	virtual void onLinkQoSChanged(const LinkID& lnk, const NodeID& remote, const LinkProperties& prop);
 
 	// node listener interface
