diff --git a/Common/onelab.h b/Common/onelab.h
index f5403813ac2f66a927138dfd643b10ae2d7d520f..477c39725ce663e55ba505a3d5501f35718cac1e 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -512,6 +512,7 @@ namespace onelab{
     citer firstClient(){ return _clients.begin(); }
     citer lastClient(){ return _clients.end(); }
     citer findClient(const std::string &name){ return _clients.find(name); }
+    citer removeClient(const std::string &name){ _clients.erase(name); }
     int getNumClients(){ return _clients.size(); }
     void setChanged(bool changed, const std::string &client="")
     {
@@ -571,6 +572,8 @@ namespace onelab{
     localNetworkClient(const std::string &name, const std::string &commandLine)
       : localClient(name), _commandLine(commandLine), _pid(-1) {}
     virtual ~localNetworkClient(){}
+    const std::string &getCommandLine(){ return _commandLine; }
+    void setCommandLine(const std::string &s){ _commandLine = s; }
     int getPid(){ return _pid; }
     void setPid(int pid){ _pid = pid; }
     virtual bool run(const std::string &what);
diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index ff54177f1f36a033c896d4bfd076f68fe11178c1..93cd75c57a5a693f9d8158bf0ed151d6c090015b 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -254,6 +254,13 @@ 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"){
     onelab::server::instance()->clear();
     if(onelab::server::instance()->findClient("Gmsh") != 
@@ -267,6 +274,7 @@ void onelab_cb(Fl_Widget *w, void *data)
       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] + ".pro");
@@ -372,13 +380,14 @@ 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 - (2*BB)/3, BH);
+  _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_Button *choose = new Fl_Button(width - WB - (2*BB)/3, WB, (2*BB)/3, BH, "Choose");
-  choose->callback(onelab_cb, (void*)"choose model");
+  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->connectorstyle(FL_TREE_CONNECTOR_SOLID);
@@ -388,16 +397,11 @@ onelabWindow::onelabWindow(int deltaFontSize)
   _butt[0]->callback(onelab_cb, (void*)"compute");
   _butt[1] = new Fl_Button(width - 2*WB - 2*BB, height - WB - BH, BB, BH, "Check");
   _butt[1]->callback(onelab_cb, (void*)"check");
-
-  static Fl_Menu_Item gear_menu[] = {
-    {"Reset database", 0, onelab_cb, (void*)"reset"},
-    {"Mesh automatically", 0, 0, 0, FL_MENU_TOGGLE},
-    {0}
-  };
-  gear_menu[1].set();
   _gear = new Fl_Menu_Button
     (_butt[1]->x() - WB - BB/2, _butt[1]->y(), BB/2, BH, "@-1gmsh_gear");
-  _gear->menu(gear_menu);
+  _gear->add("Reset database", 0, onelab_cb, (void*)"reset");
+  _gear->add("Mesh automatically", 0, 0, 0, FL_MENU_TOGGLE);
+  ((Fl_Menu_Item*)_gear->menu())[1].set();
   
   Fl_Box *resbox = new Fl_Box(WB, height - BH - 3 * WB, WB, WB);
   _win->resizable(resbox);
@@ -408,10 +412,16 @@ onelabWindow::onelabWindow(int deltaFontSize)
 
   FL_NORMAL_SIZE += deltaFontSize;
 
-  // FIXME adding GetDP client
+  // FIXME this should be called when we click on "GetDP" in the
+  // solver menu
   onelab::server::instance()->registerClient
     (new onelab::localNetworkClient("GetDP",
                                     opt_solver_executable0(0, GMSH_GET, "")));
+  // onelab::server::citer it = onelab::server::instance()->findClient("GetDP");
+  // onelab::client *c = it->second;
+  // c->setCommandLine(newcommand);
+  // delete c;
+  //onelab::server::instance()->removeClient("GetDP");
 }
 
 static std::string getShortName(const std::string &name)