diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index ee5dd436b9181f53008cdbeb940025e43c2ba54f..7cfeca8747bb4e2034a8c912bd0dba5b8a06d397 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -401,7 +401,7 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master)
 	    it != onelab::server::instance()->lastClient(); it++){
 	  reply.append(it->second->getName() + " ");
 	}
-	Msg::Error("Skipping already existing client < %s> - Registered clients are <%s>",clientName.c_str(),reply.c_str());
+	Msg::Error("Skipping already existing client <%s> - Registered clients are < %s>",clientName.c_str(),reply.c_str());
 	getGmshServer()->SendMessage
 	  (GmshSocket::GMSH_STOP, reply.size(), &reply[0]); // reply is dummy
       }
@@ -725,7 +725,7 @@ static void archiveSolutionFiles(const std::string &fileName)
 	std::vector<std::string> split = SplitFileName(names[j]);
 	std::string old = names[j];
 	CreateSingleDir(dir);
-	names[j] = dir + split[1] + tag + split[2];
+	names[j] = dir + split[1] + tag + split[2]; 
 	Msg::Info("Renaming '%s' into '%s'", old.c_str(), names[j].c_str());
 	rename(old.c_str(), names[j].c_str());
       }
@@ -851,22 +851,24 @@ void onelab_cb(Fl_Widget *w, void *data)
     std::vector<onelab::string> ps;
     onelab::server::instance()->get(ps,"0Metamodel/9Tag");
     if(ps.size() && ps[0].getValue().size()){
-	fileName.assign("onelab_" + ps[0].getValue() + ".db");
+      fileName.assign("onelab_" + ps[0].getValue() + ".db");
     }
 
     // save db in "restore" mode"
+    double restoreMode=0;
     std::vector<onelab::number> pn;
     onelab::server::instance()->get(pn,"0Metamodel/9Use restored solution");
     if(pn.size()){
-      pn[0].setValue(1);
-      pn[0].setVisible(1);
+      restoreMode=pn[0].getValue();
+      pn[0].setValue(2);
       onelab::server::instance()->set(pn[0]);
     }
 
     std::string s;
     s.assign(SplitFileName(GModel::current()->getFileName())[0] + fileName);
     if(fileChooser(FILE_CHOOSER_CREATE, "Save", "*.db", s.c_str())){
-      archiveSolutionFiles(fileChooserGetName(1));
+      if(!restoreMode)
+	archiveSolutionFiles(fileChooserGetName(1));
       saveDb(fileChooserGetName(1));
     }
 
@@ -874,7 +876,6 @@ void onelab_cb(Fl_Widget *w, void *data)
     onelab::server::instance()->get(pn,"0Metamodel/9Use restored solution");
     if(pn.size()){
       pn[0].setValue(0);
-      pn[0].setVisible(0);
       onelab::server::instance()->set(pn[0]);
     }
     action = "check";
diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py
index 35891cd6093c1c9150aaf4aeea87c1da37c55b81..57f3bbb7498272ccd40cd9c6ccfdbb36d3133a12 100755
--- a/contrib/onelab/python/onelab.py
+++ b/contrib/onelab/python/onelab.py
@@ -453,20 +453,6 @@ class client :
         self._send(self._GMSH_ERROR, line.rstrip().encode('utf-8'))
       sys.exit(1)
   
-  def getPath(self, inp='') :
-    return path(self.wdir,inp)
-
-  def exists(self, p) :
-    if not os.path.exists(p):
-      self.sendError('path error: %s' %(p))
-      exit(0) 
-    return True
-
-  def checkPath(self, inp='') :
-    p = path(self.wdir,inp)
-    self.exists(p)
-    return p
-
   def copy(self, here, there):
     os.system('cp '+ here + ' ' + there)
     
@@ -499,21 +485,58 @@ class client :
       self._send(self._GMSH_INFO, 'download: ' + ' '.join(argv))
     else :
       print(call.stderr.read())
-      
-  def solutionFiles(self, list) :
+
+  def getPath(self, inp='') :
+    return path(self.wdir,inp)
+
+  def fileExists(self, p) :
+    return os.path.exists(p)
+
+  def checkFile(self, p) :
+    if not self.fileExists(p):
+      self.sendError('path error: %s' %(p))
+      exit(0) 
+    return True
+
+  def checkPath(self, inp='') :
+    p = path(self.wdir,inp)
+    self.checkFile(p)
+    return p
+
+  def solutionFiles(self, client, list) :
     self.defineNumber('0Metamodel/9Use restored solution', value=0, choices=[0,1])
     self.defineString('0Metamodel/9Tag', value='')
     if list :
       if self.getNumber('0Metamodel/9Use restored solution') :
-        return self.getStringChoices('0Metamodel/9Solution files')  
+        solFiles = self.getStringChoices('0Metamodel/9Solution files')
+        for i in solFiles:
+          self.checkFile(i)
       else :
-        self.setNumber('0Metamodel/9Use restored solution', visible=0)
-        self.setString('0Metamodel/9Solution files', value=list[0],
-                       choices=list, readOnly=1)    
-    return list
+        solFiles = list
+        self.setString('0Metamodel/9Solution files', value=solFiles[0],
+                       choices=solFiles, readOnly=1)
+        for i in solFiles:
+          if not self.fileExists(i) :
+            self.setChanged(client, True)
+    return solFiles
+
+  def needsCompute(self, client) :
+# Avoid recomputation when a database with restored solutions has just been loaded
+# Otherwise, stop using restored solutions when the client elmer has changed
+    if self.useRestoredSolution() == 2: # we have just loaded a database
+      self.setRestoredSolution(1)
+      self.setChanged(client, 0) # do not compute
+    else :
+      if self.isChanged(client):
+        self.setRestoredSolution(0)
+        return True
+    return False
+
+  def useRestoredSolution(self) :
+    return self.getNumber('0Metamodel/9Use restored solution') 
 
-  def restoreSolution(self) :
-    return self.getNumber('0Metamodel/9Use restored solution')
+  def setRestoredSolution(self, val) :
+    self.setNumber('0Metamodel/9Use restored solution', value=val)
 
   def outputFiles(self, list) :
     if list :