Index: source/ariba/communication/EndpointDescriptor.cpp
===================================================================
--- source/ariba/communication/EndpointDescriptor.cpp	(revision 3699)
+++ source/ariba/communication/EndpointDescriptor.cpp	(revision 3705)
@@ -112,11 +112,41 @@
 bool EndpointDescriptor::operator==(const EndpointDescriptor& rh) const {
 
-	if( locator != NULL && rh.locator != NULL )
-		return ( locator->operator==(*rh.locator) );
+	if( isUnspecified() && rh.isUnspecified() ) {
 
-	if( locator != rh.locator )
+		// both unspec bit set
+		return true;
+
+	} else if( (!isUnspecified()) && (!rh.isUnspecified()) ) {
+
+		//
+		// both are valid, check locators
+		//
+
+		if( locator == NULL && rh.locator == NULL ){
+
+			// both locators are invalid, ok true
+			return true;
+
+		} else if( locator == NULL ^ rh.locator == NULL ) {
+
+			// one locator is invalid, the other not, false
+			return false;
+
+		} else {
+
+			// both locators are valid, compare
+			assert( locator != NULL && rh.locator != NULL );
+			return ( locator->operator==(*rh.locator) );
+
+		}
+
+	} else {
+
+		// one is unspec, the other not
+		assert( isUnspecified() ^ rh.isUnspecified() );
 		return false;
 
-	return (isUnspec == rh.isUnspec);
+	}
+
 }
 
Index: source/ariba/communication/EndpointDescriptor.h
===================================================================
--- source/ariba/communication/EndpointDescriptor.h	(revision 3699)
+++ source/ariba/communication/EndpointDescriptor.h	(revision 3705)
@@ -100,5 +100,10 @@
 
 sznBeginDefault( ariba::communication::EndpointDescriptor, X ) {
-	X && VO(locator);
+	uint8_t unspec = isUnspec;
+
+	X && unspec && VO(locator);
+
+	// when deserializing reset unspec flag
+	if (X.isDeserializer()) isUnspec = unspec;
 } sznEnd();
 
