diff --git a/Common/Options.cpp b/Common/Options.cpp
index 8fd577b3f457cbe510d10acec1d27bb3b38c8e65..568cbaf5d7d93ace60eff641266e30b04b2ba389 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1771,10 +1771,8 @@ double opt_general_graphics_size0(OPT_ARGS_NUM)
     if(CTX::instance()->glSize[0] <= 0) CTX::instance()->glSize[0] = 600;
   }
 #if defined(HAVE_FLTK)
-  if(FlGui::available()){
-    if(action & GMSH_SET){
-      FlGui::instance()->graph[0]->setGlWidth(CTX::instance()->glSize[0]);
-    }
+  if(FlGui::available() && (action & GMSH_GUI)){
+    FlGui::instance()->graph[0]->setGlWidth(CTX::instance()->glSize[0]);
   }
 #endif
   return CTX::instance()->glSize[0];
@@ -1787,10 +1785,8 @@ double opt_general_graphics_size1(OPT_ARGS_NUM)
     if(CTX::instance()->glSize[1] <= 0) CTX::instance()->glSize[1] = 600;
   }
 #if defined(HAVE_FLTK)
-  if(FlGui::available()){
-    if(action & GMSH_SET){
-      FlGui::instance()->graph[0]->setGlHeight(CTX::instance()->glSize[1]);
-    }
+  if(FlGui::available() && (action & GMSH_GUI)){
+    FlGui::instance()->graph[0]->setGlHeight(CTX::instance()->glSize[1]);
   }
 #endif
   return CTX::instance()->glSize[1];
@@ -1837,6 +1833,11 @@ double opt_general_message_size(OPT_ARGS_NUM)
     CTX::instance()->msgSize = (int)val;
     if(CTX::instance()->msgSize < 0) CTX::instance()->msgSize = 0;
   }
+#if defined(HAVE_FLTK)
+  if(FlGui::available() && (action & GMSH_GUI)){
+    FlGui::instance()->graph[0]->setMessageHeight(CTX::instance()->msgSize);
+  }
+#endif
   return CTX::instance()->msgSize;
 }
 
@@ -1845,6 +1846,14 @@ double opt_general_detached_menu(OPT_ARGS_NUM)
   if(action & GMSH_SET){
     CTX::instance()->detachedMenu = (int)val;
   }
+#if defined(HAVE_FLTK)
+  if(FlGui::available() && (action & GMSH_GUI)){
+    if(CTX::instance()->detachedMenu)
+      FlGui::instance()->graph[0]->detachMenu();
+    else
+      FlGui::instance()->graph[0]->attachMenu();
+  }
+#endif
   return CTX::instance()->detachedMenu;
 }
 
@@ -1854,6 +1863,11 @@ double opt_general_menu_size0(OPT_ARGS_NUM)
     CTX::instance()->menuSize[0] = (int)val;
     if(CTX::instance()->menuSize[0] < 0) CTX::instance()->menuSize[0] = 0;
   }
+#if defined(HAVE_FLTK)
+  if(FlGui::available() && (action & GMSH_GUI)){
+    FlGui::instance()->graph[0]->setMenuWidth(CTX::instance()->menuSize[0]);
+  }
+#endif
   return CTX::instance()->menuSize[0];
 }
 
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index b4d4dcaf4bee25e4d01035ebf9cb41fabd997b64..3b54829f50a887c8f16c78c4bbfb4bbc42e16621 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -90,9 +90,10 @@ FlGui::FlGui(int argc, char **argv)
     Fl::display(CTX::instance()->display.c_str());
 
 #if 0 // dark scheme... not bad, but needs work
-  Fl::background(60, 60, 60);
-  Fl::background2(120, 120, 120);
-  Fl::foreground(200, 200, 200);
+  Fl::background(110, 110, 110);
+  Fl::background2(140, 140, 140);
+  Fl::foreground(230, 230, 230);
+  //Fl::set_color(FL_SELECTION_COLOR, 50, 50, 0);
 #endif
 
   // add new box types used in graphic window
@@ -703,7 +704,7 @@ void FlGui::storeCurrentWindowsInfo()
   CTX::instance()->glPosition[1] = graph[0]->getWindow()->y();
   CTX::instance()->glSize[0] = graph[0]->getGlWidth();
   CTX::instance()->glSize[1] = graph[0]->getGlHeight();
-  CTX::instance()->msgSize = graph[0]->getSavedMessageHeight();
+  CTX::instance()->msgSize = graph[0]->getMessageHeight();
   CTX::instance()->menuSize[0] = graph[0]->getMenuWidth();
   if(graph[0]->isMenuDetached()){
     CTX::instance()->detachedMenu = 1;
diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index 66897a6ae8cf97911e42e6348fd5b3a03ff9497e..c0162fd7342a7918bccc08976329c077938727df 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -676,6 +676,7 @@ static void geometry_edit_cb(Fl_Widget *w, void *data)
 void geometry_reload_cb(Fl_Widget *w, void *data)
 {
   std::string fileName = GModel::current()->getFileName();
+  //ClearProject();
   OpenProject(fileName);
   drawContext::global()->draw();
 }
@@ -2671,17 +2672,15 @@ class mainWindowSpecialResize : public mainWindow {
     : mainWindow(w, h, nonModal, l) {}
   virtual void resize(int X,int Y,int W,int H)
   {
-    bool special = (FlGui::available() && shown() && 
+    bool special = (FlGui::available() && shown() &&
 		    this == FlGui::instance()->graph[0]->getWindow());
-    int old_mh = 0;
+    int mh = 0;
     if(special)
-      old_mh = FlGui::instance()->graph[0]->getMessageHeight();
+      mh = FlGui::instance()->graph[0]->getMessageHeight();
     Fl_Window::resize(X, Y, W, H);
     const int minimum_non_message_height = 100;
-    if(special && old_mh < h() - minimum_non_message_height){
-      int mh = FlGui::instance()->graph[0]->getMessageHeight();
-      FlGui::instance()->graph[0]->resizeMessages(old_mh - mh);
-    }
+    if(special && mh < h() - minimum_non_message_height)
+      FlGui::instance()->graph[0]->setMessageHeight(mh);
   }
 };
 
@@ -2921,12 +2920,12 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
 
   // resize the tiles to match the prescribed sizes
   _tile->position(0, mh + glheight, 0, mh + CTX::instance()->glSize[1]);
-  _savedMessageHeight = CTX::instance()->msgSize;
 
+  // if the tree widget is too small it will not be rebuilt correctly (probably
+  // a bug)... so impose minimum width
   int minw = 3 * BB/2 + 4 * WB;
   if(CTX::instance()->menuSize[0] < minw) CTX::instance()->menuSize[0] = minw;
   _tile->position(twidth, 0, CTX::instance()->menuSize[0], 0);
-  _savedMenuWidth = CTX::instance()->menuSize[0];
 
   _win->position(CTX::instance()->glPosition[0], CTX::instance()->glPosition[1]);
   _win->end();
@@ -2970,7 +2969,7 @@ void graphicWindow::setTitle(std::string str)
 void graphicWindow::detachMenu()
 {
   if(_menuwin || !_onelab || !_browser) return;
-  if(_browser->h() == 0) resizeMessages(1);
+  if(_browser->h() == 0) setMessageHeight(1);
   int w = _onelab->w();
   _tile->remove(_onelab);
   _browser->resize(0, _browser->y(), _browser->w() + w, _browser->h());
@@ -3003,7 +3002,7 @@ void graphicWindow::attachMenu()
   _menuwin->hide();
   delete _menuwin;
   _menuwin = 0;
-  if(_browser->h() == 0) resizeMessages(1);
+  if(_browser->h() == 0) setMessageHeight(1);
   int w = _onelab->w();
   if(_browser->w() - w < 0) w = _browser->w() / 2;
   _browser->resize(w, _browser->y(), _browser->w() - w, _browser->h());
@@ -3027,19 +3026,19 @@ void graphicWindow::showMenu()
 {
   if(_menuwin || !_onelab || !_win->shown()) return;
   if(_onelab->w() < 5){
-    int width = _savedMenuWidth;
+    int width = CTX::instance()->menuSize[0];
     if(width < 5) width = _onelab->getMinWindowWidth();
     int maxw = _win->w();
     if(width > maxw) width = maxw / 2;
-    resizeMenu(width - _onelab->w());
+    setMenuWidth(width);
   }
 }
 
 void graphicWindow::hideMenu()
 {
   if(_menuwin || !_onelab) return;
-  _savedMenuWidth = _onelab->w();
-  resizeMenu(-_onelab->w());
+  CTX::instance()->menuSize[0] = _onelab->w();
+  setMenuWidth(0);
 }
 
 void graphicWindow::showHideMenu()
@@ -3100,7 +3099,7 @@ bool graphicWindow::split(openglWindow *g, char how)
   }
   else{
     // make sure browser is not zero-size when adding children
-    if(_browser && _browser->h() == 0) resizeMessages(1);
+    if(_browser && _browser->h() == 0) setMessageHeight(1);
     int x1 = g->x();
     int y1 = g->y();
     int w1 = (how == 'h') ? g->w() / 2 : g->w();
@@ -3186,15 +3185,23 @@ void graphicWindow::checkAnimButtons()
   }
 }
 
-void graphicWindow::resizeMenu(int dh)
+void graphicWindow::setMenuWidth(int w)
 {
-  if(_menuwin || !_onelab) return;
+  if(_menuwin){
+    _menuwin->size(std::max(w, _onelab->getMinWindowWidth()), _menuwin->h());
+    _menuwin->redraw();
+    return;
+  }
+  if(!_onelab || !_browser) return;
+  double dw = w - _onelab->w();
+  if(!dw) return;
   for(unsigned int i = 0; i < gl.size(); i++){
     if(gl[i]->x() == _onelab->x() + _onelab->w())
-      gl[i]->resize(gl[i]->x() + dh, gl[i]->y(), gl[i]->w() - dh, gl[i]->h());
+      gl[i]->resize(gl[i]->x() + dw, gl[i]->y(), gl[i]->w() - dw, gl[i]->h());
   }
-  _onelab->resize(_onelab->x(), _onelab->y(), _onelab->w() + dh, _onelab->h());
-  _onelab->redraw();
+  _browser->resize(_browser->x() + dw, _browser->y(), _browser->w() - dw, _browser->h());
+  _onelab->resize(_onelab->x(), _onelab->y(), _onelab->w() + dw, _onelab->h());
+  _tile->redraw();
 }
 
 int graphicWindow::getGlHeight()
@@ -3211,43 +3218,43 @@ int graphicWindow::getGlWidth()
 
 void graphicWindow::setGlWidth(int w)
 {
-  _win->size(w, _win->h());
+  if(w == _win->w()) return;
+  _win->size(std::max(w, _minWidth), _win->h());
   _win->redraw();
-  // workaround resizing bug on Mac
-  _win->size_range(_minWidth, _minHeight);
 }
 
 void graphicWindow::setGlHeight(int h)
 {
   int hh = h + _bottom->h();
   if(_bar) hh += _bar->h();
-  _win->size(_win->w(), hh);
+  if(hh == _win->h()) return;
+  _win->size(_win->w(), std::max(hh, _minHeight));
   _win->redraw();
-  // workaround resizing bug on Mac
-  _win->size_range(_minWidth, _minHeight);
 }
 
-void graphicWindow::resizeMessages(int dh)
+void graphicWindow::setMessageHeight(int h)
 {
   if(!_browser) return;
+  int dh = h - _browser->h();
+  if(!dh) return;
   for(unsigned int i = 0; i < gl.size(); i++){
     if(gl[i]->y() + gl[i]->h() == _browser->y())
       gl[i]->resize(gl[i]->x(), gl[i]->y(), gl[i]->w(), gl[i]->h() - dh);
   }
   _browser->resize(_browser->x(), _browser->y() - dh,
                    _browser->w(), _browser->h() + dh);
-  _browser->redraw();
+  _tile->redraw();
 }
 
 void graphicWindow::showMessages()
 {
   if(!_browser || !_win->shown()) return;
   if(_browser->h() < 5){
-    int height = _savedMessageHeight;
+    int height = CTX::instance()->msgSize;
     if(height < 5) height = 50;
     int maxh = _win->h() - _bottom->h();
     if(height > maxh) height = maxh / 2;
-    resizeMessages(height - _browser->h());
+    setMessageHeight(height);
   }
   if(_autoScrollMessages)
     _browser->bottomline(_browser->size());
@@ -3256,8 +3263,8 @@ void graphicWindow::showMessages()
 void graphicWindow::hideMessages()
 {
   if(!_browser) return;
-  _savedMessageHeight = _browser->h();
-  resizeMessages(-_browser->h());
+  CTX::instance()->msgSize = _browser->h();
+  setMessageHeight(0);
 }
 
 void graphicWindow::showHideMessages()
@@ -3273,13 +3280,6 @@ int graphicWindow::getMessageHeight()
   return _browser->h();
 }
 
-int graphicWindow::getSavedMessageHeight()
-{
-  if(!_browser) return 0;
-  if(!_browser->h()) return _savedMessageHeight;
-  return _browser->h();
-}
-
 void graphicWindow::addMessage(const char *msg)
 {
   if(!_browser) return;
diff --git a/Fltk/graphicWindow.h b/Fltk/graphicWindow.h
index 676c4445be1c6625745b88e28c00add61450d982..13b8279fcac77dfb7e0d2f7b4c1fa62f94261288 100644
--- a/Fltk/graphicWindow.h
+++ b/Fltk/graphicWindow.h
@@ -24,7 +24,6 @@
 class graphicWindow{
  private:
   std::string _title;
-  int _savedMessageHeight, _savedMenuWidth;
   bool _autoScrollMessages;
 #if defined(__APPLE__)
   Fl_Sys_Menu_Bar *_sysbar;
@@ -48,32 +47,33 @@ class graphicWindow{
   onelabGroup *getMenu(){ return _onelab; }
   Fl_Progress *getProgress(){ return _label; }
   Fl_Button *getSelectionButton(){ return _butt[9]; }
-  void setGlWidth(int w);
-  void setGlHeight(int h);
   int getMinWidth(){ return _minWidth; }
   int getMinHeight(){ return _minHeight; }
-  void setTitle(std::string str);
   void setAutoScroll(bool val){ _autoScrollMessages = val; }
   bool getAutoScroll(){ return _autoScrollMessages; }
-  int getGlHeight();
-  int getGlWidth();
+  void setTitle(std::string str);
   void setStereo();
-  void resizeMenu(int dh);
-  void showMenu();
-  void hideMenu();
-  void showHideMenu();
-  bool isMenuDetached(){ return _menuwin ? true : false; }
+  int getGlWidth();
+  void setGlWidth(int w);
+  int getGlHeight();
+  void setGlHeight(int h);
   int getMenuWidth();
+  void setMenuWidth(int w);
   int getMenuHeight();
   int getMenuPositionX();
   int getMenuPositionY();
+  void showMenu();
+  void hideMenu();
+  void showHideMenu();
   void detachMenu();
   void attachMenu();
   void attachDetachMenu();
+  bool isMenuDetached(){ return _menuwin ? true : false; }
   bool split(openglWindow *g, char how);
   void setAnimButtons(int mode);
   void checkAnimButtons();
-  void resizeMessages(int dh);
+  int getMessageHeight();
+  void setMessageHeight(int h);
   void showMessages();
   void hideMessages();
   void showHideMessages();
@@ -81,8 +81,6 @@ class graphicWindow{
   void clearMessages();
   void saveMessages(const char *filename);
   void copySelectedMessagesToClipboard();
-  int getMessageHeight();
-  int getSavedMessageHeight();
   void fillRecentHistoryMenu();
 };
 
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index 7d472b749026ec2d0ab69c6f63975a834db3e823..bc80fa6be03b92c2be473a6eb9aa22f7cde16879 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -767,6 +767,7 @@ onelabGroup::onelabGroup(int x, int y, int w, int h, const char *l)
   _tree->color(col);
   _tree->callback(onelab_tree_cb);
   _tree->connectorstyle(FL_TREE_CONNECTOR_SOLID);
+  //_tree->connectorstyle(FL_TREE_CONNECTOR_NONE);
   _tree->showroot(0);
   _tree->box(FL_FLAT_BOX);
   _tree->scrollbar_size(std::max(10, FL_NORMAL_SIZE - 2));