diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp
index c56b7f887f1ece8cfb32e74e5df939525df07029..fe88b7c4c706b009a3cdf7134fde36c229a40b58 100644
--- a/contrib/onelab/OnelabClients.cpp
+++ b/contrib/onelab/OnelabClients.cpp
@@ -18,33 +18,34 @@ class onelabMetaModelServer : public GmshServer{
     : GmshServer(), _client(client) {}
   ~onelabMetaModelServer(){}
 
-  int NonBlockingSystemCall(const char *str){ return SystemCall(str); }
+  int NonBlockingSystemCall(const char *str){ 
+    std::cout << "Calling now : " << str << std::endl;
+    return SystemCall(str); 
+  }
   int NonBlockingWait(double waitint, double timeout, int socket)
   {
     double start = GetTimeInSeconds();
     while(1){
       if(timeout > 0 && GetTimeInSeconds() - start > timeout)
         return 2; // timeout
-      // if(_client->getPid() < 0 || (_client->getCommandLine().empty() &&
-      //                              !CTX::instance()->solver.listen))
-      if(_client->getPid() < 0 || (_client->getCommandLine().empty()))
-        return 1; // process has been killed or we stopped listening
+
+      if(_client->getPid() < 0 /*|| (_client->getCommandLine().empty())*/)
+        return 1; // process has been killed
+
       // check if there is data (call select with a zero timeout to
       // return immediately, i.e., do polling)
       int ret = Select(0, 0, socket);
+
       if(ret == 0){ // nothing available
         // wait at most waitint seconds and respond to FLTK events
-	//FlGui::instance()->wait(waitint);
 	void (*waitFct)(double) = OLMsg::GetGuiWaitFunction();
 	if(waitFct) waitFct(waitint);
       }
       else if(ret > 0){
         return 0; // data is there!
       }
-      else{
-        // ret<0 an error happened
+      else{ // ret<0 an error happened
         _client->setPid(-1);
-        _client->setGmshServer(0);
         return 1;
       }
     }
@@ -83,14 +84,223 @@ std::string localNetworkSolverClient::appendArguments(){
   return command;
 }
 
+bool localNetworkSolverClient::receiveMessage(){
+  double timer = GetTimeInSeconds();
+
+  if(!getGmshServer()){
+    OLMsg::Error("Abnormal server termination (no valid server)");
+    return false;
+  }
+
+  int type, length, swap;
+  if(!getGmshServer()->ReceiveHeader(&type, &length, &swap)){
+    OLMsg::Error("Abnormal server termination (did not receive message header)");
+    return false;
+  }
+  else if(_socketMsg)
+    OLMsg::Info("Received header <%d>",type);
+
+  std::string message(length, ' ');
+  if(!getGmshServer()->ReceiveMessage(length, &message[0])){
+    OLMsg::Error("Abnormal server termination (did not receive message body)r");
+    return false;
+  }
+  else if(_socketMsg)
+    OLMsg::Info("Received message <%s>",message.c_str());
+
+  switch (type) {
+  case GmshSocket::GMSH_START:
+    setPid(atoi(message.c_str()));
+    break;
+  case GmshSocket::GMSH_STOP:
+    setPid(-1);
+    break;
+  case GmshSocket::GMSH_PARAMETER:
+    {
+      std::string version, type, name;
+      onelab::parameter::getInfoFromChar(message, version, type, name);
+      if(onelab::parameter::version() != version){
+	OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
+		     message.c_str(), onelab::parameter::version().c_str(), version.c_str());
+      }
+      if(type == "number"){
+	onelab::number p; p.fromChar(message); set(p);
+      }
+      else if(type == "string"){
+	onelab::string p; p.fromChar(message); set(p);
+      }
+      else if(type == "region"){
+	onelab::region p; p.fromChar(message); set(p);
+      }
+      else if(type == "function"){
+	onelab::function p; p.fromChar(message); set(p);
+      }
+      else
+	OLMsg::Error("FIXME query not done for this parameter type: <%s>",
+		     message.c_str());
+    }
+    break;
+  case GmshSocket::GMSH_PARAMETER_QUERY:
+    {
+      std::string version, type, name, reply;
+      onelab::parameter::getInfoFromChar(message, version, type, name);
+      if(onelab::parameter::version() != version){
+	OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
+		     message.c_str(), onelab::parameter::version().c_str(), version.c_str());
+      }
+      else if(type == "number"){
+	std::vector<onelab::number> par; get(par, name);
+	if(par.size() == 1) reply = par[0].toChar();
+      }
+      else if(type == "string"){
+	std::vector<onelab::string> par; get(par, name);
+	if(par.size() == 1) reply = par[0].toChar();
+      }
+      else if(type == "region"){
+	std::vector<onelab::region> par; get(par, name);
+	if(par.size() == 1) par[0].toChar();
+      }
+      else if(type == "function"){
+	std::vector<onelab::function> par; get(par, name);
+	if(par.size() == 1) reply = par[0].toChar();
+      }
+      else
+	OLMsg::Error("Unknown OneLab parameter type in query: %s",
+		     type.c_str());
+
+      if(reply.size()){
+	getGmshServer()->SendMessage(GmshSocket::GMSH_PARAMETER,
+			    reply.size(), &reply[0]);
+      }
+      else{
+	reply = "OneLab parameter '" + name + "' not found";
+	getGmshServer()->SendMessage(GmshSocket::GMSH_INFO, reply.size(), &reply[0]);
+      }
+    }
+    break;
+  case GmshSocket::GMSH_PARAM_QUERY_ALL:
+    {
+      std::string version, type, name, reply;
+      std::vector<std::string> replies;
+      onelab::parameter::getInfoFromChar(message, version, type, name);
+      if(onelab::parameter::version() != version){
+	OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
+		     message.c_str(), onelab::parameter::version().c_str(), version.c_str());
+      }
+      else if(type == "number"){
+	std::vector<onelab::number> numbers; get(numbers);
+	for(std::vector<onelab::number>::iterator it = numbers.begin();
+	    it != numbers.end(); it++) replies.push_back((*it).toChar());
+      }
+      else if(type == "string"){
+	std::vector<onelab::string> strings; get(strings);
+	for(std::vector<onelab::string>::iterator it = strings.begin();
+	    it != strings.end(); it++) replies.push_back((*it).toChar());
+      }
+      else if(type == "region"){
+	std::vector<onelab::region> regions; get(regions);
+	for(std::vector<onelab::region>::iterator it = regions.begin();
+	    it != regions.end(); it++) replies.push_back((*it).toChar());
+      }
+      else if(type == "function"){
+	std::vector<onelab::function> functions; get(functions);
+	for(std::vector<onelab::function>::iterator it = functions.begin();
+	    it != functions.end(); it++) replies.push_back((*it).toChar());
+      }
+      else
+	OLMsg::Error("Unknown OneLab parameter type in query: %s",
+		     type.c_str());
+
+      for(unsigned int i = 0; i < replies.size(); i++)
+	getGmshServer()->SendMessage(GmshSocket::GMSH_PARAM_QUERY_ALL,
+				     replies[i].size(), &replies[i][0]);
+      reply = "Sent all OneLab " + type + "s";
+      getGmshServer()->SendMessage(GmshSocket::GMSH_PARAM_QUERY_END,
+				   reply.size(), &reply[0]);
+    }
+    break;
+  case GmshSocket::GMSH_PROGRESS:
+    OLMsg::StatusBar(2, false, "%s %s", _name.c_str(), message.c_str());
+    break;
+  case GmshSocket::GMSH_INFO:
+    OLMsg::Direct("%-8.8s: %s", _name.c_str(), message.c_str());
+    break;
+  case GmshSocket::GMSH_WARNING:
+    OLMsg::Direct(2, "%-8.8s: %s", _name.c_str(), message.c_str());
+    break;
+  case GmshSocket::GMSH_ERROR:
+    OLMsg::Error("%-8.8s: %s", _name.c_str(), message.c_str());
+    break;
+  case GmshSocket::GMSH_MERGE_FILE:
+    // if(CTX::instance()->solver.autoMergeFile){
+    //   unsigned int n = PView::list.size();
+    //   MergePostProcessingFile(message, CTX::instance()->solver.autoShowLastStep,
+    //                           CTX::instance()->solver.autoHideNewViews, true);
+    //   drawContext::global()->draw();
+    //   if(FlGui::available() && n != PView::list.size()){
+    //     FlGui::instance()->rebuildTree();
+    //     FlGui::instance()->openModule("Post-processing");
+    //   }
+    // }
+    break;
+  case GmshSocket::GMSH_PARSE_STRING:
+    // ParseString(message);
+    // drawContext::global()->draw();
+    break;
+ case GmshSocket::GMSH_SPEED_TEST:
+    OLMsg::Info("got %d Mb message in %g seconds",
+              length / 1024 / 1024, GetTimeInSeconds() - timer);
+    break;
+  case GmshSocket::GMSH_VERTEX_ARRAY:
+    {
+      // int n = PView::list.size();
+      // PView::fillVertexArray(this, length, &message[0], swap);
+      // if(FlGui::available())
+      //   FlGui::instance()->updateViews(n != (int)PView::list.size());
+      // drawContext::global()->draw();
+    }
+    break;
+  case GmshSocket::GMSH_CONNECT:
+    {
+      // const std::string clientName = message;
+      // std::cout << "client name =" << clientName << std::endl;
+      // onelab::localNetworkClient *subClient = findClient(clientName);
+      // if (!subClient) {
+      //   subClient = new gmshLocalNetworkClient(clientName, "");
+      // }
+      // else
+      // 	std::cout << "Gmsh has " << addClient(subClient) << " clients\n";
+      // subClient->getGmshServer()->LaunchClient();
+    }
+    break;
+  case GmshSocket::GMSH_OLPARSE:
+    {
+#if defined(HAVE_ONELAB_METAMODEL)
+      localSolverClient *c = new InterfacedClient("OLParser","","");
+      std::string ofileName = message ;
+      std::ofstream outfile(ofileName.c_str());
+      if (outfile.is_open())
+        c->convert_onefile(ofileName + ".ol",outfile);
+      else
+        OLMsg::Error("The file <%s> cannot be opened",ofileName.c_str());
+      outfile.close();
+      delete c;
+#endif
+    }
+    break;
+  default:
+    OLMsg::Warning("Received unknown message type (%d)", type);
+    break;
+  }
+  return true;
+}
+
 bool localNetworkSolverClient::run()
 {
  new_connection:
-  _pid = 0;
-  _gmshServer = 0;
-
-  onelabMetaModelServer *server = new onelabMetaModelServer(this);
+  setPid(0);
 
+  // Choose socket type (Unix or TCP/IP)
 #if defined(WIN32)
   std::string socketName = ":";
 #else
@@ -103,201 +313,75 @@ bool localNetworkSolverClient::run()
 
   std::string sockname;
   std::ostringstream tmp;
-  if(!strstr(socketName.c_str(), ":")){
-    // Unix socket
+  if(!strstr(socketName.c_str(), ":")){ // Unix socket
     tmp << socketName << getId();
     sockname = FixWindowsPath(tmp.str());
   }
-  else{
-    // TCP/IP socket
+  else{                                 // TCP/IP socket
     if(socketName.size() && socketName[0] == ':')
-      // prepend hostname if only the port number is given
-      tmp << GetHostName();
+      tmp << GetHostName(); // prepend hostname if only the port number is given
     tmp << socketName ;
     sockname = tmp.str();
   }
 
-  _socketMsg = OLMsg::GetOnelabNumber("SHOWSOCKETMESSAGES")?true:false;
+  // Build the commande line 
   std::string command = buildCommandLine();
-  if(command.size()) command.append(appendArguments());
+  if(command.size()) 
+    command.append(appendArguments());
+  else 
+    return false;
+
+  // Create socket connection and launch client 
+  onelabMetaModelServer *socketConnection = new onelabMetaModelServer(this);
+
+  std::cout << "commandline = " << command << std::endl;
 
   int sock;
   try{
-    sock = server->Start(command.c_str(), sockname.c_str(), 10);
+    sock = socketConnection->Start(command.c_str(), sockname.c_str(), 10);
   }
   catch(const char *err){
     OLMsg::Error("%s (on socket '%s')", err, sockname.c_str());
     sock = -1;
   }
 
-  if(sock < 0){
-    server->Shutdown();
-    delete server;
+  std::cout << "sock = " << sock << std::endl;
+
+  if(sock < 0){ //could not establish connection: aborting
+    socketConnection->Shutdown();
+    delete socketConnection;
+    OLMsg::Error("Connection failed on socket <%s>", sockname.c_str());
     return false;
   }
 
-  //OLMsg::StatusBar(2, true, "Now running client <%s>", _name.c_str());
+  OLMsg::StatusBar(2, true, "Now running client <%s> on socket <%d>", _name.c_str(), sock);
+  _socketMsg = OLMsg::GetOnelabNumber("SHOWSOCKETMESSAGES")?true:false;
+
+  setGmshServer(socketConnection);
 
   while(1) {
-    if(_pid < 0) break;
+    bool stop = false, haveData = false;
 
-    int stop = server->NonBlockingWait(sock, 0.0001, 0.);
-    if(stop || _pid < 0) {
-      OLMsg::Info("Stop=%d _pid=%d",stop, _pid);
-      break;
-    }
-    int type, length, swap;
-    if(!server->ReceiveHeader(&type, &length, &swap)){
-      OLMsg::Error("Did not receive message header: stopping server");
-      break;
+    if(getPid() < 0) { stop = true; break; }
+    if(!getGmshServer()){
+      OLMsg::Error("Abnormal server termination (no valid server)");
+      stop = true;
     }
-    else if(_socketMsg)
-      OLMsg::Info("Received header <%d>",type);
-
-    std::string message(length, ' ');
-    if(!server->ReceiveMessage(length, &message[0])){
-      OLMsg::Error("Did not receive message body: stopping server");
-      break;
+    else if(!getGmshServer()->NonBlockingWait(0.001, 0., sock)){
+      haveData = true;
+      std::cout << "Have data" << std::endl;
     }
-    else if(_socketMsg)
-      OLMsg::Info("Received message <%s>",message.c_str());
-
-    switch (type) {
-    case GmshSocket::GMSH_START:
-      _pid = atoi(message.c_str());
-      _gmshServer = server;
-      break;
-    case GmshSocket::GMSH_STOP:
-      _pid = -1;
-      _gmshServer = 0;
-      break;
-    case GmshSocket::GMSH_PARAMETER:
-      {
-        std::string version, type, name;
-        onelab::parameter::getInfoFromChar(message, version, type, name);
-        if(onelab::parameter::version() != version){
-          OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
-	   message.c_str(), onelab::parameter::version().c_str(), version.c_str());
-        }
-        if(type == "number"){
-          onelab::number p; p.fromChar(message); set(p);
-        }
-        else if(type == "string"){
-          onelab::string p; p.fromChar(message); set(p);
-        }
-	else if(type == "region"){
-          onelab::region p; p.fromChar(message); set(p);
-        }
-        else if(type == "function"){
-          onelab::function p; p.fromChar(message); set(p);
-        }
-        else
-          OLMsg::Error("FIXME query not done for this parameter type: <%s>",
-		     message.c_str());
-      }
-      break;
-    case GmshSocket::GMSH_PARAMETER_QUERY:
-      {
-        std::string version, type, name, reply;
-        onelab::parameter::getInfoFromChar(message, version, type, name);
-        if(onelab::parameter::version() != version){
-          OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
-	   message.c_str(), onelab::parameter::version().c_str(), version.c_str());
-        }
-        else if(type == "number"){
-          std::vector<onelab::number> par; get(par, name);
-          if(par.size() == 1) reply = par[0].toChar();
-	}
-        else if(type == "string"){
-          std::vector<onelab::string> par; get(par, name);
-          if(par.size() == 1) reply = par[0].toChar();
-        }
-        else if(type == "region"){
-          std::vector<onelab::region> par; get(par, name);
-          if(par.size() == 1) par[0].toChar();
-        }
-        else if(type == "function"){
-          std::vector<onelab::function> par; get(par, name);
-          if(par.size() == 1) reply = par[0].toChar();
-        }
-        else
-          OLMsg::Error("Unknown OneLab parameter type in query: %s",
-		     type.c_str());
-
-        if(reply.size()){
-          server->SendMessage(GmshSocket::GMSH_PARAMETER,
-			      reply.size(), &reply[0]);
-        }
-        else{
-          reply = "OneLab parameter '" + name + "' not found";
-          server->SendMessage(GmshSocket::GMSH_INFO, reply.size(), &reply[0]);
-        }
-      }
-      break;
-    case GmshSocket::GMSH_PARAM_QUERY_ALL:
-      {
-        std::string version, type, name, reply;
-        std::vector<std::string> replies;
-        onelab::parameter::getInfoFromChar(message, version, type, name);
-	if(onelab::parameter::version() != version){
-          OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)",
-           message.c_str(), onelab::parameter::version().c_str(), version.c_str());
-        }
-	else if(type == "number"){
-	  std::vector<onelab::number> numbers; get(numbers);
-	  for(std::vector<onelab::number>::iterator it = numbers.begin();
-	      it != numbers.end(); it++) replies.push_back((*it).toChar());
-	}
-	else if(type == "string"){
-	  std::vector<onelab::string> strings; get(strings);
-	  for(std::vector<onelab::string>::iterator it = strings.begin();
-	      it != strings.end(); it++) replies.push_back((*it).toChar());
-	}
-        else if(type == "region"){
-	  std::vector<onelab::region> regions; get(regions);
-	  for(std::vector<onelab::region>::iterator it = regions.begin();
-              it != regions.end(); it++) replies.push_back((*it).toChar());
-        }
-        else if(type == "function"){
-	  std::vector<onelab::function> functions; get(functions);
-	  for(std::vector<onelab::function>::iterator it = functions.begin();
-              it != functions.end(); it++) replies.push_back((*it).toChar());
-        }
-        else
-          OLMsg::Error("Unknown OneLab parameter type in query: %s",
-		     type.c_str());
-
-        for(unsigned int i = 0; i < replies.size(); i++)
-          server->SendMessage(GmshSocket::GMSH_PARAM_QUERY_ALL,
-	     replies[i].size(), &replies[i][0]);
-        reply = "Sent all OneLab " + type + "s";
-        server->SendMessage(GmshSocket::GMSH_PARAM_QUERY_END,
-			    reply.size(), &reply[0]);
-      }
-      break;
-    case GmshSocket::GMSH_PROGRESS:
-      OLMsg::StatusBar(2, false, "%s %s", _name.c_str(), message.c_str());
-      break;
-    case GmshSocket::GMSH_INFO:
-      OLMsg::Direct("%-8.8s: %s", _name.c_str(), message.c_str());
-      break;
-    case GmshSocket::GMSH_WARNING:
-      OLMsg::Direct(2, "%-8.8s: %s", _name.c_str(), message.c_str());
-      break;
-    case GmshSocket::GMSH_ERROR:
-      //OLMsg::Direct(1, "%-8.8s: %s", _name.c_str(), message.c_str());
-      OLMsg::Error("%-8.8s: %s", _name.c_str(), message.c_str());
-      break;
-    case GmshSocket::GMSH_MERGE_FILE:
-      break;
-    default:
-      OLMsg::Warning("Received unknown message type (%d)", type);
-      break;
+    else{// an error occurred
+      stop = true;
     }
+    if(stop) break;
+    if(haveData && !receiveMessage()) break;
+    if(getPid() < 0) break;
   }
 
-  server->Shutdown();
-  delete server;
+  socketConnection->Shutdown();
+  delete socketConnection;
+  setGmshServer(0);
   OLMsg::StatusBar(2, true, "Done running '%s'", _name.c_str());
 
   if(command.empty()){
@@ -310,14 +394,14 @@ bool localNetworkSolverClient::run()
 
 bool localNetworkSolverClient::kill()
 {
-  if(_pid > 0) {
-    if(KillProcess(_pid)){
-      OLMsg::Info("Killed '%s' (pid %d)", _name.c_str(), _pid);
-      _pid = -1;
+  if(getPid() > 0) {
+    if(KillProcess(getPid())){
+      OLMsg::Info("Killed '%s' (pid %d)", _name.c_str(), getPid());
+      setPid(-1);
       return true;
     }
   }
-  _pid = -1;
+  setPid(-1);
   return false;
 }
 
@@ -412,9 +496,7 @@ bool localSolverClient::checkCommandLine(){
     if(isNative()){ // native clients checked by initializing
       setAction("initialize");
       if(!run()){ // initializes native clients, false otherwise
-	OLMsg::Error("Invalid commandline <%s> for client <%s>",
-		     getCommandLine().c_str(), getName().c_str());
-	success=false;
+	success = false;
       }
     }
     else{
@@ -422,7 +504,7 @@ bool localSolverClient::checkCommandLine(){
       commandLine.assign(QuoteExecPath(getCommandLine()));
 
       // check whether the executable exists as a file
-      success=checkIfPresent(getCommandLine());
+      success = checkIfPresent(getCommandLine());
 
       // resolve a possible linux link
 #if not defined(WIN32)
@@ -454,7 +536,7 @@ bool localSolverClient::checkCommandLine(){
     OLMsg::Info("Command line ok");
   }
   else{
-    OLMsg::Error("Invalid command line <%s> for client <%s>",
+    OLMsg::Error("Invalid commandline <%s> for client <%s>",
 		 getCommandLine().c_str(), getName().c_str());
     //setCommandLine("");
     OLMsg::SetOnelabString(getName() + "/CommandLine", getCommandLine(), true);
diff --git a/contrib/onelab/OnelabClients.h b/contrib/onelab/OnelabClients.h
index 9775d37e84b9fca30b4fff833a49bd747f3ce2ed..4e4a20986c4a76f051783fbef3cda1d726bb5d01 100644
--- a/contrib/onelab/OnelabClients.h
+++ b/contrib/onelab/OnelabClients.h
@@ -190,7 +190,7 @@ class localNetworkSolverClient : public localSolverClient{
   int _pid;
   // underlying GmshServer
   GmshServer *_gmshServer;
-  // flag indicating whether socket communication should be shown
+  // flag indicating whether socket communication should be monitored
   bool _socketMsg;
  public:
  localNetworkSolverClient(const std::string &name, const std::string &cmdl, const std::string &wdir)
@@ -204,6 +204,7 @@ class localNetworkSolverClient : public localSolverClient{
   void setPid(int pid){ _pid = pid; }
   GmshServer *getGmshServer(){ return _gmshServer; }
   void setGmshServer(GmshServer *server){ _gmshServer = server; }
+  bool receiveMessage();
 
   bool isNative() { return true; }
   virtual std::string buildCommandLine();
diff --git a/contrib/onelab/OnelabMessage.h b/contrib/onelab/OnelabMessage.h
index d94612e7a298f2b1b91fe0cfd5c1fa21d487dc77..383afe79915c2e2eea36434026498568f6048778 100644
--- a/contrib/onelab/OnelabMessage.h
+++ b/contrib/onelab/OnelabMessage.h
@@ -14,6 +14,7 @@
 
 class GmshClient;
 
+#ifndef _GMSH_MESSAGE_H_
 // the external message handler
 class GmshMessage{
  public:
@@ -21,6 +22,7 @@ class GmshMessage{
   virtual ~GmshMessage(){}
   virtual void operator()(std::string level, std::string message){}
 };
+#endif
 
 class fullNameLessThan{
 public:
diff --git a/contrib/onelab/python/OnelabClient.py b/contrib/onelab/python/OnelabClient.py
index 257f8fcb534c09c3096e14d73f55624b5966a13a..8bfe3d240d0ccde3f4a6dd243e457bcbfc1f1fc7 100755
--- a/contrib/onelab/python/OnelabClient.py
+++ b/contrib/onelab/python/OnelabClient.py
@@ -1,6 +1,14 @@
 import socket, struct, os, sys
 _VERSION = '1.05'
 
+def file_exist(filename):
+  try:
+    with open(filename) as f:
+      return True
+  except IOError:
+    return False
+    
+
 class _parameter() :
   _membersbase = [
     ('name', 'string'), ('label', 'string', ''), ('help', 'string', ''),
@@ -13,7 +21,8 @@ class _parameter() :
       ('value', 'string'), ('kind', 'string', 'generic'), ('choices', ('list', 'string'), [])
     ],
     'number' : _membersbase + [
-      ('value', 'float'), ('min', 'float', -sys.float_info.max), ('max', 'float', sys.float_info.max),
+      ('value', 'float'),
+      ('min', 'float', -sys.float_info.max), ('max', 'float', sys.float_info.max),
       ('step', 'float', 0.), ('index', 'int', -1), ('choices', ('list', 'float'), []),
       ('labels', ('dict', 'float', 'string'), {})
     ]
@@ -67,7 +76,9 @@ class client :
   _GMSH_PARAMETER = 23
   _GMSH_PARAMETER_QUERY = 24
   _GMSH_CONNECT = 27
-
+  _GMSH_OLPARSE = 28
+  _GMSH_PARAM_NOT_FOUND = 29
+    
   def _receive(self) :
     def buffered_receive(l) :
       msg = b''
@@ -89,34 +100,60 @@ class client :
     if self.socket.send(struct.pack('ii%is' %len(m), t, len(m), m)) == 0 :
       RuntimeError('onelab socket closed')
 
-  def _get_parameter(self, param) :
+  def _def_parameter(self, param) :
     if not self.socket :
       return
     self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
     (t, msg) = self._receive() 
     if t == self._GMSH_PARAMETER :
       param.fromchar(msg)
-    elif t == self._GMSH_INFO :
+    elif t == self._GMSH_PARAM_NOT_FOUND :
       self._send(self._GMSH_PARAMETER, param.tochar())
 
-  def get_string(self, name, value, **param):
+  def def_string(self, name, value, **param):
     param = _parameter('string', name=name, value=value, **param)
-    self._get_parameter(param)
+    self._def_parameter(param)
     return param.value
 
-  def get_number(self, name, value, **param):
+  def def_number(self, name, value, **param):
     if "labels" in param :
       param["choices"] = param["labels"].keys()
     p = _parameter('number', name=name, value=value, **param)
-    self._get_parameter(p)
+    self._def_parameter(p)
     return p.value
 
+  def _get_parameter(self, param) :
+    if not self.socket :
+      return
+    self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
+    (t, msg) = self._receive() 
+    if t == self._GMSH_PARAMETER :
+      param.fromchar(msg)
+    elif t == self._GMSH_PARAM_NOT_FOUND :
+      print 'Unknown parameter %s' %(name)
+
+  def get_number(self, name):
+    param = _parameter('number', name=name, value=0)
+    self._get_parameter(param)
+    return param.value
+
+  def get_string(self, name):
+    param = _parameter('string', name=name, value='void')
+    self._get_parameter(param)
+    return param.value
+
   def sub_client(self, name, command):
-    self._send(self._GMSH_CONNECT, name)
+    print 'Defining the subclient ' + name
+    msg = [name, command]
+    ## msg.append(name + '\0')
+    ## msg.append(command + '\0')
+    if not self.socket :
+      return
+    self._send(self._GMSH_CONNECT, '\0'.join(msg))
     (t, msg) = self._receive()
     print ("python receive : ", t, msg)
     if t == self._GMSH_CONNECT and msg :
-      print "python launch : "+ command + " -onelab "+ msg
+      print "python launch : "+ command + " -onelab " + name + " " + msg
       os.system(command + " -onelab " + name + " " + msg)
 
   def merge_file(self, filename) :
@@ -126,6 +163,13 @@ class client :
       filename = os.getcwd() + "/" + filename;
     self._send(self._GMSH_PARSE_STRING, 'Merge "'+filename+'";')
 
+  def convert_olfile(self, filename) :
+    if not self.socket :
+      return
+    if filename and filename[0] != '/' :
+      filename = os.getcwd() + "/" + filename;
+    self._send(self._GMSH_OLPARSE, filename)
+
   def __init__(self):
     self.socket = None
     self.name = ""
@@ -139,7 +183,7 @@ class client :
           self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.socket.connect(sys.argv[i + 2])
         self._send(self._GMSH_START, str(os.getpid))
-    self.action = self.get_string(self.name + '/Action', 'compute')
+    self.action = self.get_string('python/Action')
     if self.action == "initialize": exit(0)
   
   def __del__(self) :
diff --git a/contrib/onelab/python/test.py b/contrib/onelab/python/test.py
index f2c1b840582a6781c7e210f0ee5f3e8722a39751..311f66846cb736cc8daae35b098c539b7697c2ba 100755
--- a/contrib/onelab/python/test.py
+++ b/contrib/onelab/python/test.py
@@ -5,11 +5,11 @@ import OnelabClient
 oc = OnelabClient.client()
 
 #name and default value are required
-A = oc.get_number('A', 10)
+A = oc.def_number('A', 10)
 #other attributes are optionals
-B = oc.get_number('Group/B', 0, min = -10, max = 10, step = 1)
-C = oc.get_number('Group/C', 2, choices = [0, 1, 2, 3], attributes={'Highlight':'Pink'})
-D = oc.get_number('Group/D', 2, labels = {0:'zero', 1:'un', 2:'deux', 3:'trois'}, attributes={'Highlight':'Blue'})
+B = oc.def_number('Group/B', 0, min = -10, max = 10, step = 1)
+C = oc.def_number('Group/C', 2, choices = [0, 1, 2, 3], attributes={'Highlight':'Pink'})
+D = oc.def_number('Group/D', 2, labels = {0:'zero', 1:'un', 2:'deux', 3:'trois'}, attributes={'Highlight':'Blue'})
 #utf-8 are allowed everywhere (should be prefixed by 'u' in python 2, not required in python 3)
 #Omega = oc.get_string(u'Ω', u'∫(∂φ/∂α)³dx', help=u'ask someone@universe.org', choices = ['oui', 'non', u'peut-être'])
 
@@ -17,11 +17,20 @@ modelName = 'coin'
 
 oc.merge_file(modelName + '.geo')
 
-print('Action=%s pour %s' %(oc.action,'python'))
-if oc.action != 'compute' :
-  exit(0)
+#print('Action=%s pour %s' %(oc.action,'python'))
+print('Action=%s' %(oc.get_string('python/Action')))
 
 oc.sub_client('gmsh', 'gmsh ' + modelName + '.geo -2')
 
 oc.merge_file(modelName + '.msh')
 
+oc.convert_olfile(modelName + '.txt')
+
+oc.sub_client('python', 'python ' + modelName + '.py')
+
+if oc.action != 'compute' :
+  exit(0)
+
+## insert here the client's script
+  
+exit(0)