diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index eaa2616ffd1f7896d7d55873328b59b75c618491..820f85ff07c8235ca2f64bcf9da9e398a3dbd1fb 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -733,8 +733,24 @@ void Msg::ExchangeOnelabParameter(const std::string &key,
   bool noRange = true, noChoices = true, noLoop = true;
   bool noGraph = true, noClosed = true;
   if(ps.size()){
-    if(!ps[0].getReadOnly())
+
+    // modified implementation of ReadOnly
+    if(fopt.count("ReadOnly")) {
+      ps[0].setReadOnly(fopt["ReadOnly"][0] ? true : false);
+      if(ps[0].getReadOnly()) 
+	// If the parameter is set "read-only" in this statement
+	// use local value
+	ps[0].setValue(val[0]);
+      else
+	// use value from server
+	val[0] = ps[0].getValue(); 
+    }
+    else
       val[0] = ps[0].getValue(); // use value from server
+
+    // if(!ps[0].getReadOnly())
+    //   val[0] = ps[0].getValue(); // use value from server
+
     // keep track of these attributes, which can be changed server-side
     if(ps[0].getMin() != -onelab::parameter::maxNumber() ||
        ps[0].getMax() != onelab::parameter::maxNumber() ||
@@ -790,12 +806,6 @@ void Msg::ExchangeOnelabParameter(const std::string &key,
     if(copt.count("Choices")) ps[0].setChoiceLabels(copt["Choices"]);
   }
   if(fopt.count("Visible")) ps[0].setVisible(fopt["Visible"][0] ? true : false);
-  if(fopt.count("ReadOnly")) {
-    ps[0].setReadOnly(fopt["ReadOnly"][0] ? true : false);
-    // If the parameter is set "read-only" here, the local value is used instead
-    // of that from the server
-    if(ps[0].getReadOnly()) ps[0].setValue(val[0]);
-  }
   if(copt.count("Help")) ps[0].setHelp(copt["Help"][0]);
   if(copt.count("Label")) ps[0].setLabel(copt["Label"][0]);
   if(copt.count("ShortHelp")) ps[0].setLabel(copt["ShortHelp"][0]);
diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index 96eaeddc010c90ae97955f789d692b41440c4bcb..b6b0070a4e98d71f157215828c32b5fb5dde72bd 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -558,7 +558,7 @@ void onelab_cb(Fl_Widget *w, void *data)
 	geometry_reload_cb(0, 0);
 #endif
     }
-    else{
+    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++){
diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp
index 433db4eab5db259fd76446d424885d2a4d28acb3..d21cfb740406090abdd54d7041769c49aa99cb26 100644
--- a/contrib/onelab/OnelabClients.cpp
+++ b/contrib/onelab/OnelabClients.cpp
@@ -32,7 +32,7 @@ class onelabMetaModelServer : public GmshServer{
       return 1;
     }
     std::string cmd(command);
-    int pos;
+    size_t pos;
     if((pos=cmd.find("incomp_ssh ")) != std::string::npos){
       cmd.assign(cmd.substr(pos+7));  // remove "incomp_"
       cmd.append(" & '");
@@ -59,6 +59,17 @@ class onelabMetaModelServer : public GmshServer{
       // return immediately, i.e., do polling)
       int ret = Select(0, 0, socket);
       if(ret == 0){ // nothing available
+        // if asked, refresh the onelab GUI
+        // std::vector<onelab::string> ps;
+        // onelab::server::instance()->get(ps, "Gmsh/Action");
+        // if(ps.size() && ps[0].getValue() == "refresh"){
+        //   ps[0].setVisible(false);
+        //   ps[0].setValue("");
+        //   onelab::server::instance()->set(ps[0]);
+        //   onelab_cb(0, (void*)"refresh");
+        //}
+
+        // wait at most waitint seconds and respond to FLTK events
 	//FlGui::instance()->wait(waitint);
 	void (*waitFct)(double) = OLMsg::GetGuiWaitFunction();
 	if(waitFct) waitFct(waitint);
@@ -316,8 +327,6 @@ bool localNetworkSolverClient::run()
       OLMsg::Fatal("%-8.8s: %s", _name.c_str(), message.c_str());
       break;
     case GmshSocket::GMSH_MERGE_FILE:
-      OLMsg::Info("Merge Post-Processing File %s",message.c_str());
-      SystemCall("gmsh "+ message);
       break;
     default:
       OLMsg::Warning("Received unknown message type (%d)", type);
@@ -390,7 +399,7 @@ bool localSolverClient::checkCommandLine(){
   OLMsg::Info("Check command line for <%s>",getName().c_str());
 
   if(getCommandLine().empty())
-    OLMsg::Fatal("No commandline for client <%s>", getName().c_str());
+    OLMsg::Warning("No commandline for client <%s>", getName().c_str());
 
   if(!isActive()) return true;
 
@@ -399,6 +408,7 @@ bool localSolverClient::checkCommandLine(){
     run(); // does nothing for Interfaced clients, initializes native clients
   }
   else{
+    std::cout << "FHF hasGmsh=" << OLMsg::hasGmsh << std::endl;
     if(OLMsg::hasGmsh) {
       // exits metamodel and restores control to the onelab window
       OLMsg::Error("The command line of client <%s> is undefined.",
@@ -431,12 +441,13 @@ bool localSolverClient::buildRmCommand(std::string &cmd){
 #else
     cmd.append("rm -rf ");
 #endif
-    for(unsigned int i = 0; i < choices.size(); i++)
-      cmd.append(choices[i]+" ");
-    return true;
+    if(choices.size()){
+      for(unsigned int i = 0; i < choices.size(); i++)
+	cmd.append(choices[i]+" ");
+      return true;
+    }
   }
-  else
-    return false;
+  return false;
 }
 
 void localSolverClient::addNumberChoice(std::string name, double val)
@@ -462,18 +473,17 @@ void localSolverClient::addNumberChoice(std::string name, double val)
 
 void localSolverClient::PostArray(std::vector<std::string> choices)
 {
-  int nb=0;
-  while( 4*(nb+1) <= choices.size()){
-    //std::cout << "Nb Choices" << choices.size() << std::endl;
-    int lin= atof(choices[4*nb+1].c_str());
-    int col= atof(choices[4*nb+2].c_str());
-    std::string fileName = getWorkingDir()+choices[4*nb];
+  unsigned int i=0;
+  while( 4*(i+1) <= choices.size()){
+    int lin= atof(choices[4*i+1].c_str())-1;
+    int col= atof(choices[4*i+2].c_str())-1;
+    std::string fileName = getWorkingDir()+choices[4*i];
       //checkIfPresent or make available locally
     double val=find_in_array(lin,col,read_array(fileName,' '));
-    addNumberChoice(choices[4*nb+3],val);
+    addNumberChoice(choices[4*i+3],val);
     OLMsg::Info("Upload parameter <%s>=%e from file <%s>",
-		choices[4*nb+3].c_str(),val,fileName.c_str());
-    nb++;
+		choices[4*i+3].c_str(),val,fileName.c_str());
+    i++;
   }
 }
 
@@ -490,7 +500,6 @@ void localSolverClient::GmshMerge(std::vector<std::string> choices)
 // REMOTE CLIENT
 
 bool remoteClient::checkCommandLine(const std::string &commandLine){
-  struct stat buf;
   std::string cmd;
   char cbuf [1024];
   FILE *fp;
@@ -513,7 +522,6 @@ bool remoteClient::checkCommandLine(const std::string &commandLine){
 }
 
 bool remoteClient::checkIfPresentRemote(const std::string &fileName){
-  struct stat buf;
   std::string cmd;
   char cbuf [1024];
   FILE *fp;
@@ -532,7 +540,7 @@ bool remoteClient::checkIfPresentRemote(const std::string &fileName){
 }
 
 bool remoteClient::syncInputFile(const std::string &wdir, const std::string &fileName){
-  int pos;
+  size_t pos;
   std::string cmd;
   if((pos=fileName.find(onelabExtension)) != std::string::npos){
     // .ol file => local
@@ -542,6 +550,7 @@ bool remoteClient::syncInputFile(const std::string &wdir, const std::string &fil
     std::string fullName = wdir+trueName;
     if(checkIfPresent(fullName)){
       cmd.assign("rsync -e ssh -auv "+fullName+" "+_remoteHost+":"+_remoteDir+"/"+trueName);
+      sleep(OLMsg::GetOnelabNumber("RSYNCDELAY"));
       return mySystem(cmd);
     }
     else{
@@ -555,6 +564,7 @@ bool remoteClient::syncInputFile(const std::string &wdir, const std::string &fil
       std::string fullName = wdir+fileName;
       if(checkIfPresent(fullName)){
 	cmd.assign("rsync -e ssh -auv "+fullName+" "+_remoteHost+":"+_remoteDir+"/"+fileName);
+	sleep(OLMsg::GetOnelabNumber("RSYNCDELAY"));
 	return mySystem(cmd);
       }
       else{
@@ -577,17 +587,18 @@ bool remoteClient::syncOutputFile(const std::string &wdir, const std::string &fi
   std::string cmd;
 
   if(checkIfPresentRemote(fileName)){
-    int pos=fileName.find_first_not_of(" ");
-    if(!fileName.compare(pos,1,".")){ // the file must be copied back locally
+    size_t pos=fileName.find_first_not_of(" ");
+    if(!fileName.compare(pos,1,".")){ 
+      // the file must be copied back on local host
       cmd.assign("rsync -e ssh -auv "+_remoteHost+":"+_remoteDir+dirSep
 		 +fileName.substr(pos,std::string::npos)+" .");
       if(!wdir.empty())
 	cmd.append(dirSep+wdir);
+      sleep(OLMsg::GetOnelabNumber("RSYNCDELAY"));
       return mySystem(cmd);
     }
   }
-  else
-    return false;
+  return false;
 }
 
 // client METAMODEL
@@ -623,16 +634,6 @@ void MetaModel::construct()
   closeOnelabBlock();
 }
 
-// void MetaModel::initialize()
-// {
-//   OLMsg::Info("Metamodel now INITIALIZING");
-//   OLMsg::Info("Initialize Metamodel by the loader");
-//   OLMsg::SetOnelabString(clientName + "/9CheckCommand","-a",false);
-//   OLMsg::SetOnelabNumber(clientName + "/UseCommandLine",1,false);
-//   OLMsg::SetOnelabNumber(clientName + "/Initialized",1,false);
-// }
-
-
 void MetaModel::analyze() {
   OLMsg::Info("Metamodel now ANALYZING");
   std::string fileName = genericNameFromArgs + onelabExtension;
@@ -670,8 +671,8 @@ void MetaModel::registerClient(const std::string &name, const std::string &type,
       c= new RemoteInterfacedClient(name,cmdl,getWorkingDir(),host,rdir);
     else if(!type.compare(0,6,"native"))
       c= new RemoteNativeClient(name,cmdl,getWorkingDir(),host,rdir);
-    // else if(!type.compare(0,6,"encaps"))
-    //   c= new RemoteEncapsulatedClient(name,cmdl,getWorkingDir(),host,rdir);
+    else if(!type.compare(0,6,"encaps"))
+      c= new RemoteEncapsulatedClient(name,cmdl,getWorkingDir(),host,rdir);
     else
       OLMsg::Fatal("Unknown remote client type", type.c_str());
   }
@@ -680,24 +681,23 @@ void MetaModel::registerClient(const std::string &name, const std::string &type,
 
 void MetaModel::PostArray(std::vector<std::string> choices)
 {
-  int nb=0;
-  //onelab::number o;
-  while( 4*(nb+1) <= choices.size()){
-    int lin= atof(choices[4*nb+1].c_str());
-    int col= atof(choices[4*nb+2].c_str());
+  unsigned int i=0;
+  while( 4*(i+1) <= choices.size()){
+    int lin= atof(choices[4*i+1].c_str())-1;
+    int col= atof(choices[4*i+2].c_str())-1;
     std::string fileName =
-      OLMsg::GetOnelabString("Arguments/WorkingDir")+choices[4*nb];
+      OLMsg::GetOnelabString("Arguments/WorkingDir")+choices[4*i];
     double val=find_in_array(lin,col,read_array(fileName,' '));
-    addNumberChoice(choices[4*nb+3],val);
-    OLMsg::Info("PostArray <%s>=%e",choices[4*nb+3].c_str(),val);
-    nb++;
+    addNumberChoice(choices[4*i+3],val);
+    OLMsg::Info("PostArray <%s>=%e",choices[4*i+3].c_str(),val);
+    i++;
   }
 }
 
 // INTERFACED client
 
 void InterfacedClient::analyze() {
-  int pos;
+  size_t pos;
   std::vector<std::string> choices;
 
   setAction("check");
@@ -715,7 +715,7 @@ void InterfacedClient::analyze() {
 }
 
 void InterfacedClient::convert() {
-  int pos;
+  size_t pos;
   std::vector<std::string> choices;
   getList("InputFiles", choices);
   for(unsigned int i = 0; i < choices.size(); i++){
@@ -737,43 +737,35 @@ void InterfacedClient::compute(){
   std::string cmd;
   std::vector<std::string> choices;
 
-  OLMsg::Info("Computes <%s> changed=%d", getName().c_str(),
-	      onelab::server::instance()->getChanged(getName()));
+  OLMsg::Info("Computes <%s>", getName().c_str());
 
-  if(getActive() && onelab::server::instance()->getChanged(getName())){
-    analyze();
-    if(getList("InputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	//remove .ol ext
-	checkIfPresentLocal(
-	     choices[i].substr(0,choices[i].find(onelabExtension)));
-      }
-    }
+  analyze();
+  setAction("compute");
 
-    setAction("compute");
-    if(buildRmCommand(cmd)){
-      OLMsg::Info("Calling <%s>",cmd.c_str());
-      SystemCall(cmd,true);
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      //remove .ol ext
+      checkIfPresentLocal(
+	 choices[i].substr(0,choices[i].find(onelabExtension)));
     }
+  }
 
-    cmd.assign("");
-    if(!getWorkingDir().empty())
-      cmd.append("cd " + getWorkingDir() + cmdSep);
-    cmd.append(FixWindowsPath(getCommandLine()));
-    cmd.append(" " + getString("Arguments"));
+  if(buildRmCommand(cmd)) mySystem(cmd);
 
-    if(cmd.size()){
-      OLMsg::Info("Calling <%s>",cmd.c_str());
-      SystemCall(cmd.c_str(),true);
-    }
+  cmd.assign("");
+  if(!getWorkingDir().empty())
+    cmd.append("cd " + getWorkingDir() + cmdSep);
+  cmd.append(FixWindowsPath(getCommandLine()));
+  cmd.append(" " + getString("Arguments"));
 
-    if(getList("OutputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	checkIfPresentLocal(choices[i]);
-      }
+  if(cmd.size()) mySystem(cmd.c_str());
+
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      checkIfPresentLocal(choices[i]);
     }
   }
-  OLMsg::Info("Client %s completed",_name.c_str());
+  OLMsg::Info("Client %s completed",getName().c_str());
 }
 
 // NATIVE Client
@@ -789,38 +781,33 @@ void NativeClient::compute() {
   std::string cmd;
   std::vector<std::string> choices;
 
+  OLMsg::Info("Computes <%s>", getName().c_str());
+  analyze();
   setAction("compute");
-  OLMsg::Info("Computes <%s> changed=%d", getName().c_str(),
-	      onelab::server::instance()->getChanged(getName()));
-  if(getActive() && onelab::server::instance()->getChanged(getName())){
-    if(buildRmCommand(cmd)){
-      OLMsg::Info("Calling <%s>",cmd.c_str());
-      SystemCall(cmd,true);
-    }
 
-    if(getList("InputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	checkIfPresentLocal(choices[i]);
-      }
+  if(buildRmCommand(cmd)) mySystem(cmd);
+
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      checkIfPresentLocal(choices[i]);
     }
-    run();
+  }
+  run();
 
-    if(getList("OutputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	checkIfPresentLocal(choices[i]);
-      }
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      checkIfPresentLocal(choices[i]);
     }
   }
+  OLMsg::Info("Client %s completed",getName().c_str());
 }
 
 // ENCAPSULATED Client
-
-// bool EncapsulatedClient::checkCommandLine(){
-//   return localSolverClient::checkCommandLine(getCommandLine());
-// }
+// EncapsulatedClient's are InterfacedClient's called via the loader
+// so that Gmsh sees them as a localNetworkClient 
 
 void EncapsulatedClient::analyze() {
-  int pos;
+  size_t pos;
   std::vector<std::string> choices;
 
   setAction("check");
@@ -838,7 +825,7 @@ void EncapsulatedClient::analyze() {
 }
 
 void EncapsulatedClient::convert() {
-  int pos;
+  size_t pos;
   std::vector<std::string> choices;
   getList("InputFiles", choices);
   for(unsigned int i = 0; i < choices.size(); i++){
@@ -866,43 +853,37 @@ void EncapsulatedClient::compute(){
   std::string cmd;
   std::vector<std::string> choices;
 
-  //setAction("compute");
-  std::string name=getName();
-  OLMsg::Info("Computes <%s> changed=%d", name.c_str(),
-	      onelab::server::instance()->getChanged(name));
-
-  if(getActive() && onelab::server::instance()->getChanged(name)){
-    analyze();
-    if(getList("InputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	//remove .ol ext
-	checkIfPresentLocal(
-	     choices[i].substr(0,choices[i].find(onelabExtension)));
-      }
-    }
+  OLMsg::Info("Computes <%s>", getName().c_str());
 
-    setAction("compute");
-    if(buildRmCommand(cmd)){
-      OLMsg::Info("Calling <%s>",cmd.c_str());
-      SystemCall(cmd,true);
+  analyze();
+  setAction("compute");
+
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      //remove .ol ext
+      checkIfPresentLocal(
+	  choices[i].substr(0,choices[i].find(onelabExtension)));
     }
+  }
 
-    cmd.assign("");
-    if(!getWorkingDir().empty())
-      cmd.append("cd " + getWorkingDir() + cmdSep);
-    cmd.append(FixWindowsPath(getCommandLine()));
-    cmd.append(" " + getString("Arguments"));
+  setAction("compute");
+  if(buildRmCommand(cmd)) mySystem(cmd);
 
-    OLMsg::SetOnelabString(name+"/FullCmdLine",cmd,false);
-    run();
+  cmd.assign("");
+  if(!getWorkingDir().empty())
+    cmd.append("cd " + getWorkingDir() + cmdSep);
+  cmd.append(FixWindowsPath(getCommandLine()));
+  cmd.append(" " + getString("Arguments"));
 
-    if(getList("OutputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++){
-	checkIfPresentLocal(choices[i]);
-      }
+  OLMsg::SetOnelabString(getName()+"/FullCmdLine",cmd,false);
+  run();
+
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++){
+      checkIfPresentLocal(choices[i]);
     }
   }
-  OLMsg::Info("Client %s completed",name.c_str());
+  OLMsg::Info("Client %s completed",getName().c_str());
 }
 
 // REMOTE INTERFACED Client
@@ -915,35 +896,36 @@ void RemoteInterfacedClient::compute(){
   std::string cmd,rmcmd;
   std::vector<std::string> choices;
 
-  setAction("compute");
-  OLMsg::Info("Computes <%s> changed=%d", getName().c_str(),
-	      onelab::server::instance()->getChanged(getName()));
+  OLMsg::Info("Computes <%s>", getName().c_str());
 
-  if(getActive() && onelab::server::instance()->getChanged(getName())){
-    if(getList("InputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++)
-	syncInputFile(getWorkingDir(),choices[i]);
-    }
+  analyze();
+  setAction("compute");
 
-    if(buildRmCommand(rmcmd)){
-      cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "+rmcmd+"'");
-      mySystem(cmd);
-    }
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncInputFile(getWorkingDir(),choices[i]);
+  }
 
-    cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "
-	       +getCommandLine()+" "+getString("Arguments")+"'");
+  if(buildRmCommand(rmcmd)){
+    cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "+rmcmd+"'");
     mySystem(cmd);
+  }
 
-    if(getList("OutputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++)
-	syncOutputFile(getWorkingDir(),choices[i]);
-    }
+  cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "
+	     +getCommandLine()+" "+getString("Arguments")+"'");
+  mySystem(cmd);
 
-    if(getList("PostArray",choices))
-      PostArray(choices);
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncOutputFile(getWorkingDir(),choices[i]);
   }
+
+  // if(getList("PostArray",choices))
+  //   PostArray(choices);
+  OLMsg::Info("Client %s completed",getName().c_str());
 }
 
+
 // REMOTE NATIVE Client
 
 std::string RemoteNativeClient::buildCommandLine(){
@@ -978,31 +960,69 @@ void RemoteNativeClient::compute(){
   std::string cmd,rmcmd;
   std::vector<std::string> choices;
 
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str());
+  analyze();
   setAction("compute");
-  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
-	      onelab::server::instance()->getChanged(getName()));
 
-  if(getActive() && onelab::server::instance()->getChanged(getName())){
-    if(getList("InputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++)
-	syncInputFile(getWorkingDir(),choices[i]);
-    }
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncInputFile(getWorkingDir(),choices[i]);
+  }
 
-    if(buildRmCommand(rmcmd)){
-      cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "+rmcmd+"'");
-      mySystem(cmd);
-    }
+  if(buildRmCommand(rmcmd)){
+    cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "+rmcmd+"'");
+    mySystem(cmd);
+  }
 
-    run();
+  run();
 
-    if(getList("OutputFiles",choices)){
-      for(unsigned int i = 0; i < choices.size(); i++)
-	syncOutputFile(getWorkingDir(),choices[i]);
-    }
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncOutputFile(getWorkingDir(),choices[i]);
+  }
+
+  // if(getList("PostArray",choices))
+  //   PostArray(choices);
+  OLMsg::Info("Client %s completed",getName().c_str());
+}
+
+
+// REMOTE ENCAPSULATED Client
+
+bool RemoteEncapsulatedClient::checkCommandLine(){
+  return remoteClient::checkCommandLine(getCommandLine());
+}
+
+void RemoteEncapsulatedClient::compute(){
+  std::string cmd,rmcmd;
+  std::vector<std::string> choices;
+
+  OLMsg::Info("Computes <%s> changed=%d", getName().c_str());
+  analyze();
+  setAction("compute");
+
+  if(getList("InputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncInputFile(getWorkingDir(),choices[i]);
+  }
 
-    if(getList("PostArray",choices))
-      PostArray(choices);
+  if(buildRmCommand(rmcmd)){
+    cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "+rmcmd+"'");
+    mySystem(cmd);
   }
+
+  cmd.assign("ssh "+getRemoteHost()+" 'cd "+getRemoteDir()+"; "
+	     +getCommandLine()+" "+getString("Arguments")+"'");
+  mySystem(cmd);
+
+  if(getList("OutputFiles",choices)){
+    for(unsigned int i = 0; i < choices.size(); i++)
+      syncOutputFile(getWorkingDir(),choices[i]);
+  }
+
+  // if(getList("PostArray",choices))
+  //   PostArray(choices);
+  OLMsg::Info("Client %s completed",getName().c_str());
 }
 
 // ONELAB additional TOOLS (no access to server in tools)
@@ -1052,6 +1072,7 @@ int getOptions(int argc, char *argv[], parseMode &todo, std::string &commandLine
       i++;
     }
   }
+  return(1);
 }
 
 std::string itoa(const int i){
@@ -1067,7 +1088,7 @@ std::string ftoa(const double x){
 }
 
 int mySystem(std::string commandLine){
-  //std::cout << "mySystem<" << commandLine << ">" << std::endl;
+  OLMsg::Info("Calling <%s>", commandLine.c_str());
   return SystemCall(commandLine.c_str(), true);
 }
 
@@ -1113,8 +1134,8 @@ std::string sanitize(const std::string &in)
 }
 std::string removeBlanks(const std::string &in)
 {
-  int pos0=in.find_first_not_of(" ");
-  int pos=in.find_last_not_of(" ");
+  size_t pos0=in.find_first_not_of(" ");
+  size_t pos=in.find_last_not_of(" ");
   if( (pos0 != std::string::npos) && (pos != std::string::npos))
     return in.substr(pos0,pos-pos0+1);
   else
@@ -1122,38 +1143,37 @@ std::string removeBlanks(const std::string &in)
 }
 bool isPath(const std::string &in)
 {
-  int pos=in.find_last_not_of(" 0123456789");
+  size_t pos=in.find_last_not_of(" 0123456789");
   if(in.compare(pos,1,dirSep))
     OLMsg::Fatal("The argument <%s> is not a valid path (must end with '/')",in.c_str());
   return true;
 }
 
-std::vector <double> extract_column(const int col, array data){
-  std::vector<double> column;
-  for ( int i=0; i<data.size(); i++)
-    if (  col>0 && col<=data[i].size())
-      column.push_back(data[i][col-1]);
-    else
-      OLMsg::Fatal("Column number (%d) out of range.",col);
-  return column;
-}
+// std::vector <double> extract_column(const unsigned int col, const array data){
+//   std::vector<double> column;
+//   for(unsigned int i=0; i<data.size(); i++)
+//     if(col<=data[i].size())
+//       column.push_back(data[i][col-1]);
+//     else
+//       OLMsg::Fatal("Column number (%d) out of range.",col);
+//   return column;
+// }
 
 double find_in_array(int lin, int col, const std::vector <std::vector <double> > &data){
-  if ( lin<0 ) {
-    lin=data.size();
-  }
-  if ( lin>=1 && lin<=data.size()){
-    if ( col>=1 && col<=data[lin-1].size() )
-      return data[lin-1][col-1];
+  if(lin<0) lin=(int)data.size()-1;
+  if(lin<(int)data.size()){
+    if ( col>=0 && col<(int)data[lin].size() )
+      return data[lin][col];
   }
   OLMsg::Fatal("The value has not been calculated: (%d,%d) out of range",lin,col);
+  return(0);
 }
 
 array read_array(std::string fileName, char sep){
   std::ifstream infile(sanitize(fileName).c_str());
   std::vector <std::vector <double> > array;
 
-  int deb,end;
+  size_t deb,end;
   double temp;
   while (infile){
     std::string s;
diff --git a/contrib/onelab/OnelabClients.h b/contrib/onelab/OnelabClients.h
index eba73429073907d0e4043886ae925def9c43279a..02d7cf386a80a5945e99d488c8a5a488d5847e72 100644
--- a/contrib/onelab/OnelabClients.h
+++ b/contrib/onelab/OnelabClients.h
@@ -20,7 +20,6 @@ static std::string onelabExtension(".ol");
 // Possible actions for clients
 enum parseMode {INITIALIZE, REGISTER, ANALYZE, COMPUTE, EXIT, STOP};
 
-static char charSep() { return '\0'; }
 #if defined(WIN32)
 static std::string dirSep("\\");
 static std::string cmdSep(" & ");
@@ -42,7 +41,7 @@ std::string removeBlanks(const std::string &in);
 bool isPath(const std::string &in);
 
 // Parser TOOLS 
-int enclosed(const std::string &in, std::vector<std::string> &arguments);
+int enclosed(const std::string &in, std::vector<std::string> &arguments, size_t &end);
 int extract(const std::string &in, std::string &paramName, std::string &action, std::vector<std::string> &arguments);
 bool extractRange(const std::string &in, std::vector<double> &arguments);
 std::string extractExpandPattern(const std::string& str);
@@ -51,7 +50,7 @@ std::string extractExpandPattern(const std::string& str);
 typedef std::vector <std::vector <double> > array;
 array read_array(std::string fileName, char sep);
 double find_in_array(int i, int j, const std::vector <std::vector <double> > &data);
-std::vector<double> extract_column(const int j, array data);
+//std::vector<double> extract_column(const int j, array data);
 
 static std::string getShortName(const std::string &name) {
   std::string s = name;
@@ -219,8 +218,12 @@ class remoteClient {
 
 class MetaModel : public localSolverClient {
  private:
+  // clients in order of appearance in the metamodel 
   std::vector<localSolverClient *> _clients;
+  // action performed at this metamodel call
   parseMode _todo;
+  // remains false as long as the clients do not need recomputation 
+  bool _started;
  public:
  MetaModel(const std::string &cmdl, const std::string &wdir, const std::string &cname, const std::string &fname) 
    : localSolverClient(cname,cmdl,wdir){
@@ -228,6 +231,7 @@ class MetaModel : public localSolverClient {
     genericNameFromArgs = fname.size() ? fname : cmdl;
     setWorkingDir(wdir); // wdir from args
     _todo=REGISTER;
+    _started=false;
     construct();
   }
   ~MetaModel(){}
@@ -235,6 +239,7 @@ class MetaModel : public localSolverClient {
   void setTodo(const parseMode x) { _todo=x; }
   parseMode getTodo() { return _todo; }
   bool isTodo(const parseMode x) { return (_todo==x);}
+  bool isStarted(bool x) { _started = _started || x; return _started; }
   citer firstClient(){ return _clients.begin(); }
   citer lastClient(){ return _clients.end(); }
   int getNumClients() { return _clients.size(); };
@@ -253,7 +258,7 @@ class MetaModel : public localSolverClient {
   std::string genericNameFromArgs, clientName;
   void client_sentence(const std::string &name, const std::string &action, 
 		       const std::vector<std::string> &arguments);
-  std::string toChar(){}
+  std::string toChar(){ return "";}
   void PostArray(std::vector<std::string> choices);
   void construct();
   void analyze();
@@ -320,6 +325,15 @@ public:
   void compute() ;
 };
 
+class RemoteEncapsulatedClient : public EncapsulatedClient, public remoteClient {
+public:
+ RemoteEncapsulatedClient(const std::string &name, const std::string &cmdl, const std::string &wdir, const std::string &host, const std::string &rdir) 
+   : EncapsulatedClient(name,cmdl,wdir), remoteClient(host,rdir) {}
+  ~RemoteEncapsulatedClient(){}
+
+  bool checkCommandLine();
+  void compute() ;
+};
 #endif
 
 
diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp
index 008806ddd776b703a6bf930599cc98bb071a359c..e192ea58259f2cd1b2c4d225eca9239b3a000590 100644
--- a/contrib/onelab/OnelabParser.cpp
+++ b/contrib/onelab/OnelabParser.cpp
@@ -24,10 +24,10 @@ namespace olkey{
 }
 
 int enclosed(const std::string &in, std::vector<std::string> &arguments,
-	     int &end){
+	     size_t &end){
   // syntax: (arguments[Ø], arguments[1], ... , arguments[n])
   // arguments[i] may contain parenthesis
-  int pos, cursor;
+  size_t pos, cursor;
   arguments.resize(0);
   cursor=0;
   if ( (pos=in.find("(",cursor)) == std::string::npos )
@@ -66,7 +66,7 @@ int enclosed(const std::string &in, std::vector<std::string> &arguments,
 
 int extractLogic(const std::string &in, std::vector<std::string> &arguments){
   // syntax: ( argument[0], argument[1]\in{<,>,<=,>=,==,!=}, arguments[2])
-  int pos, cursor;
+  size_t pos, cursor;
   arguments.resize(0);
   cursor=0;
   if ( (pos=in.find("(",cursor)) == std::string::npos )
@@ -109,7 +109,7 @@ int extractLogic(const std::string &in, std::vector<std::string> &arguments){
 int extract(const std::string &in, std::string &paramName, 
 	    std::string &action, std::vector<std::string> &arguments){
   // syntax: paramName.action( arg1, arg2, ... )
-  int pos, cursor;
+  size_t pos, cursor;
   cursor=0;
   if ( (pos=in.find(".",cursor)) == std::string::npos )
      OLMsg::Fatal("Syntax error: <%s>",in.c_str());
@@ -126,7 +126,7 @@ int extract(const std::string &in, std::string &paramName,
 
 bool extractRange(const std::string &in, std::vector<double> &arguments){
   // syntax: a:b:c or a:b#n
-  int pos, cursor;
+  size_t pos, cursor;
   arguments.resize(0);
   cursor=0;
   if ( (pos=in.find(":",cursor)) == std::string::npos )
@@ -150,7 +150,7 @@ bool extractRange(const std::string &in, std::vector<double> &arguments){
 }
 
 std::string extractExpandPattern(const std::string& str){
-  int posa,posb;
+  size_t posa, posb;
   posa=str.find_first_of("\"\'<");
   posb=str.find_last_of("\"\'>");
   std::string pattern=str.substr(posa+1,posb-posa-1);
@@ -170,7 +170,6 @@ std::string localSolverClient::longName(const std::string name){
     fullName.assign(OLMsg::obtainFullName(*it));
   else
     fullName.assign(OLMsg::obtainFullName(name));
-  //std::cout << "Full name=<" << name << "> => <" << fullName << ">" << std::endl;
   return fullName;
 }
 
@@ -179,7 +178,7 @@ std::string localSolverClient::resolveGetVal(std::string line) {
   std::vector<onelab::string> strings;
   std::vector<std::string> arguments;
   std::string buff;
-  int pos,pos0,cursor;
+  size_t pos, pos0, cursor;
 
   cursor=0;
   while ( (pos=line.find(olkey::getValue,cursor)) != std::string::npos){
@@ -214,7 +213,7 @@ std::string localSolverClient::resolveGetVal(std::string line) {
 	  }
 	  else if(!action.compare("comp")) {
 	    int i=atoi(args[0].c_str());
-	    if( (i>=0) && (i<choices.size()) )
+	    if( (i>=0) && (i<(int)choices.size()) )
 	      Num << choices[i];
 	    buff.assign(ftoa(choices[i]));
 	  }
@@ -241,10 +240,13 @@ std::string localSolverClient::resolveGetVal(std::string line) {
 		       action.c_str(),olkey::getValue.c_str());
 	}
 	else if(!name.compare("range")) {
-	  double stp, min, max;
-	  if( ((stp=numbers[0].getStep()) == 0) ||
-	      ((min=numbers[0].getMin()) ==-onelab::parameter::maxNumber()) ||
-	      ((max=numbers[0].getMax()) ==onelab::parameter::maxNumber()) )
+	  double stp=numbers[0].getStep();
+	  double min=numbers[0].getMin();
+	  double max=numbers[0].getMax();
+
+	  if( (stp == 0) ||
+	      (min == -onelab::parameter::maxNumber()) ||
+	      (max ==  onelab::parameter::maxNumber()) )
 	    OLMsg::Fatal("Invalid range description for parameter <%s>",
 		       paramName.c_str());
 	  if(!action.compare("size")) {
@@ -279,7 +281,7 @@ std::string localSolverClient::resolveGetVal(std::string line) {
   // Check now wheter the line contains OL.mathex and resolve them
   cursor=0;
   while ( (pos=line.find(olkey::mathex,cursor)) != std::string::npos){
-    int pos0=pos;
+    size_t pos0=pos;
     cursor=pos+olkey::mathex.length();
     if(enclosed(line.substr(cursor),arguments,pos) != 1)
       OLMsg::Fatal("Misformed %s statement: <%s>",
@@ -302,13 +304,12 @@ std::string localSolverClient::resolveGetVal(std::string line) {
 bool localSolverClient::resolveLogicExpr(std::vector<std::string> arguments) {
   std::vector<onelab::number> numbers;
   double val1, val2;
-  bool condition;
+  bool condition=false;
 
-  val1= atof( resolveGetVal(arguments[0]).c_str() );
+  val1 = atof( resolveGetVal(arguments[0]).c_str() );
   if(arguments.size()==1)
-    return (bool)val1;
-
-  if(arguments.size()==3){
+    condition=(bool)val1;
+  else if(arguments.size()==3){
     val2=atof( resolveGetVal(arguments[2]).c_str() );
     if(!arguments[1].compare("<"))
       condition = (val1<val2);
@@ -322,13 +323,16 @@ bool localSolverClient::resolveLogicExpr(std::vector<std::string> arguments) {
       condition = (val1==val2);   
     else if (!arguments[1].compare("!="))
       condition = (val1!=val2);
+    else
+      OLMsg::Fatal("Unknown logical operator <%s>", arguments[1].c_str());
   }
-
+  else
+    OLMsg::Fatal("Invalid logical expression");
   return condition;
 }
 
 void localSolverClient::parse_sentence(std::string line) { 
-  int pos,cursor,NumArg;
+  size_t pos,cursor;
   std::string name,action,path;
   std::vector<std::string> arguments;
   std::vector<onelab::number> numbers;
@@ -535,7 +539,7 @@ void localSolverClient::parse_sentence(std::string line) {
 	    strings[0].setValue("");
 	  else
 	    strings[0].setValue(arguments[0]);
-	  numbers[0].setReadOnly(1);
+	  strings[0].setReadOnly(1);
 	  set(strings[0]);
 	}
 	else{
@@ -665,7 +669,7 @@ void localSolverClient::modify_tags(const std::string lab, const std::string com
 }
 
 void localSolverClient::parse_oneline(std::string line, std::ifstream &infile) { 
-  int pos,cursor;
+  size_t pos,cursor;
   std::vector<std::string> arguments;
   std::vector<onelab::number> numbers;
   std::vector<onelab::string> strings;
@@ -742,7 +746,7 @@ void localSolverClient::parse_oneline(std::string line, std::ifstream &infile) {
   else if ( (pos=line.find(olkey::ifcond)) != std::string::npos) {
     // onelab.ifcond
     cursor = pos+olkey::ifcond.length();
-    int NumArgs=extractLogic(line.substr(cursor),arguments);
+    extractLogic(line.substr(cursor),arguments);
     bool condition= resolveLogicExpr(arguments);
     if (!parse_ifstatement(infile,condition)){
       OLMsg::Fatal("Misformed %s statement: <%s>", 
@@ -814,7 +818,8 @@ void localSolverClient::parse_oneline(std::string line, std::ifstream &infile) {
     // either any other line within a onelabBlock or a line 
     // introduced by a "onelab.line" tag not within a onelabBlock
     std::string cmds="",cmd;
-    int posa, posb, NbLines=1;
+    size_t posa, posb;
+    int NbLines=1;
     do{
       if( (pos=line.find(olkey::line)) != std::string::npos)
 	posa=pos + olkey::line.size();
@@ -872,7 +877,7 @@ void localSolverClient::parse_oneline(std::string line, std::ifstream &infile) {
 }
 
 bool localSolverClient::parse_block(std::ifstream  &infile) { 
-  int pos;
+  size_t pos;
   std::string line;
   openOnelabBlock();
   while (infile.good()){
@@ -888,7 +893,8 @@ bool localSolverClient::parse_block(std::ifstream  &infile) {
 
 bool localSolverClient::parse_ifstatement(std::ifstream &infile, 
 					  bool condition) { 
-  int level, pos;
+  int level;
+  size_t pos;
   std::string line;
 
   bool trueclause=true; 
@@ -914,7 +920,6 @@ bool localSolverClient::parse_ifstatement(std::ifstream &infile,
 } 
 
 void localSolverClient::parse_onefile(std::string fileName, bool mandatory) { 
-  int pos;
   std::string fullName=getWorkingDir()+fileName;
   std::ifstream infile(fullName.c_str());
   if (infile.is_open()){
@@ -934,7 +939,8 @@ void localSolverClient::parse_onefile(std::string fileName, bool mandatory) {
 } 
 
 bool localSolverClient::convert_ifstatement(std::ifstream &infile, std::ofstream &outfile, bool condition) { 
-  int level, pos;
+  int level;
+  size_t pos;
   std::string line;
 
   bool trueclause=true; 
@@ -960,7 +966,7 @@ bool localSolverClient::convert_ifstatement(std::ifstream &infile, std::ofstream
 } 
 
 void localSolverClient::convert_oneline(std::string line, std::ifstream &infile, std::ofstream &outfile) { 
-  int pos,cursor;
+  size_t pos,cursor;
   std::vector<std::string> arguments;
   std::vector<onelab::number> numbers;
   std::vector<onelab::string> strings;
@@ -1044,7 +1050,7 @@ void localSolverClient::convert_oneline(std::string line, std::ifstream &infile,
   else if ( (pos=line.find(olkey::ifcond)) != std::string::npos) {
     // onelab.ifcond
     cursor = pos+olkey::ifcond.length();
-    int NumArgs=extractLogic(line.substr(cursor),arguments);
+    extractLogic(line.substr(cursor),arguments);
     bool condition= resolveLogicExpr(arguments);
     if (!convert_ifstatement(infile,outfile,condition))
       OLMsg::Fatal("Misformed %s statement: <%s>", line.c_str());
@@ -1133,7 +1139,6 @@ void localSolverClient::convert_oneline(std::string line, std::ifstream &infile,
 }
 
 void localSolverClient::convert_onefile(std::string fileName, std::ofstream &outfile) {
-  int pos;
   std::string fullName=getWorkingDir()+fileName;
   std::ifstream infile(fullName.c_str());
   if (infile.is_open()){
@@ -1197,15 +1202,6 @@ void MetaModel::client_sentence(const std::string &name,
     if(isTodo(REGISTER)){
       if(arguments[0].size()){
 	OLMsg::SetOnelabString(name + "/CommandLine",arguments[0],false);
-	// get(strings, name);
-	// if(strings.empty()){
-	//   strings.resize(1);
-	//   strings[0].setName(name + "/CommandLine");
-	//   strings[0].setValue(arguments[0]);
-	//   strings[0].setKind("file");
-	//   strings[0].setVisible(false);
-	//   set(strings[0]);
-	// }
       }
       else
 	OLMsg::Error("No pathname given for client <%s>", name.c_str());
@@ -1213,7 +1209,7 @@ void MetaModel::client_sentence(const std::string &name,
   }
   else if(!action.compare("workingDir")){
     localSolverClient *c;
-    if(c=findClientByName(name))
+    if((c=findClientByName(name)))
       c->setWorkingDir(c->getWorkingDir()+arguments[0]);
     else
       OLMsg::Fatal("Unknown client <%s>", name.c_str());
@@ -1221,7 +1217,7 @@ void MetaModel::client_sentence(const std::string &name,
   else if(!action.compare("active")){
     localSolverClient *c;
     if(arguments[0].size()){
-      if(c=findClientByName(name))
+      if((c=findClientByName(name)))
 	c->setActive(atof( resolveGetVal(arguments[0]).c_str() ));
       else
 	OLMsg::Fatal("Unknown client <%s>", name.c_str());
@@ -1288,13 +1284,19 @@ void MetaModel::client_sentence(const std::string &name,
     }
     else if(isTodo(ANALYZE)){
       localSolverClient *c;
-      if(c=findClientByName(name)) c->analyze();
+      if((c=findClientByName(name))) c->analyze();
     }
     else if(isTodo(COMPUTE)){
       localSolverClient *c;
-      if(c=findClientByName(name)){
-	c->analyze();
-	c->compute();
+      if((c=findClientByName(name))){
+	if(c->getActive()){
+
+	  bool changed = onelab::server::instance()->getChanged(c->getName());
+	  bool started = isStarted(changed);
+
+	  std::cout << c->getName() << " active=" << c->getActive() << " changed=" << changed << " started=" << started << std::endl;
+	  if(started) c->compute();
+	}
       }
     }
   }
@@ -1325,7 +1327,7 @@ void MetaModel::client_sentence(const std::string &name,
 	  choices.push_back(str);
 	}
 	localSolverClient *c;
-	if(c=findClientByName(name)) c->PostArray(choices);
+	if((c=findClientByName(name))) c->PostArray(choices);
       }
     }
     else
@@ -1334,7 +1336,7 @@ void MetaModel::client_sentence(const std::string &name,
   }
   else if(!action.compare("check")){
     localSolverClient *c;
-    if(c=findClientByName(name)){
+    if((c=findClientByName(name))){
       c->checkCommandLine();
       c->analyze();
     }
@@ -1343,7 +1345,7 @@ void MetaModel::client_sentence(const std::string &name,
   }
   else if(!action.compare("compute")){
     localSolverClient *c;
-    if(c=findClientByName(name)){
+    if((c=findClientByName(name))){
       c->checkCommandLine();
       if(isTodo(REGISTER))
 	c->analyze(); // computes nothing at registration
@@ -1362,7 +1364,7 @@ void MetaModel::client_sentence(const std::string &name,
 	choices.push_back(resolveGetVal(arguments[i]));
       }
       localSolverClient *c;
-      if(c=findClientByName(name)) {
+      if((c=findClientByName(name))) {
 	OLMsg::SetOnelabNumber("Gmsh/NeedReloadGeom",1,false);
 	c->GmshMerge(choices);
       }
@@ -1374,7 +1376,7 @@ void MetaModel::client_sentence(const std::string &name,
       choices.push_back(resolveGetVal(arguments[i]));
     }
     localSolverClient *c;
-    if(c=findClientByName(name)) {
+    if((c=findClientByName(name))) {
       c->checkCommandLine();
       if(isTodo(REGISTER))
 	c->analyze(); // computes nothing at registration
diff --git a/contrib/onelab/metamodel.cpp b/contrib/onelab/metamodel.cpp
index 616d7b41d65a158f03676a3571783c9c12a2f59b..98a1521808e2e0bdbbe7f3e423d2636588060bbc 100644
--- a/contrib/onelab/metamodel.cpp
+++ b/contrib/onelab/metamodel.cpp
@@ -16,6 +16,7 @@ void initializeMetamodel(onelab::client *client, void (*gui_wait_fct)(double tim
 
 int metamodel(const std::string &action){
   OLMsg::Info("Start metamodel");
+  OLMsg::hasGmsh = OLMsg::GetOnelabNumber("IsMetamodel");
 
   parseMode todo;
   if(action == "initialize")
@@ -33,9 +34,6 @@ int metamodel(const std::string &action){
   std::string workingDir = OLMsg::GetOnelabString("Arguments/WorkingDir");
   std::string clientName = "meta";
 
-  std::cout << "FHF ModelName=" << modelName << std::endl;
-  std::cout << "FHF WorkingDir=" << workingDir << std::endl;
-
   MetaModel *myModel =
     new MetaModel(clientName, workingDir, clientName, modelName);
   myModel->setTodo(todo);