diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 6311881d3dc7ef330663463380ec9eca4e6e1d31..1fba455958d9eacd1025b7f83cb49ec718205e30 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -6,8 +6,7 @@ SUBDIRS = $(officialdir) qt server
 
 noinst_LTLIBRARIES = libguiframework.la
 
-libguiframework_la_SOURCES = \
-	guiframework.cpp guiframework.h
+libguiframework_la_SOURCES = guiframework.cpp guiframework.h
 
 libguiframework_la_CPPFLAGS = -I$(top_srcdir)
 libguiframework_la_CXXFLAGS = $(libccext2_CFLAGS)
diff --git a/src/gui/server/Makefile.am b/src/gui/server/Makefile.am
index 8db981b80d6e2e6d8fa6c7a3a7462bc86f0c68dd..7e523e574a5a7b98bd3ed0c6379600c9b355d345 100644
--- a/src/gui/server/Makefile.am
+++ b/src/gui/server/Makefile.am
@@ -8,4 +8,5 @@ libsflphoneguiserver_la_LIBADD =
 
 AM_CPPFLAGS = -I$(top_srcdir) $(libccext2_CFLAGS)
 
-noinst_HEADERS = responsemessage.h request.h requestfactory.h subcall.h
+noinst_HEADERS = responsemessage.h request.h requestfactory.h subcall.h \
+	argtokenizer.h
diff --git a/src/gui/server/request.h b/src/gui/server/request.h
index b9d81306505073ec15efe0e2a0084d4f2f2b446b..3701debcb91a31707512c6d656da689deca847f2 100644
--- a/src/gui/server/request.h
+++ b/src/gui/server/request.h
@@ -21,8 +21,11 @@
 #define __REQUEST_H__
 
 #include <string>
+#include <list>
 #include "responsemessage.h"
 
+typedef std::list<std::string> TokenList;
+
 /**
 Request are received from the client
 and execute on the server
@@ -30,10 +33,14 @@ Request execution always return a ResponseMessage
 @author Yan Morin
 */
 class GUIServer;
+
+class RequestConstructorException {
+};
+
 class Request 
 {
 public:
-  Request(const std::string &sequenceId, const std::string &arg) : _sequenceId(sequenceId), _arg(arg) {}
+  Request(const std::string &sequenceId, const TokenList& argList) : _sequenceId(sequenceId), _argList(argList) {}
   virtual ~Request() {}
   virtual ResponseMessage execute(GUIServer& gui) = 0;
   ResponseMessage message(const std::string &code, const std::string &message) {
@@ -44,99 +51,114 @@ public:
   
 protected:
   std::string _sequenceId;
-  std::string _arg;
+  TokenList _argList;
 };
 
 
-class RequestGlobalCall : public Request
-{
+class RequestCall : public Request {
 public:
-  RequestGlobalCall(const std::string &sequenceId, const std::string &arg) : Request(sequenceId,arg) {
-    unsigned int spacePos = _arg.find(' ');
-    if (spacePos == std::string::npos) {
-      // only one argument, so it's must be the callId
-      _callId = _arg;
-    } else {
-      _callId = _arg.substr(0, spacePos);
-      _arg = _arg.substr(spacePos+1, _arg.size()-spacePos+1);
+  RequestCall(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId,argList) {
+    TokenList::iterator iter = _argList.begin();
+    // check for the callid
+    bool argsAreValid = false;
+    // Args are: account callid destination
+    //           acc1000 c10345 sip:test@test.com
+    if (iter != _argList.end() && iter->find("acc")==0) {
+      _account = *iter;
+      _argList.pop_front();
+      iter = _argList.begin();
+      // a call method can only begin by 'c' since it's only the client that 
+      // call with method
+      if (iter != _argList.end() && (*iter)[0]=='c') {
+        _callId = *iter;
+        iter++;
+        // last arg is the destination
+        if (iter != _argList.end()) {
+          _destination = *iter;
+          argsAreValid = true;
+        }
+      }
+    }
+    if (!argsAreValid) {
+      throw RequestConstructorException();
     }
   }
-  virtual ~RequestGlobalCall() {}
-  virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); }
+  virtual ResponseMessage execute(GUIServer& gui);
 
-protected:
+private:
   std::string _callId;
+  std::string _destination;
+  std::string _account;
 };
 
-class RequestCall : public RequestGlobalCall {
+
+class RequestGlobalCall : public Request
+{
 public:
-  RequestCall(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {
-    // only one argument, so it's must be the account (that switch is JP fault)
-    _account = _callId;
-    _callId = "";
-    unsigned int spacePos = _arg.find(' ');
-    if (spacePos == std::string::npos) {
-      _callId = _arg;
+  RequestGlobalCall(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId, argList) {
+    TokenList::iterator iter = _argList.begin();
+    if (iter != _argList.end() && ((*iter)[0]=='c' || (*iter)[0]=='s') ) {
+      _callId = *iter;
+      _argList.pop_front();
     } else {
-      _callId = _arg.substr(0, spacePos);
-      _destination = _arg.substr(spacePos+1, _arg.size()-spacePos+1);
+      throw RequestConstructorException();
     }
   }
-  virtual ResponseMessage execute(GUIServer& gui);
+  virtual ~RequestGlobalCall() {}
+  virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); }
 
-private:
-  std::string _destination;
-  std::string _account;
+protected:
+  std::string _callId;
 };
 
 class RequestAnswer : public RequestGlobalCall {
 public:
-  RequestAnswer(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {}
+  RequestAnswer(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {}
 };
 class RequestRefuse : public RequestGlobalCall {
 public:
-  RequestRefuse(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {}
+  RequestRefuse(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {}
 };
 class RequestHold : public RequestGlobalCall {
 public:
-  RequestHold(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {}
+  RequestHold(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {}
 };
 class RequestUnhold : public RequestGlobalCall {
 public:
-  RequestUnhold(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {}
+  RequestUnhold(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {}
 };
 class RequestTransfer : public RequestGlobalCall {
 public:
-  RequestTransfer(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {}
+  RequestTransfer(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {}
 };
 
 
 class RequestGlobal : public Request
 {
 public:
-  RequestGlobal(const std::string &sequenceId, const std::string &arg) : Request(sequenceId,arg) {}
+  RequestGlobal(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId,argList) {}
   virtual ~RequestGlobal() {}
   virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); }
 };
 
 class RequestMute : public RequestGlobal {
 public:
-  RequestMute(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {}
+  RequestMute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
 };
 class RequestUnmute : public RequestGlobal {
 public:
-  RequestUnmute(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {}
+  RequestUnmute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
 };
 class RequestQuit : public RequestGlobal {
 public:
-  RequestQuit(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {}
+  RequestQuit(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
 };
 
 
 class RequestSyntaxError : public Request 
 {
 public:
-  RequestSyntaxError(const std::string &sequenceId, const std::string &arg) : Request(sequenceId, arg) {}
+  RequestSyntaxError(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId, argList) {}
   ~RequestSyntaxError() {}
   ResponseMessage execute(GUIServer& gui) {
     return message("501", "Syntax Error");
diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp
index 0593a78c5e73970ad74beae6ad0f395bf494ca52..ae76e5c1fbad97a551c16634786f7baca388dce1 100644
--- a/src/gui/server/requestfactory.cpp
+++ b/src/gui/server/requestfactory.cpp
@@ -23,48 +23,39 @@
 #include "request.h"
 
 Request *
-RequestFactory::create(const std::string &requestLine)
+RequestFactory::create(const std::string& requestLine)
 {
-  std::string requestName;
-  std::string sequenceId="seq0";
-  std::string arguments;
   
-  unsigned int spacePos = requestLine.find(' ');
-  // we find a spacePos
-  if (spacePos != std::string::npos) {
-    /*
-    012345678901234
-    call seq1 cdddd
-    spacePos  = 4
-    spacePos2 = 9
-    0 for 4  = 0 for spacePos
-    5 for 4  = (spacePos+1 for spacePos2-spacePos-1)
-    10 for 5 = (spacePos2+1 for size - spacePos2+1)
-    */
-    requestName = requestLine.substr(0, spacePos);
-    
-    unsigned int spacePos2 = requestLine.find(' ', spacePos+1);
-    if (spacePos2 == std::string::npos) {
-      // command that end with a sequence number
-      sequenceId = requestLine.substr(spacePos+1, requestLine.size()-spacePos+1);
-    } else {
-      sequenceId = requestLine.substr(spacePos+1, spacePos2-spacePos-1);
-      arguments = requestLine.substr(spacePos2+1, requestLine.size()-spacePos2+1);
+  TokenList tList = _tokenizer.tokenize(requestLine);
+  TokenList::iterator iter = tList.begin();
+  // there is atleast one token (the command)
+  if (iter != tList.end()) {
+    std::string requestName = *iter;
+    tList.pop_front();
+    iter = tList.begin();
+    // there is atleast a second token (the sequenceId)
+    if (iter != tList.end() && iter->find("seq") == 0 ) {
+      std::string sequenceId = *iter;
+      tList.pop_front();
+      try {
+        Request *r = create(requestName, sequenceId, tList);
+        return r;
+      } catch (...) {
+        // if the create return an exception
+        // we create a syntaxerror
+      }
     }
-  } else {
-    requestName = "syntaxerror";
   }
-  
-  return create(requestName, sequenceId, arguments);
+  return create("syntaxerror", "seq0", tList);
 }
 
 Request *
 RequestFactory::create(
-  const std::string &requestname, 
-  const std::string &sequenceId, 
-  const std::string &arg)
+  const std::string& requestName, 
+  const std::string& sequenceId, 
+  const TokenList& argList)
 {
-  std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestname);
+  std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestName);
   if(pos == mRequests.end()) {
     pos = mRequests.find("syntaxerror");
     if(pos == mRequests.end()) {
@@ -72,7 +63,7 @@ RequestFactory::create(
     }
   }
   
-  return pos->second->create(sequenceId, arg);
+  return pos->second->create(sequenceId, argList);
 }
 
 template< typename T >
diff --git a/src/gui/server/requestfactory.h b/src/gui/server/requestfactory.h
index 1d84c4bb943597d90dfa624ec09d1df9cb1a30b4..39f74e024d09584950b782f9fbfd2634679f793a 100644
--- a/src/gui/server/requestfactory.h
+++ b/src/gui/server/requestfactory.h
@@ -23,6 +23,7 @@
 #include <map>
 
 #include "request.h"
+#include "argtokenizer.h"
 
 class Request;
 /**
@@ -30,7 +31,7 @@ class Request;
 class RequestCreatorBase
 {
 public:
-  virtual Request *create(const std::string &sequenceId, const std::string &arg) = 0;
+  virtual Request *create(const std::string &sequenceId, const TokenList& argList) = 0;
   virtual RequestCreatorBase *clone() = 0;
 };
 
@@ -38,9 +39,9 @@ template< typename T >
 class RequestCreator : public RequestCreatorBase
 {
 public:
-  virtual Request *create(const std::string &sequenceId, const std::string &arg)
+  virtual Request *create(const std::string &sequenceId, const TokenList& argList)
   {
-    return new T(sequenceId, arg);
+    return new T(sequenceId, argList);
   }
 
   virtual RequestCreatorBase *clone()
@@ -53,17 +54,18 @@ public:
 class RequestFactory
 {
 public:
-  Request *create(const std::string &requestLine);
+  Request *create(const std::string& requestLine);
   Request *create(
-    const std::string &requestname, 
-    const std::string &sequenceId, 
-    const std::string &arg);
+    const std::string& requestname, 
+    const std::string& sequenceId, 
+    const TokenList& argList);
 
   template< typename T >
-  void registerRequest(const std::string &requestname);
+  void registerRequest(const std::string& requestname);
   void registerAll();
 private:
   std::map< std::string, RequestCreatorBase * > mRequests;
+  ArgTokenizer _tokenizer;
 };