diff --git a/Common/GmshSocket.h b/Common/GmshSocket.h
index 971b14933f8228698d9ce621a2ad6aab141c294a..467a93687d1e3f852d2d3cd430c98bce6798bff1 100644
--- a/Common/GmshSocket.h
+++ b/Common/GmshSocket.h
@@ -86,6 +86,7 @@ class GmshSocket{
     GMSH_PARAMETER_CLEAR     = 31,
     GMSH_PARAMETER_UPDATE    = 32,
     GMSH_OPEN_PROJECT        = 33,
+    GMSH_CLIENT_CHANGED      = 34,
     GMSH_OPTION_1            = 100,
     GMSH_OPTION_2            = 101,
     GMSH_OPTION_3            = 102,
diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp
index a111b0b5a8b3960dd87156423dc8d4b6071f9657..1044646a4dd78d07896fd71f305050f9e758e26a 100644
--- a/Common/OpenFile.cpp
+++ b/Common/OpenFile.cpp
@@ -439,7 +439,7 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, bool setWindowTit
     int num = defineSolver(split[1]);
     opt_solver_executable(num, GMSH_SET, fileName);
     CTX::instance()->launchSolverAtStartup = num;
-    Msg::SetOnelabNumber("0Metamodel/Batch", CTX::instance()->batch, false);
+    //Msg::SetOnelabNumber("0Metamodel/Batch", CTX::instance()->batch, false);
     return 1;
   }
 #endif
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index 14841184ea679a7187f96d150ec184be1378c740..3a622abd9d2a156654463007fa011ca0a6fa8541 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -402,8 +402,10 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master)
       std::string ofileName = split[0] + split[1] ;
       std::ofstream outfile(ofileName.c_str());
       localSolverClient *c = new InterfacedClient(split[1],"","");
-      if (outfile.is_open())
+      if (outfile.is_open()) {
+        Msg::Info("Preprocess file <%s>",ofileName.c_str());
         c->convert_onefile(message, outfile);
+      }
       else
         Msg::Error("The file <%s> cannot be opened",ofileName.c_str());
       outfile.close();
@@ -416,6 +418,13 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master)
 #endif
     }
     break;
+  case GmshSocket::GMSH_CLIENT_CHANGED:
+    {
+      std::string reply = onelab::server::instance()->getChanged(message) ? "changed" : "unchanged";
+      getGmshServer()->SendMessage
+        (GmshSocket::GMSH_CLIENT_CHANGED, reply.size(), &reply[0]);
+    }
+    break;
   default:
     Msg::Warning("Received unknown message type (%d)", type);
     break;
@@ -580,13 +589,10 @@ static bool incrementLoops()
   else if(onelabUtils::incrementLoop("2")) ret = true;
   else if(onelabUtils::incrementLoop("1")) ret = true;
 
-  //Update Onelab db parameter indicating whether or not in a loop
-  std::vector<onelab::number> pn;
-  onelab::server::instance()->get(pn,"0Metamodel/Loop");
-  if(pn.size()){
-    pn[0].setValue(ret?1:0);
-    onelab::server::instance()->set(pn[0]);
-  }
+  //Define ONELAB parameter indicating whether or not in a loop
+  onelab::number n("0Metamodel/Loop",ret?1:0);
+  n.setVisible(false);
+  onelab::server::instance()->set(n);
 
   if(FlGui::available() && onelab::server::instance()->getChanged())
     FlGui::instance()->rebuildTree(false);
@@ -801,7 +807,7 @@ void onelab_cb(Fl_Widget *w, void *data)
     }
 
     std::string fileName = "onelab.db";
-    // add tag if any
+    // add user defined tag, if any 
     std::vector<onelab::string> ps;
     onelab::server::instance()->get(ps,"0Metamodel/9Tag");
     if(ps.size()){
@@ -851,17 +857,16 @@ void onelab_cb(Fl_Widget *w, void *data)
 
   if(action == "compute") initializeLoops();
 
-  // check whether we are running a metamodel (.ol or .py)
-  std::vector<onelab::number> n;
-  onelab::server::instance()->get(n, "IsMetamodel");
-  bool isMetamodel = (n.size() && n[0].getValue());
-  onelab::server::instance()->get(n, "IsPyMetamodel");
-  bool isPyMetamodel = (n.size() && n[0].getValue());
+  // check whether we are running a metamodel (.py)
+  std::vector<onelab::number> pn;
+  onelab::server::instance()->get(pn, "IsPyMetamodel");
+  bool isPyMetamodel = (pn.size() && pn[0].getValue());
+
 
   do{ // enter loop
 
     // if the client is a not a metamodel, run Gmsh
-    if(!isMetamodel && !isPyMetamodel){
+    if(!isPyMetamodel){
       if(onelabUtils::runGmshClient(action, CTX::instance()->solver.autoMesh))
         drawContext::global()->draw();
     }
@@ -870,38 +875,28 @@ void onelab_cb(Fl_Widget *w, void *data)
       FlGui::instance()->onelab->checkForErrors("Gmsh");
     if(FlGui::instance()->onelab->stop()) break;
 
-    if(isMetamodel){
-#if defined(HAVE_ONELAB_METAMODEL)
-      if(metamodel(action)){
-        OpenProject(GModel::current()->getFileName());
-        drawContext::global()->draw();
-      }
-#endif
-    }
-    else{
-      // iterate over all other clients (there should normally only be one)
-      for(onelab::server::citer it = onelab::server::instance()->firstClient();
-          it != onelab::server::instance()->lastClient(); it++){
-        onelab::client *c = it->second;
-        if(c->getName() == "Gmsh" || // local Gmsh client
-           c->getName() == "Listen" || // unknown client connecting through "-listen"
-           c->getName() == "GmshRemote") // distant post-processing Gmsh client
-          continue;
-        if(action != "initialize") onelabUtils::guessModelName(c);
-        onelab::string o(c->getName() + "/Action", action);
-        o.setVisible(false);
-        o.setNeverChanged(true);
-        onelab::server::instance()->set(o);
-        c->run();
-        if(action == "compute"){
-          FlGui::instance()->onelab->checkForErrors(c->getName());
-        }
-        if(FlGui::instance()->onelab->stop()) break;
-      }
-      // after computing, all parameters are set unchanged
+    // iterate over all other clients (there should normally only be one)
+    for(onelab::server::citer it = onelab::server::instance()->firstClient();
+	it != onelab::server::instance()->lastClient(); it++){
+      onelab::client *c = it->second;
+      if(c->getName() == "Gmsh" || // local Gmsh client
+	 c->getName() == "Listen" || // unknown client connecting through "-listen"
+	 c->getName() == "GmshRemote") // distant post-processing Gmsh client
+	continue;
+      if(action != "initialize") onelabUtils::guessModelName(c);
+      onelab::string o(c->getName() + "/Action", action);
+      o.setVisible(false);
+      o.setNeverChanged(true);
+      onelab::server::instance()->set(o);
+      c->run();
       if(action == "compute"){
-        onelab::server::instance()->setChanged(false);
+	FlGui::instance()->onelab->checkForErrors(c->getName());
       }
+      if(FlGui::instance()->onelab->stop()) break;
+    }
+    // after computing, all parameters are set unchanged
+    if(action == "compute"){
+      onelab::server::instance()->setChanged(false);
     }
 
     if(action != "initialize"){
@@ -2071,6 +2066,10 @@ void solver_batch_cb(Fl_Widget *w, void *data)
     return;
   }
 
+  onelab::number n("0Metamodel/Batch", CTX::instance()->batch);
+  n.setVisible(false);
+  onelab::server::instance()->set(n);
+
   // create client
   onelab::localNetworkClient *c = new gmshLocalNetworkClient(name, exe, host);
   c->setIndex(num);
@@ -2118,6 +2117,7 @@ void flgui_wait_cb(double time)
   FlGui::instance()->wait(time);
 }
 
+/*
 int metamodel_cb(const std::string &name, const std::string &action)
 {
 #if defined(HAVE_ONELAB_METAMODEL)
@@ -2153,3 +2153,4 @@ int metamodel_cb(const std::string &name, const std::string &action)
   return 0;
 #endif
 }
+*/
diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp
index 6baf07118c1ca17e092a79663117f0f14c107408..24159fd857aab2a943de33d2bc366494ea2ca652 100644
--- a/contrib/onelab/OnelabParser.cpp
+++ b/contrib/onelab/OnelabParser.cpp
@@ -1439,7 +1439,7 @@ void localSolverClient::convert_oneline(std::string line, std::ifstream &infile,
 void localSolverClient::convert_onefile(std::string fileName, std::ofstream &outfile) {
   std::ifstream infile(fileName.c_str());
   if (infile.is_open()){
-    OLMsg::Info("Convert file <%s>",fileName.c_str());
+    //OLMsg::Info("Convert file <%s>",fileName.c_str());
     while ( infile.good() ) {
       std::string line;
       getline (infile,line);
diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py
index 21ce4b7af5f172c88e9d1119e03e4399f23eea79..f2b3344304ed7e8aa562173582920b5c74a7bd34 100755
--- a/contrib/onelab/python/onelab.py
+++ b/contrib/onelab/python/onelab.py
@@ -140,6 +140,7 @@ class client :
   _GMSH_PARAMETER_CLEAR = 31
   _GMSH_PARAMETER_UPDATE = 32
   _GMSH_OPEN_PROJECT = 33
+  _GMSH_CLIENT_CHANGED = 34
 
   def _createSocket(self) :
     addr = self.addr
@@ -279,7 +280,7 @@ class client :
     return param.choices
 
   def show(self, name) :
-    if not self.socket :
+    if not self.socket or not name:
       return
     param = _parameter('number', name=name)
     self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
@@ -287,7 +288,13 @@ class client :
     if t == self._GMSH_PARAMETER :
       print (msg.replace('\0','|'))
     elif t == self._GMSH_PARAMETER_NOT_FOUND :
-      print ('Unknown parameter %s' %(name))
+      param = _parameter('string', name=name)
+      self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
+      (t, msg) = self._receive() 
+      if t == self._GMSH_PARAMETER :
+        print (msg.replace('\0','|'))
+      elif t == self._GMSH_PARAMETER_NOT_FOUND :
+        print('Unknown parameter %s' %(name))
 
   def sendCommand(self, command) :
     if not self.socket :
@@ -341,11 +348,21 @@ class client :
     self._send(self._GMSH_OLPARSE, filename)
     (t, msg) = self._receive() 
     if t == self._GMSH_OLPARSE :
-      print(msg)
       if msg == "changed" :
           return True
     return False
 
+  def isChanged(self, clientname) :
+    if not self.socket :
+      return
+    self._send(self._GMSH_CLIENT_CHANGED, clientname)
+    (t, msg) = self._receive() 
+    if t == self._GMSH_CLIENT_CHANGED :
+      if msg == "changed" :
+          return True
+    return False
+
+    
   def waitOnSubClients(self):
     if not self.socket :
       return
@@ -386,9 +403,9 @@ class client :
     self.action = "compute" # default (subclients have no client.Action defined)
     self.action = self.getString(self.name + '/Action', False)
     self.setNumber('IsPyMetamodel',value=1,visible=0)
-    self.defineNumber('0Metamodel/Loop',value=0,visible=0)
-    self.loop = self.getNumber('0Metamodel/Loop')
-    self.batch = self.getNumber('0Metamodel/Batch')
+    #self.defineNumber('0Metamodel/Loop',value=0,visible=0)
+    self.loop = self.getNumber('0Metamodel/Loop', warn_if_not_found=False)
+    self.batch = self.getNumber('0Metamodel/Batch', warn_if_not_found=False)
     self.sendInfo("Performing OneLab '" + self.action + "'")
     if self.action == "initialize": 
       self.finalize()