diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h
index 0568de6e784b27d53df397af6508342db4431571..24831ff2826d88e880a0379d7fd961fc2363a118 100644
--- a/src/gui/guiframework.h
+++ b/src/gui/guiframework.h
@@ -37,18 +37,15 @@ public:
 	virtual void peerAnsweredCall (short id) = 0;
 	virtual int peerRingingCall (short id) = 0;
 	virtual int peerHungupCall (short id) = 0;
+	virtual void displayStatus (const std::string& status) = 0;
+	virtual void displayConfigError (const std::string& error) = 0;
 	virtual void displayTextMessage (short id, const std::string& message) = 0;
 	virtual void displayErrorText (short id, const std::string& message) = 0;
 	virtual void displayError (const std::string& error) = 0;
-	virtual void displayStatus (const std::string& status) = 0;
-	virtual void displayContext (short id) = 0;
-	virtual void setup (void) = 0;
-	//virtual int selectedCall (void) = 0;
-	//virtual bool isCurrentId (short) = 0;
 	virtual void startVoiceMessageNotification (void) {}
 	virtual void stopVoiceMessageNotification (void) {}
   virtual void sendVoiceNbMessage(const std::string& nb_msg) = 0;
-	
+	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, 
diff --git a/src/gui/server/guiserver.cpp b/src/gui/server/guiserver.cpp
deleted file mode 100644
index 098f009ec8e32e5f0bfd2e2a130956e7188c44a8..0000000000000000000000000000000000000000
--- a/src/gui/server/guiserver.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- *  Copyright (C) 2005 Savoir-Faire Linux inc.
- *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
- *                                                                              
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *                                                                              
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "guiserver.h"
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
-#include "responsemessage.h"
-#include "request.h"
-
-void 
-TCPSessionIO::run() {
-  std::string response;
-  while(!testCancel() && good()) {
-    if (isPending(ost::TCPSocket::pendingInput, 10)) {
-      std::string input;
-      std::getline(*this, input);
-      _gui->pushRequestMessage(input);
-    }
-    if (_outputPool.pop(response, 10)) {
-      *this << response << std::endl;
-    }
-  }
-}
-
-// default constructor
-GUIServer::GUIServer()
-{
-  _factory.registerAll();
-  _sessionIO = 0;
-  _shouldQuit = false;
-}
-
-// destructor
-GUIServer::~GUIServer()
-{
-  // Waiting Requests cleanup
-  std::map<std::string, Request*>::iterator iter = _waitingRequests.begin();
-  while (iter != _waitingRequests.end()) {
-    delete iter->second; iter->second = NULL;
-    iter++;
-  }
- _waitingRequests.clear();
-}
-
-int
-GUIServer::exec() {
-  try {
-    ost::InetAddress addr("127.0.0.1");
-    
-    //Creating a listening socket.
-    ost::TCPSocket aServer(addr, 3999);
-    
-    std::cout << "listening on " << aServer.getLocal() << ":" << 3999 << std::endl;
-    
-    ResponseMessage output; // TCPStream output line
-    Request *request;
-    
-    while (std::cin.good()) {
-      
-      // waiting for a new connection
-      std::cout << "waiting for a new connection..." << std::endl;
-
-      //I'm accepting an incomming connection
-      _sessionIO = new TCPSessionIO(aServer, this);
-      _sessionIO->start();
-
-      // wait for the first message
-      std::cout << "accepting connection..." << std::endl;
-
-      _shouldQuit = false;
-      while(_sessionIO->good() && !_shouldQuit) {
-        if ( _requests.pop(request, 1000)) {
-          output = request->execute(*this);
-          handleExecutedRequest(request, output);
-        }
-      }
-    }
-  }
-  catch(ost::Socket *e) {
-    std::cerr << e->getErrorString() << std::endl;
-  }
-
-  return 0;
-}
-
-void 
-GUIServer::pushRequestMessage(const std::string &request)
-{
-  Request *tempRequest = _factory.create(request);
-  _requests.push(tempRequest);
-}
-
-void 
-GUIServer::pushResponseMessage(const ResponseMessage &response) 
-{
-  if (_sessionIO) {
-    _sessionIO->push(response.toString());
-  } else {
-    std::cerr << "PushResponseMessage: " << response.toString() << std::endl;
-  }
-
-  // remove the request from the list 
-  if (response.isFinal()) {
-    std::map<std::string, Request*>::iterator iter = _waitingRequests.find(response.sequenceId());
-    if (iter != _waitingRequests.end()) {
-      delete iter->second; iter->second = NULL;
-      _waitingRequests.erase(iter);
-    }
-  }
-}
-
-/**
- * Delete the request from the list of request
- * or send it into the waitingRequest map
- */
-void 
-GUIServer::handleExecutedRequest(Request * const request, const ResponseMessage& response) 
-{
-  if (response.isFinal()) {
-    delete request; request = NULL;
-  } else {
-    if (_waitingRequests.find(request->sequenceId()) == _waitingRequests.end()) {
-      _waitingRequests[response.sequenceId()] = request;
-    } else {
-      // we don't deal with requests with a sequenceId already send...
-      delete request; request = NULL;
-    }
-  }
-  if (_sessionIO) {
-    _sessionIO->push(response.toString());
-  }
-}
-
-/** 
- * SubCall operations
- *  insert
- *  remove
- */
-void 
-GUIServer::insertSubCall(short id, SubCall& subCall) {
-  _callMap[id] = subCall;
-}
-
-void
-GUIServer::removeSubCall(short id) {
-  _callMap.erase(id);
-}
-
-/**
- * Retreive the subcall or send 0
- */
-std::string 
-GUIServer::getSequenceIdFromId(short id) {
-  CallMap::iterator iter = _callMap.find(id);
-  if (iter != _callMap.end()) {
-    return iter->second.sequenceId();
-  }
-  return "seq0";
-}
-
-short
-GUIServer::getIdFromCallId(const std::string& callId) 
-{
-  CallMap::iterator iter = _callMap.begin();
-  while (iter != _callMap.end()) {
-    if (iter->second.callId()==callId) {
-      return iter->first;
-    }
-  }
-  throw std::runtime_error("No match for this CallId");
-}
-
-void 
-GUIServer::hangup(const std::string& callId) {
-  try {
-    short id = getIdFromCallId(callId);
-    // There was a problem when hanging up...
-    if (!GuiFramework::hangupCall(id)) {
-      throw std::runtime_error("Error when hangup");
-    }
-  } catch(...) {
-    throw;
-  }
-}
-
-int 
-GUIServer::incomingCall (short id) 
-{
-  return 0;
-}
-
-void  
-GUIServer::peerAnsweredCall (short id) 
-{
-  CallMap::iterator iter = _callMap.find(id);
-  if ( iter != _callMap.end() ) {
-    pushResponseMessage(ResponseMessage("200", iter->second.sequenceId(), "OK"));
-  } else {
-    std::ostringstream responseMessage;
-    responseMessage << "Peer Answered Call: " << id;
-    pushResponseMessage(ResponseMessage("500", "seq0", responseMessage.str()));
-  }
-}
-
-int  
-GUIServer::peerRingingCall (short id) 
-{
-  CallMap::iterator iter = _callMap.find(id);
-  if ( iter != _callMap.end() ) {
-    pushResponseMessage(ResponseMessage("151", iter->second.sequenceId(), "Ringing"));
-  } 
-  return 0;
-}
-
-int  
-GUIServer::peerHungupCall (short id) 
-{
-  return 0;
-}
-
-void  
-GUIServer::displayTextMessage (short id, const std::string& message) 
-{
-  std::ostringstream responseMessage;
-  std::string seq = getSequenceIdFromId(id);
-  responseMessage <<"s" << id << "text message: " + message;
-  pushResponseMessage(ResponseMessage("700", seq, responseMessage.str()));
-}
-
-void  
-GUIServer::displayErrorText (short id, const std::string& message) 
-{
-  std::ostringstream responseMessage;
-  std::string seq = getSequenceIdFromId(id);
-  responseMessage << "s" << id << " error text: " << message;
-  pushResponseMessage(ResponseMessage("700", seq, responseMessage.str()));
-}
-
-void  
-GUIServer::displayError (const std::string& error) 
-{
-  std::ostringstream responseMessage;
-  responseMessage << "error: " << error;
-  pushResponseMessage(ResponseMessage("700", "seq0", responseMessage.str()));
-}
-
-void  
-GUIServer::displayStatus (const std::string& status) 
-{
-  std::ostringstream responseMessage;
-  responseMessage << "status: " + status;
-  pushResponseMessage(ResponseMessage("700", "seq0", responseMessage.str()));
-}
-
-void  
-GUIServer::displayContext (short id) 
-{
-  std::ostringstream responseMessage;
-  responseMessage << "s" << id;
-  std::string seq = getSequenceIdFromId(id);
-  pushResponseMessage(ResponseMessage("700", seq, responseMessage.str()));
-}
-
-std::string  
-GUIServer::getRingtoneFile (void) 
-{
-  return std::string("");
-}
-
-void  
-GUIServer::setup (void) 
-{
-}
-
-void  
-GUIServer::startVoiceMessageNotification (void) 
-{
-}
-
-void  
-GUIServer::stopVoiceMessageNotification (void) 
-{
-}
diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp
index aaecadd041df95fd39a7ed76a680b187ab04f25e..a231bd1eafbd7feb521f30f34fc72f7cef64d1cd 100644
--- a/src/gui/server/guiserverimpl.cpp
+++ b/src/gui/server/guiserverimpl.cpp
@@ -342,59 +342,74 @@ responseMessage.str()));
 }
 
 void  
-GUIServerImpl::displayTextMessage (short id, const std::string& message) 
+GUIServerImpl::displayStatus (const std::string& status) 
 {
-  std::ostringstream responseMessage;
-  std::string seq = getSequenceIdFromId(id);
-  responseMessage << "s" << id << " text message: " + message;
-  _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str()));
+  TokenList tk;
+  tk.push_back(status);
+  tk.push_back("Status");
+  _requestManager.sendResponse(ResponseMessage("100", _getEventsSequenceId, tk));
 }
 
 void  
-GUIServerImpl::displayErrorText (short id, const std::string& message) 
+GUIServerImpl::displayConfigError (const std::string& error) 
 {
-  std::ostringstream responseMessage;
-  std::string seq = getSequenceIdFromId(id);
-  responseMessage << "s" << id << " error text: " << message;
-  _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str()));
+  TokenList tk;
+  tk.push_back(error);
+  tk.push_back("Config Error");
+  _requestManager.sendResponse(ResponseMessage("101", _getEventsSequenceId, tk));
 }
 
 void  
-GUIServerImpl::displayError (const std::string& error) 
+GUIServerImpl::displayTextMessage (short id, const std::string& message) 
 {
-  std::ostringstream responseMessage;
-  responseMessage << "error: " << error;
-  _requestManager.sendResponse(ResponseMessage("700", _getEventsSequenceId,
-responseMessage.str()));
+  try {
+    std::string callId = getCallIdFromId(id);
+    TokenList tk;
+    tk.push_back(callId);
+    tk.push_back(message);
+    tk.push_back("Text message");
+    _requestManager.sendResponse(ResponseMessage("102", _getEventsSequenceId, tk));
+  } catch(...) {
+    TokenList tk;
+    tk.push_back(message);
+    tk.push_back("Text message");
+    _requestManager.sendResponse(ResponseMessage("103", _getEventsSequenceId, tk));
+  }
 }
 
 void  
-GUIServerImpl::displayStatus (const std::string& status) 
+GUIServerImpl::displayErrorText (short id, const std::string& message) 
 {
-  std::ostringstream responseMessage;
-  responseMessage << "status: " + status;
-  _requestManager.sendResponse(ResponseMessage("700", _getEventsSequenceId,
-responseMessage.str()));
+  try {
+    std::string callId = getCallIdFromId(id);
+    TokenList tk;
+    tk.push_back(callId);
+    tk.push_back(message);
+    tk.push_back("Error");
+    _requestManager.sendResponse(ResponseMessage("104", _getEventsSequenceId, tk));
+  } catch(...) {
+    displayError(message);
+  }
 }
 
 void  
-GUIServerImpl::displayContext (short id) 
+GUIServerImpl::displayError (const std::string& error) 
 {
-  std::ostringstream responseMessage;
-  responseMessage << "s" << id;
-  std::string seq = getSequenceIdFromId(id);
-  _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str()));
+  TokenList tk;
+  tk.push_back(error);
+  tk.push_back("Error");
+  _requestManager.sendResponse(ResponseMessage("105", _getEventsSequenceId, tk));
 }
 
-void  
-GUIServerImpl::setup (void) 
+void
+GUIServerImpl::sendVoiceNbMessage(const std::string& nb_msg)
 {
+  _requestManager.sendResponse(ResponseMessage("020", _getEventsSequenceId, nb_msg));
 }
 
 void
-GUIServerImpl::sendVoiceNbMessage(const std::string& nb_msg)
+GUIServerImpl::setup() 
 {
-  _requestManager.sendResponse(ResponseMessage("020", _getEventsSequenceId, nb_msg));
 }
 
 void 
diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h
index 35f1e26b72508802f382c1cf288a60b707b64a3f..8a14759bac7f1256467d566a56e5ab742b3b29ab 100644
--- a/src/gui/server/guiserverimpl.h
+++ b/src/gui/server/guiserverimpl.h
@@ -46,15 +46,15 @@ public:
 	void peerAnsweredCall (short id);
 	int peerRingingCall (short id);
 	int peerHungupCall (short id);
+	void displayStatus (const std::string& status);
+  void displayConfigError(const std::string& error);
 	void displayTextMessage (short id, const std::string& message);
 	void displayErrorText (short id, const std::string& message);
 	void displayError (const std::string& error);
-	void displayStatus (const std::string& status);
-	void displayContext (short id);
-	void setup (void);
 	//void startVoiceMessageNotification (void);
 	//void stopVoiceMessageNotification (void);
   void sendVoiceNbMessage(const std::string& nb_msg);
+  void setup();
 
   void sendMessage(const std::string& code, const std::string& seqId, TokenList&
 arg);
@@ -81,7 +81,7 @@ arg);
   bool getCurrentCallId(std::string& callId);
 
   std::string version();
-  void quit() { _requestManager.quit(); }
+  void quit() { _getEventsSequenceId="seq0"; _requestManager.quit(); }
   void stop() { _requestManager.stop(); }
 
   // observer methods
diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp
index 83a9b86dee2901853de34830abf5dc81be788a30..685993338478994e21a7420e58d4da7520eb1276 100644
--- a/src/gui/server/requestmanager.cpp
+++ b/src/gui/server/requestmanager.cpp
@@ -62,7 +62,6 @@ RequestManager::exec()
       while(_sessionIO && _sessionIO->good() && std::cin.good() && !_quit) {
 
         if (_sessionIO->receive(input)) {
-          _debug("Receive Input...: %s\n", input.c_str());
           request = _factory.create(input);
           outputResponse = request->execute();
 
diff --git a/src/gui/server/responsemessage.cpp b/src/gui/server/responsemessage.cpp
index 74a122a4df93850b3ece07879adc16ae314bc9b2..34c2715e7a0c3b1a9d4f084ea7da45b3c7a73b6b 100644
--- a/src/gui/server/responsemessage.cpp
+++ b/src/gui/server/responsemessage.cpp
@@ -27,8 +27,16 @@ const std::string ResponseMessage::FINALCODE = "2456";
 
 ResponseMessage::ResponseMessage(const std::string& code,
       const std::string& seq,
-      const std::string& message) : _code(code), _seq(seq), _message(message)
+      const std::string& message) : _code(code), _seq(seq)
 {
+    int len = message.length();
+    if (len) {
+      char *tmp = new char[len*3+2];
+      ost::urlEncode(message.c_str(), tmp, len*3+2);
+      // we don't have to put a '\0' right?
+      _message = tmp;
+      delete [] tmp; tmp = NULL;
+    }
 }
 
 /*
diff --git a/src/gui/server/tcpsessionio.cpp b/src/gui/server/tcpsessionio.cpp
index 8382587bb1a8c81ecb9664514eb52f50c368dc1f..19cfd1b0ec0890c7b9c93dcba7a13fbd3d6950cd 100644
--- a/src/gui/server/tcpsessionio.cpp
+++ b/src/gui/server/tcpsessionio.cpp
@@ -17,6 +17,7 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 #include "tcpsessionio.h"
+#include "../../global.h"
 
 const int TCPSessionIO::PORT = 3999;
 const char * const TCPSessionIO::IP = "127.0.0.1";
@@ -55,16 +56,19 @@ TCPSessionIO::send(const std::string& response)
 {
   if (_clientStream) { // just in case
     _clientStream->send(response);
+    _debug("SessionIO: Sending: %s\n", response.c_str());
   }
 }
 
 bool 
 TCPSessionIO::receive(std::string& request)
 {
+  bool returnValue = false;
   if (_clientStream) { // just in case
-    return _clientStream->receive(request);
+    returnValue = _clientStream->receive(request);
+    if (returnValue) _debug("SessionIO: Receiving: %s\n", request.c_str());
   }
-  return false;
+  return returnValue;
 }
 
 void
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index a6e875e11469ab7a56635fab2ee1c36e2bc2f4fc..2fc2118f96d4dcfd7f68a890c66415873694689a 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -571,7 +571,7 @@ ManagerImpl::registerVoIPLink (void)
 {
   int returnValue = 0;
   if ( !useStun() ) {
-    if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() == 0) {
+    if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() >= 0) {
       returnValue = true;
     } else {
       _debug("ManagerImpl::registerVoIPLink: Registration Failed\n");
@@ -849,7 +849,8 @@ void
 ManagerImpl::displayError (const string& error)
 {
   if(_gui) {
-    _gui->displayStatus(error);
+    _debug("Display Error: %s\n", error.c_str());
+    _gui->displayError(error);
   }
 }