diff --git a/Common/Context.h b/Common/Context.h
index 3fca35bb10248d00e09ebf257b178563fdb4fc65..94425d4096b341b8f5677cb6039c17ed502e11ad 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -156,7 +156,8 @@ public :
   struct {
     double msh_file_version;
     int changed, draw;
-    int points, lines, surfaces_edges, surfaces_faces, volumes_edges, volumes_faces;
+    int points, lines, triangles, quadrangles, tetrahedra, hexahedra, prisms, pyramids;
+    int surfaces_edges, surfaces_faces, volumes_edges, volumes_faces;
     int points_num, lines_num, surfaces_num, volumes_num;
     double label_frequency;
     int point_type, line_type; // flat or 3D
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 8de4cfeb6b73c3c4edf4e0286a57970384fbac5a..7043245c2a9bebe086cddead8429b7007203d88c 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -888,6 +888,9 @@ StringXNumber MeshOptions_Number[] = {
   { F|O, "Format" , opt_mesh_format , FORMAT_MSH , 
     "Mesh output format (1=msh, 2=unv, 3=gref, 19=vrml)" },
 
+  { F|O, "Hexahedra" , opt_mesh_hexahedra , 1. , 
+    "Display mesh hexahedra?" },
+
   { F|O, "InitialOnly" , opt_mesh_initial_only , 0. ,
     "Only contruct the n-dimensional initial mesh (no refinement)" },
   { F|O, "Interactive" , opt_mesh_interactive , 0. ,
@@ -949,7 +952,13 @@ StringXNumber MeshOptions_Number[] = {
     "Display size of mesh vertices (in pixels)" },
   { F|O, "PointType" , opt_mesh_point_type , 0. , 
     "Display mesh vertices as solid color dots (0) or 3D spheres (1)" },
+  { F|O, "Prisms" , opt_mesh_prisms , 1. , 
+    "Display mesh prisms?" },
+  { F|O, "Pyramids" , opt_mesh_pyramids , 1. , 
+    "Display mesh pyramids?" },
 
+  { F|O, "Quadrangles" , opt_mesh_quadrangles , 1. , 
+    "Display mesh quadrangles?" },
   { F|O, "Quality" , opt_mesh_quality , 1.0 ,
     "Target quality for tetrahedral elements (currently only used by Tetgen)" },
   { F|O, "QualityInf" , opt_mesh_quality_inf , 0.0 , 
@@ -993,6 +1002,10 @@ StringXNumber MeshOptions_Number[] = {
     "Display size of tangent vectors (in pixels)" }, 
   { F|O, "TargetElmentSizeFact" , opt_mesh_target_elem_size_fact, 20. ,
     "Target element size factor in the Remesher" },
+  { F|O, "Tetrahedra" , opt_mesh_tetrahedra , 1. , 
+    "Display mesh tetrahedra?" },
+  { F|O, "Triangles" , opt_mesh_triangles , 1. , 
+    "Display mesh triangles?" },
 
   { F|O, "VolumeEdges" , opt_mesh_volumes_edges , 1. , 
     "Display edges of volume mesh?" },
@@ -1278,7 +1291,7 @@ StringXNumber ViewOptions_Number[] = {
   { F|O, "ShowScale" , opt_view_show_scale , 1. ,
     "Show value scale?" },
   { F|O, "ShowTime" , opt_view_show_time , 3. ,
-    "Time display mode (0=hidden, 1=value if multiple, 2=value always, 3=step if multiple, 4=step always)" },
+    "Time display mode (0=hidden, 1=value if multi-step, 2=value always, 3=step if multi-step, 4=step always)" },
   { F|O, "SmoothNormals" , opt_view_smooth_normals , 0. ,
     "Smooth the normals?" },
   { F|O, "Stipple" , opt_view_use_stipple , 0. ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 0e01efe94fe7dd8a2b395e8968882b85b70106ab..762b6417d3aad0a6ba4bb06f20ae256a52c0af35 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.295 2006-08-17 06:28:30 geuzaine Exp $
+// $Id: Options.cpp,v 1.296 2006-08-17 17:08:50 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -4197,6 +4197,108 @@ double opt_mesh_lines(OPT_ARGS_NUM)
   return CTX.mesh.lines;
 }
 
+double opt_mesh_triangles(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.triangles != val) CTX.mesh.changed = 1;
+    CTX.mesh.triangles = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.triangles)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[0].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[0].clear();
+  }
+#endif
+  return CTX.mesh.triangles;
+}
+
+double opt_mesh_quadrangles(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.quadrangles != val) CTX.mesh.changed = 1;
+    CTX.mesh.quadrangles = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.quadrangles)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[1].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[1].clear();
+  }
+#endif
+  return CTX.mesh.quadrangles;
+}
+
+double opt_mesh_tetrahedra(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.tetrahedra != val) CTX.mesh.changed = 1;
+    CTX.mesh.tetrahedra = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.tetrahedra)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[2].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[2].clear();
+  }
+#endif
+  return CTX.mesh.tetrahedra;
+}
+
+double opt_mesh_hexahedra(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.hexahedra != val) CTX.mesh.changed = 1;
+    CTX.mesh.hexahedra = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.hexahedra)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[3].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[3].clear();
+  }
+#endif
+  return CTX.mesh.hexahedra;
+}
+
+double opt_mesh_prisms(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.prisms != val) CTX.mesh.changed = 1;
+    CTX.mesh.prisms = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.prisms)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[4].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[4].clear();
+  }
+#endif
+  return CTX.mesh.prisms;
+}
+
+double opt_mesh_pyramids(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    if(CTX.mesh.pyramids != val) CTX.mesh.changed = 1;
+    CTX.mesh.pyramids = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI)){
+    if(CTX.mesh.pyramids)
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[5].set();
+    else
+      ((Fl_Menu_Item*)WID->mesh_menu_butt->menu())[5].clear();
+  }
+#endif
+  return CTX.mesh.pyramids;
+}
+
 double opt_mesh_surfaces_edges(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
@@ -6087,8 +6189,12 @@ double opt_view_draw_points(OPT_ARGS_NUM)
     v->DrawPoints = (int)val;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[13]->value(v->DrawPoints);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawPoints)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[0].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[0].clear();
+  }
 #endif
   return v->DrawPoints;
 }
@@ -6100,8 +6206,12 @@ double opt_view_draw_lines(OPT_ARGS_NUM)
     v->DrawLines = (int)val;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[14]->value(v->DrawLines);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawLines)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[1].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[1].clear();
+  }
 #endif
   return v->DrawLines;
 }
@@ -6114,8 +6224,12 @@ double opt_view_draw_triangles(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[15]->value(v->DrawTriangles);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawTriangles)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[2].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[2].clear();
+  }
 #endif
   return v->DrawTriangles;
 }
@@ -6128,8 +6242,12 @@ double opt_view_draw_quadrangles(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[16]->value(v->DrawQuadrangles);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawQuadrangles)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[3].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[3].clear();
+  }
 #endif
   return v->DrawQuadrangles;
 }
@@ -6142,8 +6260,12 @@ double opt_view_draw_tetrahedra(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[17]->value(v->DrawTetrahedra);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawTetrahedra)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[4].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[4].clear();
+  }
 #endif
   return v->DrawTetrahedra;
 }
@@ -6156,8 +6278,12 @@ double opt_view_draw_hexahedra(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[18]->value(v->DrawHexahedra);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawHexahedra)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[5].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[5].clear();
+  }
 #endif
   return v->DrawHexahedra;
 }
@@ -6170,8 +6296,12 @@ double opt_view_draw_prisms(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[19]->value(v->DrawPrisms);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawPrisms)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[6].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[6].clear();
+  }
 #endif
   return v->DrawPrisms;
 }
@@ -6184,8 +6314,12 @@ double opt_view_draw_pyramids(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[20]->value(v->DrawPyramids);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawPyramids)
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[7].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[1]->menu())[7].clear();
+  }
 #endif
   return v->DrawPyramids;
 }
@@ -6198,8 +6332,12 @@ double opt_view_draw_scalars(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[21]->value(v->DrawScalars);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawScalars)
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[0].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[0].clear();
+  }
 #endif
   return v->DrawScalars;
 }
@@ -6212,8 +6350,12 @@ double opt_view_draw_vectors(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[22]->value(v->DrawVectors);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawVectors)
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[1].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[1].clear();
+  }
 #endif
   return v->DrawVectors;
 }
@@ -6226,8 +6368,12 @@ double opt_view_draw_tensors(OPT_ARGS_NUM)
     v->Changed = 1;
   }
 #if defined(HAVE_FLTK)
-  if(_gui_action_valid(action, num))
-    WID->view_butt[23]->value(v->DrawTensors);
+  if(_gui_action_valid(action, num)){
+    if(v->DrawTensors)
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[2].set();
+    else
+      ((Fl_Menu_Item*)WID->view_menu_butt[0]->menu())[2].clear();
+  }
 #endif
   return v->DrawTensors;
 }
diff --git a/Common/Options.h b/Common/Options.h
index 97d782bae550f812e963d70bc6b273c0b3b34b01..556d38fdf80463ebfc566ee2c56db72bfea9fb7d 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -420,6 +420,12 @@ double opt_mesh_radius_sup(OPT_ARGS_NUM);
 double opt_mesh_label_type(OPT_ARGS_NUM);
 double opt_mesh_points(OPT_ARGS_NUM);
 double opt_mesh_lines(OPT_ARGS_NUM);
+double opt_mesh_triangles(OPT_ARGS_NUM);
+double opt_mesh_quadrangles(OPT_ARGS_NUM);
+double opt_mesh_tetrahedra(OPT_ARGS_NUM);
+double opt_mesh_hexahedra(OPT_ARGS_NUM);
+double opt_mesh_prisms(OPT_ARGS_NUM);
+double opt_mesh_pyramids(OPT_ARGS_NUM);
 double opt_mesh_surfaces_edges(OPT_ARGS_NUM);
 double opt_mesh_surfaces_faces(OPT_ARGS_NUM);
 double opt_mesh_volumes_edges(OPT_ARGS_NUM);
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 5900d4637ab708c5a6abb4cf60231449d7abadb7..6bba4ba3b7b2c19d35404b709b953da3b565faf3 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.435 2006-08-17 05:18:50 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.436 2006-08-17 17:08:50 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -1113,6 +1113,12 @@ void mesh_options_ok_cb(CALLBACK_ARGS)
   opt_mesh_constrained_bgmesh(0, GMSH_SET, WID->mesh_butt[5]->value());
   opt_mesh_points(0, GMSH_SET, WID->mesh_butt[6]->value());
   opt_mesh_lines(0, GMSH_SET, WID->mesh_butt[7]->value());
+  opt_mesh_triangles(0, GMSH_SET, WID->mesh_menu_butt->menu()[0].value());
+  opt_mesh_quadrangles(0, GMSH_SET, WID->mesh_menu_butt->menu()[1].value());
+  opt_mesh_tetrahedra(0, GMSH_SET, WID->mesh_menu_butt->menu()[2].value());
+  opt_mesh_hexahedra(0, GMSH_SET, WID->mesh_menu_butt->menu()[3].value());
+  opt_mesh_prisms(0, GMSH_SET, WID->mesh_menu_butt->menu()[4].value());
+  opt_mesh_pyramids(0, GMSH_SET, WID->mesh_menu_butt->menu()[5].value());
   opt_mesh_surfaces_edges(0, GMSH_SET, WID->mesh_butt[8]->value());
   opt_mesh_surfaces_faces(0, GMSH_SET, WID->mesh_butt[9]->value());
   opt_mesh_volumes_edges(0, GMSH_SET, WID->mesh_butt[10]->value());
@@ -3928,50 +3934,50 @@ void view_options_ok_cb(CALLBACK_ARGS)
       if(force || (val != smooth_normals))
         opt_view_smooth_normals(i, GMSH_SET, val);
 
-      val = WID->view_butt[13]->value();
+      val = WID->view_menu_butt[0]->menu()[0].value() ? 1 : 0;
+      if(force || (val != draw_scalars))
+        opt_view_draw_scalars(i, GMSH_SET, val);
+
+      val = WID->view_menu_butt[0]->menu()[1].value() ? 1 : 0;
+      if(force || (val != draw_vectors))
+        opt_view_draw_vectors(i, GMSH_SET, val);
+
+      val = WID->view_menu_butt[0]->menu()[2].value() ? 1 : 0;
+      if(force || (val != draw_tensors))
+        opt_view_draw_tensors(i, GMSH_SET, val);
+
+      val = WID->view_menu_butt[1]->menu()[0].value() ? 1 : 0;
       if(force || (val != draw_points))
         opt_view_draw_points(i, GMSH_SET, val);
 
-      val = WID->view_butt[14]->value();
+      val = WID->view_menu_butt[1]->menu()[1].value() ? 1 : 0;
       if(force || (val != draw_lines))
         opt_view_draw_lines(i, GMSH_SET, val);
 
-      val = WID->view_butt[15]->value();
+      val = WID->view_menu_butt[1]->menu()[2].value() ? 1 : 0;
       if(force || (val != draw_triangles))
         opt_view_draw_triangles(i, GMSH_SET, val);
 
-      val = WID->view_butt[16]->value();
+      val = WID->view_menu_butt[1]->menu()[3].value() ? 1 : 0;
       if(force || (val != draw_quadrangles))
         opt_view_draw_quadrangles(i, GMSH_SET, val);
 
-      val = WID->view_butt[17]->value();
+      val = WID->view_menu_butt[1]->menu()[4].value() ? 1 : 0;
       if(force || (val != draw_tetrahedra))
         opt_view_draw_tetrahedra(i, GMSH_SET, val);
 
-      val = WID->view_butt[18]->value();
+      val = WID->view_menu_butt[1]->menu()[5].value() ? 1 : 0;
       if(force || (val != draw_hexahedra))
         opt_view_draw_hexahedra(i, GMSH_SET, val);
 
-      val = WID->view_butt[19]->value();
+      val = WID->view_menu_butt[1]->menu()[6].value() ? 1 : 0;
       if(force || (val != draw_prisms))
         opt_view_draw_prisms(i, GMSH_SET, val);
 
-      val = WID->view_butt[20]->value();
+      val = WID->view_menu_butt[1]->menu()[7].value() ? 1 : 0;
       if(force || (val != draw_pyramids))
         opt_view_draw_pyramids(i, GMSH_SET, val);
 
-      val = WID->view_butt[21]->value();
-      if(force || (val != draw_scalars))
-        opt_view_draw_scalars(i, GMSH_SET, val);
-
-      val = WID->view_butt[22]->value();
-      if(force || (val != draw_vectors))
-        opt_view_draw_vectors(i, GMSH_SET, val);
-
-      val = WID->view_butt[23]->value();
-      if(force || (val != draw_tensors))
-        opt_view_draw_tensors(i, GMSH_SET, val);
-
       val = WID->view_butt[6]->value();
       if(force || (val != use_gen_raise))
         opt_view_use_gen_raise(i, GMSH_SET, val);
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index d283908262293b4395c646618fc6198c79b2bd8e..22014cd87e83f711c6f9c99619a21e9cc693c580 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.522 2006-08-17 00:25:01 geuzaine Exp $
+// $Id: GUI.cpp,v 1.523 2006-08-17 17:08:51 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -411,6 +411,7 @@ static Fl_Menu_Item menu_axes_mode[] = {
   {0}
 };
 
+
 #define NUM_FONTS 14
 
 Fl_Menu_Item menu_font_names[] = {
@@ -2418,16 +2419,29 @@ void GUI::create_option_window()
       mesh_value[12]->step(0.1);
       mesh_value[12]->align(FL_ALIGN_RIGHT);
 
-      mesh_value[4] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 7 * BH, IW / 2, BH);
+      static Fl_Menu_Item menu_mesh_element_types[] = {
+	{"Triangles",   0, 0, 0, FL_MENU_TOGGLE},
+	{"Quadrangles", 0, 0, 0, FL_MENU_TOGGLE},
+	{"Tetrahedra",  0, 0, 0, FL_MENU_TOGGLE},
+	{"Hexahedra",   0, 0, 0, FL_MENU_TOGGLE},
+	{"Prisms",      0, 0, 0, FL_MENU_TOGGLE},
+	{"Pyramids",    0, 0, 0, FL_MENU_TOGGLE},
+	{0}
+      };
+
+      mesh_menu_butt = new Fl_Menu_Button(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Elements");
+      mesh_menu_butt->menu(menu_mesh_element_types);
+
+      mesh_value[4] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW / 4, BH);
       mesh_value[4]->minimum(0);
       mesh_value[4]->maximum(1);
-      mesh_value[4]->step(0.001);
+      mesh_value[4]->step(0.01);
       mesh_value[4]->align(FL_ALIGN_RIGHT);
 
-      mesh_value[5] = new Fl_Value_Input(L + 2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Element quality range");
+      mesh_value[5] = new Fl_Value_Input(L + 2 * WB + IW / 4, 2 * WB + 8 * BH, IW / 4, BH);
       mesh_value[5]->minimum(0);
       mesh_value[5]->maximum(1);
-      mesh_value[5]->step(0.001);
+      mesh_value[5]->step(0.01);
       mesh_value[5]->align(FL_ALIGN_RIGHT);
 
       static Fl_Menu_Item menu_quality_type[] = {
@@ -2436,14 +2450,14 @@ void GUI::create_option_window()
         {"Rho", 0, 0, 0},
         {0}
       };
-      mesh_choice[6] = new Fl_Choice(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Element quality measure");
+      mesh_choice[6] = new Fl_Choice(L + 2 * WB + IW / 2, 2 * WB + 8 * BH, IW/2, BH, "Quality range");
       mesh_choice[6]->menu(menu_quality_type);
       mesh_choice[6]->align(FL_ALIGN_RIGHT);
 
       mesh_value[6] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 9 * BH, IW / 2, BH);
       mesh_value[6]->align(FL_ALIGN_RIGHT);
 
-      mesh_value[7] = new Fl_Value_Input(L + 2 * WB + IW / 2, 2 * WB + 9 * BH, IW / 2, BH, "Element size range");
+      mesh_value[7] = new Fl_Value_Input(L + 2 * WB + IW / 2, 2 * WB + 9 * BH, IW / 2, BH, "Size range");
       mesh_value[7]->align(FL_ALIGN_RIGHT);
 
       mesh_value[8] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 10 * BH, IW, BH, "Normals");
@@ -2817,87 +2831,50 @@ void GUI::create_option_window()
       Fl_Group *o = new Fl_Group(L + WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Visibility");
       o->hide();
 
-      view_butt[13] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Points");
-      view_butt[13]->type(FL_TOGGLE_BUTTON);
-      view_butt[13]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[13]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[14] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines");
-      view_butt[14]->type(FL_TOGGLE_BUTTON);
-      view_butt[14]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[14]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[15] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Triangles");
-      view_butt[15]->type(FL_TOGGLE_BUTTON);
-      view_butt[15]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[15]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[16] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Quadrangles");
-      view_butt[16]->type(FL_TOGGLE_BUTTON);
-      view_butt[16]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[16]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[17] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Tetrahedra");
-      view_butt[17]->type(FL_TOGGLE_BUTTON);
-      view_butt[17]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[17]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[18] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Hexahedra");
-      view_butt[18]->type(FL_TOGGLE_BUTTON);
-      view_butt[18]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[18]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[19] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Prisms");
-      view_butt[19]->type(FL_TOGGLE_BUTTON);
-      view_butt[19]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[19]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_butt[20] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Pyramids");
-      view_butt[20]->type(FL_TOGGLE_BUTTON);
-      view_butt[20]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[20]->selection_color(GMSH_TOGGLE_COLOR);
-
-      view_value[0] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 9 * BH, IW, BH, "Normals");
-      view_value[0]->minimum(0);
-      view_value[0]->maximum(500);
-      view_value[0]->step(1);
-      view_value[0]->align(FL_ALIGN_RIGHT);
-
-      view_value[1] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 10 * BH, IW, BH, "Tangents");
-      view_value[1]->minimum(0);
-      view_value[1]->maximum(500);
-      view_value[1]->step(1);
-      view_value[1]->align(FL_ALIGN_RIGHT);
-      
-      view_butt[4] = new Fl_Check_Button(L + width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Scale");
+      view_butt[4] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Show value scale");
       view_butt[4]->tooltip("(Alt+i)");
       view_butt[4]->type(FL_TOGGLE_BUTTON);
       view_butt[4]->down_box(GMSH_TOGGLE_BOX);
       view_butt[4]->selection_color(GMSH_TOGGLE_COLOR);
 
       static Fl_Menu_Item time_display[] = {
-	{"Hidden", 0, 0, 0},
-	{"Value if multiple", 0, 0, 0},
-	{"Value always", 0, 0, 0},
-	{"Step if multiple", 0, 0, 0},
-	{"Step always", 0, 0, 0},
+	{"None", 0, 0, 0},
+	{"Value if multi-step", 0, 0, 0},
+	{"Value", 0, 0, 0},
+	{"Step if multi-step", 0, 0, 0},
+	{"Step", 0, 0, 0},
 	{0}
       };
-      view_choice[12] = new Fl_Choice(L + width / 2, 2 * WB + 2 * BH, IW, BH, "Time");
+      view_choice[12] = new Fl_Choice(L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Time display mode");
       view_choice[12]->menu(time_display);
       view_choice[12]->align(FL_ALIGN_RIGHT);
 
-      view_butt[5] = new Fl_Check_Button(L + width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Annotations");
+      view_butt[5] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Show annotations");
       view_butt[5]->tooltip("(Alt+n)");
       view_butt[5]->type(FL_TOGGLE_BUTTON);
       view_butt[5]->down_box(GMSH_TOGGLE_BOX);
       view_butt[5]->selection_color(GMSH_TOGGLE_COLOR);
 
-      view_butt[10] = new Fl_Check_Button(L + width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Element edges");
+      view_butt[10] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Draw element outlines");
       view_butt[10]->type(FL_TOGGLE_BUTTON);
       view_butt[10]->down_box(GMSH_TOGGLE_BOX);
       view_butt[10]->selection_color(GMSH_TOGGLE_COLOR);
 
+      static Fl_Menu_Item menu_view_element_types[] = {
+	{"Points",      0, 0, 0, FL_MENU_TOGGLE},
+	{"Lines",       0, 0, 0, FL_MENU_TOGGLE},
+	{"Triangles",   0, 0, 0, FL_MENU_TOGGLE},
+	{"Quadrangles", 0, 0, 0, FL_MENU_TOGGLE},
+	{"Tetrahedra",  0, 0, 0, FL_MENU_TOGGLE},
+	{"Hexahedra",   0, 0, 0, FL_MENU_TOGGLE},
+	{"Prisms",      0, 0, 0, FL_MENU_TOGGLE},
+	{"Pyramids",    0, 0, 0, FL_MENU_TOGGLE},
+	{0}
+      };
+
+      view_menu_butt[1] = new Fl_Menu_Button(L + 2 * WB, 2 * WB + 5 * BH, IW, BH, "Elements");
+      view_menu_butt[1]->menu(menu_view_element_types);
+      
       static Fl_Menu_Item menu_boundary[] = {
 	{"None", 0, 0, 0},
 	{"Dimension - 1", 0, 0, 0},
@@ -2905,25 +2882,33 @@ void GUI::create_option_window()
 	{"Dimension - 3", 0, 0, 0},
 	{0}
       };
-      view_choice[9] = new Fl_Choice(L + width / 2, 2 * WB + 5 * BH, IW, BH, "Boundary");
+      view_choice[9] = new Fl_Choice(L + 2 * WB, 2 * WB + 6 * BH, IW, BH, "Element boundary mode");
       view_choice[9]->menu(menu_boundary);
       view_choice[9]->align(FL_ALIGN_RIGHT);
 
-      view_butt[21] = new Fl_Check_Button(L + width / 2, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Scalar values");
-      view_butt[21]->type(FL_TOGGLE_BUTTON);
-      view_butt[21]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[21]->selection_color(GMSH_TOGGLE_COLOR);
+      view_value[0] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Normals");
+      view_value[0]->minimum(0);
+      view_value[0]->maximum(500);
+      view_value[0]->step(1);
+      view_value[0]->align(FL_ALIGN_RIGHT);
+
+      view_value[1] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Tangents");
+      view_value[1]->minimum(0);
+      view_value[1]->maximum(500);
+      view_value[1]->step(1);
+      view_value[1]->align(FL_ALIGN_RIGHT);
+
+      static Fl_Menu_Item menu_view_field_types[] = {
+	{"Scalar", 0, 0, 0, FL_MENU_TOGGLE},
+	{"Vector", 0, 0, 0, FL_MENU_TOGGLE},
+	{"Tensor", 0, 0, 0, FL_MENU_TOGGLE},
+	{0}
+      };
+
+      view_menu_butt[0] = new Fl_Menu_Button(L + 2 * WB, 2 * WB + 9 * BH, IW, BH, "Fields");
+      view_menu_butt[0]->menu(menu_view_field_types);
 
-      view_butt[22] = new Fl_Check_Button(L + width / 2, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Vector values");
-      view_butt[22]->type(FL_TOGGLE_BUTTON);
-      view_butt[22]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[22]->selection_color(GMSH_TOGGLE_COLOR);
 
-      view_butt[23] = new Fl_Check_Button(L + width / 2, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Tensor values");
-      view_butt[23]->type(FL_TOGGLE_BUTTON);
-      view_butt[23]->down_box(GMSH_TOGGLE_BOX);
-      view_butt[23]->selection_color(GMSH_TOGGLE_COLOR);
-      
       o->end();
     }
     {
diff --git a/Fltk/GUI.h b/Fltk/GUI.h
index 017c7235c20e46751720ebc51e1f94ae07600ff9..d348860208c68d08964ba5a0fe11f7ea4305d440 100644
--- a/Fltk/GUI.h
+++ b/Fltk/GUI.h
@@ -24,6 +24,7 @@
 #include <FL/Fl_Double_Window.H>
 #include <FL/Fl_Box.H>
 #include <FL/Fl_Menu_Bar.H>
+#include <FL/Fl_Menu_Button.H>
 #include <FL/fl_draw.H>
 #include <FL/gl.h>
 #include <FL/Fl_Choice.H>
@@ -185,6 +186,7 @@ public:
   Fl_Value_Input   *mesh_value[50] ;
   Fl_Button        *mesh_col[50] ;
   Fl_Choice        *mesh_choice[20] ;
+  Fl_Menu_Button   *mesh_menu_butt;
 
   // solver options
   Fl_Group         *solver_group ;
@@ -211,6 +213,7 @@ public:
   Fl_Button        *view_col[50] ;
   Colorbar_Window  *view_colorbar_window ;
   Fl_Return_Button *view_ok ;
+  Fl_Menu_Button   *view_menu_butt[2];
 
   // statistics window
   Fl_Window        *stat_window ;
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index 2ade192c4f9fa9a4d57277c9b672e2569110e352..f3f036c77df130f1e167205d09dfbad001f6d18c 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.175 2006-08-17 14:09:38 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.176 2006-08-17 17:08:51 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -581,8 +581,8 @@ class initMeshGFace {
     MRep *m = f->meshRep;
     m->resetArrays();
     m->allElementsVisible = 
-      areAllElementsVisible(f->triangles) && 
-      areAllElementsVisible(f->quadrangles);
+      CTX.mesh.triangles && areAllElementsVisible(f->triangles) && 
+      CTX.mesh.quadrangles && areAllElementsVisible(f->quadrangles);
 
     bool useEdges = CTX.mesh.surfaces_edges ? true : false;
     if(CTX.mesh.surfaces_faces /*this will change!*/ || 
@@ -604,8 +604,8 @@ class initMeshGFace {
     else if(CTX.mesh.surfaces_edges || CTX.mesh.surfaces_faces){
       m->va_triangles = new VertexArray(3, f->triangles.size());
       m->va_quads = new VertexArray(4, f->quadrangles.size());
-      addElementsInArrays(f, f->triangles);
-      addElementsInArrays(f, f->quadrangles);
+      if(CTX.mesh.triangles) addElementsInArrays(f, f->triangles);
+      if(CTX.mesh.quadrangles) addElementsInArrays(f, f->quadrangles);
     }
   }
 };
@@ -642,27 +642,29 @@ class drawMeshGFace {
     }
 
     if(CTX.mesh.surfaces_num) {
-      drawElementLabels(f, f->triangles, CTX.mesh.surfaces_faces, CTX.color.mesh.line);
-      drawElementLabels(f, f->quadrangles, CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.triangles)
+	drawElementLabels(f, f->triangles, CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.quadrangles)
+	drawElementLabels(f, f->quadrangles, CTX.mesh.surfaces_faces, CTX.color.mesh.line);
     }
 
     if(CTX.mesh.points || CTX.mesh.points_num){
       if(m->allElementsVisible)
 	drawVerticesPerEntity(f);
       else{
-	drawVerticesPerElement(f, f->triangles);
-	drawVerticesPerElement(f, f->quadrangles);
+	if(CTX.mesh.triangles) drawVerticesPerElement(f, f->triangles);
+	if(CTX.mesh.quadrangles) drawVerticesPerElement(f, f->quadrangles);
       }
     }
 
     if(CTX.mesh.normals) {
-      drawNormals(f->triangles);
-      drawNormals(f->quadrangles);
+      if(CTX.mesh.triangles) drawNormals(f->triangles);
+      if(CTX.mesh.quadrangles) drawNormals(f->quadrangles);
     }
 
     if(CTX.mesh.dual) {
-      drawBarycentricDual(f->triangles);
-      drawBarycentricDual(f->quadrangles);
+      if(CTX.mesh.triangles) drawBarycentricDual(f->triangles);
+      if(CTX.mesh.quadrangles) drawBarycentricDual(f->quadrangles);
     }
 
     if(CTX.render_mode == GMSH_SELECT) {
@@ -685,10 +687,10 @@ class initMeshGRegion {
     MRep *m = r->meshRep;
     m->resetArrays();
     m->allElementsVisible = 
-      areAllElementsVisible(r->tetrahedra) &&
-      areAllElementsVisible(r->hexahedra) &&
-      areAllElementsVisible(r->prisms) &&
-      areAllElementsVisible(r->pyramids);
+      CTX.mesh.tetrahedra && areAllElementsVisible(r->tetrahedra) &&
+      CTX.mesh.hexahedra && areAllElementsVisible(r->hexahedra) &&
+      CTX.mesh.prisms && areAllElementsVisible(r->prisms) &&
+      CTX.mesh.pyramids && areAllElementsVisible(r->pyramids);
 
     bool useEdges = CTX.mesh.volumes_edges ? true : false;
     if(CTX.mesh.volumes_faces /*this will change!*/ || 
@@ -708,10 +710,10 @@ class initMeshGRegion {
       m->va_quads = new VertexArray(4, 6 * r->hexahedra.size() +
 				    3 * r->prisms.size() +
 				    r->pyramids.size());
-      addElementsInArrays(r, r->tetrahedra);
-      addElementsInArrays(r, r->hexahedra);
-      addElementsInArrays(r, r->prisms);
-      addElementsInArrays(r, r->pyramids);
+      if(CTX.mesh.tetrahedra) addElementsInArrays(r, r->tetrahedra);
+      if(CTX.mesh.hexahedra) addElementsInArrays(r, r->hexahedra);
+      if(CTX.mesh.prisms) addElementsInArrays(r, r->prisms);
+      if(CTX.mesh.pyramids) addElementsInArrays(r, r->pyramids);
     }
   }
 };
@@ -748,32 +750,36 @@ class drawMeshGRegion {
     }
     
     if(CTX.mesh.volumes_num) {
-      drawElementLabels(r, r->tetrahedra, CTX.mesh.volumes_faces || 
-			CTX.mesh.surfaces_faces, CTX.color.mesh.line);
-      drawElementLabels(r, r->hexahedra, CTX.mesh.volumes_faces || 
-			CTX.mesh.surfaces_faces, CTX.color.mesh.line);
-      drawElementLabels(r, r->prisms, CTX.mesh.volumes_faces || 
-			CTX.mesh.surfaces_faces, CTX.color.mesh.line);
-      drawElementLabels(r, r->pyramids, CTX.mesh.volumes_faces ||
-			CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.tetrahedra) 
+	drawElementLabels(r, r->tetrahedra, CTX.mesh.volumes_faces || 
+			  CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.hexahedra) 
+	drawElementLabels(r, r->hexahedra, CTX.mesh.volumes_faces || 
+			  CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.prisms) 
+	drawElementLabels(r, r->prisms, CTX.mesh.volumes_faces || 
+			  CTX.mesh.surfaces_faces, CTX.color.mesh.line);
+      if(CTX.mesh.pyramids) 
+	drawElementLabels(r, r->pyramids, CTX.mesh.volumes_faces ||
+			  CTX.mesh.surfaces_faces, CTX.color.mesh.line);
     }
 
     if(CTX.mesh.points || CTX.mesh.points_num){
       if(m->allElementsVisible)
 	drawVerticesPerEntity(r);
       else{
-	drawVerticesPerElement(r, r->tetrahedra);
-	drawVerticesPerElement(r, r->hexahedra);
-	drawVerticesPerElement(r, r->prisms);
-	drawVerticesPerElement(r, r->pyramids);
+	if(CTX.mesh.tetrahedra) drawVerticesPerElement(r, r->tetrahedra);
+	if(CTX.mesh.hexahedra) drawVerticesPerElement(r, r->hexahedra);
+	if(CTX.mesh.prisms) drawVerticesPerElement(r, r->prisms);
+	if(CTX.mesh.pyramids) drawVerticesPerElement(r, r->pyramids);
       }
     }
 
     if(CTX.mesh.dual) {
-      drawBarycentricDual(r->tetrahedra);
-      drawBarycentricDual(r->hexahedra);
-      drawBarycentricDual(r->prisms);
-      drawBarycentricDual(r->pyramids);
+      if(CTX.mesh.tetrahedra) drawBarycentricDual(r->tetrahedra);
+      if(CTX.mesh.hexahedra) drawBarycentricDual(r->hexahedra);
+      if(CTX.mesh.prisms) drawBarycentricDual(r->prisms);
+      if(CTX.mesh.pyramids) drawBarycentricDual(r->pyramids);
     }
 
     if(CTX.render_mode == GMSH_SELECT) {