diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp
index c3d6ccfa9bd6ae1c4f4fad852e97fffc8f6ceb85..20545889cbb537ca6c72d50c8741b243fd728674 100644
--- a/src/gui/server/guiserverimpl.cpp
+++ b/src/gui/server/guiserverimpl.cpp
@@ -23,12 +23,12 @@
 #include <sstream>
 #include <stdexcept>
 
+#include "../../global.h" // for VERSION and PROGNAME
 #include "responsemessage.h"
 
 // default constructor
 GUIServerImpl::GUIServerImpl()
 {
-  _shouldQuit = false;
 }
 
 // destructor
@@ -157,6 +157,7 @@ GUIServerImpl::hangupCall(const std::string& callId)
   try {
     short id = getIdFromCallId(callId);
     if (GuiFramework::hangupCall(id)) {
+      _callMap.erase(id);
       return true;
     }
   } catch(...) {
@@ -165,6 +166,25 @@ GUIServerImpl::hangupCall(const std::string& callId)
   return false;
 }
 
+bool
+GUIServerImpl::hangupAll()
+{
+  bool result = true;
+  short id;
+  CallMap::iterator iter = _callMap.begin();
+  // try to hangup every call, even if one fail
+  while(iter!=_callMap.end()) {
+    id = iter->first;
+    if (!GuiFramework::hangupCall(id)) {
+      result = false;
+    } else {
+      _callMap.erase(id);
+    }
+    iter++;
+  }
+  return result;
+}
+
 bool 
 GUIServerImpl::dtmfCall(const std::string& callId, const std::string& dtmfKey) 
 {
@@ -178,6 +198,20 @@ GUIServerImpl::dtmfCall(const std::string& callId, const std::string& dtmfKey)
   return false;
 }
 
+/**
+ * Version constant are in global.h
+ * @return the version (name number)
+ */
+std::string 
+GUIServerImpl::version() 
+{
+  std::ostringstream version;
+  version << PROGNAME << " " << VERSION;
+  return version.str();
+}
+
+
+
 int 
 GUIServerImpl::incomingCall (short id) 
 {
diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h
index 7ca6e04fe54f10a763051ce7f7643aa53dd2ecaf..839c2be0c6fa1ec4495e794fab05dad70a5eb29f 100644
--- a/src/gui/server/guiserverimpl.h
+++ b/src/gui/server/guiserverimpl.h
@@ -67,8 +67,10 @@ public:
   bool unholdCall(const std::string& callId);
   bool hangupCall(const std::string& callId);
   bool dtmfCall(const std::string& callId, const std::string& dtmfKey);
+  bool hangupAll();
 
-  void quit() {_shouldQuit=true;}
+  std::string version();
+  void quit() { _requestManager.quit(); }
 
 private:
 
@@ -83,7 +85,6 @@ private:
   // RequestManager execute received request 
   // and send response
   RequestManager _requestManager;
-  bool _shouldQuit;
 };
 
 #endif // __GUI_SERVER_H__
diff --git a/src/gui/server/request.cpp b/src/gui/server/request.cpp
index ec8704996ec390e190346e0582b3fb4f5c5750c7..2a7fad5c319f4532b1f101036e00bb210a177232 100644
--- a/src/gui/server/request.cpp
+++ b/src/gui/server/request.cpp
@@ -81,6 +81,15 @@ RequestHangup::execute()
   return message("500", "Hangup Error");
 }
 
+ResponseMessage
+RequestHangupAll::execute()
+{
+  if ( GUIServer::instance().hangupAll() ) {
+    return message("200", "OK");
+  }
+  return message("500", "Hangup Error");
+}
+
 RequestDTMF::RequestDTMF(const std::string &sequenceId, 
     const TokenList& argList) : RequestGlobalCall(sequenceId, argList)
 {
@@ -112,17 +121,23 @@ RequestDTMF::execute()
 ResponseMessage
 RequestMute::execute()
 {
-  GUI::instance().muteOn();
+  GUIServer::instance().mute();
   return message("200","OK");
 }
 
 ResponseMessage
 RequestUnmute::execute()
 {
-  GUI::instance().unmute();
+  GUIServer::instance().unmute();
   return message("200","OK");
 }
 
+ResponseMessage
+RequestVersion::execute()
+{
+  return message("200",GUIServer::instance().version());
+}
+
 ResponseMessage
 RequestQuit::execute()
 {
diff --git a/src/gui/server/request.h b/src/gui/server/request.h
index 4851952e735639268f8ce3ebd2a39631eb8e2f4c..7ab3b5d352159c1f37bbdec9b446c97bc9c8ef9e 100644
--- a/src/gui/server/request.h
+++ b/src/gui/server/request.h
@@ -170,11 +170,21 @@ public:
   RequestUnmute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
   ResponseMessage execute();
 };
+class RequestVersion : public RequestGlobal {
+public:
+  RequestVersion(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
+  ResponseMessage execute();
+};
 class RequestQuit : public RequestGlobal {
 public:
   RequestQuit(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
   ResponseMessage execute();
 };
+class RequestHangupAll : public RequestGlobal {
+public:
+  RequestHangupAll(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
+  ResponseMessage execute();
+};
 
 class RequestSyntaxError : public Request 
 {
diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp
index 20995e9c40f5e4001c8e1b5d7680a63125ba0a4a..a433239506d8d4227a264441598e111fd2c65a2b 100644
--- a/src/gui/server/requestfactory.cpp
+++ b/src/gui/server/requestfactory.cpp
@@ -85,15 +85,17 @@ RequestFactory::registerRequest(const std::string &requestname)
 void 
 RequestFactory::registerAll() {
   registerRequest<RequestSyntaxError> ("syntaxerror");
-  registerRequest<RequestCall>     ("call");
-  registerRequest<RequestQuit>     ("quit");
-  registerRequest<RequestAnswer>   ("answer");
-  registerRequest<RequestRefuse>   ("refuse");
-  registerRequest<RequestHold>     ("hold");
-  registerRequest<RequestUnhold>   ("unhold");
-  registerRequest<RequestHangup>   ("hangup");
-  registerRequest<RequestDTMF>     ("dtmf");
-  registerRequest<RequestTransfer> ("transfer");
-  registerRequest<RequestMute>     ("mute");
-  registerRequest<RequestUnmute>   ("unmute");
-}
+  registerRequest<RequestCall>      ("call");
+  registerRequest<RequestAnswer>    ("answer");
+  registerRequest<RequestRefuse>    ("refuse");
+  registerRequest<RequestHold>      ("hold");
+  registerRequest<RequestUnhold>    ("unhold");
+  registerRequest<RequestHangup>    ("hangup");
+  registerRequest<RequestHangupAll> ("hangupall");
+  registerRequest<RequestDTMF>      ("dtmf");
+  registerRequest<RequestTransfer>  ("transfer");
+  registerRequest<RequestMute>      ("mute");
+  registerRequest<RequestUnmute>    ("unmute");
+  registerRequest<RequestVersion>   ("version");
+  registerRequest<RequestQuit>      ("quit");
+} 
diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp
index 2dccf5d72f8857181612e56d463b1698b36b6c01..184426548a3fe5253e625a32242e045433eee327 100644
--- a/src/gui/server/requestmanager.cpp
+++ b/src/gui/server/requestmanager.cpp
@@ -26,6 +26,7 @@
 RequestManager::RequestManager() : _sessionIO(0)
 {
   _factory.registerAll();
+  _quit = false;
 }
 
 
@@ -57,7 +58,7 @@ RequestManager::exec()
 
     // std::cin.good() is only there to close the server when
     // we do a CTRL+D
-    while(_sessionIO->good() && std::cin.good()) {
+    while(_sessionIO && _sessionIO->good() && std::cin.good() && !_quit) {
 
       if (_sessionIO->receive(input)) {
         _debug("Receive Input...: %s\n", input.c_str());
@@ -68,7 +69,6 @@ RequestManager::exec()
 
         handleExecutedRequest(request, outputResponse);
       } // end pop
-
     } // end streaming
     delete _sessionIO;
     _sessionIO = 0;
diff --git a/src/gui/server/requestmanager.h b/src/gui/server/requestmanager.h
index 509fa3f81d10c094f98fbbc83dcdf4eed0c828c1..babfb7f91d55cd23bec4ee04fafa486e6079dce9 100644
--- a/src/gui/server/requestmanager.h
+++ b/src/gui/server/requestmanager.h
@@ -36,6 +36,7 @@ public:
 
     int exec(void);
     void sendResponse(const ResponseMessage& response);
+    void quit() { _quit = true; }
 
 private:
   void flushWaitingRequest();
@@ -47,6 +48,8 @@ private:
   // waiting requests
   ost::Mutex _waitingRequestsMutex;
   std::map<std::string, Request*> _waitingRequests;
+
+  bool _quit; // tell to quit and end the exec loop
 };
 
 #endif
diff --git a/src/gui/server/tcpstreampool.h b/src/gui/server/tcpstreampool.h
index 5e7afa9e45689ffca64de12aab6c382d46de3073..46f8e90af0d61e9389f48879652d0c59d8fe3d98 100644
--- a/src/gui/server/tcpstreampool.h
+++ b/src/gui/server/tcpstreampool.h
@@ -39,7 +39,10 @@
 class TCPStreamPool : public ost::TCPSession 
 {
 public:
-  TCPStreamPool(ost::TCPSocket& server) : ost::TCPSession(server) {}
+  TCPStreamPool(ost::TCPSocket& server) : ost::TCPSession(server) 
+  {
+    setCancel(cancelDeferred);
+  }
 
   void run();
   void send(const std::string& response);