Index: source/ariba/utility/bootstrap/BootstrapInformationCallback.h
===================================================================
--- source/ariba/utility/bootstrap/BootstrapInformationCallback.h	(revision 4758)
+++ source/ariba/utility/bootstrap/BootstrapInformationCallback.h	(revision 4836)
@@ -49,5 +49,5 @@
 class BootstrapInformationCallback {
 public:
-	virtual void onBootstrapServiceFound(string name, string info) = 0;
+	virtual void onBootstrapServiceFound(string name, string info1, string info2, string info3) = 0;
 };
 
Index: source/ariba/utility/bootstrap/BootstrapManager.cpp
===================================================================
--- source/ariba/utility/bootstrap/BootstrapManager.cpp	(revision 4758)
+++ source/ariba/utility/bootstrap/BootstrapManager.cpp	(revision 4836)
@@ -50,11 +50,4 @@
 
 BootstrapManager::~BootstrapManager(){
-
-	boost::mutex::scoped_lock lock( modulesMutex );
-
-	while( modules.size() > 0 ){
-		ModuleMap::iterator i = modules.begin();
-		unregisterModule( i->first );
-	}
 }
 
@@ -96,5 +89,6 @@
 }
 
-BootstrapManager::RegistrationResult BootstrapManager::unregisterModule(BootstrapManager::BootstrapType type){
+BootstrapManager::RegistrationResult BootstrapManager::unregisterModule(
+		BootstrapManager::BootstrapType type){
 
 	boost::mutex::scoped_lock lock( modulesMutex );
@@ -113,8 +107,32 @@
 }
 
-void BootstrapManager::onBootstrapServiceFound(string name, string info){
+BootstrapManager::RegistrationResult BootstrapManager::registerAllModules(){
+	RegistrationResult result = RegistrationSucceeded;
+
+	{ // multicast dns
+		RegistrationResult resone = RegistrationSucceeded;
+		resone = registerModule(BootstrapTypeMulticastDns);
+		if(resone != RegistrationSucceeded)
+			result = resone;
+	}
+
+	{ // todo
+		/*  ...   */
+	}
+
+	return result;
+}
+
+BootstrapManager::RegistrationResult BootstrapManager::unregisterAllModules(){
+	unregisterModule(BootstrapTypeMulticastDns);
+	/*  todo  ...  */
+
+	return RegistrationSucceeded;
+}
+
+void BootstrapManager::onBootstrapServiceFound(string name, string info1, string info2, string info3){
 
 	BOOST_FOREACH( BootstrapInformationCallback* callback, callbacks ){
-		callback->onBootstrapServiceFound(name, info);
+		callback->onBootstrapServiceFound(name, info1, info2, info3);
 	}
 }
@@ -132,5 +150,5 @@
 }
 
-void BootstrapManager::publish(string name, string info){
+void BootstrapManager::publish(string name, string info1, string info2, string info3){
 	boost::mutex::scoped_lock lock( modulesMutex );
 
@@ -141,9 +159,11 @@
 		logging_info("bootstrap manager publishing service "
 				<< name << " on module " << i->second->getName());
-		i->second->publishService(name, info);
+		i->second->publishService(name, info1, info2, info3);
 	}
 }
 
 void BootstrapManager::revoke(string name){
+	boost::mutex::scoped_lock lock( modulesMutex );
+
 	ModuleMap::iterator i = modules.begin();
 	ModuleMap::iterator iend = modules.end();
Index: source/ariba/utility/bootstrap/BootstrapManager.h
===================================================================
--- source/ariba/utility/bootstrap/BootstrapManager.h	(revision 4758)
+++ source/ariba/utility/bootstrap/BootstrapManager.h	(revision 4836)
@@ -73,5 +73,5 @@
 
 	enum BootstrapType {
-		BootstrapTypeMulticastDns,
+		BootstrapTypeMulticastDns,	// use mDNS bootstrapping
 	};
 
@@ -82,5 +82,7 @@
 	};
 
+	RegistrationResult registerAllModules();
 	RegistrationResult registerModule(BootstrapType type);
+	RegistrationResult unregisterAllModules();
 	RegistrationResult unregisterModule(BootstrapType type);
 
@@ -88,9 +90,9 @@
 	void unregisterCallback(BootstrapInformationCallback* _callback);
 
-	void publish(string name, string info);
+	void publish(string name, string info1, string info2, string info3);
 	void revoke(string name);
 
 protected:
-	virtual void onBootstrapServiceFound(string name, string info);
+	virtual void onBootstrapServiceFound(string name, string info1, string info2, string info3);
 
 private:
Index: source/ariba/utility/bootstrap/modules/BootstrapModule.h
===================================================================
--- source/ariba/utility/bootstrap/modules/BootstrapModule.h	(revision 4758)
+++ source/ariba/utility/bootstrap/modules/BootstrapModule.h	(revision 4836)
@@ -53,4 +53,5 @@
 	virtual ~BootstrapModule();
 
+	// the module must run asynchronously in its own thread.
 	virtual void start() = 0;
 	virtual void stop() = 0;
@@ -60,5 +61,5 @@
 	virtual bool isFunctional() = 0;
 
-	virtual void publishService(string name, string info) = 0;
+	virtual void publishService(string name, string info1, string info2, string info3) = 0;
 	virtual void revokeService(string name) = 0;
 
Index: source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp
===================================================================
--- source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp	(revision 4758)
+++ source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.cpp	(revision 4836)
@@ -46,9 +46,9 @@
 
 MulticastDns::MulticastDns(BootstrapInformationCallback* _callback) : BootstrapModule(_callback) {
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 	avahiclient = NULL;
 	avahipoll = NULL;
 	avahibrowser = NULL;
-  #endif // HAVE_LIBAVAHI_CLIENT
+  #endif // HAVE_AVAHI_CLIENT_CLIENT_H
 }
 
@@ -65,5 +65,5 @@
 
 bool MulticastDns::isFunctional(){
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 	return true;
   #else
@@ -73,5 +73,5 @@
 
 void MulticastDns::start(){
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 	int error = 0;
@@ -110,9 +110,9 @@
 	avahi_threaded_poll_start( avahipoll );
 
-  #endif // HAVE_LIBAVAHI_CLIENT
+  #endif // HAVE_AVAHI_CLIENT_CLIENT_H
 }
 
 void MulticastDns::stop(){
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 	//
@@ -144,9 +144,9 @@
 	avahipoll = NULL;
 
-  #endif // HAVE_LIBAVAHI_CLIENT
-}
-
-void MulticastDns::publishService(string name, string info){
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #endif // HAVE_AVAHI_CLIENT_CLIENT_H
+}
+
+void MulticastDns::publishService(string name, string info1, string info2, string info3){
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 	if(name.length() > 63){
@@ -198,5 +198,7 @@
 			NULL,					// host name of our machine, let avahi find out
 			3333,					// port number the service is on, just dummy, everything is encoded in TXT
-			info.c_str(),			// arbitrary info
+			info1.c_str(),			// arbitrary info
+			info2.c_str(),			// arbitrary info
+			info3.c_str(),			// arbitrary info
 			NULL);					// make that this is the last info field
 
@@ -219,9 +221,9 @@
 	avahi_threaded_poll_unlock(avahipoll);
 
-  #endif // HAVE_LIBAVAHI_CLIENT
+  #endif // HAVE_AVAHI_CLIENT_CLIENT_H
 }
 
 void MulticastDns::revokeService(string name){
-  #ifdef HAVE_LIBAVAHI_CLIENT
+  #ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 	avahi_threaded_poll_lock(avahipoll);
@@ -239,8 +241,8 @@
 	avahi_threaded_poll_unlock(avahipoll);
 
-  #endif // HAVE_LIBAVAHI_CLIENT
-}
-
-#ifdef HAVE_LIBAVAHI_CLIENT
+  #endif // HAVE_AVAHI_CLIENT_CLIENT_H
+}
+
+#ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 void MulticastDns::client_callback(AvahiClient* client, AvahiClientState state, void* userdata){
@@ -395,13 +397,32 @@
 
 			char addr[AVAHI_ADDRESS_STR_MAX];
-			char* text = NULL;
 
 			avahi_address_snprint(addr, sizeof(addr), address);
-			text = avahi_string_list_to_string(txt);
+
+			string info1 = "";
+			string info2 = "";
+			string info3 = "";
+
+			if(txt != NULL){
+				char* cinfo = avahi_string_list_to_string(txt);
+				info1 = cinfo;
+				avahi_free(cinfo);
+			}
+
+			if(txt != NULL && avahi_string_list_get_next(txt) != NULL){
+				char* cinfo = avahi_string_list_to_string( avahi_string_list_get_next(txt) );
+				info2 = cinfo;
+				avahi_free(cinfo);
+			}
+
+			if(txt != NULL && avahi_string_list_get_next(txt) != NULL){
+				char* cinfo = avahi_string_list_to_string( avahi_string_list_get_next(txt) );
+				info3 = cinfo;
+				avahi_free(cinfo);
+			}
 
 			if(obj != NULL && obj->callback != NULL)
-				obj->callback->onBootstrapServiceFound(name, text);
-
-			avahi_free( text );
+				obj->callback->onBootstrapServiceFound(name, info1, info2, info3);
+
 			break;
 	}
@@ -410,5 +431,5 @@
 }
 
-#endif // HAVE_LIBAVAHI_CLIENT
+#endif // HAVE_AVAHI_CLIENT_CLIENT_H
 
 }} //namespace ariba, utility
Index: source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h
===================================================================
--- source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h	(revision 4758)
+++ source/ariba/utility/bootstrap/modules/multicastdns/MulticastDns.h	(revision 4836)
@@ -42,5 +42,5 @@
 #include "ariba/config.h"
 
-#ifdef HAVE_LIBAVAHI_CLIENT
+#ifdef HAVE_AVAHI_CLIENT_CLIENT_H
   #include <avahi-client/client.h>
   #include <avahi-client/lookup.h>
@@ -51,5 +51,5 @@
   #include <avahi-common/error.h>
   #include <avahi-common/timeval.h>
-#endif
+#endif // HAVE_AVAHI_CLIENT_CLIENT_H
 
 #include <iostream>
@@ -80,5 +80,5 @@
 	virtual string getInformation();
 	virtual bool isFunctional();
-	virtual void publishService(string name, string info);
+	virtual void publishService(string name, string info1, string info2, string info3);
 	virtual void revokeService(string name);
 
@@ -86,5 +86,5 @@
 	static const string serviceType;
 
-#ifdef HAVE_LIBAVAHI_CLIENT
+#ifdef HAVE_AVAHI_CLIENT_CLIENT_H
 
 	AvahiClient*         avahiclient;
@@ -133,5 +133,5 @@
 			);
 
-#endif // HAVE_LIBAVAHI_CLIENT
+#endif // HAVE_AVAHI_CLIENT_CLIENT_H
 
 };
