diff --git a/src/gui/guiframework.cpp b/src/gui/guiframework.cpp
index 39264313810b2e7c753a46b1eeaf1a5c9755bc53..aea606107032d80d7ae3e37bf87edade213aaae8 100644
--- a/src/gui/guiframework.cpp
+++ b/src/gui/guiframework.cpp
@@ -120,24 +120,16 @@ GuiFramework::saveConfig (void)
 	return Manager::instance().saveConfig();
 }
 
-int 
+bool 
 GuiFramework::registerVoIPLink (void)
 {
-	if (Manager::instance().registerVoIPLink()) {
-		return 1;
-	} else {
-		return 0;
-	}
+  return Manager::instance().registerVoIPLink();
 }
 
-int 
+bool 
 GuiFramework::unregisterVoIPLink (void)
 {
-	if (Manager::instance().unregisterVoIPLink()) {
-		return 1;
-	} else {
-		return 0;
-	}
+  return Manager::instance().unregisterVoIPLink();
 }
 
 bool 
diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h
index 6b46a9bc81fab975daae16c333ce35f55b3ca20d..a823eb3e56e47c55abead6615f6f53c6cb62cd01 100644
--- a/src/gui/guiframework.h
+++ b/src/gui/guiframework.h
@@ -50,10 +50,8 @@ public:
 	virtual void setup() = 0;
   virtual void sendMessage(const std::string& code, const std::string& seqId, TokenList& arg) = 0;
   virtual void sendCallMessage(const std::string& code, 
-  const std::string& sequenceId, 
-  CALLID id, 
-  TokenList arg) = 0;
-
+  const std::string& sequenceId, CALLID id, TokenList arg) = 0;
+  virtual void sendRegistrationState(bool state) = 0;
   virtual void callFailure(CALLID id) = 0;
 
 	/* Child class to parent class */
@@ -68,10 +66,10 @@ public:
 	void unmute ();
 	int refuseCall (CALLID id);
 
-	bool saveConfig (void);
-	int registerVoIPLink (void);
-	int unregisterVoIPLink (void);
-	bool sendDtmf (CALLID id, char code);
+  bool saveConfig(void);
+  bool registerVoIPLink(void);
+  bool unregisterVoIPLink(void);
+  bool sendDtmf (CALLID id, char code);
   bool playDtmf (char code);
   bool playTone ();
   bool stopTone ();
diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp
index 2a6625b6a4ec3b692fc4db47a5af060eb325aefc..f59f387e1f6a7a8ca1004ce48c4a0abc0e7ba361 100644
--- a/src/gui/server/guiserverimpl.cpp
+++ b/src/gui/server/guiserverimpl.cpp
@@ -428,6 +428,15 @@ GUIServerImpl::sendVoiceNbMessage(const std::string& nb_msg)
   _requestManager.sendResponse(ResponseMessage("020", _getEventsSequenceId, nb_msg));
 }
 
+void
+GUIServerImpl::sendRegistrationState(bool state) 
+{
+  if (state == true) {
+  _requestManager.sendResponse(ResponseMessage("003", _getEventsSequenceId, "Registration succeed"));
+  } else {
+  _requestManager.sendResponse(ResponseMessage("004", _getEventsSequenceId, "Registration failed"));
+  }
+}
 void
 GUIServerImpl::setup() 
 {
diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h
index 836dc286572ec77aba044f4237084984322ba812..18172cb462a745de82eca32c937bb8774249df85 100644
--- a/src/gui/server/guiserverimpl.h
+++ b/src/gui/server/guiserverimpl.h
@@ -49,9 +49,8 @@ public:
 	void displayTextMessage (CALLID id, const std::string& message);
 	void displayErrorText (CALLID id, const std::string& message);
 	void displayError (const std::string& error);
-	//void startVoiceMessageNotification (void);
-	//void stopVoiceMessageNotification (void);
   void sendVoiceNbMessage(const std::string& nb_msg);
+  void sendRegistrationState(bool state);
   void setup();
 
   void sendMessage(const std::string& code, const std::string& seqId, TokenList&
diff --git a/src/gui/server/requestconfig.cpp b/src/gui/server/requestconfig.cpp
index 3bfa954b5154c44fb872fd915f2740e1d610e963..490792b19bd64d8ed4bace940ec90ccd6f2b77be 100644
--- a/src/gui/server/requestconfig.cpp
+++ b/src/gui/server/requestconfig.cpp
@@ -241,3 +241,24 @@ RequestVolumeMic::execute()
   }
 }
 
+ResponseMessage
+RequestRegister::execute()
+{
+  if (GUIServer::instance().registerVoIPLink()) {
+    return message("200", "OK");
+  } else {
+    return message("500","Registration sending failed");
+  }
+}
+
+ResponseMessage
+RequestUnregister::execute()
+{
+  if (GUIServer::instance().unregisterVoIPLink()) {
+    return message("200", "OK");
+  } else {
+    return message("500","Unregistration sending failed");
+  }
+}
+
+
diff --git a/src/gui/server/requestconfig.h b/src/gui/server/requestconfig.h
index ddf82d4b6c747e9887a8ffeb87a01d5bd77d72f9..db50c74b77afaa427729d776227599343890b611 100644
--- a/src/gui/server/requestconfig.h
+++ b/src/gui/server/requestconfig.h
@@ -110,4 +110,16 @@ private:
   int _percent;
 };
 
+class RequestRegister : public RequestGlobal {
+public:
+  RequestRegister(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId, argList) {}
+  ResponseMessage execute();
+};
+
+class RequestUnregister : public RequestGlobal {
+public:
+  RequestUnregister(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId, argList) {}
+  ResponseMessage execute();
+};
+
 #endif // __REQUESTCONFIG_H__
diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp
index 8a978c503060d9cfa592e64a9258c34f31927916..6bbbf03c48704a3937ea7cf672813331a11d7b23 100644
--- a/src/gui/server/requestfactory.cpp
+++ b/src/gui/server/requestfactory.cpp
@@ -128,4 +128,6 @@ RequestFactory::registerAll() {
   registerRequest<RequestList>        ("list");
   registerRequest<RequestVolumeSpkr>  ("setspkrvolume");
   registerRequest<RequestVolumeMic>   ("setmicvolume");
+  registerRequest<RequestRegister>    ("register");
+  registerRequest<RequestUnregister>  ("unregister");
 }
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index 63aca562cfab670216a3d33c544eff80b2cd5eb9..de32f5a56476c2d40f8a2d05e39d7de0a1ee1186 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -500,39 +500,34 @@ ManagerImpl::initRegisterVoIPLink()
 /**
  * Initialize action (main thread)
  * Note that Registration is only send if STUN is not activated
- * @return 1 if setRegister is call without failure, else return 0
+ * @return true if setRegister is call without failure, else return false
  */
-int 
+bool
 ManagerImpl::registerVoIPLink (void)
 {
   _debug("Register VoIP Link\n");
-  int returnValue = 0;
-  // Cyrille always want to register to receive call | 2005-10-24 10:50
-  //if ( !useStun() ) {
-    if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() >= 0) {
-      returnValue = 1;
-      _registerState = REGISTERED;
-    } else {
-      _registerState = FAILED;
-    }
-  //} else {
-  //  _registerState = UNREGISTERED;
-  //}
+  int returnValue = false;
+  if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() >= 0) {
+    returnValue = true;
+    _registerState = REGISTERED;
+  } else {
+    _registerState = FAILED;
+  }
   return returnValue;
 }
 
 /**
  * Terminate action (main thread)
- * @return 1 if the unregister method is send correctly
+ * @return true if the unregister method is send correctly
  */
-int 
+bool 
 ManagerImpl::unregisterVoIPLink (void)
 {
   _debug("Unregister VoIP Link\n");
 	if (_voIPLinkVector.at(DFT_VOIP_LINK)->setUnregister() == 0) {
-		return 1;
+		return true;
 	} else {
-		return 0;
+		return false;
 	}
 }
 
@@ -903,6 +898,24 @@ ManagerImpl::stopVoiceMessageNotification (void)
   if (_gui) _gui->sendVoiceNbMessage(std::string("0"));
 }
 
+/**
+ * SipEvent Thread
+ */
+void 
+ManagerImpl::registrationSucceed()
+{
+  if (_gui) _gui->sendRegistrationState(true);
+}
+
+/**
+ * SipEvent Thread
+ */
+void 
+ManagerImpl::registrationFailed()
+{
+  if (_gui) _gui->sendRegistrationState(false);
+}
+
 /**
  * Multi Thread
  */
diff --git a/src/managerimpl.h b/src/managerimpl.h
index 5cb69410d18538dbe434c6681da2572420705828..0cf41d603a96e778ad4f7db7278c9905e0e4a427 100644
--- a/src/managerimpl.h
+++ b/src/managerimpl.h
@@ -131,8 +131,8 @@ public:
   int refuseCall (CALLID id);
 
   bool saveConfig (void);
-  int registerVoIPLink (void);
-  int unregisterVoIPLink (void);
+  bool registerVoIPLink (void);
+  bool unregisterVoIPLink (void);
 	
   /**
    * Handle choice of the DTMF-send-way
@@ -161,6 +161,9 @@ public:
   void startVoiceMessageNotification (const std::string& nb_msg);
   void stopVoiceMessageNotification (void);
 
+  void registrationSucceed();
+  void registrationFailed();
+
   // configuration function requests
   bool getEvents();
   bool getZeroconf(const std::string& sequenceId);
diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp
index 4f7cc7579bc06d0d548ab40354aa1eabbe641be5..ffb6239403cd093d9e2bd66d1daa199c5587aae8 100644
--- a/src/sipvoiplink.cpp
+++ b/src/sipvoiplink.cpp
@@ -179,6 +179,11 @@ SipVoIPLink::setRegister (void)
 {
   ManagerImpl& manager = Manager::instance();
 
+  if (_reg_id != -1) {
+    manager.displayError("Registration already sent. Try to unregister");
+    return -1;
+  }
+
   // all this will be inside the profil associate with the voip link
   std::string proxy = "sip:" + manager.getConfigString(SIGNALISATION, PROXY);
   std::string hostname = "sip:" + manager.getConfigString(SIGNALISATION, HOST_PART);
@@ -193,11 +198,6 @@ SipVoIPLink::setRegister (void)
     return -1;
   }
 
-  if (setAuthentication() == -1) {
-    _debug("No authentication\n");
-    return -1;
-  }
-
   _debug("REGISTER From: %s\n", from.data());
   osip_message_t *reg = NULL;
   eXosip_lock();
@@ -208,14 +208,20 @@ SipVoIPLink::setRegister (void)
     _reg_id = eXosip_register_build_initial_register ((char*)from.data(), 
 						      (char*)hostname.data(), NULL, EXPIRES_VALUE, &reg);
   }
+  eXosip_unlock();
   if (_reg_id < 0) {
-    eXosip_unlock();
     return -1;
-  }	
+  }
+
+  if (setAuthentication() == -1) {
+    _debug("No authentication\n");
+    return -1;
+  }
 
   osip_message_set_header (reg, "Event", "Registration");
   osip_message_set_header (reg, "Allow-Events", "presence");
 
+  eXosip_lock();
   int i = eXosip_register_send_register (_reg_id, reg);
   if (i == -2) {
     _debug("Cannot build registration, check the setup\n"); 
@@ -231,7 +237,6 @@ SipVoIPLink::setRegister (void)
 
   // subscribe to message one time?
   // subscribeMessageSummary();
-
   _registrationSend = true;
   return i;
 }
@@ -254,11 +259,17 @@ SipVoIPLink::setUnregister (void)
       _debug("UNREGISTER\n");
       i = eXosip_register_build_register (_reg_id, 0, &reg);
     }
-    if (_reg_id < 0) {
-      eXosip_unlock();
+    eXosip_unlock();
+    if (i < 0) {
       return -1;
-    }	
+    }
+
+    if (setAuthentication() == -1) {
+      _debug("No authentication\n");
+      return -1;
+    }
 
+    eXosip_lock();
     i = eXosip_register_send_register (_reg_id, reg);
     if (i == -2) {
       _debug("(unregister) Cannot build registration, check the setup\n"); 
@@ -267,10 +278,9 @@ SipVoIPLink::setUnregister (void)
     }
     if (i == -1) {
       _debug("(unregister) Registration Failed\n");
-      eXosip_unlock();
-      return -1;
     }
     eXosip_unlock();
+    _reg_id = -1;
     return i;
   } else {
     // no registration send before
@@ -877,10 +887,12 @@ SipVoIPLink::getEvent (void)
 
   case EXOSIP_REGISTRATION_SUCCESS: // 1
     // Manager::instance().displayStatus(LOGGED_IN_STATUS);
+    Manager::instance().registrationSucceed();
     break;
 
   case EXOSIP_REGISTRATION_FAILURE: // 2
     //Manager::instance().displayError("getEvent : Registration Failure");
+    Manager::instance().registrationFailed();
     break;
 
   case EXOSIP_MESSAGE_NEW: //27
diff --git a/utilspp/Makefile.am b/utilspp/Makefile.am
index d7dbe1c908aa5d1e53077f46deea4e5ed8a7b9c7..01bff558414d75132d9819f1628c8574730913b2 100644
--- a/utilspp/Makefile.am
+++ b/utilspp/Makefile.am
@@ -14,16 +14,3 @@ libutilspp_la_SOURCES = \
 	TypeList.hpp
 
 libutilspp_la_LIBADD = ./singleton/libsingleton.la
-
-pkginclude_HEADERS = \
-	EmptyType.hpp \
-	Functors.hpp \
-	NonCopyable.hpp \
-	NullType.hpp \
-	Singleton.hpp \
-	SmartPtr.hpp \
-	ThreadingFactoryMutex.hpp ThreadingFactoryMutex.inl \
-	ThreadingSingle.hpp ThreadingSingle.inl \
-	TypeList.hpp
-
-pkgincludedir=$(includedir)/utilspp/