diff --git a/Common/Options.cpp b/Common/Options.cpp
index 3ff5a0ad5b716ce7a12e1de21638b4709570850a..0c9f8980b1fcf4b97c260b1e8268a616b479320c 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1770,12 +1770,7 @@ double opt_general_graphics_size0(OPT_ARGS_NUM)
 #if defined(HAVE_FLTK)
   if(FlGui::available()){
     if(action & GMSH_SET){
-      FlGui::instance()->graph[0]->win->size
-        (CTX::instance()->glSize[0],
-         FlGui::instance()->graph[0]->win->h());
-      // workaround resizing bug on Mac
-      FlGui::instance()->graph[0]->win->size_range
-        (FlGui::instance()->graph[0]->minWidth, FlGui::instance()->graph[0]->minHeight);
+      FlGui::instance()->graph[0]->setGlWidth(CTX::instance()->glSize[0]);
     }
   }
 #endif
@@ -1791,12 +1786,7 @@ double opt_general_graphics_size1(OPT_ARGS_NUM)
 #if defined(HAVE_FLTK)
   if(FlGui::available()){
     if(action & GMSH_SET){
-      FlGui::instance()->graph[0]->win->size
-        (FlGui::instance()->graph[0]->win->w(),
-         FlGui::instance()->graph[0]->bottom->h() + CTX::instance()->glSize[1]);
-      // workaround resizing bug on Mac
-      FlGui::instance()->graph[0]->win->size_range
-        (FlGui::instance()->graph[0]->minWidth, FlGui::instance()->graph[0]->minHeight);
+      FlGui::instance()->graph[0]->setGlHeight(CTX::instance()->glSize[1]);
     }
   }
 #endif
@@ -2488,16 +2478,16 @@ double opt_general_mouse_selection(OPT_ARGS_NUM)
       if(FlGui::available())
         Msg::StatusBar(false, "Mouse selection ON");
       for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-        FlGui::instance()->graph[i]->butt[9]->color(FL_BACKGROUND_COLOR);
+        FlGui::instance()->graph[i]->getSelectionButton()->color(FL_BACKGROUND_COLOR);
     }
     else{
       if(FlGui::available())
         Msg::StatusBar(false, "Mouse selection OFF");
       for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-        FlGui::instance()->graph[i]->butt[9]->color(FL_RED);
+        FlGui::instance()->graph[i]->getSelectionButton()->color(FL_RED);
     }
     for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-      FlGui::instance()->graph[i]->butt[9]->redraw();
+      FlGui::instance()->graph[i]->getSelectionButton()->redraw();
   }
 #endif
   return CTX::instance()->mouseSelection;
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index 5df40535dc33f609bc82c218c47f61d022b91d63..3ad61ffbd38e2ac3d0f8322daa859ca9cd252ac5 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -243,7 +243,7 @@ FlGui::FlGui(int argc, char **argv)
                                     CTX::instance()->detachedMenu ? true : false));
 
   // FIXME: make this cleaner ;-)
-  onelab = graph.back()->onelab;
+  onelab = graph.back()->getMenu();
 
 #if defined(WIN32)
   graph[0]->win->icon
@@ -270,8 +270,8 @@ FlGui::FlGui(int argc, char **argv)
                                         gmsh32x32, 32, 32));
 #endif
 
-  graph[0]->win->show(1, argv);
-  if(graph[0]->menuwin) graph[0]->menuwin->show();
+  graph[0]->getWindow()->show(1, argv);
+  if(graph[0]->getMenuWindow()) graph[0]->getMenuWindow()->show();
 
   // graphic window should have the initial focus (so we can e.g. directly loop
   // through time steps with the keyboard)
@@ -281,9 +281,11 @@ FlGui::FlGui(int argc, char **argv)
   // create additional graphic windows
   for(int i = 1; i < CTX::instance()->numWindows; i++){
     graphicWindow *g = new graphicWindow(false, CTX::instance()->numTiles);
-    g->win->resize(graph.back()->win->x() + 10, graph.back()->win->y() + 10,
-                   graph.back()->win->w(), graph.back()->win->h());
-    g->win->show();
+    g->getWindow()->resize(graph.back()->getWindow()->x() + 10,
+                           graph.back()->getWindow()->y() + 10,
+                           graph.back()->getWindow()->w(),
+                           graph.back()->getWindow()->h());
+    g->getWindow()->show();
     graph.push_back(g);
   }
 
@@ -753,10 +755,8 @@ void FlGui::splitCurrentOpenglWindow(char how)
 {
   openglWindow *g = getCurrentOpenglWindow();
   for(unsigned int i = 0; i < graph.size(); i++){
-    if(graph[i]->tile->find(g) != graph[i]->tile->children()){
-      graph[i]->split(g, how);
+    if(graph[i]->split(g, how))
       break;
-    }
   }
 }
 
@@ -774,8 +774,8 @@ void FlGui::setStatus(const char *msg, bool opengl)
     strncpy(buff, msg, sizeof(buff) - 1);
     buff[sizeof(buff) - 1] = '\0';
     for(unsigned int i = 0; i < graph.size(); i++){
-      graph[i]->label->label(buff);
-      graph[i]->label->redraw();
+      graph[i]->getProgress()->label(buff);
+      graph[i]->getProgress()->redraw();
     }
   }
   else{
@@ -797,20 +797,20 @@ void FlGui::setStatus(const char *msg, bool opengl)
 void FlGui::setProgress(const char *msg, double val, double min, double max)
 {
   for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++){
-    if(FlGui::instance()->graph[i]->label->value() != val)
-      FlGui::instance()->graph[i]->label->value(val);
-    if(FlGui::instance()->graph[i]->label->minimum() != min)
-      FlGui::instance()->graph[i]->label->minimum(min);
-    if(FlGui::instance()->graph[i]->label->maximum() != max)
-      FlGui::instance()->graph[i]->label->maximum(max);
+    if(FlGui::instance()->graph[i]->getProgress()->value() != val)
+      FlGui::instance()->graph[i]->getProgress()->value(val);
+    if(FlGui::instance()->graph[i]->getProgress()->minimum() != min)
+      FlGui::instance()->graph[i]->getProgress()->minimum(min);
+    if(FlGui::instance()->graph[i]->getProgress()->maximum() != max)
+      FlGui::instance()->graph[i]->getProgress()->maximum(max);
   }
   setStatus(msg);
 }
 
 void FlGui::storeCurrentWindowsInfo()
 {
-  CTX::instance()->glPosition[0] = graph[0]->win->x();
-  CTX::instance()->glPosition[1] = graph[0]->win->y();
+  CTX::instance()->glPosition[0] = graph[0]->getWindow()->x();
+  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]->getMessageHeight();
@@ -873,8 +873,8 @@ void window_cb(Fl_Widget *w, void *data)
 
   if(str == "minimize"){
     for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-      if(FlGui::instance()->graph[i]->win->shown())
-        FlGui::instance()->graph[i]->win->iconize();
+      if(FlGui::instance()->graph[i]->getWindow()->shown())
+        FlGui::instance()->graph[i]->getWindow()->iconize();
     if(FlGui::instance()->options->win->shown())
       FlGui::instance()->options->win->iconize();
     if(FlGui::instance()->plugins->win->shown())
@@ -894,25 +894,25 @@ void window_cb(Fl_Widget *w, void *data)
   }
   else if(str == "zoom"){
     if(zoom){
-      oldx = FlGui::instance()->graph[0]->win->x();
-      oldy = FlGui::instance()->graph[0]->win->y();
-      oldw = FlGui::instance()->graph[0]->win->w();
-      oldh = FlGui::instance()->graph[0]->win->h();
+      oldx = FlGui::instance()->graph[0]->getWindow()->x();
+      oldy = FlGui::instance()->graph[0]->getWindow()->y();
+      oldw = FlGui::instance()->graph[0]->getWindow()->w();
+      oldh = FlGui::instance()->graph[0]->getWindow()->h();
 //#define FS
 #ifndef FS
-      FlGui::instance()->graph[0]->win->resize(Fl::x(), Fl::y(), Fl::w(), Fl::h());
+      FlGui::instance()->graph[0]->getWindow()->resize(Fl::x(), Fl::y(), Fl::w(), Fl::h());
       FlGui::instance()->graph[0]->hideMessages();
       FlGui::check();
 #else
-      FlGui::instance()->graph[0]->win->fullscreen();
+      FlGui::instance()->graph[0]->getWindow()->fullscreen();
 #endif
       zoom = 0;
     }
     else{
 #ifndef FS
-      FlGui::instance()->graph[0]->win->resize(oldx, oldy, oldw, oldh);
+      FlGui::instance()->graph[0]->getWindow()->resize(oldx, oldy, oldw, oldh);
 #else
-      FlGui::instance()->graph[0]->win->fullscreen_off();
+      FlGui::instance()->graph[0]->getWindow()->fullscreen_off();
 #endif
       zoom = 1;
     }
@@ -920,7 +920,7 @@ void window_cb(Fl_Widget *w, void *data)
   else if(str == "front"){
     // the order is important!
     for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-      FlGui::instance()->graph[i]->win->show();
+      FlGui::instance()->graph[i]->getWindow()->show();
     if(FlGui::instance()->options->win->shown())
       FlGui::instance()->options->win->show();
     if(FlGui::instance()->plugins->win->shown())
diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index f444f2bfc5aa4802bf633262e7bf4dfa8d68a1db..a9581dbabde95bc3eebaae8611829d8f93a086a7 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -237,9 +237,11 @@ static void file_window_cb(Fl_Widget *w, void *data)
     graphicWindow *g2 = new graphicWindow(false, CTX::instance()->numTiles);
     FlGui::instance()->graph.push_back(g2);
     FlGui::instance()->setGraphicTitle(GModel::current()->getFileName());
-    g2->win->resize(g1->win->x() + 10, g1->win->y() + 10,
-                    g1->win->w(), g1->win->h());
-    g2->win->show();
+    g2->getWindow()->resize(g1->getWindow()->x() + 10,
+                            g1->getWindow()->y() + 10,
+                            g1->getWindow()->w(),
+                            g1->getWindow()->h());
+    g2->getWindow()->show();
   }
   else if(str == "split_h"){
     FlGui::instance()->splitCurrentOpenglWindow('h');
@@ -2273,7 +2275,7 @@ static graphicWindow *getGraphicWindow(Fl_Widget *w)
 {
   if(!w || !w->parent()) return FlGui::instance()->graph[0];
   for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
-    if(FlGui::instance()->graph[i]->win == w->parent())
+    if(FlGui::instance()->graph[i]->getWindow() == w->parent())
       return FlGui::instance()->graph[i];
   return FlGui::instance()->graph[0];
 }
@@ -2577,7 +2579,7 @@ static void remove_graphic_window_cb(Fl_Widget *w, void *data)
   std::vector<graphicWindow*> graph2;
   graphicWindow *deleteMe = 0;
   for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++){
-    if(FlGui::instance()->graph[i]->win == w)
+    if(FlGui::instance()->graph[i]->getWindow() == w)
       deleteMe = FlGui::instance()->graph[i];
     else
       graph2.push_back(FlGui::instance()->graph[i]);
@@ -2711,32 +2713,32 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   // the graphic window should be a "normal" window (neither modal nor
   // non-modal)
   if(main){
-    win = new mainWindow(width, height, false);
-    win->callback(file_quit_cb);
+    _win = new mainWindow(width, height, false);
+    _win->callback(file_quit_cb);
   }
   else{
-    win = new paletteWindow(width, height, false);
-    win->callback(remove_graphic_window_cb);
+    _win = new paletteWindow(width, height, false);
+    _win->callback(remove_graphic_window_cb);
   }
 
 #if defined(__APPLE__)
-  sysbar = 0;
+  _sysbar = 0;
 #endif
-  bar = 0;
+  _bar = 0;
   if(main){
 #if defined(__APPLE__)
     if(CTX::instance()->systemMenuBar){
-      sysbar = new Fl_Sys_Menu_Bar(1, 1, 1, 1);
-      sysbar->menu(sysbar_table);
-      sysbar->global();
+      _sysbar = new Fl_Sys_Menu_Bar(1, 1, 1, 1);
+      _sysbar->menu(sysbar_table);
+      _sysbar->global();
       fillRecentHistoryMenu();
     }
     else{
 #endif
-      bar = new Fl_Menu_Bar(0, 0, width, BH);
-      bar->menu(bar_table);
-      bar->box(FL_UP_BOX);
-      bar->global();
+      _bar = new Fl_Menu_Bar(0, 0, width, BH);
+      _bar->menu(bar_table);
+      _bar->box(FL_UP_BOX);
+      _bar->global();
       fillRecentHistoryMenu();
 #if defined(__APPLE__)
     }
@@ -2744,97 +2746,97 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   }
 
   // bottom button bar
-  bottom = new Fl_Box(0, mh + glheight + mheight, width, sh);
-  bottom->box(FL_FLAT_BOX);
+  _bottom = new Fl_Box(0, mh + glheight + mheight, width, sh);
+  _bottom->box(FL_FLAT_BOX);
 
   int x = 2;
   int sht = sh - 4; // leave a 2 pixel border at the bottom
 
-  butt[5] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_models");
-  butt[5]->callback(status_options_cb, (void *)"model");
-  butt[5]->tooltip("Select active model");
+  _butt[5] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_models");
+  _butt[5]->callback(status_options_cb, (void *)"model");
+  _butt[5]->tooltip("Select active model");
   x += sw;
-  butt[0] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "X");
-  butt[0]->callback(status_xyz1p_cb, (void *)"x");
-  butt[0]->tooltip("Set +X or -X view (Alt+x or Alt+Shift+x)");
+  _butt[0] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "X");
+  _butt[0]->callback(status_xyz1p_cb, (void *)"x");
+  _butt[0]->tooltip("Set +X or -X view (Alt+x or Alt+Shift+x)");
   x += sw;
-  butt[1] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "Y");
-  butt[1]->callback(status_xyz1p_cb, (void *)"y");
-  butt[1]->tooltip("Set +Y or -Y view (Alt+y or Alt+Shift+y)");
+  _butt[1] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "Y");
+  _butt[1]->callback(status_xyz1p_cb, (void *)"y");
+  _butt[1]->tooltip("Set +Y or -Y view (Alt+y or Alt+Shift+y)");
   x += sw;
-  butt[2] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "Z");
-  butt[2]->callback(status_xyz1p_cb, (void *)"z");
-  butt[2]->tooltip("Set +Z or -Z view (Alt+z or Alt+Shift+z)");
+  _butt[2] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "Z");
+  _butt[2]->callback(status_xyz1p_cb, (void *)"z");
+  _butt[2]->tooltip("Set +Z or -Z view (Alt+z or Alt+Shift+z)");
   x += sw;
-  butt[4] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_rotate");
-  butt[4]->callback(status_xyz1p_cb, (void *)"r");
-  butt[4]->tooltip("Rotate +90 or -90 (Shift) degrees, or sync rotations (Alt)");
+  _butt[4] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_rotate");
+  _butt[4]->callback(status_xyz1p_cb, (void *)"r");
+  _butt[4]->tooltip("Rotate +90 or -90 (Shift) degrees, or sync rotations (Alt)");
   x += sw;
-  butt[3] = new Fl_Button(x, mh + glheight + mheight + 2, 2 * FL_NORMAL_SIZE, sht, "1:1");
-  butt[3]->callback(status_xyz1p_cb, (void *)"1:1");
-  butt[3]->tooltip("Set unit scale, sync scale between viewports (Alt), "
+  _butt[3] = new Fl_Button(x, mh + glheight + mheight + 2, 2 * FL_NORMAL_SIZE, sht, "1:1");
+  _butt[3]->callback(status_xyz1p_cb, (void *)"1:1");
+  _butt[3]->tooltip("Set unit scale, sync scale between viewports (Alt), "
                    "or reset bounding box around visible entities (Shift)");
   x += 2 * FL_NORMAL_SIZE;
-  butt[8] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_ortho");
-  butt[8]->callback(status_options_cb, (void *)"p");
-  butt[8]->tooltip("Toggle projection mode (Alt+o or Alt+Shift+o)");
+  _butt[8] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_ortho");
+  _butt[8]->callback(status_options_cb, (void *)"p");
+  _butt[8]->tooltip("Toggle projection mode (Alt+o or Alt+Shift+o)");
   x += sw;
-  butt[12] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "M");
-  butt[12]->callback(status_options_cb, (void *)"M");
-  butt[12]->tooltip("Toggle mesh visibility (Alt+m)");
+  _butt[12] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "M");
+  _butt[12]->callback(status_options_cb, (void *)"M");
+  _butt[12]->tooltip("Toggle mesh visibility (Alt+m)");
   x += sw;
-  butt[13] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_clscale");
-  butt[13]->callback(status_options_cb, (void *)"clscale");
-  butt[13]->tooltip("Change mesh element size factor");
+  _butt[13] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_clscale");
+  _butt[13]->callback(status_options_cb, (void *)"clscale");
+  _butt[13]->tooltip("Change mesh element size factor");
   x += sw;
-  butt[9] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "S");
-  butt[9]->callback(status_options_cb, (void *)"S");
-  butt[9]->tooltip("Toggle mouse selection ON/OFF (Escape)");
+  _butt[9] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "S");
+  _butt[9]->callback(status_options_cb, (void *)"S");
+  _butt[9]->tooltip("Toggle mouse selection ON/OFF (Escape)");
   x += sw;
-  butt[6] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_rewind");
-  butt[6]->callback(status_rewind_cb);
-  butt[6]->tooltip("Rewind animation");
-  butt[6]->deactivate();
+  _butt[6] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_rewind");
+  _butt[6]->callback(status_rewind_cb);
+  _butt[6]->tooltip("Rewind animation");
+  _butt[6]->deactivate();
   x += sw;
-  butt[10] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_back");
-  butt[10]->callback(status_stepbackward_cb);
-  butt[10]->tooltip("Step backward");
-  butt[10]->deactivate();
+  _butt[10] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_back");
+  _butt[10]->callback(status_stepbackward_cb);
+  _butt[10]->tooltip("Step backward");
+  _butt[10]->deactivate();
   x += sw;
-  butt[7] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_play");
-  butt[7]->callback(status_play_cb);
-  butt[7]->tooltip("Play/pause animation");
-  butt[7]->deactivate();
+  _butt[7] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_play");
+  _butt[7]->callback(status_play_cb);
+  _butt[7]->tooltip("Play/pause animation");
+  _butt[7]->deactivate();
   x += sw;
-  butt[11] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_forward");
-  butt[11]->callback(status_stepforward_cb);
-  butt[11]->tooltip("Step forward");
-  butt[11]->deactivate();
+  _butt[11] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_forward");
+  _butt[11]->callback(status_stepforward_cb);
+  _butt[11]->tooltip("Step forward");
+  _butt[11]->deactivate();
   x += sw;
 
   for(int i = 0; i < 14; i++) {
-    butt[i]->box(FL_FLAT_BOX);
-    butt[i]->selection_color(FL_WHITE);
-    butt[i]->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
+    _butt[i]->box(FL_FLAT_BOX);
+    _butt[i]->selection_color(FL_WHITE);
+    _butt[i]->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   }
 
   x += 2;
-  label = new Fl_Progress(x, mh + glheight + mheight + 2, width - x, sht);
-  label->box(FL_THIN_DOWN_BOX);
-  label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
-  label->color(FL_BACKGROUND_COLOR, FL_DARK2); // FL_DARK_GREEN
+  _label = new Fl_Progress(x, mh + glheight + mheight + 2, width - x, sht);
+  _label->box(FL_THIN_DOWN_BOX);
+  _label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
+  _label->color(FL_BACKGROUND_COLOR, FL_DARK2); // FL_DARK_GREEN
 
   // dummy resizable box
   dummyBox *resbox = new dummyBox(x, mh, width - x, glheight);
-  win->resizable(resbox);
+  _win->resizable(resbox);
 
   // set mininum window size
-  minWidth = x;
-  minHeight = 100;
-  win->size_range(minWidth, minHeight);
+  _minWidth = x;
+  _minHeight = 100;
+  _win->size_range(_minWidth, _minHeight);
 
   // tiled windows (tree menu, opengl, messages)
-  tile = new Fl_Tile(0, mh, glwidth + twidth, glheight + mheight);
+  _tile = new Fl_Tile(0, mh, glwidth + twidth, glheight + mheight);
 
   int w2 = glwidth / 2, h2 = glheight / 2;
   if(numTiles == 2){
@@ -2876,178 +2878,178 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   for(unsigned int i = 0; i < gl.size(); i++) gl[i]->mode(mode);
 
   if(main){
-    browser = new Fl_Browser(twidth, mh + glheight, glwidth, mheight);
-    browser->box(FL_THIN_DOWN_BOX);
-    browser->textfont(FL_COURIER);
-    browser->textsize(FL_NORMAL_SIZE - 1);
-    browser->type(FL_MULTI_BROWSER);
-    browser->callback(message_browser_cb, this);
-    browser->scrollbar_size(std::max(10, FL_NORMAL_SIZE - 2)); // thinner scrollbars
+    _browser = new Fl_Browser(twidth, mh + glheight, glwidth, mheight);
+    _browser->box(FL_THIN_DOWN_BOX);
+    _browser->textfont(FL_COURIER);
+    _browser->textsize(FL_NORMAL_SIZE - 1);
+    _browser->type(FL_MULTI_BROWSER);
+    _browser->callback(message_browser_cb, this);
+    _browser->scrollbar_size(std::max(10, FL_NORMAL_SIZE - 2)); // thinner scrollbars
   }
   else{
-    browser = 0;
+    _browser = 0;
   }
 
   if(main && !detachedMenu){
-    onelab = new onelabGroup(0, mh, twidth, height - mh - sh);
+    _onelab = new onelabGroup(0, mh, twidth, height - mh - sh);
   }
   else{
-    onelab = 0;
+    _onelab = 0;
   }
 
-  tile->end();
+  _tile->end();
 
   // resize the tiles to match the prescribed sizes
-  tile->position(0, mh + glheight, 0, mh + CTX::instance()->glSize[1]);
+  _tile->position(0, mh + glheight, 0, mh + CTX::instance()->glSize[1]);
   _savedMessageHeight = CTX::instance()->msgSize;
 
   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);
+  _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();
+  _win->position(CTX::instance()->glPosition[0], CTX::instance()->glPosition[1]);
+  _win->end();
 
   if(main && detachedMenu){
-    menuwin = new mainWindow
+    _menuwin = new mainWindow
       (CTX::instance()->menuSize[0], CTX::instance()->menuSize[1],
        CTX::instance()->nonModalWindows ? true : false, "Gmsh");
-    menuwin->callback(file_quit_cb);
-    menuwin->box(GMSH_WINDOW_BOX);
-    onelab = new onelabGroup(0, 0, menuwin->w(), menuwin->h());
-    menuwin->position(CTX::instance()->menuPosition[0],
-                      CTX::instance()->menuPosition[1]);
-    menuwin->resizable(onelab);
-    menuwin->size_range(onelab->getMinWindowWidth(), onelab->getMinWindowHeight());
-    menuwin->end();
+    _menuwin->callback(file_quit_cb);
+    _menuwin->box(GMSH_WINDOW_BOX);
+    _onelab = new onelabGroup(0, 0, _menuwin->w(), _menuwin->h());
+    _menuwin->position(CTX::instance()->menuPosition[0],
+                       CTX::instance()->menuPosition[1]);
+    _menuwin->resizable(_onelab);
+    _menuwin->size_range(_onelab->getMinWindowWidth(), _onelab->getMinWindowHeight());
+    _menuwin->end();
   }
   else{
-    menuwin = 0;
+    _menuwin = 0;
   }
 }
 
 graphicWindow::~graphicWindow()
 {
   openglWindow::setLastHandled(0);
-  tile->clear();
-  win->clear();
-  Fl::delete_widget(win);
+  _tile->clear();
+  _win->clear();
+  Fl::delete_widget(_win);
 }
 
 void graphicWindow::setTitle(std::string str)
 {
   _title = str;
-  win->label(_title.c_str());
+  _win->label(_title.c_str());
 }
 
 void graphicWindow::detachMenu()
 {
-  if(menuwin || !onelab || !browser) return;
-  if(browser->h() == 0) resizeMessages(1);
-  int w = onelab->w();
-  tile->remove(onelab);
-  browser->resize(0, browser->y(), browser->w() + w, browser->h());
+  if(_menuwin || !_onelab || !_browser) return;
+  if(_browser->h() == 0) resizeMessages(1);
+  int w = _onelab->w();
+  _tile->remove(_onelab);
+  _browser->resize(0, _browser->y(), _browser->w() + w, _browser->h());
   for(unsigned int i = 0; i < gl.size(); i++){
     if(gl[i]->x() == w)
       gl[i]->resize(0, gl[i]->y(), gl[i]->w() + w, gl[i]->h());
   }
-  tile->redraw();
+  _tile->redraw();
 
-  menuwin = new mainWindow
+  _menuwin = new mainWindow
     (CTX::instance()->menuSize[0], CTX::instance()->menuSize[1],
      CTX::instance()->nonModalWindows ? true : false, "Gmsh");
-  menuwin->callback(file_quit_cb);
-  menuwin->box(GMSH_WINDOW_BOX);
-  menuwin->add(onelab);
-  onelab->resize(0, 0, menuwin->w(), menuwin->h());
-  menuwin->position(CTX::instance()->menuPosition[0],
-                    CTX::instance()->menuPosition[1]);
-  menuwin->resizable(onelab);
-  menuwin->size_range(onelab->getMinWindowWidth(), onelab->getMinWindowHeight());
-  menuwin->end();
-  menuwin->show();
+  _menuwin->callback(file_quit_cb);
+  _menuwin->box(GMSH_WINDOW_BOX);
+  _menuwin->add(_onelab);
+  _onelab->resize(0, 0, _menuwin->w(), _menuwin->h());
+  _menuwin->position(CTX::instance()->menuPosition[0],
+                     CTX::instance()->menuPosition[1]);
+  _menuwin->resizable(_onelab);
+  _menuwin->size_range(_onelab->getMinWindowWidth(), _onelab->getMinWindowHeight());
+  _menuwin->end();
+  _menuwin->show();
 }
 
 void graphicWindow::attachMenu()
 {
-  if(!menuwin || !onelab || !browser) return;
-  menuwin->remove(onelab);
-  menuwin->hide();
-  delete menuwin;
-  menuwin = 0;
-  if(browser->h() == 0) resizeMessages(1);
-  int w = onelab->w();
-  if(browser->w() - w < 0) w = browser->w() / 2;
-  browser->resize(w, browser->y(), browser->w() - w, browser->h());
+  if(!_menuwin || !_onelab || !_browser) return;
+  _menuwin->remove(_onelab);
+  _menuwin->hide();
+  delete _menuwin;
+  _menuwin = 0;
+  if(_browser->h() == 0) resizeMessages(1);
+  int w = _onelab->w();
+  if(_browser->w() - w < 0) w = _browser->w() / 2;
+  _browser->resize(w, _browser->y(), _browser->w() - w, _browser->h());
   for(unsigned int i = 0; i < gl.size(); i++){
     if(gl[i]->x() == 0)
       gl[i]->resize(w, gl[i]->y(), gl[i]->w() - w, gl[i]->h());
   }
-  tile->add(onelab);
-  onelab->resize(tile->x(), tile->y(), w, tile->h());
-  tile->redraw();
+  _tile->add(_onelab);
+  _onelab->resize(_tile->x(), _tile->y(), w, _tile->h());
+  _tile->redraw();
 }
 
 void graphicWindow::attachDetachMenu()
 {
-  if(menuwin) attachMenu();
+  if(_menuwin) attachMenu();
   else detachMenu();
 }
 
 void graphicWindow::showMenu()
 {
-  if(menuwin || !onelab || !win->shown()) return;
-  if(onelab->w() < 5){
+  if(_menuwin || !_onelab || !_win->shown()) return;
+  if(_onelab->w() < 5){
     int width = _savedMenuWidth;
-    if(width < 5) width = onelab->getMinWindowWidth();
-    int maxw = win->w();
+    if(width < 5) width = _onelab->getMinWindowWidth();
+    int maxw = _win->w();
     if(width > maxw) width = maxw / 2;
-    resizeMenu(width - onelab->w());
+    resizeMenu(width - _onelab->w());
   }
 }
 
 void graphicWindow::hideMenu()
 {
-  if(menuwin || !onelab) return;
-  _savedMenuWidth = onelab->w();
-  resizeMenu(-onelab->w());
+  if(_menuwin || !_onelab) return;
+  _savedMenuWidth = _onelab->w();
+  resizeMenu(-_onelab->w());
 }
 
 void graphicWindow::showHideMenu()
 {
-  if(menuwin || !onelab) return;
-  if(onelab->w() < 5) showMenu();
+  if(_menuwin || !_onelab) return;
+  if(_onelab->w() < 5) showMenu();
   else hideMenu();
 }
 
 int graphicWindow::getMenuWidth()
 {
-  if(!onelab) return 0;
-  return onelab->w();
+  if(!_onelab) return 0;
+  return _onelab->w();
 }
 
 int graphicWindow::getMenuHeight()
 {
-  if(!menuwin) return 0;
-  return menuwin->h();
+  if(!_menuwin) return 0;
+  return _menuwin->h();
 }
 
 int graphicWindow::getMenuPositionX()
 {
-  if(!menuwin) return 0;
-  return menuwin->x();
+  if(!_menuwin) return 0;
+  return _menuwin->x();
 }
 
 int graphicWindow::getMenuPositionY()
 {
-  if(!menuwin) return 0;
-  return menuwin->y();
+  if(!_menuwin) return 0;
+  return _menuwin->y();
 }
 
-void graphicWindow::split(openglWindow *g, char how)
+bool graphicWindow::split(openglWindow *g, char how)
 {
-  if(tile->find(g) == tile->children()) return;
+  if(_tile->find(g) == _tile->children()) return false; // not found
 
   if(how == 'u'){
     // after many tries I cannot figure out how to do this cleanly, so let's be
@@ -3055,24 +3057,24 @@ void graphicWindow::split(openglWindow *g, char how)
     int mode = g->mode();
     openglWindow::setLastHandled(0);
     for(unsigned int i = 0; i < gl.size(); i++){
-      tile->remove(gl[i]);
+      _tile->remove(gl[i]);
       delete gl[i];
     }
     gl.clear();
     openglWindow *g2 = new openglWindow
-      (tile->x() + (onelab && !menuwin ? onelab->w() : 0),
-       tile->y(),
-       tile->w() - (onelab && !menuwin ? onelab->w() : 0),
-       tile->h() - (browser ? browser->h() : 0));
+      (_tile->x() + (_onelab && !_menuwin ? _onelab->w() : 0),
+       _tile->y(),
+       _tile->w() - (_onelab && !_menuwin ? _onelab->w() : 0),
+       _tile->h() - (_browser ? _browser->h() : 0));
     g2->end();
     g2->mode(mode);
     gl.push_back(g2);
-    tile->add(g2);
+    _tile->add(g2);
     g2->show();
   }
   else{
     // make sure browser is not zero-size when adding children
-    if(browser && browser->h() == 0) resizeMessages(1);
+    if(_browser && _browser->h() == 0) resizeMessages(1);
     int x1 = g->x();
     int y1 = g->y();
     int w1 = (how == 'h') ? g->w() / 2 : g->w();
@@ -3088,23 +3090,45 @@ void graphicWindow::split(openglWindow *g, char how)
     g2->mode(g->mode());
 
     gl.push_back(g2);
-    tile->add(g2);
+    _tile->add(g2);
     g2->show();
 
     g->resize(x1, y1, w1, h1);
     g2->resize(x2, y2, w2, h2);
   }
+  return true;
+}
+
+void graphicWindow::setStereo()
+{
+  openglWindow::setLastHandled(0);
+  for(unsigned int i = 0; i < gl.size(); i++){
+    _tile->remove(gl[i]);
+    delete gl[i];
+  }
+  gl.clear();
+  openglWindow *g2 = new openglWindow
+    (_tile->x() + (_onelab && !_menuwin ? _onelab->w() : 0),
+     _tile->y(),
+     _tile->w() - (_onelab && !_menuwin ? _onelab->w() : 0),
+     _tile->h() - (_browser ? _browser->h() : 0));
+  g2->mode(FL_RGB | FL_DEPTH | FL_DOUBLE | FL_STEREO);
+  g2->end();
+  gl.push_back(g2);
+  _tile->add(g2);
+  g2->show();
+  Msg::Info("new gl window for stereo vision!");
 }
 
 void graphicWindow::setAnimButtons(int mode)
 {
   if(mode) {
-    butt[7]->callback(status_play_cb);
-    butt[7]->label("@-1gmsh_play");
+    _butt[7]->callback(status_play_cb);
+    _butt[7]->label("@-1gmsh_play");
   }
   else {
-    butt[7]->callback(status_pause_cb);
-    butt[7]->label("@-1gmsh_pause");
+    _butt[7]->callback(status_pause_cb);
+    _butt[7]->label("@-1gmsh_pause");
   }
 }
 
@@ -3123,105 +3147,122 @@ void graphicWindow::checkAnimButtons()
     }
   }
   if(play){
-    butt[6]->activate();
-    butt[7]->activate();
-    butt[10]->activate();
-    butt[11]->activate();
+    _butt[6]->activate();
+    _butt[7]->activate();
+    _butt[10]->activate();
+    _butt[11]->activate();
   }
   else{
-    butt[6]->deactivate();
-    butt[7]->deactivate();
-    butt[10]->deactivate();
-    butt[11]->deactivate();
+    _butt[6]->deactivate();
+    _butt[7]->deactivate();
+    _butt[10]->deactivate();
+    _butt[11]->deactivate();
   }
 }
 
 void graphicWindow::resizeMenu(int dh)
 {
-  if(menuwin || !onelab) return;
+  if(_menuwin || !_onelab) return;
   for(unsigned int i = 0; i < gl.size(); i++){
-    if(gl[i]->x() == onelab->x() + onelab->w())
+    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());
   }
-  onelab->resize(onelab->x(), onelab->y(), onelab->w() + dh, onelab->h());
-  onelab->redraw();
+  _onelab->resize(_onelab->x(), _onelab->y(), _onelab->w() + dh, _onelab->h());
+  _onelab->redraw();
 }
 
 int graphicWindow::getGlHeight()
 {
-  int h = win->h() - bottom->h(); // yes, ignore message browser
-  if(bar) h -= bar->h();
+  int h = _win->h() - _bottom->h(); // yes, ignore message browser
+  if(_bar) h -= _bar->h();
   return h;
 }
 
 int graphicWindow::getGlWidth()
 {
-  return win->w();
+  return _win->w();
+}
+
+void graphicWindow::setGlWidth(int w)
+{
+  _win->size(w, _win->h());
+  // 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(), h);
+  // workaround resizing bug on Mac
+  _win->size_range(_minWidth, _minHeight);
 }
 
 void graphicWindow::resizeMessages(int dh)
 {
-  if(!browser) return;
+  if(!_browser) return;
   for(unsigned int i = 0; i < gl.size(); i++){
-    if(gl[i]->y() + gl[i]->h() == browser->y())
+    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();
+  _browser->resize(_browser->x(), _browser->y() - dh,
+                   _browser->w(), _browser->h() + dh);
+  _browser->redraw();
 }
 
 void graphicWindow::showMessages()
 {
-  if(!browser || !win->shown()) return;
-  if(browser->h() < 5){
+  if(!_browser || !_win->shown()) return;
+  if(_browser->h() < 5){
     int height = _savedMessageHeight;
     if(height < 5) height = 50;
-    int maxh = win->h() - bottom->h();
+    int maxh = _win->h() - _bottom->h();
     if(height > maxh) height = maxh / 2;
-    resizeMessages(height - browser->h());
+    resizeMessages(height - _browser->h());
   }
   if(_autoScrollMessages)
-    browser->bottomline(browser->size());
+    _browser->bottomline(_browser->size());
 }
 
 void graphicWindow::hideMessages()
 {
-  if(!browser) return;
-  _savedMessageHeight = browser->h();
-  resizeMessages(-browser->h());
+  if(!_browser) return;
+  _savedMessageHeight = _browser->h();
+  resizeMessages(-_browser->h());
 }
 
 void graphicWindow::showHideMessages()
 {
-  if(!browser) return;
-  if(browser->h() < 5) showMessages();
+  if(!_browser) return;
+  if(_browser->h() < 5) showMessages();
   else hideMessages();
 }
 
 int graphicWindow::getMessageHeight()
 {
-  if(!browser) return 0;
-  if(!browser->h()) return _savedMessageHeight;
-  return browser->h();
+  if(!_browser) return 0;
+  if(!_browser->h()) return _savedMessageHeight;
+  return _browser->h();
 }
 
 void graphicWindow::addMessage(const char *msg)
 {
-  if(!browser) return;
-  browser->add(msg, 0);
-  if(_autoScrollMessages && win->shown() && browser->h() >= 10)
-    browser->bottomline(browser->size());
+  if(!_browser) return;
+  _browser->add(msg, 0);
+  if(_autoScrollMessages && _win->shown() && _browser->h() >= 10)
+    _browser->bottomline(_browser->size());
 }
 
 void graphicWindow::clearMessages()
 {
-  if(!browser) return;
-  browser->clear();
+  if(!_browser) return;
+  _browser->clear();
 }
 
 void graphicWindow::saveMessages(const char *filename)
 {
-  if(!browser) return;
+  if(!_browser) return;
 
   FILE *fp = fopen(filename, "w");
 
@@ -3231,8 +3272,8 @@ void graphicWindow::saveMessages(const char *filename)
   }
 
   Msg::StatusBar(true, "Writing '%s'...", filename);
-  for(int i = 1; i <= browser->size(); i++) {
-    const char *c = browser->text(i);
+  for(int i = 1; i <= _browser->size(); i++) {
+    const char *c = _browser->text(i);
     if(c[0] == '@')
       fprintf(fp, "%s\n", &c[5]);
     else
@@ -3244,12 +3285,12 @@ void graphicWindow::saveMessages(const char *filename)
 
 void graphicWindow::copySelectedMessagesToClipboard()
 {
-  if(!browser) return;
+  if(!_browser) return;
 
   std::string buff;
-  for(int i = 1; i <= browser->size(); i++) {
-    if(browser->selected(i)) {
-      const char *c = browser->text(i);
+  for(int i = 1; i <= _browser->size(); i++) {
+    if(_browser->selected(i)) {
+      const char *c = _browser->text(i);
       if(strlen(c) > 5 && c[0] == '@')
         buff += std::string(&c[5]);
       else
@@ -3265,7 +3306,7 @@ void graphicWindow::copySelectedMessagesToClipboard()
 void graphicWindow::fillRecentHistoryMenu()
 {
 #if defined(__APPLE__)
-  if(CTX::instance()->systemMenuBar && !sysbar)
+  if(CTX::instance()->systemMenuBar && !_sysbar)
     return;
 #endif
 
@@ -3282,7 +3323,7 @@ void graphicWindow::fillRecentHistoryMenu()
 
 #if defined(__APPLE__)
   if(CTX::instance()->systemMenuBar)
-    sysbar->menu(table);
+    _sysbar->menu(table);
 #endif
 }
 
diff --git a/Fltk/graphicWindow.h b/Fltk/graphicWindow.h
index 397e9f8acdae76ae0af22509ae128c519c60b706..38e7223d3dcbe957c920b57822f5910a41bfa57c 100644
--- a/Fltk/graphicWindow.h
+++ b/Fltk/graphicWindow.h
@@ -26,33 +26,43 @@ class graphicWindow{
   std::string _title;
   int _savedMessageHeight, _savedMenuWidth;
   bool _autoScrollMessages;
- public:
-  Fl_Window *win, *menuwin;
 #if defined(__APPLE__)
-  Fl_Sys_Menu_Bar *sysbar;
+  Fl_Sys_Menu_Bar *_sysbar;
 #endif
-  Fl_Menu_Bar *bar;
-  Fl_Tile *tile;
+  Fl_Menu_Bar *_bar;
+  Fl_Tile *_tile;
+  Fl_Window *_win, *_menuwin;
+  Fl_Browser *_browser;
+  onelabGroup *_onelab;
+  Fl_Box *_bottom;
+  Fl_Button *_butt[14];
+  Fl_Progress *_label;
+  int _minWidth, _minHeight;
+ public:
   std::vector<openglWindow*> gl;
-  Fl_Browser *browser;
-  onelabGroup *onelab;
-  Fl_Box *bottom;
-  Fl_Button *butt[14];
-  Fl_Progress *label;
-  int minWidth, minHeight;
  public:
   graphicWindow(bool main=true, int numTiles=1, bool detachedMenu=false);
   ~graphicWindow();
+  Fl_Window *getWindow(){ return _win; }
+  Fl_Window *getMenuWindow(){ return _menuwin; }
+  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 setStereo();
   void resizeMenu(int dh);
   void showMenu();
   void hideMenu();
   void showHideMenu();
-  bool isMenuDetached(){ return menuwin ? true : false; }
+  bool isMenuDetached(){ return _menuwin ? true : false; }
   int getMenuWidth();
   int getMenuHeight();
   int getMenuPositionX();
@@ -60,7 +70,7 @@ class graphicWindow{
   void detachMenu();
   void attachMenu();
   void attachDetachMenu();
-  void split(openglWindow *g, char how);
+  bool split(openglWindow *g, char how);
   void setAnimButtons(int mode);
   void checkAnimButtons();
   void resizeMessages(int dh);
diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp
index 2891c98ab5bd1c88c6d2c12ae8e3f69371007a0e..cddfa04bcf7e63a9b2e7258502293d67d7a433b3 100644
--- a/Fltk/optionWindow.cpp
+++ b/Fltk/optionWindow.cpp
@@ -338,22 +338,9 @@ static void general_options_ok_cb(Fl_Widget *w, void *data)
   opt_general_camera_mode(0, GMSH_SET, o->general.butt[18]->value());
   if(opt_general_stereo_mode(0, GMSH_GET, 0) != o->general.butt[17]->value()) {
     opt_general_stereo_mode(0, GMSH_SET, o->general.butt[17]->value());
-    // beginning of test to re-allocate gl for stereo: inspired from
-    // "split" method
     if (CTX::instance()->stereo){
-      openglWindow::setLastHandled(0);
-      for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++){
-	graphicWindow * graph = FlGui::instance()->graph[i];
-	graph->tile->clear();
-	graph->gl.clear();
-	openglWindow* stereo_gl = new openglWindow(0, 0, graph->tile->w(), graph->tile->h());
-	stereo_gl->mode(FL_RGB | FL_DEPTH | FL_DOUBLE | FL_STEREO);
-	stereo_gl->end();
-	graph->gl.push_back(stereo_gl);
-	graph->tile->add(stereo_gl);
-	stereo_gl->show();
-        Msg::Info("new gl windows for stereo vision!");
-      }
+      for(unsigned int i = 0; i < FlGui::instance()->graph.size(); i++)
+	FlGui::instance()->graph[i]->setStereo();
     }
   }