diff --git a/Common/onelabUtils.cpp b/Common/onelabUtils.cpp
index 258bf1107cc62911171a986a11fbc563f94e7f75..d523329737581339918ac032ae53788d5c47d83c 100644
--- a/Common/onelabUtils.cpp
+++ b/Common/onelabUtils.cpp
@@ -69,6 +69,7 @@ namespace onelabUtils {
       }
       onelab::string o("Gmsh/MshFileName", name, "Mesh name");
       o.setKind("file");
+      o.setAttribute("Closed", "1");
       c->set(o);
     }
 
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index bba3388beba1226c21ca198c93434178b8d832e9..07073ad314206cdcac48a12cef40f5b2ce48f92d 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -730,17 +730,33 @@ static void onelab_subtree_cb(Fl_Widget *w, void *data)
   FlGui::instance()->onelab->redrawTree();
 }
 
+void onelabGroup::_computeWidths()
+{
+  _baseWidth = (int)(0.9 * _tree->w() - _tree->marginleft());
+  _connWidth = (int)(_tree->connectorwidth() / 2.);
+}
+
+#if !defined(__APPLE__)
+#define gear_width 16
+#define gear_height 16
+static unsigned char gear_bits[] = {
+   0x80, 0x01, 0x80, 0x01, 0x8c, 0x31, 0xfc, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f,
+   0x38, 0x1c, 0x3f, 0xfc, 0x3f, 0xfc, 0x38, 0x1c, 0xf8, 0x1f, 0xf8, 0x1f,
+   0xfc, 0x3f, 0x8c, 0x31, 0x80, 0x01, 0x80, 0x01 };
+#endif
+
 onelabGroup::onelabGroup(int x, int y, int w, int h, const char *l)
   : Fl_Group(x,y,w,h,l), _stop(false)
 {
   _tree = new Fl_Tree(x, y, w, h - BH - 2 * WB);
   _tree->callback(onelab_tree_cb);
   _tree->connectorstyle(FL_TREE_CONNECTOR_SOLID);
+  //_tree->connectorwidth(100);
   _tree->showroot(0);
   _tree->box(FL_FLAT_BOX);
   _tree->scrollbar_size(std::max(10, FL_NORMAL_SIZE - 2));
 
-  _itemWidth = (int)(0.4 * _tree->w());
+  _computeWidths();
 
   box(FL_FLAT_BOX);
   color(_tree->color());
@@ -753,8 +769,12 @@ onelabGroup::onelabGroup(int x, int y, int w, int h, const char *l)
   _butt[1] = new Fl_Button(x + w - 2 * WB - 2 * BB2, y + h - WB - BH, BB2, BH, "Run");
   _butt[1]->callback(onelab_cb, (void*)"compute");
 
-  _gear = new Fl_Menu_Button
-    (x + w - WB - BB2, y + h - WB - BH, BB2, BH, "@-1gmsh_gear");
+  _gear = new Fl_Menu_Button(x + w - WB - BB2, y + h - WB - BH, BB2, BH);
+#if defined(__APPLE__)
+  _gear->label("@-1gmsh_gear");
+#else
+  _gear->image(new Fl_Bitmap(gear_bits, gear_width, gear_height));
+#endif
   _gear->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   _gear->add("Reset database", 0, onelab_cb, (void*)"reset");
   _gear->add("Save database...", 0, onelab_cb, (void*)"save");
@@ -826,7 +846,6 @@ void onelabGroup::_addParameter(T &p)
   Fl_Color c;
   if(getFlColor(p.getAttribute("Highlight"), c)) highlight = true;
   Fl_Tree_Item *n = _tree->add(p.getName().c_str());
-  n->labelsize(FL_NORMAL_SIZE + 5);
   _tree->begin();
   Fl_Widget *widget = _addParameterWidget(p, n, highlight, c);
   _treeWidgets.push_back(widget);
@@ -838,11 +857,14 @@ void onelabGroup::_addParameter(T &p)
 void onelabGroup::_addMenu(const std::string &path, Fl_Callback *callback, void *data)
 {
   Fl_Tree_Item *n = _tree->add(path.c_str());
-  n->labelsize(FL_NORMAL_SIZE + 5);
   _tree->begin();
-  Fl_Button *but = new Fl_Button(1, 1, (3 * _itemWidth) / 2, 1);
-  but->align(FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
+  Fl_Button *but = new Fl_Button(1, 1, ww, 1);
+  but->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   but->callback(callback, data);
+  but->box(FL_FLAT_BOX);
+  but->color(_tree->color());
+  but->selection_color(_tree->color());
   _treeWidgets.push_back(but);
   std::string label = path;
   std::string::size_type last = path.find_last_of('/');
@@ -857,9 +879,9 @@ void onelabGroup::_addViewMenu(int num)
   std::ostringstream path;
   path << "0Gmsh modules/Post-processing/View" << num;
   Fl_Tree_Item *n = _tree->add(path.str().c_str());
-  n->labelsize(FL_NORMAL_SIZE + 5);
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
   _tree->begin();
-  viewButton *but = new viewButton(1, 1, (7 * _itemWidth) / 4, 1, num);
+  viewButton *but = new viewButton(1, 1, ww, 1, num, _tree->color());
   _treeWidgets.push_back(but);
   n->widget(but);
   _tree->end();
@@ -946,9 +968,13 @@ static void onelab_number_input_range_cb(Fl_Widget *w, void *data)
 Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, Fl_Tree_Item *n,
                                             bool highlight, Fl_Color c)
 {
+  n->labelsize(FL_NORMAL_SIZE + 5);
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
+  ww /= 2;
+
   // non-editable value
   if(p.getReadOnly()){
-    Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1);
+    Fl_Output *but = new Fl_Output(1, 1, ww, 1);
     char tmp[128];
     sprintf(tmp, "%g", p.getValue());
     but->value(tmp);
@@ -960,7 +986,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, Fl_Tree_Item *n,
   // enumeration (display choices as value labels, not numbers)
   if(p.getChoices().size() &&
      p.getChoices().size() == p.getValueLabels().size()){
-    Fl_Choice *but = new Fl_Choice(1, 1, _itemWidth, 1);
+    Fl_Choice *but = new Fl_Choice(1, 1, ww, 1);
     std::vector<Fl_Menu_Item> menu;
     std::map<double, std::string> labels(p.getValueLabels());
     for(std::map<double, std::string>::iterator it = labels.begin();
@@ -988,7 +1014,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, Fl_Tree_Item *n,
   // check box (boolean choice)
   if(p.getChoices().size() == 2 &&
      p.getChoices()[0] == 0 && p.getChoices()[1] == 1){
-    Fl_Check_Button *but = new Fl_Check_Button(1, 1, _itemWidth, 1);
+    Fl_Check_Button *but = new Fl_Check_Button(1, 1, 2 * ww, 1);
     but->value(p.getValue());
     but->callback(onelab_number_check_button_cb, (void*)n);
     if(highlight) n->labelbgcolor(c);
@@ -996,8 +1022,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, Fl_Tree_Item *n,
   }
 
   // general number input
-  inputRange *but = new inputRange
-    (1, 1, _itemWidth, 1, onelab::parameter::maxNumber());
+  inputRange *but = new inputRange(1, 1, ww, 1, onelab::parameter::maxNumber());
   but->value(p.getValue());
   but->minimum(p.getMin());
   but->maximum(p.getMax());
@@ -1019,8 +1044,11 @@ static void onelab_string_button_cb(Fl_Widget *w, void *data)
   std::vector<onelab::string> strings;
   onelab::server::instance()->get(strings, name);
   if(strings.size()){
-    MergeFile(strings[0].getValue());
+    std::string tmp = FixRelativePath(GModel::current()->getFileName(),
+                                      strings[0].getValue());
+    MergeFile(tmp);
     autoCheck(strings[0], strings[0], true);
+    drawContext::global()->draw();
   }
 }
 
@@ -1067,18 +1095,26 @@ static void onelab_input_choice_file_merge_cb(Fl_Widget *w, void *data)
 Fl_Widget *onelabGroup::_addParameterWidget(onelab::string &p, Fl_Tree_Item *n,
                                             bool highlight, Fl_Color c)
 {
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
+
   // macro button
   if(p.getAttribute("Macro") == "Gmsh"){
-    Fl_Button *but = new Fl_Button(1, 1, (3 * _itemWidth) / 2, 1);
-    but->align(FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
+    Fl_Button *but = new Fl_Button(1, 1, ww, 1);
+    but->box(FL_FLAT_BOX);
+    but->color(_tree->color());
+    but->selection_color(_tree->color());
+    but->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
     but->callback(onelab_string_button_cb, (void*)n);
     if(highlight) but->color(c);
     return but;
   }
 
+  ww /= 2;
+  n->labelsize(FL_NORMAL_SIZE + 5);
+
   // non-editable value
   if(p.getReadOnly()){
-    Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1);
+    Fl_Output *but = new Fl_Output(1, 1, ww, 1);
     but->value(p.getValue().c_str());
     but->align(FL_ALIGN_RIGHT);
     if(highlight) but->color(c);
@@ -1086,7 +1122,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::string &p, Fl_Tree_Item *n,
   }
 
   // general string input
-  Fl_Input_Choice *but = new Fl_Input_Choice(1, 1, _itemWidth, 1);
+  Fl_Input_Choice *but = new Fl_Input_Choice(1, 1, ww, 1);
   std::vector<Fl_Menu_Item> menu;
   for(unsigned int j = 0; j < p.getChoices().size(); j++){
     char *str = strdup(p.getChoices()[j].c_str());
@@ -1135,16 +1171,19 @@ static void onelab_region_input_cb(Fl_Widget *w, void *data)
 Fl_Widget *onelabGroup::_addParameterWidget(onelab::region &p, Fl_Tree_Item *n,
                                             bool highlight, Fl_Color c)
 {
+  n->labelsize(FL_NORMAL_SIZE + 5);
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
+
   // non-editable value
   if(p.getReadOnly()){
-    inputRegion *but = new inputRegion(1, 1, _itemWidth, 1, true);
+    inputRegion *but = new inputRegion(1, 1, ww, 1, true);
     but->value(p.getValue());
     but->align(FL_ALIGN_RIGHT);
     if(highlight) but->color(c);
     return but;
   }
 
-  inputRegion *but = new inputRegion(1, 1, _itemWidth, 1, false);
+  inputRegion *but = new inputRegion(1, 1, ww, 1, false);
   but->value(p.getValue());
   but->align(FL_ALIGN_RIGHT);
   but->callback(onelab_region_input_cb, (void*)n);
@@ -1155,9 +1194,12 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::region &p, Fl_Tree_Item *n,
 Fl_Widget *onelabGroup::_addParameterWidget(onelab::function &p, Fl_Tree_Item *n,
                                             bool highlight, Fl_Color c)
 {
+  n->labelsize(FL_NORMAL_SIZE + 5);
+  int ww = _baseWidth - (n->depth()+1) * _connWidth;
+
   // non-editable value
   if(1 || p.getReadOnly()){
-    Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1);
+    Fl_Output *but = new Fl_Output(1, 1, ww, 1);
     but->value("TODO function");
     but->align(FL_ALIGN_RIGHT);
     if(highlight) but->color(c);
@@ -1167,7 +1209,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::function &p, Fl_Tree_Item *n
 
 void onelabGroup::rebuildTree()
 {
-  _itemWidth = (int)(0.4 * _tree->w());
+  _computeWidths();
 
   std::set<std::string> closed = _getClosedGmshMenus();
 
@@ -1222,8 +1264,9 @@ void onelabGroup::rebuildTree()
 
   for(Fl_Tree_Item *n = _tree->first(); n; n = n->next()){
     if(n->has_children()){
+      int ww = _baseWidth - (n->depth()+1) * _connWidth;
       _tree->begin();
-      Fl_Button *but = new Fl_Button(1, 1, _itemWidth, 1);
+      Fl_Button *but = new Fl_Button(1, 1, ww, 1);
       but->box(FL_NO_BOX);
       but->clear_visible_focus();
       but->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
diff --git a/Fltk/onelabGroup.h b/Fltk/onelabGroup.h
index 462726af4c2e2f772d017cff35b3a48812112adc..f1c2e081aacc45b174b99bbb87dbdb5700717ad0 100644
--- a/Fltk/onelabGroup.h
+++ b/Fltk/onelabGroup.h
@@ -26,8 +26,9 @@ class onelabGroup : public Fl_Group{
   std::vector<char*> _treeStrings;
   std::string _title;
   bool _stop;
-  int _itemWidth;
+  int _baseWidth, _connWidth;
   std::set<std::string> _manuallyClosed;
+  void _computeWidths();
   template <class T> void _addParameter(T &p);
   Fl_Widget *_addParameterWidget(onelab::number &p, Fl_Tree_Item *n,
                                  bool highlight, Fl_Color c);
diff --git a/Fltk/viewButton.cpp b/Fltk/viewButton.cpp
index d4eca9a4e430a7a3cc55047c49174c9dca665ed4..c5314f7d9fe220e5d4c9d3ba008dd690c4c3d299 100644
--- a/Fltk/viewButton.cpp
+++ b/Fltk/viewButton.cpp
@@ -254,16 +254,18 @@ static void view_applybgmesh_cb(Fl_Widget *w, void *data)
     GModel::current()->getFields()->setBackgroundMesh(index);
 }
 
-viewButton::viewButton(int x, int y, int w, int h, int num)
+viewButton::viewButton(int x, int y, int w, int h, int num, Fl_Color col)
   : Fl_Group(x,y,w,h)
 {
-  int popw = 4 * FL_NORMAL_SIZE + 3;
+  int popw = 4 * FL_NORMAL_SIZE;
 
   PView *view = PView::list[num];
   PViewData *data = view->getData();
   PViewOptions *opt = view->getOptions();
 
-  _toggle = new Fl_Light_Button(x, y, w - popw, h);
+  _toggle = new Fl_Check_Button(x, y, w - popw, h);
+  _toggle->box(FL_FLAT_BOX);
+  _toggle->color(col);
   _toggle->callback(view_toggle_cb, (void *)num);
   _toggle->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   _toggle->value(opt->visible);
@@ -272,9 +274,12 @@ viewButton::viewButton(int x, int y, int w, int h, int num)
   _toggle->tooltip(_tooltip);
   sprintf(_arrow, "[%d]@#-1>", num);
   _butt = new Fl_Button(x + w - popw, y, popw, h, _arrow);
+
   _butt->align(FL_ALIGN_RIGHT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   _butt->tooltip("Show view option menu (Shift+w)");
-
+  _butt->box(FL_FLAT_BOX);
+  _butt->color(col);
+  _butt->selection_color(col);
   _popup = new Fl_Menu_Button(x + w - popw, y, popw, h);
   _popup->type(Fl_Menu_Button::POPUP123);
   _popup->add("Reload/View", 'r',
diff --git a/Fltk/viewButton.h b/Fltk/viewButton.h
index cf97751d4f7efccdb943a17dd56ff0720e5df8ae..1e94733a48f2c5ba4c1bfb2efcc83f86848ee10c 100644
--- a/Fltk/viewButton.h
+++ b/Fltk/viewButton.h
@@ -9,17 +9,17 @@
 #include <string>
 #include <FL/Fl.H>
 #include <FL/Fl_Group.H>
-#include <FL/Fl_Light_Button.H>
+#include <FL/Fl_Check_Button.H>
 #include <FL/Fl_Menu_Button.H>
 
 class viewButton : public Fl_Group {
  private:
-  Fl_Light_Button *_toggle;
+  Fl_Check_Button *_toggle;
   Fl_Button *_butt;
   Fl_Menu_Button *_popup;
   char _tooltip[256], _arrow[32];
  public:
-  viewButton(int x, int y, int w, int h, int num);
+  viewButton(int x, int y, int w, int h, int num, Fl_Color col);
   double value() { return _toggle->value(); }
   void value(double val) { _toggle->value(val); }
   void copy_label(const std::string &label){ _toggle->copy_label(label.c_str()); }
diff --git a/demos/indheat.geo b/demos/indheat.geo
index 1c0bdc0d102a369c36913b2ef9d955506b3f3fbc..75cab3f36903cbe163e59307e198983f15ede48c 100644
--- a/demos/indheat.geo
+++ b/demos/indheat.geo
@@ -12,12 +12,12 @@ DefineConstant
  rt2 = {0.092, Label "Tube external radius", Path "Parameters"},
  lb = {1, Label "Infinite box width", Path "Parameters"},
  left = {1, Choices{0,1}, Label "Terminals on the left?", Path "Parameters"}
- //macro = {"aa.pos", Label "Run my macro!", Kind "macro", Path "Actions"},
- showLines = {1, Choices {0,1}, Label "Show lines?", Path "Options"}
+ macro = {"title.script", Label "Run my macro!", Path "Actions",
+          Macro "Gmsh", AutoCheck "0"},
+ showLines = {Geometry.Lines, Choices {0,1}, Label "Show lines?", Path "Options",
+              GmshOption "Geometry.Lines", AutoCheck "0"}
 ];
 
-Geometry.Lines = showLines;
-
 // inductor
 p = newp;
 Point(p)={0, -r, -hc/2, lc};