Index: /source/ariba/communication/BaseCommunication.h
===================================================================
--- /source/ariba/communication/BaseCommunication.h	(revision 9693)
+++ /source/ariba/communication/BaseCommunication.h	(revision 9694)
@@ -131,8 +131,11 @@
 
 	/// Establishes a link to another end-point.
-	const LinkID establishLink(const EndpointDescriptor& descriptor );
+	const LinkID establishLink(const EndpointDescriptor& descriptor,
+		const LinkID& linkid = LinkID::UNSPECIFIED, const QoSParameterSet& qos =
+				QoSParameterSet::DEFAULT, const SecurityParameterSet& sec =
+				SecurityParameterSet::DEFAULT);
 
 	/// Drops a link
-	void dropLink( LinkID link );
+	void dropLink(const LinkID link);
 
 	/**
@@ -143,5 +146,5 @@
 	 * @return A sequence number for this message
 	 */
-	seqnum_t sendMessage( LinkID lid, const Message* message );
+	seqnum_t sendMessage(const LinkID lid, const Message* message);
 
 	/**
@@ -151,6 +154,6 @@
 	 * @return The end-point descriptor of the link's end-point
 	 */
-	const EndpointDescriptor& getEndpointDescriptor(
-			LinkID link = LinkID::UNSPECIFIED) const;
+	const EndpointDescriptor& getEndpointDescriptor(const LinkID link =
+			LinkID::UNSPECIFIED) const;
 
 	/**
@@ -209,6 +212,11 @@
 	class LinkDescriptor {
 	public:
+
 		/// default constructor
-		LinkDescriptor() : up(false), id(), localLocator(NULL), remoteLocator(NULL) {}
+		LinkDescriptor() :
+			localLink(LinkID::UNSPECIFIED), localLocator(NULL),
+			remoteLink(LinkID::UNSPECIFIED), remoteLocator(NULL),
+			up(false) {
+		}
 
 		~LinkDescriptor() {
@@ -218,19 +226,28 @@
 
 		bool isUnspecified() const {
-			return id.isUnspecified();
+			return (this == &UNSPECIFIED());
 		}
+
+		static LinkDescriptor& UNSPECIFIED(){
+			static LinkDescriptor* unspec = NULL;
+			if(unspec == NULL) unspec = new LinkDescriptor();
+			return *unspec;
+		}
+
+		bool unspecified;
+
+		/// link identifiers
+		LinkID localLink;
+		const address_v* localLocator;
+
+		/// used underlay addresses for the link
+		LinkID remoteLink;
+		const address_v* remoteLocator;
+
+		/// the remote end-point descriptor
+		EndpointDescriptor remoteEndpoint;
 
 		/// flag, whether this link is up
 		bool up;
-
-		/// link identifier
-		LinkID id;
-
-		/// locators
-		const address_v* localLocator;
-		const address_v* remoteLocator;
-
-		/// the remote end-point descriptor
-		EndpointDescriptor remoteEndpoint;
 	};
 
@@ -242,11 +259,14 @@
 
 	/// Link management: add a link
-	LinkDescriptor& addLink( LinkID link );
+	void addLink( LinkDescriptor* link );
 
 	/// Link management: remove a link
-	void removeLink( LinkID link);
+	void removeLink(const LinkID& localLink);
 
 	/// Link management: get link information using the local link
-	LinkDescriptor& queryLink( LinkID link) const;
+	LinkDescriptor& queryLocalLink(const LinkID& localLink) const;
+
+	/// Link management: get link information using the remote link
+	LinkDescriptor& queryRemoteLink(const LinkID& remoteLink) const;
 
 	/// The local end-point descriptor
@@ -287,9 +307,9 @@
 	/// convenience: send message to peer
 	void send( Message* message, const EndpointDescriptor& endpoint );
-
 	void send( Message* message, const LinkDescriptor& descriptor );
 
 	/// state of the base communication
 	bool started;
+
 };
 
Index: /source/ariba/communication/messages/AribaBaseMsg.cpp
===================================================================
--- /source/ariba/communication/messages/AribaBaseMsg.cpp	(revision 9693)
+++ /source/ariba/communication/messages/AribaBaseMsg.cpp	(revision 9694)
@@ -44,6 +44,8 @@
 vsznDefault(AribaBaseMsg);
 
-AribaBaseMsg::AribaBaseMsg( type_ _type, LinkID link ) :
-	type((uint8_t)_type), link(link){
+AribaBaseMsg::AribaBaseMsg( type_ _type,
+	const LinkID& localLink, const LinkID& remoteLink ) :
+	type((uint8_t)_type),
+	localLink(localLink),remoteLink(remoteLink) {
 }
 
Index: /source/ariba/communication/messages/AribaBaseMsg.h
===================================================================
--- /source/ariba/communication/messages/AribaBaseMsg.h	(revision 9693)
+++ /source/ariba/communication/messages/AribaBaseMsg.h	(revision 9694)
@@ -41,9 +41,7 @@
 
 #include <string>
-#include <stdint.h>
-
+#include <boost/cstdint.hpp>
 #include "ariba/utility/messages.h"
 #include "ariba/utility/serialization.h"
-
 #include "ariba/utility/types/LinkID.h"
 #include "ariba/utility/types/Address.h"
@@ -74,5 +72,8 @@
 	};
 
-	AribaBaseMsg( type_ type = typeData, LinkID link = LinkID::UNSPECIFIED );
+	AribaBaseMsg( type_ type = typeData,
+			const LinkID& localLink = LinkID::UNSPECIFIED,
+			const LinkID& remoteLink = LinkID::UNSPECIFIED );
+
 	virtual ~AribaBaseMsg();
 
@@ -83,6 +84,10 @@
 	}
 
-	const LinkID& getLink() const {
-		return link;
+	const LinkID& getLocalLink() const {
+		return localLink;
+	}
+
+	const LinkID& getRemoteLink() const {
+		return remoteLink;
 	}
 
@@ -96,11 +101,11 @@
 
 private:
-	// link message type
-	uint8_t type;
+	uint8_t type;		// the link message type
 
-	// link identifier
-	LinkID  link;
+	// remote and local link ids
+	LinkID localLink;	// the local link id
+	LinkID remoteLink;	// the remote link id
 
-	// remote and local endpoint descriptors (link reply/request only)
+	// remote and local endpoint descriptors
 	EndpointDescriptor localDescriptor;
 	EndpointDescriptor remoteDescriptor;
@@ -110,8 +115,7 @@
 
 sznBeginDefault( ariba::communication::AribaBaseMsg, X ) {
-	X && type && link;
-	if (type == typeLinkReply || type == typeLinkRequest) {
+	X && type && &localLink && &remoteLink;
+	if (type == typeLinkReply || type == typeLinkRequest)
 		X && localDescriptor && remoteDescriptor;
-	}
 	X && Payload();
 } sznEnd();
