Index: source/ariba/communication/networkinfo/AddressDiscovery.hpp
===================================================================
--- source/ariba/communication/networkinfo/AddressDiscovery.hpp	(revision 5284)
+++ source/ariba/communication/networkinfo/AddressDiscovery.hpp	(revision 5284)
@@ -0,0 +1,70 @@
+#ifndef ADDRESSDISCOVERY_HPP_
+#define ADDRESSDISCOVERY_HPP_
+
+#include "ariba/utility/addressing/addressing.hpp"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include <ifaddrs.h>
+
+using namespace ariba::addressing;
+
+mac_address getMacFromIF( const char* name ) {
+	int s;
+	struct ifreq buffer;
+	s = socket(PF_INET, SOCK_DGRAM, 0);
+	memset(&buffer, 0x00, sizeof(buffer));
+	strcpy(buffer.ifr_name, name);
+	ioctl(s, SIOCGIFHWADDR, &buffer);
+	close(s);
+	mac_address addr;
+	addr.assign( (uint8_t*)buffer.ifr_hwaddr.sa_data, 6 );
+	return addr;
+}
+
+void discoverEndpoints( endpoint_set& endpoints ) {
+	struct ifaddrs* ifaceBuffer = NULL;
+	struct ifaddrs* tmpAddr     = NULL;
+	void*           tmpAddrPtr  = NULL;
+	char            straddr     [INET_ADDRSTRLEN];
+
+	int ret = getifaddrs( &ifaceBuffer );
+	if( ret != 0 ) return;
+
+	for( struct ifaddrs* i=ifaceBuffer; i != NULL; i=i->ifa_next ) {
+
+		// ignore devices that are disabled or have no ip
+		if(i == NULL) continue;
+		struct sockaddr* addr = i->ifa_addr;
+
+		// only look at IPv4, not IPv6 addresses
+		if (addr->sa_family == AF_INET) {
+			if (addr==NULL) continue;
+			tmpAddrPtr= &((struct sockaddr_in*)addr)->sin_addr;
+			inet_ntop( i->ifa_addr->sa_family, tmpAddrPtr, straddr, sizeof(straddr) );
+			ip_address ip = straddr;
+			if (ip.is_loopback()) continue;
+			address_vf vf = ip;
+			endpoints.add( vf );
+		} else
+		if (addr->sa_family == AF_INET6) {
+			if (addr==NULL) continue;
+			tmpAddrPtr= &((struct sockaddr_in6*)addr)->sin6_addr;
+			inet_ntop( i->ifa_addr->sa_family, tmpAddrPtr, straddr, sizeof(straddr) );
+			ip_address ip = straddr;
+			if (ip.is_loopback()) continue;
+			address_vf vf = ip;
+			endpoints.add( vf );
+		} else
+		if (i->ifa_name[0]=='p' && i->ifa_name[1]=='a' && i->ifa_name[2]=='n') {
+			mac_address mac = getMacFromIF(i->ifa_name);
+			address_vf vf = mac;
+			endpoints.add( vf );
+		}
+	}
+}
+
+#endif /* ADDRESSDISCOVERY_HPP_ */
Index: source/ariba/communication/networkinfo/AddressInformation.cpp
===================================================================
--- source/ariba/communication/networkinfo/AddressInformation.cpp	(revision 4843)
+++ source/ariba/communication/networkinfo/AddressInformation.cpp	(revision 5284)
@@ -39,6 +39,13 @@
 #include "AddressInformation.h"
 
+#include <ifaddrs.h>
+
+#include <boost/asio/ip/address.hpp>
+#include <boost/asio/ip/address_v4.hpp>
+
 namespace ariba {
 namespace communication {
+
+using namespace ariba::addressing;
 
 AddressInformation::AddressInformation(){
@@ -52,32 +59,29 @@
 	AddressList retlist;
 
-	//
 	// gather transport addresses
-	//
-
 	struct ifaddrs* ifap;
 	getifaddrs( &ifap );
 
 	for( struct ifaddrs* p = ifap; p != NULL; p=p->ifa_next ){
+
+		// no name set? ->continue
 		if( interface.name.compare(string(p->ifa_name)) != 0 ) continue;
 
-		// TODO: currently only handle IPv4
+		// handle IPv4 entry
 		struct sockaddr* addr = p->ifa_addr;
-		if( addr->sa_family != AF_INET ) continue;
+		if( addr->sa_family == AF_INET ) {
+			// get address
+			const struct sockaddr_in& ipv4 = (const struct sockaddr_in&)*addr;
+			boost::asio::ip::address_v4::bytes_type bytes;
+			for( int i=0; i<4; i++ )
+				bytes[i] = (ipv4.sin_addr.s_addr >> (24-i*8)) & 0xff;
 
-		const struct sockaddr_in& ipv4 = (const struct sockaddr_in&)*addr;
-		boost::asio::ip::address_v4::bytes_type bytes;
-		for( int i=0; i<4; i++ )
-			bytes[i] = (ipv4.sin_addr.s_addr >> (24-i*8)) & 0xff;
-
-		boost::asio::ip::address boost_addr = boost::asio::ip::address_v4( bytes );
-		retlist.push_back( IPv4Locator::fromString(boost_addr.to_string()) );
+			// add ipv4 address
+			boost::asio::ip::address boost_addr = boost::asio::ip::address_v4( bytes );
+			retlist.push_back( vcapsule<address_v>( ip_address(boost_addr) ) );
+		}
 	}
 
 	freeifaddrs( ifap );
-
-	//
-	// TODO: gather further addresses like MAC etc.
-	//
 
 	return retlist;
Index: source/ariba/communication/networkinfo/AddressInformation.h
===================================================================
--- source/ariba/communication/networkinfo/AddressInformation.h	(revision 4843)
+++ source/ariba/communication/networkinfo/AddressInformation.h	(revision 5284)
@@ -40,19 +40,17 @@
 #define __ADDRESS_INFORMATION_H
 
-#include <ifaddrs.h>
 #include <vector>
-#include <boost/asio/ip/address.hpp>
-#include <boost/asio/ip/address_v4.hpp>
+
 #include "ariba/communication/networkinfo/NetworkInterface.h"
-#include "ariba/communication/modules/network/ip/IPv4Locator.h"
-
-using std::vector;
-using ariba::communication::NetworkInterface;
-using ariba::communication::IPv4Locator;
+#include "ariba/utility/addressing/addressing.hpp"
 
 namespace ariba {
 namespace communication {
 
-typedef vector<IPv4Locator> AddressList; // TODO: make more general, not only ipv4
+using namespace std;
+using namespace ariba::addressing;
+
+/// a list of addresses
+typedef vector<address_v*> AddressList;
 
 class AddressInformation {
@@ -62,5 +60,4 @@
 
 	AddressList getAddresses(const NetworkInterface& interface);
-
 };
 
