Index: /configure.ac
===================================================================
--- /configure.ac	(revision 4721)
+++ /configure.ac	(revision 4733)
@@ -34,4 +34,5 @@
 AX_LOG4CXX
 AX_OPENSSL
+AX_AVAHI
 
 dnl Check for boost
Index: /m4/ax_avahi.m4
===================================================================
--- /m4/ax_avahi.m4	(revision 4733)
+++ /m4/ax_avahi.m4	(revision 4733)
@@ -0,0 +1,26 @@
+# SYNOPSIS
+#
+#   AX_AVAHI()
+#
+# DESCRIPTION
+#
+#   Test for the Avahi library
+#
+# LAST MODIFICATION
+#
+#   2009-07-03
+
+AC_DEFUN([AX_AVAHI],
+[
+  AC_CHECK_HEADERS(avahi-client/client.h,,
+    [AC_MSG_ERROR([Avahi Client Library not found. Install libavahi-client-dev])])
+    
+  AC_CHECK_HEADERS(avahi-common/timeval.h,,
+    [AC_MSG_ERROR([Avahi Common Library not found. Install libavahi-common-dev])])
+    
+  AC_CHECK_LIB([avahi-client],[avahi_entry_group_new],,
+    [AC_MSG_ERROR([Avahi Client Library not found. Install libavahi-client-dev])])
+    
+  AC_CHECK_LIB([avahi-common],[avahi_free],,
+    [AC_MSG_ERROR([Avahi Client Library not found. Install libavahi-client-dev])])
+])
Index: /sample/pingpong/main.cpp
===================================================================
--- /sample/pingpong/main.cpp	(revision 4721)
+++ /sample/pingpong/main.cpp	(revision 4733)
@@ -6,40 +6,4 @@
 using ariba::utility::StartupWrapper;
 using ariba::application::pingpong::PingPong;
-
-//*************************************************
-/*
-#include <iostream>
-#include <boost/cstdint.hpp>
-
-using std::cout;
-using std::endl;
-
-void debugging(){
-
-	cout << "int" << " - \t \t" << sizeof(int) << endl;
-	cout << "unsigned int" << " - \t \t" << sizeof(unsigned int) << endl;
-	cout << "long" << " - \t \t" << sizeof(long) << endl;
-	cout << "unsigned long" << " - \t \t" << sizeof(unsigned long) << endl;
-	cout << "char" << " - \t \t" << sizeof(char) << endl;
-	cout << "unsigned char" << " - \t \t" << sizeof(unsigned char) << endl;
-	cout << "short" << " - \t \t" << sizeof(short) << endl;
-	cout << "unsigned short" << " - \t \t" << sizeof(unsigned short) << endl;
-	cout << "uint16_t" << " - \t \t" << sizeof(uint16_t) << endl;
-	cout << "uint8_t" << " - \t \t" << sizeof(uint8_t) << endl;
-	cout << "uint32_t" << " - \t \t" << sizeof(uint32_t) << endl;
-	cout << "int8_t" << " - \t \t" << sizeof(int8_t) << endl;
-	cout << "int16_t" << " - \t \t" << sizeof(int16_t) << endl;
-	cout << "int32_t" << " - \t \t" << sizeof(int32_t) << endl;
-	cout << "boost::uint16_t" << " - \t \t" << sizeof(boost::uint16_t) << endl;
-	cout << "boost::uint8_t" << " - \t \t" << sizeof(boost::uint8_t) << endl;
-	cout << "boost::uint32_t" << " - \t \t" << sizeof(boost::uint32_t) << endl;
-	cout << "boost::int8_t" << " - \t \t" << sizeof(boost::int8_t) << endl;
-	cout << "boost::int16_t" << " - \t \t" << sizeof(boost::int16_t) << endl;
-	cout << "boost::int32_t" << " - \t \t" << sizeof(boost::int32_t) << endl;
-
-}
-*/
-//*************************************************
-
 
 int main( int argc, char** argv ) {
@@ -63,2 +27,15 @@
 	return 0;
 }
+
+/* Chris's debugging stuff
+
+	#include "ariba/utility/bootstrap/BootstrapManager.h"
+	using ariba::utility::BootstrapManager;
+
+	StartupWrapper::startSystem();
+	BootstrapManager::instance().registerModule(
+			BootstrapManager::BootstrapTypeMulticastDns);
+	BootstrapManager::instance().publish("testname", "testinfo");
+	getchar();
+	return 0;
+*/
Index: /source/ariba/Makefile.am
===================================================================
--- /source/ariba/Makefile.am	(revision 4721)
+++ /source/ariba/Makefile.am	(revision 4733)
@@ -327,4 +327,17 @@
   utility/serialization.h
 
+#------------> utility :: bootstrap
+
+libariba_la_SOURCES += \
+  utility/bootstrap/BootstrapManager.cpp \
+  utility/bootstrap/modules/BootstrapModule.cpp \
+  utility/bootstrap/modules/multicastdns/MulticastDns.cpp
+  
+nobase_libariba_la_HEADERS += \
+  utility/bootstrap/BootstrapManager.h \
+  utility/bootstrap/BootstrapInformationCallback.h \
+  utility/bootstrap/modules/BootstrapModule.h \
+  utility/bootstrap/modules/multicastdns/MulticastDns.h
+
 #------------> utility :: configuration
 
Index: /source/ariba/utility/bootstrap/BootstrapInformationCallback.h
===================================================================
--- /source/ariba/utility/bootstrap/BootstrapInformationCallback.h	(revision 4733)
+++ /source/ariba/utility/bootstrap/BootstrapInformationCallback.h	(revision 4733)
@@ -0,0 +1,56 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#ifndef __BOOTSTRAP_INFORMATION_CALLBACK_H
+#define __BOOTSTRAP_INFORMATION_CALLBACK_H
+
+#include <string>
+
+using std::string;
+
+namespace ariba {
+namespace utility {
+
+class BootstrapInformationCallback {
+public:
+	virtual void onBootstrapServiceFound(string name, string info) = 0;
+};
+
+}} //namespace ariba, utility
+
+#endif // __BOOTSTRAP_INFORMATION_CALLBACK_H
Index: /source/ariba/utility/bootstrap/BootstrapManager.cpp
===================================================================
--- /source/ariba/utility/bootstrap/BootstrapManager.cpp	(revision 4733)
+++ /source/ariba/utility/bootstrap/BootstrapManager.cpp	(revision 4733)
@@ -0,0 +1,144 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+
+#include "BootstrapManager.h"
+#include "ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h"
+
+namespace ariba {
+namespace utility {
+
+use_logging_cpp(BootstrapManager);
+
+BootstrapManager::BootstrapManager(){
+}
+
+BootstrapManager::~BootstrapManager(){
+}
+
+BootstrapManager::RegistrationResult BootstrapManager::registerModule(BootstrapManager::BootstrapType type){
+
+	boost::mutex::scoped_lock lock( modulesMutex );
+
+	ModuleMap::iterator i = modules.find(type);
+	if( i != modules.end() ){
+		logging_error("bootstrap module " << i->second->getName() << " already registered");
+		return RegistrationFailed;
+	}
+
+	BootstrapModule* module = NULL;
+	string servicetype = "_spovnet._tcp";
+
+	switch(type){
+		case BootstrapTypeMulticastDns:
+			module = new MulticastDns(servicetype, this);
+			break;
+	}
+
+	if( module == NULL){
+		logging_error("bootstrap module for type " << type << " not found");
+		return RegistrationNotSupported;
+	}
+
+	if( !module->isFunctional() ){
+		logging_error("bootstrap module " << module->getName() << " is not functional");
+		delete module;
+		return RegistrationFailed;
+	}
+
+	logging_debug("bootstrap module " << module->getName() << " registered");
+
+	module->start();
+	modules.insert( std::make_pair(type, module) );
+
+	return RegistrationSucceeded;
+}
+
+BootstrapManager::RegistrationResult BootstrapManager::unregisterModule(BootstrapManager::BootstrapType type){
+
+	boost::mutex::scoped_lock lock( modulesMutex );
+
+	ModuleMap::iterator i = modules.find(type);
+	if( i != modules.end() ) return RegistrationFailed;
+
+	BootstrapModule* module = i->second;
+	module->stop();
+	delete module;
+	modules.erase(i);
+
+	return RegistrationSucceeded;
+}
+
+void BootstrapManager::onBootstrapServiceFound(string name, string info){
+
+	BOOST_FOREACH( BootstrapInformationCallback* callback, callbacks ){
+		callback->onBootstrapServiceFound(name, info);
+	}
+}
+
+void BootstrapManager::registerCallback(BootstrapInformationCallback* _callback){
+	Callbacks::iterator i = find( callbacks.begin(), callbacks.end(), _callback );
+	if( i == callbacks.end() )
+		callbacks.push_back(_callback);
+}
+
+void BootstrapManager::unregisterCallback(BootstrapInformationCallback* _callback){
+	Callbacks::iterator i = find( callbacks.begin(), callbacks.end(), _callback );
+	if( i != callbacks.end() )
+		callbacks.erase(i);
+}
+
+void BootstrapManager::publish(string name, string info){
+	boost::mutex::scoped_lock lock( modulesMutex );
+
+	ModuleMap::iterator i = modules.begin();
+	ModuleMap::iterator iend = modules.end();
+
+	for( ; i != iend; i++ )
+		i->second->publishService(name, info);
+}
+
+void BootstrapManager::revoke(string name){
+	ModuleMap::iterator i = modules.begin();
+	ModuleMap::iterator iend = modules.end();
+
+	for( ; i != iend; i++ )
+		i->second->revokeService(name);
+}
+
+}} //namespace ariba, utility
Index: /source/ariba/utility/bootstrap/BootstrapManager.h
===================================================================
--- /source/ariba/utility/bootstrap/BootstrapManager.h	(revision 4733)
+++ /source/ariba/utility/bootstrap/BootstrapManager.h	(revision 4733)
@@ -0,0 +1,110 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#ifndef __BOOTSTRAP_MANAGER_H
+#define __BOOTSTRAP_MANAGER_H
+
+#include <map>
+#include <algorithm>
+#include <vector>
+#include <string>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/utility.hpp>
+#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+#include "ariba/utility/logging/Logging.h"
+#include "ariba/utility/bootstrap/modules/BootstrapModule.h"
+#include "ariba/utility/bootstrap/BootstrapInformationCallback.h"
+
+using std::string;
+using std::map;
+using std::find;
+using std::vector;
+
+namespace ariba {
+namespace utility {
+
+class BootstrapManager : private boost::noncopyable, private BootstrapInformationCallback {
+	use_logging_h(BootstrapManager);
+	friend class BootstrapModule;
+public:
+
+	static BootstrapManager& instance() {
+		static BootstrapManager _inst;
+		return _inst;
+	}
+
+	enum BootstrapType {
+		BootstrapTypeMulticastDns,
+	};
+
+	enum RegistrationResult {
+		RegistrationSucceeded,
+		RegistrationNotSupported,
+		RegistrationFailed,
+	};
+
+	RegistrationResult registerModule(BootstrapType type);
+	RegistrationResult unregisterModule(BootstrapType type);
+
+	void registerCallback(BootstrapInformationCallback* _callback);
+	void unregisterCallback(BootstrapInformationCallback* _callback);
+
+	void publish(string name, string info);
+	void revoke(string name);
+
+protected:
+	virtual void onBootstrapServiceFound(string name, string info);
+
+private:
+	BootstrapManager();
+	~BootstrapManager();
+
+	typedef map<BootstrapType, BootstrapModule*> ModuleMap;
+	ModuleMap modules;
+	boost::mutex modulesMutex;
+
+	typedef vector<BootstrapInformationCallback*> Callbacks;
+	Callbacks callbacks;
+};
+
+}} //namespace ariba, utility
+
+#endif // __BOOTSTRAP_MANAGER_H
Index: /source/ariba/utility/bootstrap/modules/BootstrapModule.cpp
===================================================================
--- /source/ariba/utility/bootstrap/modules/BootstrapModule.cpp	(revision 4733)
+++ /source/ariba/utility/bootstrap/modules/BootstrapModule.cpp	(revision 4733)
@@ -0,0 +1,51 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#include "BootstrapModule.h"
+
+namespace ariba {
+namespace utility {
+
+BootstrapModule::BootstrapModule(string type, BootstrapInformationCallback* _callback)
+	: callback(_callback){
+}
+
+BootstrapModule::~BootstrapModule(){
+}
+
+}} //namespace ariba, utility
Index: /source/ariba/utility/bootstrap/modules/BootstrapModule.h
===================================================================
--- /source/ariba/utility/bootstrap/modules/BootstrapModule.h	(revision 4733)
+++ /source/ariba/utility/bootstrap/modules/BootstrapModule.h	(revision 4733)
@@ -0,0 +1,72 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#ifndef __BOOTSTRAP_MODULE
+#define __BOOTSTRAP_MODULE
+
+#include <string>
+#include "ariba/utility/bootstrap/BootstrapInformationCallback.h"
+
+using std::string;
+
+namespace ariba {
+namespace utility {
+
+class BootstrapModule {
+public:
+	BootstrapModule(string type, BootstrapInformationCallback* _callback);
+	virtual ~BootstrapModule();
+
+	virtual void start() = 0;
+	virtual void stop() = 0;
+
+	virtual string getName() = 0;
+	virtual string getInformation() = 0;
+	virtual bool isFunctional() = 0;
+
+	virtual void publishService(string name, string info) = 0;
+	virtual void revokeService(string name) = 0;
+
+protected:
+	BootstrapInformationCallback* callback;
+
+};
+
+}} //namespace ariba, utility
+
+#endif // __BOOTSTRAP_MODULE
Index: /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp
===================================================================
--- /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp	(revision 4733)
+++ /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp	(revision 4733)
@@ -0,0 +1,340 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#include "MulticastDns.h"
+
+namespace ariba {
+namespace utility {
+
+use_logging_cpp(MulticastDns);
+
+MulticastDns::MulticastDns(string type, BootstrapInformationCallback* _callback)
+	: BootstrapModule(type, _callback), serviceType(type){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+	avahiclient = NULL;
+	avahigroup = NULL;
+	avahipoll = NULL;
+	avahibrowser = NULL;
+  #endif // HAVE_LIBAVAHI_CLIENT
+}
+
+MulticastDns::~MulticastDns(){
+}
+
+string MulticastDns::getName(){
+	return "MulticastDns";
+}
+
+string MulticastDns::getInformation(){
+	return "bootstrap module based on multicast-dns using the avahi library";
+}
+
+bool MulticastDns::isFunctional(){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+	return true;
+  #else
+	return false;
+  #endif
+}
+
+void MulticastDns::start(){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+
+	int error = 0;
+
+	// create a new avahi polling thread
+	avahipoll = avahi_threaded_poll_new();
+	assert( avahipoll != NULL );
+
+	// create a new avahi client
+	avahiclient = avahi_client_new( avahi_threaded_poll_get(avahipoll),
+			(AvahiClientFlags)0, MulticastDns::client_callback, this, &error );
+	assert( avahiclient != NULL );
+
+	// block the event loop
+	avahi_threaded_poll_lock( avahipoll );
+
+	// create the service browser
+	avahibrowser = avahi_service_browser_new(
+			avahiclient, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
+			serviceType.c_str(), NULL,
+			(AvahiLookupFlags)0, MulticastDns::browse_callback, this);
+
+	//unblock the event loop and let it run
+	avahi_threaded_poll_unlock( avahipoll );
+	avahi_threaded_poll_start( avahipoll );
+
+  #endif // HAVE_LIBAVAHI_CLIENT
+}
+
+void MulticastDns::stop(){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+
+	avahi_threaded_poll_stop( avahipoll );
+	avahi_service_browser_free( avahibrowser );
+	if( avahigroup != NULL ) avahi_entry_group_free( avahigroup );
+	avahi_client_free( avahiclient );
+	avahi_threaded_poll_free( avahipoll );
+
+  #endif // HAVE_LIBAVAHI_CLIENT
+}
+
+void MulticastDns::publishService(string name, string info){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+
+	avahi_threaded_poll_lock(avahipoll);
+	assert( avahiclient != NULL );
+
+	char* n = NULL;
+	int ret = 0;
+
+	if( avahigroup == NULL){
+		avahigroup = avahi_entry_group_new(avahiclient, MulticastDns::entry_group_callback, this);
+
+		if(avahigroup == NULL) {
+			logging_warn("avahi_entry_group_new failed " << avahi_strerror(avahi_client_errno(avahiclient)));
+			avahi_threaded_poll_quit(avahipoll);
+			return;
+		}
+	}
+
+	logging_debug("avahi adding service " << name);
+
+	ret = avahi_entry_group_add_service(
+			avahigroup, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, (AvahiPublishFlags)0,
+			name.c_str(), serviceType.c_str(), NULL, NULL, 0, info.c_str(), NULL);
+
+	if( ret < 0 ){
+
+		logging_warn("failed to add service " << name << ": " << avahi_strerror(ret));
+		avahi_threaded_poll_quit(avahipoll);
+		return;
+
+	}
+
+	// tell the server to register the service
+	ret = avahi_entry_group_commit(avahigroup);
+	if(ret < 0) {
+		logging_warn("failed to commit entry group: " << avahi_strerror(ret));
+		avahi_threaded_poll_quit(avahipoll);
+	}
+
+	avahi_threaded_poll_unlock(avahipoll);
+
+  #endif // HAVE_LIBAVAHI_CLIENT
+}
+
+void MulticastDns::revokeService(string name){
+  #ifdef HAVE_LIBAVAHI_CLIENT
+
+	if (avahigroup)
+		avahi_entry_group_reset(avahigroup);
+
+  #endif // HAVE_LIBAVAHI_CLIENT
+}
+
+#ifdef HAVE_LIBAVAHI_CLIENT
+
+void MulticastDns::client_callback(AvahiClient* client, AvahiClientState state, void* userdata){
+
+	MulticastDns* obj = (MulticastDns*)userdata;
+	assert( obj != NULL );
+
+    switch (state) {
+        case AVAHI_CLIENT_S_RUNNING:
+
+        	// server has startup successfully and registered its host
+            // name on the network, so it's time to create our services
+
+        	logging_debug("avahi client is running");
+            break;
+
+        case AVAHI_CLIENT_FAILURE:
+
+        	logging_warn( "avahi client failure " << avahi_strerror(avahi_client_errno(client)) );
+            avahi_threaded_poll_quit(obj->avahipoll);
+
+            break;
+
+        case AVAHI_CLIENT_S_COLLISION:
+
+        	logging_warn("avahi client collision");
+        	break;
+
+        case AVAHI_CLIENT_S_REGISTERING:
+
+            //
+        	// the server records are now being established. This
+            // might be caused by a host name change. We need to wait
+            // for our own records to register until the host name is
+            // properly esatblished
+        	//
+
+            if( obj->avahigroup != NULL )
+                avahi_entry_group_reset(obj->avahigroup);
+
+            break;
+
+        case AVAHI_CLIENT_CONNECTING:
+            break;
+    }
+}
+
+void MulticastDns::entry_group_callback(AvahiEntryGroup* group, AvahiEntryGroupState state, void* userdata){
+
+	AvahiClient* client = avahi_entry_group_get_client( group );
+	assert( client != NULL);
+
+	MulticastDns* obj = (MulticastDns*)userdata;
+	assert(obj != NULL);
+	obj->avahigroup = group;
+
+	//
+	// called whenever the entry group state changes
+	//
+
+	switch(state) {
+		case AVAHI_ENTRY_GROUP_ESTABLISHED:
+
+			// entry group has been established successfully
+			logging_debug( "service entry group successfully established" );
+			break;
+
+		case AVAHI_ENTRY_GROUP_COLLISION:
+
+			// service name collision
+			logging_warn("service name collision for name");
+			break;
+
+		case AVAHI_ENTRY_GROUP_FAILURE:
+
+			logging_warn("service group failure: " << avahi_strerror(avahi_client_errno(client)));
+			avahi_threaded_poll_quit(obj->avahipoll);
+
+			break;
+
+		case AVAHI_ENTRY_GROUP_UNCOMMITED:
+			break;
+
+		case AVAHI_ENTRY_GROUP_REGISTERING:
+			break;
+	} //switch(state)
+}
+
+void MulticastDns::browse_callback(AvahiServiceBrowser* browser, AvahiIfIndex interface,
+		AvahiProtocol protocol, AvahiBrowserEvent event, const char* name,
+		const char* type, const char* domain, AvahiLookupResultFlags flags, void* userdata){
+
+	AvahiClient* client = avahi_service_browser_get_client(browser);
+	MulticastDns* obj = (MulticastDns*)userdata;
+
+	assert( client != NULL);
+	assert( obj != NULL );
+
+	switch (event) {
+		case AVAHI_BROWSER_FAILURE:
+
+			logging_warn("avahi browser failure " << avahi_strerror(avahi_client_errno(client)));
+			avahi_threaded_poll_quit( obj->avahipoll );
+
+			break;
+
+		case AVAHI_BROWSER_NEW:
+
+			if (!(avahi_service_resolver_new(client,
+					interface, protocol, name, type, domain,
+					AVAHI_PROTO_UNSPEC, (AvahiLookupFlags)0,
+					MulticastDns::resolve_callback, obj))){
+				logging_warn( "failed to resolve service " << name << ", error " << avahi_strerror(avahi_client_errno(client)));
+			}
+
+			break;
+
+		case AVAHI_BROWSER_REMOVE:
+			break;
+
+		case AVAHI_BROWSER_ALL_FOR_NOW:
+			break;
+
+		case AVAHI_BROWSER_CACHE_EXHAUSTED:
+			break;
+	}
+}
+
+void MulticastDns::resolve_callback(AvahiServiceResolver* resolver, AvahiIfIndex interface,
+		AvahiProtocol protocol, AvahiResolverEvent event, const char *name,
+		const char* type, const char* domain, const char* host_name,
+		const AvahiAddress* address, uint16_t port, AvahiStringList* txt,
+		AvahiLookupResultFlags flags, void* userdata){
+
+	AvahiClient* client = avahi_service_resolver_get_client(resolver);
+	MulticastDns* obj = (MulticastDns*)userdata;
+
+	assert( client != NULL );
+	assert( obj  != NULL );
+
+	switch(event) {
+		case AVAHI_RESOLVER_FAILURE:
+
+			logging_warn("resolver failed to resolve service " << name << ", error " << avahi_strerror(avahi_client_errno(client)));
+			break;
+
+		case AVAHI_RESOLVER_FOUND: {
+
+			char a[AVAHI_ADDRESS_STR_MAX];
+			char* t = NULL;
+
+			avahi_address_snprint(a, sizeof(a), address);
+			t = avahi_string_list_to_string(txt);
+
+			if(obj != NULL && obj->callback != NULL){
+				obj->callback->onBootstrapServiceFound(name, t);
+				//foundNewService(name, type, domain, host_name, (int)port, a, t);
+			}
+
+			avahi_free( resolver );
+			break;
+		}
+	}
+
+	avahi_service_resolver_free( resolver );
+}
+
+#endif // HAVE_LIBAVAHI_CLIENT
+
+}} //namespace ariba, utility
Index: /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h
===================================================================
--- /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h	(revision 4733)
+++ /source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h	(revision 4733)
@@ -0,0 +1,134 @@
+// [License]
+// The Ariba-Underlay Copyright
+//
+// Copyright (c) 2008-2009, Institute of Telematics, UniversitÃ€t Karlsruhe (TH)
+//
+// Institute of Telematics
+// UniversitÃ€t Karlsruhe (TH)
+// Zirkel 2, 76128 Karlsruhe
+// Germany
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The views and conclusions contained in the software and documentation
+// are those of the authors and should not be interpreted as representing
+// official policies, either expressed or implied, of the Institute of
+// Telematics.
+// [License]
+
+#ifndef __MULTICAST_DNS_H
+#define __MULTICAST_DNS_H
+
+#include "ariba/config.h"
+
+#ifdef HAVE_LIBAVAHI_CLIENT
+  #include <avahi-client/client.h>
+  #include <avahi-client/lookup.h>
+  #include <avahi-client/publish.h>
+  #include <avahi-common/alternative.h>
+  #include <avahi-common/thread-watch.h>
+  #include <avahi-common/malloc.h>
+  #include <avahi-common/error.h>
+  #include <avahi-common/timeval.h>
+#endif
+
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
+#include <iostream>
+#include <string>
+#include "ariba/utility/bootstrap/modules/BootstrapModule.h"
+#include "ariba/utility/logging/Logging.h"
+
+namespace ariba {
+namespace utility {
+
+class MulticastDns : public BootstrapModule {
+	use_logging_h(MulticastDns);
+public:
+	MulticastDns(string type, BootstrapInformationCallback* _callback);
+	virtual ~MulticastDns();
+
+	virtual void start();
+	virtual void stop();
+
+	virtual string getName();
+	virtual string getInformation();
+	virtual bool isFunctional();
+	virtual void publishService(string name, string info);
+	virtual void revokeService(string name);
+
+private:
+	string serviceType;
+
+#ifdef HAVE_LIBAVAHI_CLIENT
+
+	AvahiClient*         avahiclient;
+	AvahiEntryGroup*     avahigroup;
+	AvahiThreadedPoll*   avahipoll;
+	AvahiServiceBrowser* avahibrowser;
+
+	static void client_callback(
+			AvahiClient* client,
+			AvahiClientState state,
+			void* userdata
+			);
+
+	static void entry_group_callback(
+			AvahiEntryGroup* group,
+			AvahiEntryGroupState state,
+			void* userdata);
+
+	static void browse_callback(
+			AvahiServiceBrowser* browser,
+			AvahiIfIndex interface,
+			AvahiProtocol protocol,
+			AvahiBrowserEvent event,
+			const char* name,
+			const char* type,
+			const char* domain,
+			AvahiLookupResultFlags flags,
+			void* userdata);
+
+	static void resolve_callback(
+			AvahiServiceResolver* resolver,
+			AvahiIfIndex interface,
+			AvahiProtocol protocol,
+			AvahiResolverEvent event,
+			const char* name,
+			const char* type,
+			const char* domain,
+			const char* host_name,
+			const AvahiAddress* address,
+			uint16_t port,
+			AvahiStringList* txt,
+			AvahiLookupResultFlags flags,
+			void* userdata
+			);
+
+#endif // HAVE_LIBAVAHI_CLIENT
+
+};
+
+}} //namespace ariba, utility
+
+#endif // __MULTICAST_DNS_H
