diff --git a/Common/onelab.h b/Common/onelab.h
index 615b4da960f4f404d6e48efdd441fd346b1d21bf..8cd774a8d6fd84daded221563720197176d5f8aa 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -798,7 +798,7 @@ namespace onelab{
       }
       return false;
     }
-    // set the changed flag for all the parameters that depend on the give
+    // set the changed flag for all the parameters that depend on the given
     // client (or for all parameters if no client name is provided)
     void setChanged(bool changed, const std::string &client="")
     {
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index 6902d9bb4ba7778be02f8cfc12a36250205b5fea..5e72cb116a9639e64e48b91ec24fb575f35c2288 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -398,13 +398,16 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master)
   case GmshSocket::GMSH_OLPARSE:
     {
 #if defined(HAVE_ONELAB_METAMODEL)
-      std::vector<std::string> split = SplitOLFileName(message);
+      std::string::size_type first = 0;
+      std::string name = onelab::parameter::getNextToken(message, first);
+      std::string fileName = onelab::parameter::getNextToken(message, first);
+      std::vector<std::string> split = SplitOLFileName(fileName);
       std::string ofileName = split[0] + split[1] ;
       std::ofstream outfile(ofileName.c_str());
-      localSolverClient *c = new InterfacedClient(split[1],"","");
+      localSolverClient *c = new InterfacedClient(name,"","");
       if (outfile.is_open()) {
         Msg::Info("Preprocess file <%s>",ofileName.c_str());
-        c->convert_onefile(message, outfile);
+        c->convert_onefile(fileName, outfile);
       }
       else
         Msg::Error("The file <%s> cannot be opened",ofileName.c_str());
@@ -421,10 +424,19 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master)
     break;
   case GmshSocket::GMSH_CLIENT_CHANGED:
     {
-      std::string reply = onelab::server::instance()->getChanged(message) ?
-        "changed" : "unchanged";
+      std::string::size_type first = 0;
+      std::string command = onelab::parameter::getNextToken(message, first);
+       std::string name = onelab::parameter::getNextToken(message, first);
+     if(command == "get"){
+       std::string reply = onelab::server::instance()->getChanged(name) ?
+        "true" : "false";
       getGmshServer()->SendMessage
         (GmshSocket::GMSH_CLIENT_CHANGED, reply.size(), &reply[0]);
+      }
+      else if(command == "set"){
+	std::string changed = onelab::parameter::getNextToken(message, first);
+	onelab::server::instance()->setChanged(changed=="true"?true:false,name);
+      }
     }
     break;
   default:
@@ -917,6 +929,7 @@ void onelab_cb(Fl_Widget *w, void *data)
         // after computing with this solver, mark the parameters as unchanged
         // for this solver
         onelab::server::instance()->setChanged(false, c->getName());
+
 	FlGui::instance()->onelab->checkForErrors(c->getName());
       }
       if(FlGui::instance()->onelab->stop()) break;
diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py
index 62207b4c1eddfbd8ed06b005f0fb8baf3587bb29..4f932596d659ff299a1cfb9344a6e02d4d9bd31e 100755
--- a/contrib/onelab/python/onelab.py
+++ b/contrib/onelab/python/onelab.py
@@ -316,19 +316,6 @@ class client :
     if not self.socket or not filename :
       return
     self._send(self._GMSH_OPEN_PROJECT, filename)
-
-  def reloadGeometry(self, filename) :
-    if not self.socket or not filename :
-      return
-    if os.path.splitext(filename)[1] == '.geo' :
-      self._send(self._GMSH_PARSE_STRING, "Delete All;")
-      self._send(self._GMSH_MERGE_FILE, filename)
-
-  def mesh(self, filename) :
-    if not self.socket or not filename :
-      return
-    self._send(self._GMSH_PARSE_STRING, 'Mesh 3; Save "' + filename + ' ;')
-    self._send(self._GMSH_MERGE_FILE, filename)
     
   def sendInfo(self, msg) :
     if not self.socket :
@@ -348,26 +335,34 @@ class client :
       return
     self._send(self._GMSH_ERROR, str(msg))
 
-  def preProcess(self, filename) :
+  def preProcess(self, name, filename) :
     if not self.socket :
       return
-    self._send(self._GMSH_OLPARSE, filename)
+    msg = [name, filename]
+    self._send(self._GMSH_OLPARSE, '\0'.join(msg))
     (t, msg) = self._receive() 
     if t == self._GMSH_OLPARSE :
-      if msg == "changed" :
+      if msg == "true" :
           return True
     return False
 
-  def isChanged(self, clientname) :
+  def isChanged(self, name) :
     if not self.socket :
       return
-    self._send(self._GMSH_CLIENT_CHANGED, clientname)
+    msg = ["get", name]
+    self._send(self._GMSH_CLIENT_CHANGED, '\0'.join(msg))
     (t, msg) = self._receive() 
     if t == self._GMSH_CLIENT_CHANGED :
-      if msg == "changed" :
+      if msg == "true" :
           return True
     return False
 
+  def setChanged(self, name, changed) :
+    if not self.socket :
+      return
+    msg = ["set", name, 'true' if changed else 'false']
+    self._send(self._GMSH_CLIENT_CHANGED, '\0'.join(msg))
+
   def waitOnSubClients(self):
     if not self.socket :
       return
@@ -377,7 +372,7 @@ class client :
         self._numSubClients -= 1
 
   def runNonBlockingSubClient(self, name, command, arguments=''):
-    if self.action == "check":
+    if self.action == 'check':
       cmd = command
     else:
       cmd = command + ' ' + arguments
@@ -390,6 +385,8 @@ class client :
   def runSubClient(self, name, command, arguments=''):
     self.runNonBlockingSubClient(name, command, arguments)
     self.waitOnSubClients() # makes the subclient blocking
+    if self.action == 'compute': 
+      self.setChanged(name, False)
 
   def run(self, name, command, arguments=''):
     self.runSubClient(name, command, arguments)
@@ -428,7 +425,7 @@ class client :
   def __del__(self):
     self.finalize()
 
-  def call(self, cmdline, remote='', rundir='', logfile=''):
+  def call(self, name, cmdline, remote='', rundir='', logfile=''):
     cwd = None
     if not remote :
       argv = cmdline.rsplit(' ')
@@ -450,9 +447,12 @@ class client :
     result = call.wait()
     if result == 0 :
       self._send(self._GMSH_INFO, 'call \"' + ' '.join(argv) + '\"')
+      if self.action == 'compute':
+        self.setChanged(name, False)
     else :
       for line in iter(call.stderr.readline, b''):
         self._send(self._GMSH_ERROR, line.rstrip().encode('utf-8'))
+      sys.exit(1)
       
   def upload(self, here, there, remote='') :
     if not here or not there :