diff --git a/Common/Context.h b/Common/Context.h
index 4bb8e00afd01bc22516fefacb67625ab8b06e7f9..cc2a451c6e7e7a7e3eef00aa4067dd082740115f 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -160,7 +160,7 @@ public :
     double msh_file_version;
     int vis_type, changed, display_lists;
     int draw;
-    int points, lines, surfaces, volumes;
+    int points, lines, surfaces_edges, surfaces_faces, volumes_edges, volumes_faces;
     int points_num, lines_num, surfaces_num, volumes_num;
     int point_type, line_type; // flat or 3D
     double point_size, line_width;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index a9d457af839e49b11f830ead8751def4f6c14cb7..4e3cbccfc9b825227a07c122dde0047ff2257833 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -652,13 +652,13 @@ StringXNumber GeometryOptions_Number[] = {
     "Enable lighting for the geometry" },
   { F|O, "Lines" , opt_geometry_lines , 1. , 
     "Display geometry curves?" },
-  { F|O, "LinesNumbers" , opt_geometry_lines_num , 0. , 
+  { F|O, "LineNumbers" , opt_geometry_lines_num , 0. , 
     "Display curve numbers?" },
   { F|O, "LineSelectWidth" , opt_geometry_line_sel_width , 2. , 
     "Display width of selected lines (in pixels)" },
   { F|O, "LineType" , opt_geometry_line_type , 0. , 
     "Display lines as solid color segments (0) or 3D cylinders (1)" },
-  { F|O, "LineWidth" , opt_geometry_line_width , 1.0 , 
+  { F|O, "LineWidth" , opt_geometry_line_width , 1.5 , 
     "Display width of lines (in pixels)" },
 
   { F|O, "Normals" , opt_geometry_normals , 0. , 
@@ -671,11 +671,11 @@ StringXNumber GeometryOptions_Number[] = {
 
   { F|O, "Points" , opt_geometry_points , 1. ,
     "Display geometry points?" },
-  { F|O, "PointsNumbers" , opt_geometry_points_num , 0. , 
+  { F|O, "PointNumbers" , opt_geometry_points_num , 0. , 
     "Display points numbers?" },
   { F|O, "PointSelectSize" , opt_geometry_point_sel_size , 5. , 
     "Display size of selected points (in pixels)" },
-  { F|O, "PointSize" , opt_geometry_point_size , 3. , 
+  { F|O, "PointSize" , opt_geometry_point_size , 4. , 
     "Display size of points (in pixels)" },
   { F|O, "PointType" , opt_geometry_point_type , 0. , 
     "Display points as solid color dots (0) or 3D spheres (1)" },
@@ -688,7 +688,7 @@ StringXNumber GeometryOptions_Number[] = {
     "Automatically create physical entities when importing STL faces as geometrical surfaces" },
   { F|O, "Surfaces" , opt_geometry_surfaces , 0. , 
     "Display geometry surfaces?" },
-  { F|O, "SurfacesNumbers" , opt_geometry_surfaces_num , 0. , 
+  { F|O, "SurfaceNumbers" , opt_geometry_surfaces_num , 0. , 
     "Display surface numbers?" },
 
   { F|O, "Tangents" , opt_geometry_tangents , 0. ,
@@ -696,7 +696,7 @@ StringXNumber GeometryOptions_Number[] = {
 
   { F|O, "Volumes" , opt_geometry_volumes , 0. , 
     "Display geometry volumes? (not implemented yet)" },
-  { F|O, "VolumesNumbers" , opt_geometry_volumes_num , 0. , 
+  { F|O, "VolumeNumbers" , opt_geometry_volumes_num , 0. , 
     "Display volume numbers? (not implemented yet)" },
 
   { 0, NULL , NULL , 0. , NULL }
@@ -752,14 +752,14 @@ StringXNumber MeshOptions_Number[] = {
 
   { F|O, "Light" , opt_mesh_light , 0. , 
     "Enable lighting for the mesh" },
-  { F|O, "Lines" , opt_mesh_lines , 1. , 
-    "Display mesh vertices on curves?" },
-  { F|O, "LinesNumbers" , opt_mesh_lines_num , 0. , 
+  { F|O, "Lines" , opt_mesh_lines , 0. , 
+    "Display mesh lines (1D elements)?" },
+  { F|O, "LineNumbers" , opt_mesh_lines_num , 0. , 
     "Display mesh line numbers?" },
   { F|O, "LineType" , opt_mesh_line_type , 0. , 
-    "Display lines as solid color segments (0) or 3D cylinders (1)" },
+    "Display mesh lines as solid color segments (0) or 3D cylinders (1)" },
   { F|O, "LineWidth" , opt_mesh_line_width , 1.0 , 
-    "Display width of lines (in pixels)" },
+    "Display width of mesh lines (in pixels)" },
 
   { F|O, "MinimumCirclePoints" , opt_mesh_min_circ_points, 7. ,
     "Minimum number of points used to mesh a circle" },
@@ -784,15 +784,15 @@ StringXNumber MeshOptions_Number[] = {
     "Display size of normal vectors (in pixels)" }, 
 
   { F|O, "Points" , opt_mesh_points , 1. , 
-    "Display mesh vertices?" },
+    "Display mesh vertices (nodes)?" },
   { F|O, "PointInsertion" , opt_mesh_point_insertion, CENTER_CIRCCIRC ,
-    "Point insertion method for isotropic 2D algorithm (1=center of circumscribed circle, 2=voronoi, 3=cog)" },
-  { F|O, "PointsNumbers" , opt_mesh_points_num , 0. , 
-    "Display mesh vertex numbers?" },
+    "Point insertion method for isotropic 2D algorithm (1=center of circumscribed circle, 2=cog)" },
+  { F|O, "PointNumbers" , opt_mesh_points_num , 0. , 
+    "Display mesh node numbers?" },
   { F|O, "PointSize" , opt_mesh_point_size , 3. , 
-    "Display size of points (in pixels)" },
+    "Display size of mesh vertices (in pixels)" },
   { F|O, "PointType" , opt_mesh_point_type , 0. , 
-    "Display points as solid color dots (0) or 3D spheres (1)" },
+    "Display mesh vertices as solid color dots (0) or 3D spheres (1)" },
 
   { F|O, "Quality" , opt_mesh_quality , 0.0 ,
     "Target quality for tetrahedral elements (not fully functional)" },
@@ -814,18 +814,22 @@ StringXNumber MeshOptions_Number[] = {
     "Draw mesh as solid (1) or wireframe (0)?" },
   { F|O, "SpeedMax" , opt_mesh_speed_max , 0. ,
     "Disable dubious point insertion tests" },
-  { F|O, "Surfaces" , opt_mesh_surfaces , 1. , 
-    "Display surface mesh?" },
-  { F|O, "SurfacesNumbers" , opt_mesh_surfaces_num , 0. , 
-    "Display mesh surface numbers?" },
+  { F|O, "SurfaceEdges" , opt_mesh_surfaces_edges , 1. , 
+    "Display edges of surface mesh?" },
+  { F|O, "SurfaceFaces" , opt_mesh_surfaces_faces , 1. , 
+    "Display faces of surface mesh?" },
+  { F|O, "SurfaceNumbers" , opt_mesh_surfaces_num , 0. , 
+    "Display surface mesh element numbers?" },
 
   { F|O, "Tangents" , opt_mesh_tangents , 0.0 , 
     "Display size of tangent vectors (in pixels)" }, 
 
-  { F|O, "Volumes" , opt_mesh_volumes , 1. , 
-    "Display volume mesh?" },
-  { F|O, "VolumesNumbers" , opt_mesh_volumes_num , 0. , 
-    "Display mesh elements numbers?" },
+  { F|O, "VolumeEdges" , opt_mesh_volumes_edges , 1. , 
+    "Display edges of volume mesh?" },
+  { F|O, "VolumeFaces" , opt_mesh_volumes_faces , 0. , 
+    "Display faces of volume mesh?" },
+  { F|O, "VolumeNumbers" , opt_mesh_volumes_num , 0. , 
+    "Display volume mesh element numbers?" },
 
   { 0, NULL , NULL , 0. , NULL }
 } ;
@@ -905,7 +909,7 @@ StringXNumber ViewOptions_Number[] = {
   { F|O, "ArrowHeadRadius" , opt_view_arrow_head_radius , 0.12 ,
     "Relative radius of arrow head" },
   { F|O, "ArrowLocation" , opt_view_arrow_location , DRAW_POST_LOCATE_COG , 
-    "Arrow location (1=cog, 2=vertex)" },
+    "Arrow location (1=cog, 2=node)" },
   { F|O, "ArrowSize" , opt_view_arrow_size , 50. ,
     "Display size of arrows (in pixels)" },
   { F|O, "ArrowStemLength" , opt_view_arrow_stem_length , 0.56 ,
@@ -1204,12 +1208,12 @@ StringXColor MeshOptions_Color[] = {
     PACK_COLOR(0  , 200, 70 , 255),
     PACK_COLOR(0  , 200, 70 , 255),
     PACK_COLOR(0,   0,   0,   255),
-    "Mesh vertex color" },
+    "Mesh node color" },
   { F|O, "PointsSup" , opt_mesh_color_points_deg2 , 
     PACK_COLOR(255, 0,  255 , 255),
     PACK_COLOR(255, 0,  255 , 255),
     PACK_COLOR(0,   0,  0,   255),
-    "Second order mesh vertex color" },
+    "Second order mesh node color" },
   { F|O, "Lines" , opt_mesh_color_lines , 
     PACK_COLOR(0,   255, 0,   255),
     PACK_COLOR(0,   255, 0,   255),
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 97aa302a7ffcc61b44318c307e9037c0bfd3d7f8..024b892831dfa4b3a2cb30bf08ab22e22825a7f9 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.144 2004-04-18 06:48:23 geuzaine Exp $
+// $Id: Options.cpp,v 1.145 2004-04-19 21:59:14 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -3191,30 +3191,56 @@ double opt_mesh_lines(OPT_ARGS_NUM)
   return CTX.mesh.lines;
 }
 
-double opt_mesh_surfaces(OPT_ARGS_NUM)
+double opt_mesh_surfaces_edges(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
-    CTX.mesh.surfaces = (int)val;
+    CTX.mesh.surfaces_edges = (int)val;
     CTX.mesh.changed = 1;
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[8]->value(CTX.mesh.surfaces);
+    WID->mesh_butt[8]->value(CTX.mesh.surfaces_edges);
 #endif
-  return CTX.mesh.surfaces;
+  return CTX.mesh.surfaces_edges;
 }
 
-double opt_mesh_volumes(OPT_ARGS_NUM)
+double opt_mesh_surfaces_faces(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
-    CTX.mesh.volumes = (int)val;
+    CTX.mesh.surfaces_faces = (int)val;
     CTX.mesh.changed = 1;
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[9]->value(CTX.mesh.volumes);
+    WID->mesh_butt[9]->value(CTX.mesh.surfaces_faces);
 #endif
-  return CTX.mesh.volumes;
+  return CTX.mesh.surfaces_faces;
+}
+
+double opt_mesh_volumes_edges(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    CTX.mesh.volumes_edges = (int)val;
+    CTX.mesh.changed = 1;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->mesh_butt[10]->value(CTX.mesh.volumes_edges);
+#endif
+  return CTX.mesh.volumes_edges;
+}
+
+double opt_mesh_volumes_faces(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET) {
+    CTX.mesh.volumes_faces = (int)val;
+    CTX.mesh.changed = 1;
+  }
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->mesh_butt[11]->value(CTX.mesh.volumes_faces);
+#endif
+  return CTX.mesh.volumes_faces;
 }
 
 double opt_mesh_points_num(OPT_ARGS_NUM)
@@ -3225,7 +3251,7 @@ double opt_mesh_points_num(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[10]->value(CTX.mesh.points_num);
+    WID->mesh_butt[12]->value(CTX.mesh.points_num);
 #endif
   return CTX.mesh.points_num;
 }
@@ -3238,7 +3264,7 @@ double opt_mesh_lines_num(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[11]->value(CTX.mesh.lines_num);
+    WID->mesh_butt[13]->value(CTX.mesh.lines_num);
 #endif
   return CTX.mesh.lines_num;
 }
@@ -3251,7 +3277,7 @@ double opt_mesh_surfaces_num(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[12]->value(CTX.mesh.surfaces_num);
+    WID->mesh_butt[14]->value(CTX.mesh.surfaces_num);
 #endif
   return CTX.mesh.surfaces_num;
 }
@@ -3264,7 +3290,7 @@ double opt_mesh_volumes_num(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[13]->value(CTX.mesh.volumes_num);
+    WID->mesh_butt[15]->value(CTX.mesh.volumes_num);
 #endif
   return CTX.mesh.volumes_num;
 }
@@ -3331,7 +3357,7 @@ double opt_mesh_solid(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[14]->value(CTX.mesh.solid);
+    WID->mesh_butt[16]->value(CTX.mesh.solid);
 #endif
   return CTX.mesh.solid;
 }
@@ -3342,7 +3368,7 @@ double opt_mesh_light(OPT_ARGS_NUM)
     CTX.mesh.light = (int)val;
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI))
-    WID->mesh_butt[15]->value(CTX.mesh.light);
+    WID->mesh_butt[17]->value(CTX.mesh.light);
 #endif
   return CTX.mesh.light;
 }
@@ -3531,10 +3557,10 @@ double opt_mesh_color_carousel(OPT_ARGS_NUM)
   }
 #if defined(HAVE_FLTK)
   if(WID && (action & GMSH_GUI)){
-    WID->mesh_butt[17]->value(CTX.mesh.color_carousel==0);
-    WID->mesh_butt[18]->value(CTX.mesh.color_carousel==1);
-    WID->mesh_butt[19]->value(CTX.mesh.color_carousel==2);
-    WID->mesh_butt[20]->value(CTX.mesh.color_carousel==3);
+    WID->mesh_butt[18]->value(CTX.mesh.color_carousel==0);
+    WID->mesh_butt[19]->value(CTX.mesh.color_carousel==1);
+    WID->mesh_butt[20]->value(CTX.mesh.color_carousel==2);
+    WID->mesh_butt[21]->value(CTX.mesh.color_carousel==3);
   }
 #endif
   return CTX.mesh.color_carousel;
diff --git a/Common/Options.h b/Common/Options.h
index bdc358a44918d0af949c3fba2151d2290d2d8991..15872fae86e2897b30aa8540c2083b3f8cc9b189 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -351,8 +351,10 @@ double opt_mesh_radius_inf(OPT_ARGS_NUM);
 double opt_mesh_radius_sup(OPT_ARGS_NUM);
 double opt_mesh_points(OPT_ARGS_NUM);
 double opt_mesh_lines(OPT_ARGS_NUM);
-double opt_mesh_surfaces(OPT_ARGS_NUM);
-double opt_mesh_volumes(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);
+double opt_mesh_volumes_faces(OPT_ARGS_NUM);
 double opt_mesh_points_num(OPT_ARGS_NUM);
 double opt_mesh_lines_num(OPT_ARGS_NUM);
 double opt_mesh_surfaces_num(OPT_ARGS_NUM);
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 8d50d01b8e0b2e9567bddb58818ab57a931b9729..2f4bd343b67ca73128977d31182b89f96334f255 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.214 2004-04-18 21:47:29 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.215 2004-04-19 21:59:14 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1079,18 +1079,20 @@ 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_surfaces(0, GMSH_SET, WID->mesh_butt[8]->value());
-  opt_mesh_volumes(0, GMSH_SET, WID->mesh_butt[9]->value());
-  opt_mesh_points_num(0, GMSH_SET, WID->mesh_butt[10]->value());
-  opt_mesh_lines_num(0, GMSH_SET, WID->mesh_butt[11]->value());
-  opt_mesh_surfaces_num(0, GMSH_SET, WID->mesh_butt[12]->value());
-  opt_mesh_volumes_num(0, GMSH_SET, WID->mesh_butt[13]->value());
-  opt_mesh_solid(0, GMSH_SET, WID->mesh_butt[14]->value());
-  opt_mesh_light(0, GMSH_SET, WID->mesh_butt[15]->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());
+  opt_mesh_volumes_faces(0, GMSH_SET, WID->mesh_butt[11]->value());
+  opt_mesh_points_num(0, GMSH_SET, WID->mesh_butt[12]->value());
+  opt_mesh_lines_num(0, GMSH_SET, WID->mesh_butt[13]->value());
+  opt_mesh_surfaces_num(0, GMSH_SET, WID->mesh_butt[14]->value());
+  opt_mesh_volumes_num(0, GMSH_SET, WID->mesh_butt[15]->value());
+  opt_mesh_solid(0, GMSH_SET, WID->mesh_butt[16]->value());
+  opt_mesh_light(0, GMSH_SET, WID->mesh_butt[17]->value());
   opt_mesh_color_carousel(0, GMSH_SET,
-			  WID->mesh_butt[17]->value()? 0 :
-			  WID->mesh_butt[18]->value()? 1 : 
-			  WID->mesh_butt[19]->value()? 2 : 
+			  WID->mesh_butt[18]->value()? 0 :
+			  WID->mesh_butt[19]->value()? 1 : 
+			  WID->mesh_butt[20]->value()? 2 : 
 			  3);
 
   opt_mesh_nb_smoothing(0, GMSH_SET, WID->mesh_value[0]->value());
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 16c147a205dc83b71ea43859ccccce36ac9d1335..68d660371c108e7b6b9ffaf3c806c3e6bf6a2322 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.283 2004-04-18 21:47:29 geuzaine Exp $
+// $Id: GUI.cpp,v 1.284 2004-04-19 21:59:14 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -623,24 +623,28 @@ int GUI::global_shortcuts(int event)
     return 1;
   }
   else if(Fl::test_shortcut(FL_ALT + FL_SHIFT + 's')) {
-    opt_mesh_surfaces(0, GMSH_SET | GMSH_GUI,
-                      !opt_mesh_surfaces(0, GMSH_GET, 0));
+    int old = opt_mesh_surfaces_edges(0, GMSH_GET, 0) || opt_mesh_surfaces_faces(0, GMSH_GET, 0);
+    opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, !old);
     redraw_opengl();
     return 1;
   }
   else if(Fl::test_shortcut(FL_ALT + FL_SHIFT + 'v')) {
-    opt_mesh_volumes(0, GMSH_SET | GMSH_GUI,
-                     !opt_mesh_volumes(0, GMSH_GET, 0));
+    int old = opt_mesh_volumes_edges(0, GMSH_GET, 0) || opt_mesh_volumes_faces(0, GMSH_GET, 0);
+    opt_mesh_volumes_edges(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_volumes_faces(0, GMSH_SET | GMSH_GUI, !old);
     redraw_opengl();
     return 1;
   }
   else if(Fl::test_shortcut(FL_ALT + 'm')) {
-    opt_mesh_points(0, GMSH_SET | GMSH_GUI, !opt_mesh_points(0, GMSH_GET, 0));
-    opt_mesh_lines(0, GMSH_SET | GMSH_GUI, !opt_mesh_lines(0, GMSH_GET, 0));
-    opt_mesh_surfaces(0, GMSH_SET | GMSH_GUI,
-                      !opt_mesh_surfaces(0, GMSH_GET, 0));
-    opt_mesh_volumes(0, GMSH_SET | GMSH_GUI,
-                     !opt_mesh_volumes(0, GMSH_GET, 0));
+    int old = opt_mesh_points(0, GMSH_GET, 0) || opt_mesh_lines(0, GMSH_GET, 0) ||
+      opt_mesh_surfaces_edges(0, GMSH_GET, 0) || opt_mesh_surfaces_faces(0, GMSH_GET, 0);
+    opt_mesh_points(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_lines(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_volumes_edges(0, GMSH_SET | GMSH_GUI, !old);
+    opt_mesh_volumes_faces(0, GMSH_SET | GMSH_GUI, !old);
     redraw_opengl();
     return 1;
   }
@@ -1798,32 +1802,34 @@ void GUI::create_option_window()
     }
     {
       Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Visibility");
-      mesh_butt[6] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Points");
-      mesh_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines");
-      mesh_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surfaces");
-      mesh_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volumes");
-      mesh_butt[10] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Point numbers");
-      mesh_butt[11] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line numbers");
-      mesh_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface numbers");
-      mesh_butt[13] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volume numbers");
-      for(i = 6; i < 14; i++) {
+      mesh_butt[6] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Nodes");
+      mesh_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line elements");
+      mesh_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element edges");
+      mesh_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Surface element faces");
+      mesh_butt[10] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Volume element edges");
+      mesh_butt[11] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Volume element faces");
+      mesh_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Node numbers");
+      mesh_butt[13] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line element numbers");
+      mesh_butt[14] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element numbers");
+      mesh_butt[15] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volume element numbers");
+      for(i = 6; i < 16; i++) {
         mesh_butt[i]->type(FL_TOGGLE_BUTTON);
         mesh_butt[i]->down_box(TOGGLE_BOX);
         mesh_butt[i]->selection_color(TOGGLE_COLOR);
       }
-      mesh_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW / 2, BH);
+      mesh_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW / 2, BH);
       mesh_value[4]->minimum(0);
       mesh_value[4]->maximum(1);
       mesh_value[4]->step(0.001);
-      mesh_value[5] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 5 * BH, IW / 2, BH, "Quality range");
+      mesh_value[5] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Quality range");
       mesh_value[5]->minimum(0);
       mesh_value[5]->maximum(1);
       mesh_value[5]->step(0.001);
 
-      mesh_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW / 2, BH);
-      mesh_value[7] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 6 * BH, IW / 2, BH, "Size range");
+      mesh_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW / 2, BH);
+      mesh_value[7] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 8 * BH, IW / 2, BH, "Size range");
 
-      mesh_value[8] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Normals");
+      mesh_value[8] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Normals");
       mesh_value[8]->minimum(0);
       mesh_value[8]->maximum(500);
       mesh_value[8]->step(1);
@@ -1831,7 +1837,7 @@ void GUI::create_option_window()
         mesh_value[i]->align(FL_ALIGN_RIGHT);
       }
 
-      mesh_value[13] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Tangents");
+      mesh_value[13] = new Fl_Value_Input(2 * WB, 2 * WB + 10 * BH, IW, BH, "Tangents");
       mesh_value[13]->minimum(0);
       mesh_value[13]->maximum(200);
       mesh_value[13]->step(1.0);
@@ -1842,9 +1848,9 @@ void GUI::create_option_window()
     {
       Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Aspect");
       o->hide();
-      mesh_butt[14] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Draw as solid (hidden surfaces)");
-      mesh_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Enable lighting");
-      for(i = 14; i < 16; i++) {
+      mesh_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Draw as solid (hidden surfaces)");
+      mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Enable lighting");
+      for(i = 16; i < 18; i++) {
         mesh_butt[i]->type(FL_TOGGLE_BUTTON);
         mesh_butt[i]->down_box(TOGGLE_BOX);
 	mesh_butt[i]->selection_color(TOGGLE_COLOR);
@@ -1880,11 +1886,11 @@ void GUI::create_option_window()
     {
       Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Colors");
       o->hide();
-      mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by element type");
-      mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by elementary entity");
-      mesh_butt[19] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by physical entity");
-      mesh_butt[20] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by partition");
-      for(i = 17; i < 21; i++) {
+      mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by element type");
+      mesh_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by elementary entity");
+      mesh_butt[20] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by physical entity");
+      mesh_butt[21] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by partition");
+      for(i = 18; i < 22; i++) {
         mesh_butt[i]->type(FL_RADIO_BUTTON);
         mesh_butt[i]->down_box(RADIO_BOX);
         mesh_butt[i]->selection_color(RADIO_COLOR);
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index 9e00098564b31003b6dd6a95b63b8a28839c233b..8ed97290398d33a2e782cb786dac1f015f040c1b 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.69 2004-04-19 19:04:15 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.70 2004-04-19 21:59:14 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -144,11 +144,13 @@ void Draw_Mesh(Mesh * M)
 
       //printf("normal mesh drawing\n");
 
-      if(M->status >= 3 && (CTX.mesh.volumes || CTX.mesh.volumes_num)) {
+      if(M->status >= 3 && (CTX.mesh.volumes_faces || CTX.mesh.volumes_edges ||
+			    CTX.mesh.volumes_num)) {
 	Tree_Action(M->Volumes, Draw_Mesh_Volumes);
       }
 
-      if(M->status >= 2 && (CTX.mesh.surfaces || CTX.mesh.surfaces_num)) {
+      if(M->status >= 2 && (CTX.mesh.surfaces_faces || CTX.mesh.surfaces_edges ||
+			    CTX.mesh.surfaces_num)) {
         Tree_Action(M->Surfaces, Draw_Mesh_Surfaces);
         if(CTX.mesh.oldxtrude)  //old extrusion algo
           Tree_Action(M->Volumes, Draw_Mesh_Extruded_Surfaces);
@@ -318,7 +320,6 @@ void Draw_Simplex_Volume(void *a, void *b)
 {
   Simplex *s;
   char Num[100];
-  int fulldraw = 0;
   double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6];
 
   s = *(Simplex **) a;
@@ -345,13 +346,11 @@ void Draw_Simplex_Volume(void *a, void *b)
     tmp = s->GammaShapeMeasure();
     if(tmp < CTX.mesh.gamma_inf || tmp > CTX.mesh.gamma_sup)
       return;
-    fulldraw = 1;
   }
 
   if(CTX.mesh.radius_sup) {
     if(s->Radius < CTX.mesh.radius_inf || s->Radius > CTX.mesh.radius_sup)
       return;
-    fulldraw = 1;
   }
 
   double Xc = .25 * (s->V[0]->Pos.X + s->V[1]->Pos.X +
@@ -364,10 +363,9 @@ void Draw_Simplex_Volume(void *a, void *b)
   if(CTX.mesh.use_cut_plane) {
     if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0)
       return;
-    fulldraw = 1;
   }
 
-  if(!fulldraw){
+  if(!CTX.mesh.solid){
     if(theColor.type)
       glColor4ubv((GLubyte *) & theColor.mesh);
     else if(CTX.mesh.color_carousel == 1)
@@ -395,7 +393,7 @@ void Draw_Simplex_Volume(void *a, void *b)
     }
   }
 
-  if(CTX.mesh.volumes) {
+  if(CTX.mesh.volumes_edges) {
     if(!s->VSUP){
       glBegin(GL_LINES);
       glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]);
@@ -458,21 +456,18 @@ void Draw_Simplex_Volume(void *a, void *b)
     gl2psDisable(GL2PS_LINE_STIPPLE);
   }
 
-  if(!fulldraw)
-    return;
-
-  if(theColor.type)
-    glColor4ubv((GLubyte *) & theColor.mesh);
-  else if(CTX.mesh.color_carousel == 1)
-    ColorSwitch(s->iEnt);
-  else if(CTX.mesh.color_carousel == 2)
-    ColorSwitch(thePhysical);
-  else if(CTX.mesh.color_carousel == 3)
-    ColorSwitch(s->iPart);
-  else
-    glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
+  if(CTX.mesh.volumes_faces && CTX.mesh.solid){
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(s->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(s->iPart);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
 
-  if(CTX.mesh.solid) {
     double n[3];
     // FIXME: should subdivide if s->VSUP
     if(CTX.mesh.light) glEnable(GL_LIGHTING);
@@ -509,23 +504,25 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
   if(CTX.mesh.normals || CTX.mesh.light)
     glNormal3verts(s->V[0], s->V[1], s->V[2], n);
 
-  if(CTX.mesh.surfaces && CTX.mesh.lines) {
-    if(!CTX.mesh.solid) {
-      if(theColor.type)
-	glColor4ubv((GLubyte *) & theColor.mesh);
-      else if(CTX.mesh.color_carousel == 1)
-	ColorSwitch(s->iEnt);
-      else if(CTX.mesh.color_carousel == 2)
-	ColorSwitch(thePhysical);
-      else if(CTX.mesh.color_carousel == 3)
-	ColorSwitch(s->iPart);
-      else
-	glColor4ubv((GLubyte *) & CTX.color.mesh.line);
-    }
-    else {
-      glColor4ubv((GLubyte *) & CTX.color.mesh.line);
-    }
+  if(!CTX.mesh.solid){
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(s->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(s->iPart);
+    else if(K == 3)
+      glColor4ubv((GLubyte *) & CTX.color.mesh.triangle);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle);
+  }
+  else {
+    glColor4ubv((GLubyte *) & CTX.color.mesh.line);
+  }
 
+  if(CTX.mesh.surfaces_edges){
     if(pX && pY && pZ) {        // using precomputed vertices
       glBegin(GL_LINE_LOOP);
       for(i = 0; i < K * (1 + L); i++) {
@@ -550,23 +547,22 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
         glEnd();
       }
     }
-
   }
 
-  if(theColor.type)
-    glColor4ubv((GLubyte *) & theColor.mesh);
-  else if(CTX.mesh.color_carousel == 1)
-    ColorSwitch(s->iEnt);
-  else if(CTX.mesh.color_carousel == 2)
-    ColorSwitch(thePhysical);
-  else if(CTX.mesh.color_carousel == 3)
-    ColorSwitch(s->iPart);
-  else if(K == 3)
-    glColor4ubv((GLubyte *) & CTX.color.mesh.triangle);
-  else
-    glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle);
+  if(CTX.mesh.surfaces_faces && CTX.mesh.solid) {
 
-  if(CTX.mesh.surfaces && CTX.mesh.solid) {
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(s->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(s->iPart);
+    else if(K == 3)
+      glColor4ubv((GLubyte *) & CTX.color.mesh.triangle);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle);
 
     if(CTX.mesh.light) glEnable(GL_LIGHTING);
 
@@ -902,16 +898,20 @@ void Draw_Hexahedron_Volume(void *a, void *b)
       return;
   }
 
-  if(theColor.type)
-    glColor4ubv((GLubyte *) & theColor.mesh);
-  else if(CTX.mesh.color_carousel == 1)
-    ColorSwitch(h->iEnt);
-  else if(CTX.mesh.color_carousel == 2)
-    ColorSwitch(thePhysical);
-  else if(CTX.mesh.color_carousel == 3)
-    ColorSwitch(h->iPart);
+  if(!CTX.mesh.solid){
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(h->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(h->iPart);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.hexahedron);
+  }
   else
-    glColor4ubv((GLubyte *) & CTX.color.mesh.hexahedron);
+    glColor4ubv((GLubyte *) & CTX.color.mesh.line);
 
   for(i = 0; i < 8; i++) {
     X[i] = Xc + CTX.mesh.explode * (h->V[i]->Pos.X - Xc);
@@ -919,30 +919,31 @@ void Draw_Hexahedron_Volume(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (h->V[i]->Pos.Z - Zc);
   }
 
-  glBegin(GL_LINE_LOOP);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glEnd();
-
-  glBegin(GL_LINE_LOOP);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[5], Y[5], Z[5]);
-  glVertex3d(X[6], Y[6], Z[6]);
-  glVertex3d(X[7], Y[7], Z[7]);
-  glEnd();
-
-  glBegin(GL_LINES);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[5], Y[5], Z[5]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glVertex3d(X[6], Y[6], Z[6]);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glVertex3d(X[7], Y[7], Z[7]);
-  glEnd();
+  // FIXME: remove "1" when we add the face drawing code
+  if(1 || CTX.mesh.volumes_edges){
+    glBegin(GL_LINE_LOOP);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glEnd();
+    glBegin(GL_LINE_LOOP);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[5], Y[5], Z[5]);
+    glVertex3d(X[6], Y[6], Z[6]);
+    glVertex3d(X[7], Y[7], Z[7]);
+    glEnd();
+    glBegin(GL_LINES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[5], Y[5], Z[5]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[6], Y[6], Z[6]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[7], Y[7], Z[7]);
+    glEnd();
+  }
 
   if(CTX.mesh.volumes_num) {
     sprintf(Num, "%d", h->Num);
@@ -951,7 +952,6 @@ void Draw_Hexahedron_Volume(void *a, void *b)
   }
 
   if(CTX.mesh.dual) {
-
     glColor4ubv((GLubyte *) & CTX.color.fg);
     glEnable(GL_LINE_STIPPLE);
     glLineStipple(1, 0x0F0F);
@@ -1052,16 +1052,20 @@ void Draw_Prism_Volume(void *a, void *b)
       return;
   }
 
-  if(theColor.type)
-    glColor4ubv((GLubyte *) & theColor.mesh);
-  else if(CTX.mesh.color_carousel == 1)
-    ColorSwitch(p->iEnt);
-  else if(CTX.mesh.color_carousel == 2)
-    ColorSwitch(thePhysical);
-  else if(CTX.mesh.color_carousel == 3)
-    ColorSwitch(p->iPart);
+  if(!CTX.mesh.solid){
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(p->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(p->iPart);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.prism);
+  }
   else
-    glColor4ubv((GLubyte *) & CTX.color.mesh.prism);
+    glColor4ubv((GLubyte *) & CTX.color.mesh.line);
 
   for(i = 0; i < 6; i++) {
     X[i] = Xc + CTX.mesh.explode * (p->V[i]->Pos.X - Xc);
@@ -1069,26 +1073,27 @@ void Draw_Prism_Volume(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
   }
 
-  glBegin(GL_LINE_LOOP);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glEnd();
-
-  glBegin(GL_LINE_LOOP);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[5], Y[5], Z[5]);
-  glEnd();
-
-  glBegin(GL_LINES);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glVertex3d(X[5], Y[5], Z[5]);
-  glEnd();
+  // FIXME: remove "1" when we add the face drawing code
+  if(1 || CTX.mesh.volumes_edges){
+    glBegin(GL_LINE_LOOP);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glEnd();
+    glBegin(GL_LINE_LOOP);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[5], Y[5], Z[5]);
+    glEnd();
+    glBegin(GL_LINES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[5], Y[5], Z[5]);
+    glEnd();
+  }
 
   if(CTX.mesh.volumes_num) {
     sprintf(Num, "%d", p->Num);
@@ -1183,16 +1188,20 @@ void Draw_Pyramid_Volume(void *a, void *b)
       return;
   }
 
-  if(theColor.type)
-    glColor4ubv((GLubyte *) & theColor.mesh);
-  else if(CTX.mesh.color_carousel == 1)
-    ColorSwitch(p->iEnt);
-  else if(CTX.mesh.color_carousel == 2)
-    ColorSwitch(thePhysical);
-  else if(CTX.mesh.color_carousel == 3)
-    ColorSwitch(p->iPart);
+  if(!CTX.mesh.solid){
+    if(theColor.type)
+      glColor4ubv((GLubyte *) & theColor.mesh);
+    else if(CTX.mesh.color_carousel == 1)
+      ColorSwitch(p->iEnt);
+    else if(CTX.mesh.color_carousel == 2)
+      ColorSwitch(thePhysical);
+    else if(CTX.mesh.color_carousel == 3)
+      ColorSwitch(p->iPart);
+    else
+      glColor4ubv((GLubyte *) & CTX.color.mesh.pyramid);
+  }
   else
-    glColor4ubv((GLubyte *) & CTX.color.mesh.pyramid);
+    glColor4ubv((GLubyte *) & CTX.color.mesh.line);
 
   for(i = 0; i < 5; i++) {
     X[i] = Xc + CTX.mesh.explode * (p->V[i]->Pos.X - Xc);
@@ -1200,23 +1209,25 @@ void Draw_Pyramid_Volume(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
   }
 
-  glBegin(GL_LINE_LOOP);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glEnd();
-
-  glBegin(GL_LINES);
-  glVertex3d(X[0], Y[0], Z[0]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[1], Y[1], Z[1]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[2], Y[2], Z[2]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glVertex3d(X[3], Y[3], Z[3]);
-  glVertex3d(X[4], Y[4], Z[4]);
-  glEnd();
+  // FIXME: remove "1" when we add the face drawing code
+  if(1 || CTX.mesh.volumes_edges){
+    glBegin(GL_LINE_LOOP);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glEnd();
+    glBegin(GL_LINES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[4], Y[4], Z[4]);
+    glEnd();
+  }
 
   if(CTX.mesh.volumes_num) {
     sprintf(Num, "%d", p->Num);
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 8439a3c364a152d3b75b5b20c10025ea268eb9ea..aab19b008c7ae3db42f16b1e97ee65b02846bbc9 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,15 +1,16 @@
-$Id: VERSIONS,v 1.194 2004-04-19 16:42:52 geuzaine Exp $
+$Id: VERSIONS,v 1.195 2004-04-19 21:59:14 geuzaine Exp $
 
 New in 1.52: new raster ("bitmap") PostScript/EPS/PDF output formats;
 new Plugin(Extract) to extract a given component from a
 post-processing view; improved mesh projection on non-planar surfaces;
 added support for second order tetrahedral elements; added interactive
-control of element order; various bug fixes (default postscript
-printing mode, drawing of 3D arrows/cylinders on Linux, default home
-directory on Windows, default initial file browser directory,
-extrusion of points with non-normalized axes of rotation, computation
-of the scene bounding box in scripts, + the usual documentation
-updates);
+control of element order; refined mesh entity drawing selection (and
+renamed most of the corresponding options); add fine grained control
+various bug fixes (default postscript printing mode, drawing of 3D
+arrows/cylinders on Linux, default home directory on Windows, default
+initial file browser directory, extrusion of points with
+non-normalized axes of rotation, computation of the scene bounding box
+in scripts, + the usual documentation updates);
 
 New in 1.51: initial support for visualizing mesh partitions;
 integrated version 2.0 of the MSH mesh file format; new option to