diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index fcc680c0da49548511364e45ffc4625d1590ae38..90103eb8442d5bf19b063a988180586b6507cf85 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -666,12 +666,11 @@ public:
   localGmsh() : onelab::localClient("Gmsh") {}
   void sendMergeFileRequest(const std::string &name)
   {
+    MergePostProcessingFile(name, CTX::instance()->solver.autoShowLastStep,
+                            CTX::instance()->solver.autoHideNewViews, true);
     if(name.find(".geo")!= std::string::npos){
       GModel::current()->setFileName(name);
     }
-    else
-      MergePostProcessingFile(name, CTX::instance()->solver.autoShowLastStep,
-                            CTX::instance()->solver.autoHideNewViews, true);
   }
   void sendInfo(const std::string &msg){ Msg::Info("%s", msg.c_str()); }
   void sendWarning(const std::string &msg){ Msg::Warning("%s", msg.c_str()); }
@@ -734,7 +733,7 @@ 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())
+    //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() ||
diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index 9cb2d2691a8aae9ecc0ae51cfaaa05a4c58449d0..3e72f8c6507b1c59f65388845338609deec5a0df 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -544,10 +544,8 @@ void onelab_cb(Fl_Widget *w, void *data)
 
     if(isMetamodel){
 #if defined(HAVE_ONELAB_METAMODEL)
-      metamodel(action);
-      geometry_reload_cb(0, 0);
-      //std::cout << "FHFap:" << GModel::current()->getFileName() << std::endl;
-      //std::cout << "FHFap:" << GModel::current()->getName() << std::endl;
+      if(metamodel(action))  
+	geometry_reload_cb(0, 0);
 #endif
     }
     else{
diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp
index 2dc91b939461ee99450e01dabcaf15b3945e7be0..433db4eab5db259fd76446d424885d2a4d28acb3 100644
--- a/contrib/onelab/OnelabClients.cpp
+++ b/contrib/onelab/OnelabClients.cpp
@@ -59,15 +59,9 @@ 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");
-        }
+	//FlGui::instance()->wait(waitint);
+	void (*waitFct)(double) = OLMsg::GetGuiWaitFunction();
+	if(waitFct) waitFct(waitint);
       }
       else if(ret > 0){
         return 0; // data is there!
@@ -361,6 +355,18 @@ std::string localSolverClient::toChar(){
   return sstream.str();
 }
 
+const std::string localSolverClient::getString(const std::string what){
+  std::string name=getName() + "/" + what;
+  std::vector<onelab::string> strings;
+  get(strings, name);
+  if(strings.size())
+    return strings[0].getValue();
+  else{
+    //OLMsg::Info("Undefined parameter <%s> in getString", name.c_str());
+    return "";
+  }
+}
+
 void localSolverClient::setAction(const std::string action){
   std::string name=getName() + "/Action";
   onelab::string s(name, action);
@@ -369,15 +375,6 @@ void localSolverClient::setAction(const std::string action){
   set(s);
 }
 
-const std::string localSolverClient::getString(const std::string what){
-  std::vector<onelab::string> strings;
-  get(strings, getName() + "/" + what);
-  if(strings.size())
-    return strings[0].getValue();
-  else
-    return "";
-}
-
 const bool localSolverClient::getList(const std::string type, std::vector<std::string> &choices){
   std::vector<onelab::string> strings;
   get(strings, getName() + "/" + type);
@@ -391,9 +388,6 @@ const bool localSolverClient::getList(const std::string type, std::vector<std::s
 
 bool localSolverClient::checkCommandLine(){
   OLMsg::Info("Check command line for <%s>",getName().c_str());
-  // if(getCommandLine().empty()){
-  //   // look if one has a commandLine on server
-  //   std::string commandLine = getString("CommandLine");
 
   if(getCommandLine().empty())
     OLMsg::Fatal("No commandline for client <%s>", getName().c_str());
@@ -620,17 +614,28 @@ bool MetaModel::checkCommandLines(){
   return allDefined;
 }
 
-void MetaModel::initialize()
+void MetaModel::construct()
 {
-  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);
+  OLMsg::Info("Metamodel now CONSTRUCTING");
+  openOnelabBlock();
+  parse_onefile( genericNameFromArgs + onelabExtension + ".save",false);
+  parse_onefile( genericNameFromArgs + onelabExtension);
+  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;
-  OLMsg::Info("Metamodel now ANALYZING",fileName.c_str());
   openOnelabBlock();
   parse_onefile(fileName);
   closeOnelabBlock();
@@ -638,8 +643,8 @@ void MetaModel::analyze() {
 
 
 void MetaModel::compute() {
+  OLMsg::Info("Metamodel now COMPUTING");
   std::string fileName = genericNameFromArgs + onelabExtension;
-  OLMsg::Info("Metamodel now COMPUTING",fileName.c_str());
   openOnelabBlock();
   parse_onefile(fileName);
   closeOnelabBlock();
@@ -696,7 +701,7 @@ void InterfacedClient::analyze() {
   std::vector<std::string> choices;
 
   setAction("check");
-  OLMsg::Info("Analyses <%s> changed=%d", getName().c_str(),
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
 	      onelab::server::instance()->getChanged(getName()));
   getList("InputFiles", choices);
   for(unsigned int i = 0; i < choices.size(); i++){
@@ -775,7 +780,7 @@ void InterfacedClient::compute(){
 
 void NativeClient::analyze() {
   setAction("check");
-  OLMsg::Info("Analyses <%s> changed=%d", getName().c_str(),
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
 	      onelab::server::instance()->getChanged(getName()));
   run();
 }
@@ -819,7 +824,7 @@ void EncapsulatedClient::analyze() {
   std::vector<std::string> choices;
 
   setAction("check");
-  OLMsg::Info("Analyses <%s> changed=%d", getName().c_str(),
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
 	      onelab::server::instance()->getChanged(getName()));
   getList("InputFiles", choices);
   for(unsigned int i = 0; i < choices.size(); i++){
@@ -861,7 +866,7 @@ void EncapsulatedClient::compute(){
   std::string cmd;
   std::vector<std::string> choices;
 
-  setAction("compute");
+  //setAction("compute");
   std::string name=getName();
   OLMsg::Info("Computes <%s> changed=%d", name.c_str(),
 	      onelab::server::instance()->getChanged(name));
@@ -958,7 +963,7 @@ void RemoteNativeClient::analyze(){
   std::vector<std::string> choices;
 
   setAction("check");
-  OLMsg::Info("Analyses <%s> changed=%d", getName().c_str(),
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
 	      onelab::server::instance()->getChanged(getName()));
 
   if(getList("InputFiles",choices)){
@@ -974,7 +979,7 @@ void RemoteNativeClient::compute(){
   std::vector<std::string> choices;
 
   setAction("compute");
-  OLMsg::Info("Analyses <%s> changed=%d", getName().c_str(),
+  OLMsg::Info("Analyze <%s> changed=%d", getName().c_str(),
 	      onelab::server::instance()->getChanged(getName()));
 
   if(getActive() && onelab::server::instance()->getChanged(getName())){
diff --git a/contrib/onelab/OnelabClients.h b/contrib/onelab/OnelabClients.h
index c786eba8f7b851d2600169bc1d8cfab3896d27f3..eba73429073907d0e4043886ae925def9c43279a 100644
--- a/contrib/onelab/OnelabClients.h
+++ b/contrib/onelab/OnelabClients.h
@@ -227,11 +227,8 @@ class MetaModel : public localSolverClient {
     clientName = cname;
     genericNameFromArgs = fname.size() ? fname : cmdl;
     setWorkingDir(wdir); // wdir from args
-    openOnelabBlock();
     _todo=REGISTER;
-    parse_onefile( genericNameFromArgs + onelabExtension + ".save",false);
-    parse_onefile( genericNameFromArgs + onelabExtension);
-    closeOnelabBlock();
+    construct();
   }
   ~MetaModel(){}
   typedef std::vector<localSolverClient*>::iterator citer;
@@ -252,12 +249,13 @@ class MetaModel : public localSolverClient {
       if(_clients[i]->getName() == name) return _clients[i];
     return 0;
   }
+
   std::string genericNameFromArgs, clientName;
   void client_sentence(const std::string &name, const std::string &action, 
 		       const std::vector<std::string> &arguments);
   std::string toChar(){}
   void PostArray(std::vector<std::string> choices);
-  void initialize();
+  void construct();
   void analyze();
   void compute();
 };
diff --git a/contrib/onelab/OnelabMessage.cpp b/contrib/onelab/OnelabMessage.cpp
index 712d7ed25c70abaaa9f69d2bb0d4cacfb3cbcf83..d5637d9caf183f350c5d6362f66784b906404a92 100644
--- a/contrib/onelab/OnelabMessage.cpp
+++ b/contrib/onelab/OnelabMessage.cpp
@@ -31,6 +31,8 @@ GmshClient *OLMsg::_client = 0;
 onelab::client *OLMsg::_onelabClient = 0;
 bool OLMsg::hasGmsh=false;
 std::set<std::string, fullNameLessThan> OLMsg::_fullNameDict;
+void (*OLMsg::gui_wait_fct)(double time) = 0;
+
 
 #if defined(HAVE_NO_VSNPRINTF)
 static int vsnprintf(char *str, size_t size, const char *fmt, va_list ap)
@@ -215,19 +217,6 @@ void OLMsg::StatusBar(int num, bool log, const char *fmt, ...)
   }
 }
 
-// void OLMsg::InitializeOnelab(const std::string &name, const std::string &sockname)
-// {
-//   if(_onelabClient) delete _onelabClient;
-//   if (sockname.empty())
-//     _onelabClient = new onelab::localClient(name);
-//   else{
-//     onelab::remoteNetworkClient *c =
-//       new onelab::remoteNetworkClient(name, sockname);
-//     _onelabClient = c;
-//     _client = c->getGmshClient();
-//   }
-// }
-
 void OLMsg::InitializeOnelab(const std::string &name)
 {
   if(_onelabClient) delete _onelabClient;
@@ -235,6 +224,12 @@ void OLMsg::InitializeOnelab(const std::string &name)
   OLMsg::hasGmsh = OLMsg::GetOnelabNumber("IsMetamodel");
 }
 
+void OLMsg::SetGuiWaitFunction(void (*fct)(double time)){
+  gui_wait_fct = fct;
+}
+void (*OLMsg::GetGuiWaitFunction())(double){
+  return gui_wait_fct;
+}
 
 double OLMsg::GetOnelabNumber(std::string name)
 {
@@ -391,13 +386,38 @@ std::string OLMsg::obtainFullName(const std::string &name){
 }
 
 void OLMsg::MergeFile(const std::string &name){
-  if(_onelabClient)
-    _onelabClient->sendMergeFileRequest(name);
+  //This routine allows sending input files (geo, pos, msh) to Gmsh
+  //The parameter Gmsh/MergedGeo ensures that only one geometry
+  //is sent to Gmsh. It is reloaded afted each metamodel execution
+  //
+  if(_onelabClient){
+    if(name.find(".geo") != std::string::npos){
+      if(GetOnelabString("Gmsh/MergedGeo").empty()){
+	SetOnelabString("Gmsh/MergedGeo",name,false);
+	Info("Merge a geometry <%s> to Gmsh", name.c_str());
+	_onelabClient->sendMergeFileRequest(name);
+      }
+    }
+    else{
+      Info("Merge a geometry <%s> to Gmsh", name.c_str());
+      _onelabClient->sendMergeFileRequest(name);
+    }
+  }
   else
     OLMsg::Info("Not connected to Gmsh");
 }
 
 
+void OLMsg::FinalizeOnelab(){
+  if(_onelabClient){
+    delete _onelabClient;
+    _onelabClient = 0;
+    _client = 0;
+  }
+}
+
+
+
 // void OLMsg::AddOnelabNumberChoice(std::string name, double val)
 // {
 //   if(_onelabClient){
@@ -417,186 +437,3 @@ void OLMsg::MergeFile(const std::string &name){
 //     _onelabClient->set(ps[0]);
 //   }
 // }
-
-void OLMsg::FinalizeOnelab(){
-  if(_onelabClient){
-    delete _onelabClient;
-    _onelabClient = 0;
-    _client = 0;
-  }
-}
-
-
-
-/*
-void OLMsg::Debug(const char *fmt, ...)
-{
-  if(_verbosity < 99) return;
-
-  char str[1024];
-  va_list args;
-  va_start(args, fmt);
-  vsnprintf(str, sizeof(str), fmt, args);
-  va_end(args);
-
-  if(_callback) (*_callback)("Debug", str);
-  if(_client) _client->Info(str);
-
-  if(ALWAYS_TRUE){
-    if(_commSize > 1)
-      fprintf(stdout, "Debug   : [On processor %d] %s\n", _commRank, str);
-    else
-      fprintf(stdout, "Debug   : %s\n", str);
-    fflush(stdout);
-  }
-}
-
-void OLMsg::ProgressMeter(int n, int N, const char *fmt, ...)
-{
-  if(_commRank || _verbosity < 3) return;
-
-  double percent = 100. * (double)n/(double)N;
-
-  if(percent >= _progressMeterCurrent){
-    char str[1024];
-    va_list args;
-    va_start(args, fmt);
-    vsnprintf(str, sizeof(str), fmt, args);
-    va_end(args);
-
-    if(strlen(fmt)) strcat(str, " ");
-
-    char str2[1024];
-    sprintf(str2, "(%d %%)", _progressMeterCurrent);
-    strcat(str, str2);
-
-    if(_client) _client->Progress(str);
-
-    if(ALWAYS_TRUE){
-      fprintf(stdout, "%s                     \r", str);
-      fflush(stdout);
-    }
-
-    while(_progressMeterCurrent < percent)
-      _progressMeterCurrent += _progressMeterStep;
-  }
-
-  if(n > N - 1){
-    if(_client) _client->Progress("Done!");
-
-    if(ALWAYS_TRUE){
-      fprintf(stdout, "Done!                                              \r");
-      fflush(stdout);
-    }
-  }
-}
-
-void OLMsg::PrintTimers()
-{
-  // do a single stdio call!
-  std::string str;
-  for(std::map<std::string, double>::iterator it = _timers.begin();
-      it != _timers.end(); it++){
-    if(it != _timers.begin()) str += ", ";
-    char tmp[256];
-    sprintf(tmp, "%s = %gs ", it->first.c_str(), it->second);
-    str += std::string(tmp);
-  }
-  if(!str.size()) return;
-
-  if(ALWAYS_TRUE){
-    if(_commSize > 1)
-      fprintf(stdout, "Timers  : [On processor %d] %s\n", _commRank, str.c_str());
-    else
-      fprintf(stdout, "Timers  : %s\n", str.c_str());
-    fflush(stdout);
-  }
-}
-
-void OLMsg::PrintErrorCounter(const char *title)
-{
-  if(_commRank || _verbosity < 1) return;
-  if(!_warningCount && !_errorCount) return;
-
-  std::string prefix = _errorCount ? "Error   : " : "Warning : ";
-  std::string help("Check the full log for details");
-  std::string line(std::max(strlen(title), help.size()), '-');
-  char warn[128], err[128];
-  sprintf(warn, "%5d warning%s", _warningCount, _warningCount == 1 ? "" : "s");
-  sprintf(err, "%5d error%s", _errorCount, _errorCount == 1 ? "" : "s");
-
-  if(ALWAYS_TRUE){
-    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n", (prefix + line).c_str(),
-            (prefix + title).c_str(), (prefix + warn).c_str(),
-            (prefix + err).c_str(), (prefix + help).c_str(),
-            (prefix + line).c_str());
-    fflush(stderr);
-  }
-}
-
-double OLMsg::GetValue(const char *text, double defaultval)
-{
-  printf("%s (default=%.16g): ", text, defaultval);
-  char str[256];
-  char *ret = fgets(str, sizeof(str), stdin);
-  if(!ret || !strlen(str) || !strcmp(str, "\n"))
-    return defaultval;
-  else
-    return atof(str);
-}
-
-std::string OLMsg::GetString(const char *text, std::string defaultval)
-{
-  printf("%s (default=%s): ", text, defaultval.c_str());
-  char str[256];
-  char *ret = fgets(str, sizeof(str), stdin);
-  if(!ret || !strlen(str) || !strcmp(str, "\n"))
-    return defaultval;
-  else
-    return std::string(str);
-}
-
-int OLMsg::GetAnswer(const char *question, int defaultval, const char *zero,
-                   const char *one, const char *two)
-{
-  if(two)
-    printf("%s\n\n0=[%s] 1=[%s] 2=[%s] (default=%d): ", question,
-           zero, one, two, defaultval);
-  else
-    printf("%s\n\n0=[%s] 1=[%s] (default=%d): ", question,
-           zero, one, defaultval);
-  char str[256];
-  char *ret = fgets(str, sizeof(str), stdin);
-  if(!ret || !strlen(str) || !strcmp(str, "\n"))
-    return defaultval;
-  else
-    return atoi(ret);
-}
-
-void OLMsg::InitClient(std::string sockname)
-{
-  if(_client) delete _client;
-  _client = new GmshClient();
-  if(_client->Connect(sockname.c_str()) < 0){
-    OLMsg::Error("Unable to connect to server on %s", sockname.c_str());
-    delete _client;
-    _client = 0;
-  }
-  else
-    _client->Start();
-}
-
-void OLMsg::Barrier()
-{
-}
-
-void OLMsg::FinalizeClient()
-{
-  if(_client){
-    _client->Stop();
-    _client->Disconnect();
-    delete _client;
-  }
-  _client = 0;
-}
-*/
diff --git a/contrib/onelab/OnelabMessage.h b/contrib/onelab/OnelabMessage.h
index bbd51fdcfb1a53ce6d3452b266829770c2e5ec83..0daaffade98dab051ccd07e1b536ebbee8fbd503 100644
--- a/contrib/onelab/OnelabMessage.h
+++ b/contrib/onelab/OnelabMessage.h
@@ -54,6 +54,8 @@ class OLMsg {
   static onelab::client *_onelabClient;
   // dictionnary for parameter names
   static std::set<std::string, fullNameLessThan> _fullNameDict;
+  // Gmsh wait function 
+  static void (*gui_wait_fct)(double time);
  public:
   OLMsg() {}
   static void Init(int argc, char **argv);
@@ -92,8 +94,10 @@ class OLMsg {
   static int GetAnswer(const char *question, int defaultval, const char *zero,
                        const char *one, const char *two=0);
   //static void InitClient(std::string sockname);
-  static GmshClient *GetClient(){ return _client; }
   //static void FinalizeClient();
+  static GmshClient *GetClient(){ return _client; }
+  static void SetGuiWaitFunction(void (*fct)(double time));
+  static void (*GetGuiWaitFunction())(double);
 
   static void InitializeOnelab(const std::string &name);
   static void FinalizeOnelab();
diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp
index 398cd9d45057f78d54520e3a2080940c7a837933..008806ddd776b703a6bf930599cc98bb071a359c 100644
--- a/contrib/onelab/OnelabParser.cpp
+++ b/contrib/onelab/OnelabParser.cpp
@@ -797,12 +797,8 @@ void localSolverClient::parse_oneline(std::string line, std::ifstream &infile) {
     if(enclosed(line.substr(cursor),arguments,pos)<1)
       OLMsg::Fatal("Misformed <%s> statement: (%s)",
 		   olkey::showGmsh.c_str(),line.c_str());
-    if (OLMsg::GetOnelabString(getName()+"/MergedGeo").empty()){
-      std::string fileName=resolveGetVal(arguments[0]);
-      OLMsg::MergeFile(fileName);
-      OLMsg::SetOnelabString(getName()+"/MergedGeo",fileName);
-      OLMsg::Info("Merge a geometry <%s> to Gmsh", fileName.c_str());
-    }
+    std::string fileName=resolveGetVal(arguments[0]);
+    OLMsg::MergeFile(fileName);
   }
   else if ( (pos=line.find(olkey::dump)) != std::string::npos) { 
     // onelab.dump 
@@ -1302,24 +1298,6 @@ void MetaModel::client_sentence(const std::string &name,
       }
     }
   }
-  else if(!action.compare("check")){
-    localSolverClient *c;
-    if(c=findClientByName(name)){
-      c->checkCommandLine();
-      c->analyze();
-    }
-    else
-      OLMsg::Fatal("Unknown client <%s>", name.c_str());
-  }
-  else if(!action.compare("compute")){
-    localSolverClient *c;
-    if(c=findClientByName(name)){
-      c->checkCommandLine();
-      c->compute();
-    }
-    else
-      OLMsg::Fatal("Unknown client <%s>", name.c_str());
-  }
   else if(!action.compare("up")){
     if(arguments.size()%4==0){
       if(isTodo(REGISTER)){
@@ -1354,6 +1332,29 @@ void MetaModel::client_sentence(const std::string &name,
       OLMsg::Fatal("Wrong number of arguments <%d> for <%s>",
 		 arguments.size(), action.c_str());
   }
+  else if(!action.compare("check")){
+    localSolverClient *c;
+    if(c=findClientByName(name)){
+      c->checkCommandLine();
+      c->analyze();
+    }
+    else
+      OLMsg::Fatal("Unknown client <%s>", name.c_str());
+  }
+  else if(!action.compare("compute")){
+    localSolverClient *c;
+    if(c=findClientByName(name)){
+      c->checkCommandLine();
+      if(isTodo(REGISTER))
+	c->analyze(); // computes nothing at registration
+      else{
+	c->compute();
+	onelab::server::instance()->setChanged(false, c->getName());
+      }
+    }
+    else
+      OLMsg::Fatal("Unknown client <%s>", name.c_str());
+  }
   else if(!action.compare("merge")){
     if(isTodo(COMPUTE)){
       std::vector<std::string> choices;
@@ -1361,7 +1362,30 @@ void MetaModel::client_sentence(const std::string &name,
 	choices.push_back(resolveGetVal(arguments[i]));
       }
       localSolverClient *c;
-      if(c=findClientByName(name)) c->GmshMerge(choices);
+      if(c=findClientByName(name)) {
+	OLMsg::SetOnelabNumber("Gmsh/NeedReloadGeom",1,false);
+	c->GmshMerge(choices);
+      }
+    }
+  }
+  else if(!action.compare("computeMerge")){
+    std::vector<std::string> choices;
+    for(unsigned int i = 0; i < arguments.size(); i++){
+      choices.push_back(resolveGetVal(arguments[i]));
+    }
+    localSolverClient *c;
+    if(c=findClientByName(name)) {
+      c->checkCommandLine();
+      if(isTodo(REGISTER))
+	c->analyze(); // computes nothing at registration
+      else{
+	if(onelab::server::instance()->getChanged(c->getName())){
+	  c->compute();
+	  c->GmshMerge(choices);
+	  OLMsg::SetOnelabNumber("Gmsh/NeedReloadGeom",1,false);
+	  onelab::server::instance()->setChanged(false, c->getName());
+	}
+      }
     }
   }
   else
diff --git a/contrib/onelab/metamodel.cpp b/contrib/onelab/metamodel.cpp
index f41a8d9d224cf13599f67209cf829605d4050c4e..616d7b41d65a158f03676a3571783c9c12a2f59b 100644
--- a/contrib/onelab/metamodel.cpp
+++ b/contrib/onelab/metamodel.cpp
@@ -1,7 +1,6 @@
 #include "OnelabClients.h"
 #include "metamodel.h"
 
-void (*my_gui_wait_fct)(double time) = 0;
 
 void initializeMetamodel(onelab::client *client, void (*gui_wait_fct)(double time))
 {
@@ -9,8 +8,10 @@ void initializeMetamodel(onelab::client *client, void (*gui_wait_fct)(double tim
   //copies the Msg::_onelabClient to  OLMsg::_onelabClient
   //This pointer refers to an object of class localGmsh() (cf GmshMessage.cpp)
   //which is a onelab::client with sone Gmsh features (merge and messages).
+  //Initilizes also the wait function the Gmsh Gui
+  //so that Gmsh windows may remain active during client computations.
   OLMsg::SetOnelabClient(client);
-  my_gui_wait_fct = gui_wait_fct;
+  OLMsg::SetGuiWaitFunction(gui_wait_fct);
 }
 
 int metamodel(const std::string &action){
@@ -51,9 +52,6 @@ int metamodel(const std::string &action){
   if( myModel->isTodo(EXIT)){
     // exit metamodel
   }
-  else if( myModel->isTodo(INITIALIZE)){
-    myModel->initialize();
-  }
   else if( myModel->isTodo(ANALYZE)){
     myModel->analyze();
   }
@@ -62,8 +60,13 @@ int metamodel(const std::string &action){
   }
   else
     OLMsg::Fatal("Main: Unknown Action <%d>", todo);
-
   delete myModel;
-  OLMsg::Info("Leave metamodel");
+
+  int reload=OLMsg::GetOnelabNumber("Gmsh/NeedReloadGeom");
+  OLMsg::SetOnelabNumber("Gmsh/NeedReloadGeom",0,false);
+
+  OLMsg::Info("Leave metamodel - need reload=%d",reload);
   OLMsg::Info("==============================================");
+
+  return reload;
 }