diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index 808be8f45213d0e5cc642979fa5571306ca6da1d..0142ec1f5fda94fdffc8d5baa5f118883f62f324 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -302,41 +302,48 @@ static std::string getMshFileName(onelab::client *c)
   }
 }
 
+static std::string getModelName(onelab::client *c)
+{
+  std::vector<onelab::string> ps;
+  c->get(ps, c->getName() + "/1ModelName");
+  if(ps.size()){
+    return ps[0].getValue();
+  }
+  else{
+    std::vector<std::string> split = SplitFileName(GModel::current()->getFileName());
+    std::string ext = FlGui::instance()->onelab->getModelExtension();
+    std::string name(split[0] + split[1] + ext);
+    onelab::string o(c->getName() + "/1ModelName", name, "Model name");
+    o.setKind("file");
+    c->set(o);
+    return name;
+  }
+}
+
 void onelab_cb(Fl_Widget *w, void *data)
 {
   if(!data) return;
   std::string action((const char*)data);
 
-  if(action == "edit model"){
-    std::string prog = FixWindowsPath(CTX::instance()->editor);
-    std::string file = FixWindowsPath(FlGui::instance()->onelab->getModelName());
-    SystemCall(ReplaceSubString("%s", file, prog));
-    return;
-  }
-
   if(action == "reset"){
+    // clear everything except model names
+    std::vector<onelab::string> modelNames;
+    for(onelab::server::citer it = onelab::server::instance()->firstClient();
+      it != onelab::server::instance()->lastClient(); it++){
+      onelab::client *c = it->second;
+      std::vector<onelab::string> ps;
+      c->get(ps, c->getName() + "/1ModelName");
+      if(ps.size()) modelNames.push_back(ps[0]);
+    }
     onelab::server::instance()->clear();
     if(onelab::server::instance()->findClient("Gmsh") != 
        onelab::server::instance()->lastClient())
       geometry_reload_cb(0, 0);
+    for(unsigned int i = 0; i < modelNames.size(); i++)
+      onelab::server::instance()->set(modelNames[i]);
     action = "initial check";
   }
 
-  std::string ext = FlGui::instance()->onelab->getModelExtension();
-
-  if(action == "choose model"){
-    std::string pattern = "*";
-    pattern += ext;
-    if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", pattern.c_str()))
-      FlGui::instance()->onelab->setModelName(fileChooserGetName(1));
-    action = "check";
-  }
-
-  if(FlGui::instance()->onelab->getModelName().empty()){
-    std::vector<std::string> split = SplitFileName(GModel::current()->getFileName());
-    FlGui::instance()->onelab->setModelName(split[0] + split[1] + ext);
-  }
-
   FlGui::instance()->onelab->deactivate();
   
   // the Gmsh client is special: it always gets executed first. (The
@@ -388,7 +395,7 @@ void onelab_cb(Fl_Widget *w, void *data)
        c->getName() == "Listen" || // unknown client connecting through "-listen"
        c->getName() == "GmshRemote") // distant post-processing Gmsh client
       continue;
-    std::string what = FlGui::instance()->onelab->getModelName();
+    std::string what = getModelName(c);
     if(action == "initial check" || action == "check"){
       c->run(what);
     }
@@ -445,6 +452,23 @@ static void onelab_input_choice_cb(Fl_Widget *w, void *data)
   }
 }
 
+static void onelab_input_choice_file_chooser_cb(Fl_Widget *w, void *data)
+{
+  Fl_Input_Choice *but = (Fl_Input_Choice*)w->parent();
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", "")){
+    but->value(fileChooserGetName(1).c_str());
+    but->do_callback(but, data);
+  }
+}
+
+static void onelab_input_choice_file_edit_cb(Fl_Widget *w, void *data)
+{
+  Fl_Input_Choice *but = (Fl_Input_Choice*)w->parent();
+  std::string prog = FixWindowsPath(CTX::instance()->editor);
+  std::string file = FixWindowsPath(but->value());
+  SystemCall(ReplaceSubString("%s", file, prog));
+}
+
 static void onelab_choose_executable_cb(Fl_Widget *w, void *data)
 {
   onelab::localNetworkClient *c = (onelab::localNetworkClient*)data;
@@ -477,16 +501,7 @@ onelabWindow::onelabWindow(int deltaFontSize)
     (width, height, CTX::instance()->nonModalWindows ? true : false, "ONELAB");
   _win->box(GMSH_WINDOW_BOX);
 
-  _model = new Fl_Input(WB, WB, width - 2*WB - BB/3, BH);
-  _model->align(FL_ALIGN_RIGHT);
-  _model->callback(onelab_cb, (void*)"check");
-  _model->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);
-
-  Fl_Menu_Button *menu = new Fl_Menu_Button(width - WB - BB/3, WB, BB/3, BH);
-  menu->add("Choose new model", 0, onelab_cb, (void*)"choose model");
-  menu->add("Edit model",  0, onelab_cb, (void*)"edit model");
-
-  _tree = new Fl_Tree(WB, WB+BH, width - 2 * WB, height - 3 * WB - 2 * BH);
+  _tree = new Fl_Tree(WB, WB, width - 2 * WB, height - 3 * WB - BH);
   _tree->connectorstyle(FL_TREE_CONNECTOR_SOLID);
   _tree->showroot(0);
 
@@ -537,7 +552,7 @@ void onelabWindow::rebuildTree()
   onelab::server::instance()->get(numbers);
   for(unsigned int i = 0; i < numbers.size(); i++){
     Fl_Tree_Item *n = _tree->add(numbers[i].getName().c_str());
-    n->labelsize(FL_NORMAL_SIZE + 2);
+    n->labelsize(FL_NORMAL_SIZE + 3);
     std::string label = numbers[i].getShortHelp();
     if(label.empty()) label = getShortName(numbers[i].getName());
     _tree->begin();
@@ -572,13 +587,8 @@ void onelabWindow::rebuildTree()
   std::vector<onelab::string> strings;
   onelab::server::instance()->get(strings);
   for(unsigned int i = 0; i < strings.size(); i++){
-
-    if(strings[i].getKind() == "file"){
-      printf("got file string\n");
-    }
-
     Fl_Tree_Item *n = _tree->add(strings[i].getName().c_str());
-    n->labelsize(FL_NORMAL_SIZE + 2);
+    n->labelsize(FL_NORMAL_SIZE + 3);
     std::string label = strings[i].getShortHelp();
     if(label.empty()) label = getShortName(strings[i].getName());
     _tree->begin();
@@ -587,6 +597,12 @@ void onelabWindow::rebuildTree()
     but->copy_label(label.c_str());
     for(unsigned int j = 0; j < strings[i].getChoices().size(); j++)
       but->add(strings[i].getChoices()[j].c_str());
+    if(strings[i].getKind() == "file"){
+      but->menubutton()->add
+        ("Choose...", 0, onelab_input_choice_file_chooser_cb, (void*)n);
+      but->menubutton()->add
+        ("Edit...", 0, onelab_input_choice_file_edit_cb, (void*)n);
+    }
     but->value(strings[i].getValue().c_str());
     but->align(FL_ALIGN_RIGHT);
     but->callback(onelab_input_choice_cb, (void*)n);
diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h
index 65af9588045489693d145a7de2485b3f93b02c32..b8648707d4117c32d2940ae0a5a2067660f5efa1 100644
--- a/Fltk/onelabWindow.h
+++ b/Fltk/onelabWindow.h
@@ -21,7 +21,6 @@ class onelabWindow{
   Fl_Window *_win;
   Fl_Tree *_tree;
   Fl_Button *_butt[2];
-  Fl_Input *_model;
   Fl_Menu_Button *_gear;
   std::vector<Fl_Widget*> _treeWidgets;
   std::string _title;
@@ -37,8 +36,6 @@ class onelabWindow{
   void deactivate(){ _butt[0]->deactivate(); _butt[1]->deactivate(); }
   void show(){ _win->show(); }
   int shown(){ return _win->shown(); }
-  std::string getModelName(){ return _model->value(); }
-  void setModelName(const std::string &name){ _model->value(name.c_str()); }
   std::string getModelExtension(){ return _modelExtension; }
   void setModelExtension(const std::string &ext){ _modelExtension = ext; }
   int meshAuto(){ return _gear->menu()[1].value(); }