diff --git a/Common/Context.h b/Common/Context.h
index a27373bf6af864da58a819ad1d19a1618c3ed4b8..d5334e3ae8bec2874d610dfbd3bdbdb2567e49c7 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -222,6 +222,8 @@ class CTX {
     double timeout;
     std::string socketName;
     std::string name[5], executable[5], remoteLogin[5];
+    int autoSaveDatabase, autoMesh, autoMergeFile, autoHideNewViews;
+    int autoShowLastStep;
   }solver;
   // print options
   struct{
@@ -252,15 +254,13 @@ class CTX {
   } color;
   // is the machine big-endian?
   int bigEndian;
-  // how RGBA values are packed and unpacked into/from an unsigned
-  // integer to be fed to glColor4ubv (depends on machine byte
-  // ordering!):
+  // how RGBA values are packed and unpacked into/from an unsigned integer to be
+  // fed to glColor4ubv (depends on machine byte ordering!):
   unsigned int packColor(int R, int G, int B, int A);
   int unpackRed(unsigned int X);
   int unpackGreen(unsigned int X);
   int unpackBlue(unsigned int X);
   int unpackAlpha(unsigned int X);
-
 };
 
 #endif
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 56cb0e0653250a8d65dc78f2a50beab79fa13058..798aa43fe1419a00b93ed8b509c8f1705b4824d9 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1106,14 +1106,6 @@ StringXNumber MeshOptions_Number[] = {
 StringXNumber SolverOptions_Number[] = {
   { F|O, "AlwaysListen" , opt_solver_listen , 0. ,
     "Always listen to incoming connection requests?" },
-
-  { F|O, "Plugins" , opt_solver_plugins , 0. ,
-    "Enable default solver plugins?" },
-
-  { F|O, "Timeout" , opt_solver_timeout , 5. ,
-    "Time (in seconds) before closing the socket if no connection is happening" },
-
-  /* TODO
   { F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 0. ,
     "Automatically save database after each computation" },
   { F|O, "AutoMesh" , opt_solver_auto_mesh , 1. ,
@@ -1124,7 +1116,12 @@ StringXNumber SolverOptions_Number[] = {
     "Automcatically hide newly merged results" },
   { F|O, "AutoShowLastStep" , opt_solver_auto_show_last_step , 1. ,
     "Automatically show the last time step in newly merged results" },
-  */
+
+  { F|O, "Plugins" , opt_solver_plugins , 0. ,
+    "Enable default solver plugins?" },
+
+  { F|O, "Timeout" , opt_solver_timeout , 5. ,
+    "Time (in seconds) before closing the socket if no connection is happening" },
 
   { 0, 0 , 0 , 0. , 0 }
 } ;
diff --git a/Common/Gmsh.h b/Common/Gmsh.h
index e289c1e9e55003d838be748607ed8d08e66b8442..b4b344afa60daa198e88ec8c99fc23dfb08b8d6c 100644
--- a/Common/Gmsh.h
+++ b/Common/Gmsh.h
@@ -12,7 +12,7 @@
 int GmshInitialize(int argc=0, char **argv=0);
 int GmshSetMessageHandler(GmshMessage *callback);
 int GmshSetBoundingBox(double xmin, double xmax,
-                       double ymin, double ymax, 
+                       double ymin, double ymax,
                        double zmin, double zmax);
 int GmshSetOption(std::string category, std::string name, std::string value, int index=0);
 int GmshSetOption(std::string category, std::string name, double value, int index=0);
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 6f070b2695d37d0b5829bd4ba28824d5864c66d2..90cec2af38a6e0f9833d8f4c19efa95d21e5e3c2 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -5725,6 +5725,41 @@ double opt_solver_plugins(OPT_ARGS_NUM)
   return CTX::instance()->solver.plugins;
 }
 
+double opt_solver_auto_save_database(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoSaveDatabase = (int)val;
+  return CTX::instance()->solver.autoSaveDatabase;
+}
+
+double opt_solver_auto_mesh(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoMesh = (int)val;
+  return CTX::instance()->solver.autoMesh;
+}
+
+double opt_solver_auto_merge_file(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoMergeFile = (int)val;
+  return CTX::instance()->solver.autoMergeFile;
+}
+
+double opt_solver_auto_hide_new_views(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoHideNewViews = (int)val;
+  return CTX::instance()->solver.autoHideNewViews;
+}
+
+double opt_solver_auto_show_last_step(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoShowLastStep = (int)val;
+  return CTX::instance()->solver.autoShowLastStep;
+}
+
 double opt_post_horizontal_scales(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
diff --git a/Common/Options.h b/Common/Options.h
index 239ed510736a915184c9e6bf6751f8de73595ad8..52d0def1e22c9dff5e573f67e8527120e53b8bd6 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -468,6 +468,11 @@ double opt_mesh_ignore_part_bound(OPT_ARGS_NUM);
 double opt_solver_listen(OPT_ARGS_NUM);
 double opt_solver_timeout(OPT_ARGS_NUM);
 double opt_solver_plugins(OPT_ARGS_NUM);
+double opt_solver_auto_save_database(OPT_ARGS_NUM);
+double opt_solver_auto_mesh(OPT_ARGS_NUM);
+double opt_solver_auto_merge_file(OPT_ARGS_NUM);
+double opt_solver_auto_hide_new_views(OPT_ARGS_NUM);
+double opt_solver_auto_show_last_step(OPT_ARGS_NUM);
 double opt_post_horizontal_scales(OPT_ARGS_NUM);
 double opt_post_link(OPT_ARGS_NUM);
 double opt_post_smooth(OPT_ARGS_NUM);
diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index f72b3818e7e6aef2ad5c32029135724c0e6b3363..da7952898af512a885ff7fb0eef18d1399363be6 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -287,10 +287,10 @@ bool onelab::localNetworkClient::run()
       Msg::Direct(1, "%-8.8s: %s", _name.c_str(), message.c_str());
       break;
     case GmshSocket::GMSH_MERGE_FILE:
-      if(FlGui::instance()->onelab->autoMergeFile()){
+      if(CTX::instance()->solver.autoMergeFile){
         unsigned int n = PView::list.size();
-        MergePostProcessingFile(message, FlGui::instance()->onelab->autoShowLastStep(),
-                                FlGui::instance()->onelab->autoHideNewViews(), true);
+        MergePostProcessingFile(message, CTX::instance()->solver.autoShowLastStep,
+                                CTX::instance()->solver.autoHideNewViews, true);
         drawContext::global()->draw();
         if(n != PView::list.size())
           FlGui::instance()->menu->setContext(menu_post, 0);
@@ -499,7 +499,7 @@ void onelab_cb(Fl_Widget *w, void *data)
     bool metamodel = (n.size() && n[0].getValue());
     // if the client is a not a metamodel, run Gmsh
     if(!metamodel){
-      if(onelabUtils::runGmshClient(action, FlGui::instance()->onelab->autoMesh()))
+      if(onelabUtils::runGmshClient(action, CTX::instance()->solver.autoMesh))
         drawContext::global()->draw();
     }
 
@@ -536,7 +536,7 @@ void onelab_cb(Fl_Widget *w, void *data)
   } while(action == "compute" && !FlGui::instance()->onelab->stop() &&
           incrementLoops());
 
-  if(FlGui::instance()->onelab->autoSaveDatabase() && action == "compute"){
+  if(CTX::instance()->solver.autoSaveDatabase && action == "compute"){
     std::string s = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db";
     writeDb(s, true);
   }
@@ -546,6 +546,22 @@ void onelab_cb(Fl_Widget *w, void *data)
   if(action != "initialize") FlGui::instance()->onelab->show();
 }
 
+
+void onelab_option_cb(Fl_Widget *w, void *data)
+{
+  if(!data) return;
+  std::string what((const char*)data);
+  double val = ((Fl_Menu_*)w)->mvalue()->value() ? 1. : 0.;
+  if(what == "save")
+    CTX::instance()->solver.autoSaveDatabase = val;
+  else if(what == "merge")
+    CTX::instance()->solver.autoMergeFile = val;
+  else if(what == "hide")
+    CTX::instance()->solver.autoHideNewViews = val;
+  else if(what == "step")
+    CTX::instance()->solver.autoShowLastStep = val;
+}
+
 static void onelab_choose_executable_cb(Fl_Widget *w, void *data)
 {
   onelab::localNetworkClient *c = (onelab::localNetworkClient*)data;
@@ -612,17 +628,26 @@ onelabWindow::onelabWindow(int deltaFontSize)
   _gear->add("Reset database", 0, onelab_cb, (void*)"reset");
   _gear->add("Save database...", 0, onelab_cb, (void*)"save");
   _gear->add("_Load database...", 0, onelab_cb, (void*)"load");
-  _gear->add("Save database automatically", 0, 0, 0, FL_MENU_TOGGLE);
-  ((Fl_Menu_Item*)_gear->menu())[3].clear();
-  _gear->add("Remesh automatically", 0, 0, 0, FL_MENU_TOGGLE);
-  ((Fl_Menu_Item*)_gear->menu())[4].set();
-  _gear->add("Merge results automatically", 0, 0, 0, FL_MENU_TOGGLE);
-  ((Fl_Menu_Item*)_gear->menu())[5].set();
-  _gear->add("Hide new views", 0, 0, 0, FL_MENU_TOGGLE);
-  ((Fl_Menu_Item*)_gear->menu())[6].clear();
-  _gear->add("_Always show last step", 0, 0, 0, FL_MENU_TOGGLE);
-  ((Fl_Menu_Item*)_gear->menu())[7].set();
-  _gearFrozenMenuSize = _gear->menu()->size();
+
+  _gearOptionsStart = _gear->menu()->size();
+
+  _gear->add("Save database automatically", 0, onelab_option_cb, (void*)"save",
+             FL_MENU_TOGGLE |
+             (CTX::instance()->solver.autoSaveDatabase ? FL_MENU_VALUE : 0));
+  _gear->add("Remesh automatically", 0, onelab_option_cb, (void*)"mesh",
+             FL_MENU_TOGGLE |
+             (CTX::instance()->solver.autoMesh ? FL_MENU_VALUE : 0));
+  _gear->add("Merge results automatically", 0, onelab_option_cb, (void*)"merge",
+             FL_MENU_TOGGLE |
+             (CTX::instance()->solver.autoMergeFile ? FL_MENU_VALUE : 0));
+  _gear->add("Hide new views", 0, onelab_option_cb, (void*)"hide",
+             FL_MENU_TOGGLE |
+             (CTX::instance()->solver.autoHideNewViews ? FL_MENU_VALUE : 0));
+  _gear->add("_Always show last step", 0, onelab_option_cb, (void*)"step",
+             FL_MENU_TOGGLE |
+             (CTX::instance()->solver.autoShowLastStep ? FL_MENU_VALUE : 0));
+
+  _gearOptionsEnd = _gear->menu()->size();
 
   Fl_Box *resbox = new Fl_Box(WB, WB,
                               width - 2 * BB - BB / 2 - 4 * WB,
@@ -637,12 +662,6 @@ onelabWindow::onelabWindow(int deltaFontSize)
   FL_NORMAL_SIZE += _deltaFontSize;
 }
 
-int onelabWindow::autoSaveDatabase(){ return _gear->menu()[3].value(); }
-int onelabWindow::autoMesh(){ return _gear->menu()[4].value(); }
-int onelabWindow::autoMergeFile(){ return _gear->menu()[5].value(); }
-int onelabWindow::autoHideNewViews(){ return _gear->menu()[6].value(); }
-int onelabWindow::autoShowLastStep(){ return _gear->menu()[7].value(); }
-
 static bool getFlColor(const std::string &str, Fl_Color &c)
 {
   if(str == "1"){
@@ -1068,19 +1087,22 @@ void onelabWindow::setButtonMode(const std::string &butt0, const std::string &bu
     _butt[1]->label("Stop");
     _butt[1]->callback(onelab_cb, (void*)"stop");
     for(int i = 0; i < _gear->menu()->size(); i++)
-      if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
+      if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2)
+        ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
   }
   else if(butt1 == "kill"){
     _butt[1]->activate();
     _butt[1]->label("Kill");
     _butt[1]->callback(onelab_cb, (void*)"kill");
     for(int i = 0; i < _gear->menu()->size(); i++)
-      if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
+      if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2)
+        ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
   }
   else{
     _butt[1]->deactivate();
     for(int i = 0; i < _gear->menu()->size(); i++)
-      if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
+      if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2)
+        ((Fl_Menu_Item*)_gear->menu())[i].deactivate();
   }
 }
 
@@ -1095,7 +1117,7 @@ void onelabWindow::rebuildSolverList()
 {
   // update OneLab window title and gear menu
   _title = "OneLab";
-  for(int i = _gear->menu()->size(); i >= _gearFrozenMenuSize - 1; i--)
+  for(int i = _gear->menu()->size(); i >= _gearOptionsEnd - 1; i--)
     _gear->remove(i);
   for(onelab::server::citer it = onelab::server::instance()->firstClient();
       it != onelab::server::instance()->lastClient(); it++){
diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h
index b73e31e34769c23cb2d17bafe74036ea569fb7b8..38024e39f4bd19f2fb69a8f82112b17b67499d9e 100644
--- a/Fltk/onelabWindow.h
+++ b/Fltk/onelabWindow.h
@@ -23,7 +23,7 @@ class onelabWindow{
   Fl_Tree *_tree;
   Fl_Button *_butt[2];
   Fl_Menu_Button *_gear;
-  int _gearFrozenMenuSize;
+  int _gearOptionsStart, _gearOptionsEnd;
   std::vector<Fl_Widget*> _treeWidgets;
   std::vector<char*> _treeStrings;
   std::string _title;
@@ -51,11 +51,6 @@ class onelabWindow{
   bool isBusy();
   void show(){ _win->show(); }
   int shown(){ return _win->shown(); }
-  int autoSaveDatabase();
-  int autoMesh();
-  int autoMergeFile();
-  int autoHideNewViews();
-  int autoShowLastStep();
   std::string getPath(Fl_Tree_Item *item)
   {
     char path[1024];