diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index 1f6e7a720ea1cbcdaacc7a98128bed89507f4594..624fce85b51e6aed45279de8dcd81bc2ba82bc36 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -603,6 +603,7 @@ static std::string timeStamp()
   time(&now);
   tm *t = localtime(&now);
   char stamp[32];
+  // stamp.size() is always 20
   sprintf(stamp, "_%04d-%02d-%02d_%02d-%02d-%02d", 1900 + t->tm_year,
           1 + t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
   return std::string(stamp);
@@ -623,7 +624,13 @@ static void saveDb(const std::string &fileName)
 
 static void archiveOutputFiles(const std::string &fileName)
 {
-  std::string stamp = timeStamp();
+  std::string stamp;
+  std::vector<onelab::string> ps;
+  onelab::server::instance()->get(ps,"0Metamodel/9Tag");
+  if(ps.size())
+    stamp.assign(ps[0].getValue()+timeStamp());
+  else
+    stamp.assign(timeStamp());
 
   // add time stamp in all output files in the db, and rename them on disk
   std::vector<onelab::string> strings;
@@ -658,10 +665,38 @@ static void archiveOutputFiles(const std::string &fileName)
     CreateSingleDir(split[0] + "archive/");
     saveDb(split[0] + "archive/" + split[1] + stamp + split[2]);
   }
-
+ 
   FlGui::instance()->rebuildTree(true);
 }
 
+static void archiveSolutionFiles(const std::string &fileName)
+{
+  // extract tag from dbName
+  std::vector<std::string> split = SplitFileName(fileName);
+  std::string tag = split[1].substr(6); // cut off 'onelab'
+
+  // add tag to all solution files in the db, and rename them on disk
+  std::vector<onelab::string> strings;
+  onelab::server::instance()->get(strings,"0Metamodel/9Solution files");
+  if(strings.size()){
+    std::vector<std::string> names = strings[0].getChoices();
+    if(names.size()){
+      for(unsigned int j = 0; j < names.size(); j++){
+	std::vector<std::string> split = SplitFileName(names[j]);
+	std::string old = names[j];
+	CreateSingleDir(split[0] + "archive/");
+	names[j] = split[0] + "archive/" + 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());
+      }
+      strings[0].setValue(names[0]);
+      strings[0].setChoices(names);
+      onelab::server::instance()->set(strings[0]);
+      FlGui::instance()->rebuildTree(true);
+    }
+  }
+}
+
 static void loadDb(const std::string &name)
 {
   Msg::StatusBar(true, "Loading database '%s'...", name.c_str());
@@ -752,21 +787,21 @@ void onelab_cb(Fl_Widget *w, void *data)
       Msg::Direct("%s", db[i].c_str());
     }
 
+    std::string fileName = "onelab.db";
+    // add tag if any
     std::vector<onelab::string> ps;
-    onelab::server::instance()->get(ps,"TAGSIMU");
-    std::string dbName, s;
-    if(ps.size())
-      dbName.assign("onelab" + ps[0].getValue() + ".db");
-    else
-      dbName = "onelab.db";
-    s.assign(SplitFileName(GModel::current()->getFileName())[0] + dbName);
+    onelab::server::instance()->get(ps,"0Metamodel/9Tag");
+    if(ps.size()){
+      fileName.assign("onelab" + ps[0].getValue() + ".db");
+      ps[0].setValue("");
+      onelab::server::instance()->set(ps[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));
       saveDb(fileChooserGetName(1));
-      if(ps.size()){
-      	ps[0].setValue("");
-      	onelab::server::instance()->set(ps[0]);
-      	FlGui::instance()->rebuildTree(true);
-      }
     }
 
     return;
@@ -781,6 +816,14 @@ void onelab_cb(Fl_Widget *w, void *data)
     std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db";
     if(fileChooser(FILE_CHOOSER_SINGLE, "Load", "*.db", db.c_str()))
       loadDb(fileChooserGetName(1));
+
+    // switch to "restore" mode" (use archived solution files)
+    std::vector<onelab::number> pn;
+    onelab::server::instance()->get(pn,"0Metamodel/9Use restored solution");
+    if(pn.size()){
+      pn[0].setValue(1);
+      onelab::server::instance()->set(pn[0]);
+    }
     action = "check";
   }