diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 4b1214e5abed694ec1a87b6538cca84d00061c61..deab98228d722a405046a06ebac6333a1fcbf6a3 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -443,6 +443,8 @@ StringXNumber ViewOptions_Number[] = {
     "Elevation of the view along Z-axis (in model coordinates)" },
   { F|O, "ArrowScale" , opt_view_arrow_scale , 50. ,
     "Size of the vector (e.g. arrow size in pixels)" },
+  { F, "Explode" , opt_view_explode , 1. , 
+    "Explode elements (0: reduced to a point; 1: not transformed)" },
   { F, "Visible" , opt_view_visible , 1. ,
     "Is the view visible?" },
   { F|O, "IntervalsType" , opt_view_intervals_type , DRAW_POST_ISO ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 1b80f7c6fca4b9b2d1100aca9670f9d05ba65f10..dd3c8c5b5f28300bd16205bd9b1a1655c85282ae 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.37 2001-08-02 19:11:40 geuzaine Exp $
+// $Id: Options.cpp,v 1.38 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -1703,6 +1703,18 @@ double opt_view_arrow_scale(OPT_ARGS_NUM){
 #endif
   return v->ArrowScale;
 }
+double opt_view_explode(OPT_ARGS_NUM){
+  GET_VIEW(0.) ;
+  if(action & GMSH_SET){
+    v->Explode = val;
+    v->Changed = 1;
+  }
+#ifdef _FLTK
+  if(WID && (action & GMSH_GUI) && (num == WID->view_number))
+    WID->view_value[12]->value(v->Explode);
+#endif
+  return v->Explode;
+}
 double opt_view_visible(OPT_ARGS_NUM){
   GET_VIEW(0.) ;
   if(action & GMSH_SET){
diff --git a/Common/Options.h b/Common/Options.h
index cee1623d93f561a9c3c3b8452557f6c423ebf4c6..30ed840b5b847e6532d511b481398050c5f12223 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -203,6 +203,7 @@ double opt_view_raise0(OPT_ARGS_NUM);
 double opt_view_raise1(OPT_ARGS_NUM);
 double opt_view_raise2(OPT_ARGS_NUM);
 double opt_view_arrow_scale(OPT_ARGS_NUM);
+double opt_view_explode(OPT_ARGS_NUM);
 double opt_view_visible(OPT_ARGS_NUM);
 double opt_view_intervals_type(OPT_ARGS_NUM);
 double opt_view_saturate_values(OPT_ARGS_NUM);
diff --git a/Common/Views.cpp b/Common/Views.cpp
index c928347ca27e032a84b6000e174defb7a1a7bee8..fd75c1fa73f652fb4dfd15d9f3cd3803c9d870ac 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.45 2001-07-31 08:02:26 geuzaine Exp $
+// $Id: Views.cpp,v 1.46 2001-08-03 21:27:20 geuzaine Exp $
 
 #include <set>
 #include "Gmsh.h"
@@ -404,6 +404,7 @@ void CopyViewOptions(Post_View *src, Post_View *dest){
   dest->Raise[1] = src->Raise[1];
   dest->Raise[2] = src->Raise[2];
   dest->ArrowScale = src->ArrowScale;
+  dest->Explode = src->Explode;
   dest->Visible = src->Visible;
   dest->IntervalsType = src->IntervalsType;
   dest->SaturateValues = src->SaturateValues;
diff --git a/Common/Views.h b/Common/Views.h
index d4d7d378197f44d0112d46b1414ba381fe3410ab..45cd96db2c5672f052f12db75ce19df089210b22 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -29,7 +29,7 @@ class Post_View{
   // options
   char   Format[NAME_STR_L];
   double CustomMin, CustomMax;
-  double Offset[3], Raise[3], ArrowScale;
+  double Offset[3], Raise[3], ArrowScale, Explode;
   int Visible, IntervalsType, NbIso, Light, SmoothNormals ;
   int SaturateValues;
   int ShowElement, ShowTime, ShowScale;
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index e70cab024953f8bb79b5838c07a36b5db1a085b9..10a81d7676a5d92d41c635c1124251ea1aa027c6 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.71 2001-07-31 19:25:04 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.72 2001-08-03 21:27:20 geuzaine Exp $
 
 #include <sys/types.h>
 #include <signal.h>
@@ -519,7 +519,7 @@ void help_short_cb(CALLBACK_ARGS){
   Msg(DIRECT, "  Alt+Shift+p   hide/show mesh points");
   Msg(DIRECT, "  Alt+s         hide/show geometry surfaces");
   Msg(DIRECT, "  Alt+Shift+s   hide/show mesh surfaces");
-  Msg(DIRECT, "  Alt+t         alternate intervals mode for all post-processing views"); 
+  Msg(DIRECT, "  Alt+t         alternate intervals mode for visible post-processing views"); 
   Msg(DIRECT, "  Alt+v         hide/show geometry volumes");
   Msg(DIRECT, "  Alt+Shift+v   hide/show mesh volumes");
   Msg(DIRECT, "  Alt+x         set X view"); 
@@ -1727,6 +1727,7 @@ void view_options_ok_cb(CALLBACK_ARGS){
       opt_view_timestep(i, GMSH_SET, WID->view_value[9]->value());
       opt_view_arrow_scale(i, GMSH_SET, WID->view_value[10]->value());
       opt_view_boundary(i, GMSH_SET, WID->view_value[11]->value());
+      opt_view_explode(i, GMSH_SET, WID->view_value[12]->value());
       
       opt_view_name(i, GMSH_SET, (char*)WID->view_input[0]->value());
       opt_view_format(i, GMSH_SET, (char*)WID->view_input[1]->value());
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index af1c7359a75c0525d3ed6d27f9bafb3297b6e816..79f9bc5aa848d118ee9919299f6d9b2b1292ff73 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.100 2001-07-31 19:25:04 geuzaine Exp $
+// $Id: GUI.cpp,v 1.101 2001-08-03 21:27:20 geuzaine Exp $
 
 // To make the interface as visually consistent as possible, please:
 // - use the BH, BW, WB, IW values for button heights/widths, window borders, etc.
@@ -1240,10 +1240,10 @@ void GUI::create_mesh_options_window(){
 	mesh_butt[5] = new Fl_Check_Button(2*WB, 2*WB+2*BH, IW, BH, "Curves");
 	mesh_butt[6] = new Fl_Check_Button(2*WB, 2*WB+3*BH, IW, BH, "Surfaces");
 	mesh_butt[7] = new Fl_Check_Button(2*WB, 2*WB+4*BH, IW, BH, "Volumes");
-	mesh_butt[8] = new Fl_Check_Button(width/2, 2*WB+1*BH, IW, BH, "Point Numbers");
-	mesh_butt[9] = new Fl_Check_Button(width/2, 2*WB+2*BH, IW, BH, "Curve Numbers");
-	mesh_butt[10] = new Fl_Check_Button(width/2, 2*WB+3*BH, IW, BH, "Surface Numbers");
-	mesh_butt[11] = new Fl_Check_Button(width/2, 2*WB+4*BH, IW, BH, "Volume Numbers");
+	mesh_butt[8] = new Fl_Check_Button(width/2, 2*WB+1*BH, IW, BH, "Point numbers");
+	mesh_butt[9] = new Fl_Check_Button(width/2, 2*WB+2*BH, IW, BH, "Curve numbers");
+	mesh_butt[10] = new Fl_Check_Button(width/2, 2*WB+3*BH, IW, BH, "Surface numbers");
+	mesh_butt[11] = new Fl_Check_Button(width/2, 2*WB+4*BH, IW, BH, "Volume numbers");
 	for(i=4 ; i<12 ; i++){
 	  mesh_butt[i]->type(FL_TOGGLE_BUTTON);
 	  mesh_butt[i]->down_box(FL_DOWN_BOX);
@@ -1567,7 +1567,7 @@ void GUI::create_statistics_window(){
 	o->labelsize(CTX.fontsize);
 	o->hide();
 	stat_value[18] = new Fl_Output(2*WB, 2*WB+1*BH, IW, BH, "Views");
-	stat_value[19] = new Fl_Output(2*WB, 2*WB+2*BH, IW, BH, "Visible Points");
+	stat_value[19] = new Fl_Output(2*WB, 2*WB+2*BH, IW, BH, "Visible points");
 	stat_value[20] = new Fl_Output(2*WB, 2*WB+3*BH, IW, BH, "Visible lines");
 	stat_value[21] = new Fl_Output(2*WB, 2*WB+4*BH, IW, BH, "Visible triangles");
 	stat_value[22] = new Fl_Output(2*WB, 2*WB+5*BH, IW, BH, "Visible tetrahedra");
@@ -1946,26 +1946,52 @@ void GUI::create_view_options_window(int num){
 	Fl_Group *o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "General");
 	o->labelsize(CTX.fontsize);
         o->hide();
-        view_butt[13] = new Fl_Check_Button(2*WB, 2*WB+1*BH, BW, BH, "Show elements");
-        view_butt[14] = new Fl_Check_Button(2*WB, 2*WB+2*BH, BW, BH, "Show color bar");
-        view_butt[15] = new Fl_Check_Button(2*WB, 2*WB+3*BH, BW, BH, "Display time");
-        view_butt[16] = new Fl_Check_Button(2*WB, 2*WB+4*BH, BW, BH, "Transparent color bar");
-	view_butt[17] = new Fl_Check_Button(2*WB, 2*WB+5*BH, BW, BH, "Enable Lighting");
 
-	view_butt[27] = new Fl_Check_Button(2*WB, 2*WB+6*BH, BW, BH, "Smooth normals");	
+	view_input[0] = new Fl_Input(2*WB, 2*WB+1*BH, IW, BH, "Name");
+	view_input[1] = new Fl_Input(2*WB, 2*WB+2*BH, IW, BH, "Format");
+	for(i=0 ; i<2 ; i++){
+	  view_input[i]->labelsize(CTX.fontsize);
+	  view_input[i]->textsize(CTX.fontsize);
+	  view_input[i]->align(FL_ALIGN_RIGHT);
+	}
+
+        view_butt[13] = new Fl_Check_Button(2*WB, 2*WB+3*BH, BW, BH, "Show elements");
+        view_butt[14] = new Fl_Check_Button(2*WB, 2*WB+4*BH, BW, BH, "Show color bar");
+        view_butt[15] = new Fl_Check_Button(2*WB, 2*WB+5*BH, BW, BH, "Display time");
+        view_butt[16] = new Fl_Check_Button(2*WB, 2*WB+6*BH, BW, BH, "Transparent color bar");
+	view_butt[17] = new Fl_Check_Button(2*WB, 2*WB+7*BH, BW, BH, "Enable Lighting");
+
+	view_butt[27] = new Fl_Check_Button(2*WB, 2*WB+8*BH, BW, BH, "Smooth normals");	
 	view_butt[27]->type(FL_TOGGLE_BUTTON);
 	view_butt[27]->down_box(FL_DOWN_BOX);
 	view_butt[27]->labelsize(CTX.fontsize);
 	view_butt[27]->selection_color(FL_YELLOW);
 
-        view_butt[18] = new Fl_Check_Button(width/2, 2*WB+1*BH, BW, BH, "Draw points");
-        view_butt[19] = new Fl_Check_Button(width/2, 2*WB+2*BH, BW, BH, "Draw lines");
-        view_butt[20] = new Fl_Check_Button(width/2, 2*WB+3*BH, BW, BH, "Draw triangles");
-        view_butt[21] = new Fl_Check_Button(width/2, 2*WB+4*BH, BW, BH, "Draw tetrahedra");
+	view_value[11] = new Fl_Value_Input(width/2, 2*WB+ 1*BH, IW, BH, "Boundary");
+	view_value[11]->labelsize(CTX.fontsize);
+	view_value[11]->textsize(CTX.fontsize);
+	view_value[11]->type(FL_HORIZONTAL);
+	view_value[11]->align(FL_ALIGN_RIGHT);
+	view_value[11]->minimum(0); 
+	view_value[11]->step(1); 
+	view_value[11]->maximum(3); 
 
-        view_butt[22] = new Fl_Check_Button(width/2, 2*WB+5*BH, BW, BH, "Draw scalar values");
-        view_butt[23] = new Fl_Check_Button(width/2, 2*WB+6*BH, BW, BH, "Draw vector values");
-        view_butt[24] = new Fl_Check_Button(width/2, 2*WB+7*BH, BW, BH, "Draw tensor values");
+	view_value[12] = new Fl_Value_Input(width/2, 2*WB+ 2*BH, IW, BH, "Explode");
+	view_value[12]->labelsize(CTX.fontsize);
+	view_value[12]->textsize(CTX.fontsize);
+	view_value[12]->type(FL_HORIZONTAL);
+	view_value[12]->align(FL_ALIGN_RIGHT);
+	view_value[12]->minimum(0.); 
+	view_value[12]->step(0.01); 
+	view_value[12]->maximum(1.); 
+
+        view_butt[18] = new Fl_Check_Button(width/2, 2*WB+3*BH, BW, BH, "Draw points");
+        view_butt[19] = new Fl_Check_Button(width/2, 2*WB+4*BH, BW, BH, "Draw lines");
+        view_butt[20] = new Fl_Check_Button(width/2, 2*WB+5*BH, BW, BH, "Draw triangles");
+        view_butt[21] = new Fl_Check_Button(width/2, 2*WB+6*BH, BW, BH, "Draw tetrahedra");
+        view_butt[22] = new Fl_Check_Button(width/2, 2*WB+7*BH, BW, BH, "Draw scalar values");
+        view_butt[23] = new Fl_Check_Button(width/2, 2*WB+8*BH, BW, BH, "Draw vector values");
+        view_butt[24] = new Fl_Check_Button(width/2, 2*WB+9*BH, BW, BH, "Draw tensor values");
 	for(i=13 ; i<25 ; i++){
 	  view_butt[i]->type(FL_TOGGLE_BUTTON);
 	  view_butt[i]->down_box(FL_DOWN_BOX);
@@ -1973,14 +1999,6 @@ void GUI::create_view_options_window(int num){
 	  view_butt[i]->selection_color(FL_YELLOW);
 	}
 
-	view_input[0] = new Fl_Input(2*WB, 2*WB+7*BH, IW, BH, "Name");
-	view_input[1] = new Fl_Input(2*WB, 2*WB+8*BH, IW, BH, "Format");
-	for(i=0 ; i<2 ; i++){
-	  view_input[i]->labelsize(CTX.fontsize);
-	  view_input[i]->textsize(CTX.fontsize);
-	  view_input[i]->align(FL_ALIGN_RIGHT);
-	}
-
         o->end();
       }
       // Range
@@ -1988,7 +2006,7 @@ void GUI::create_view_options_window(int num){
 	Fl_Group *o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Range");
 	o->labelsize(CTX.fontsize);
 	o->hide();
-        view_butt[0] = new Fl_Check_Button(2*WB, 2*WB+1*BH, BW, BH, "Custom Range");
+        view_butt[0] = new Fl_Check_Button(2*WB, 2*WB+1*BH, BW, BH, "Custom range");
 	view_butt[0]->type(FL_TOGGLE_BUTTON);
 	view_butt[0]->down_box(FL_DOWN_BOX);
 	view_butt[0]->labelsize(CTX.fontsize);
@@ -2010,14 +2028,12 @@ void GUI::create_view_options_window(int num){
 	  view_butt[i]->labelsize(CTX.fontsize);
 	  view_butt[i]->selection_color(FL_YELLOW);
 	}
-	/// ADD JF - DOUBLE LOG SCALE
-	/// ADD JF - POSSIBILITY OF SATURATING VALUES
-	view_butt[26] = new Fl_Check_Button(2*WB, 2*WB+6*BH, BW, BH, "Double Logarithmic");
+	view_butt[26] = new Fl_Check_Button(2*WB, 2*WB+6*BH, BW, BH, "Double logarithmic");
 	view_butt[26]->type(FL_RADIO_BUTTON);
 	view_butt[26]->labelsize(CTX.fontsize);
 	view_butt[26]->selection_color(FL_YELLOW);
 
-        view_butt[25] = new Fl_Check_Button(2*WB, 2*WB+7*BH, BW, BH, "Saturate Values");
+        view_butt[25] = new Fl_Check_Button(2*WB, 2*WB+7*BH, BW, BH, "Saturate values");
 	view_butt[25]->type(FL_TOGGLE_BUTTON);
 	view_butt[25]->down_box(FL_DOWN_BOX);
 	view_butt[25]->labelsize(CTX.fontsize);
@@ -2048,14 +2064,6 @@ void GUI::create_view_options_window(int num){
 	  view_butt[i]->labelsize(CTX.fontsize);
 	  view_butt[i]->selection_color(FL_YELLOW);
 	}
-	view_value[11] = new Fl_Value_Input(2*WB, 2*WB+ 6*BH, IW, BH, "Boundary operator");
-	view_value[11]->labelsize(CTX.fontsize);
-	view_value[11]->textsize(CTX.fontsize);
-	view_value[11]->type(FL_HORIZONTAL);
-	view_value[11]->align(FL_ALIGN_RIGHT);
-	view_value[11]->minimum(0); 
-	view_value[11]->step(1); 
-	view_value[11]->maximum(3); 
         o->end();
       }
       // Offset and Raise
@@ -2206,11 +2214,13 @@ void GUI::update_view_window(int num){
     view_value[i]->maximum(v->CustomMax); 
   }
   opt_view_scale_type(num, GMSH_GUI, 0);
+  opt_view_saturate_values(num, GMSH_GUI, 0);
 
   // intervals
   opt_view_nb_iso(num, GMSH_GUI, 0);
   opt_view_intervals_type(num, GMSH_GUI, 0);
   opt_view_boundary(num, GMSH_GUI, 0);
+  opt_view_explode(num, GMSH_GUI, 0);
 
   // offset/raise
   opt_view_offset0(num, GMSH_GUI, 0);
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index 8c4a55445b0974dbf9183d17e4764be8f1587bd8..42b8ed55d704c1d19ecf6a53bf0b8df22b4952d8 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -50,20 +50,17 @@ void Draw_Post(void);
 void Draw_Scales(void);
 void Draw_Axes (double s);
 void Draw_SmallAxes(void);
-void Draw_Point(double *x, double *y, double *z,
-                double *Offset, double Raise[3][5]);
-void Draw_Line (double *x, double *y, double *z,
-                double *Offset, double Raise[3][5]);
+void Draw_Point(double *x, double *y, double *z, double Raise[3][5]);
+void Draw_Line (double *x, double *y, double *z, double Raise[3][5]);
 void Draw_Triangle (double *x, double *y, double *z,double *n,
-                    double *Offset, double Raise[3][5], int shade);
+                    double Raise[3][5], int shade);
 void Draw_Quadrangle (double *x, double *y, double *z, double *n,
-                      double *Offset, double Raise[3][5], int shade);
-void Draw_Polygon (int n, double *x, double *y, double *z,
-                   double *Offset, double Raise[3][5]);
+                      double Raise[3][5], int shade);
+void Draw_Polygon (int n, double *x, double *y, double *z, double Raise[3][5]);
 void Draw_Vector (int Type, int Fill,
                   double x, double y, double z,
                   double d, double dx, double dy, double dz,
-                  double *Offset, double Raise[3][5]);
+                  double Raise[3][5]);
 void Draw_Mesh_Volumes(void *a, void *b);
 void Draw_Mesh_Surfaces(void *a, void *b);
 void Draw_Mesh_Extruded_Surfaces(void *a, void *b);
diff --git a/Graphics/Entity.cpp b/Graphics/Entity.cpp
index 056b3856d3db2001dc5de3894bce42578bc7e045..81372d92ccfc94938ee1ee811f6b8ae30da02724 100644
--- a/Graphics/Entity.cpp
+++ b/Graphics/Entity.cpp
@@ -1,4 +1,4 @@
-// $Id: Entity.cpp,v 1.9 2001-07-30 18:34:26 geuzaine Exp $
+// $Id: Entity.cpp,v 1.10 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -12,12 +12,9 @@ extern Context_T   CTX;
 /*  D r a w _ P o i n t                                                     */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Point (double *x, double *y, double *z,
-                 double *Offset, double Raise[3][5]){
+void Draw_Point (double *x, double *y, double *z, double Raise[3][5]){
   glBegin(GL_POINTS);
-  glVertex3d(x[0]+Offset[0]+Raise[0][0],
-             y[0]+Offset[1]+Raise[1][0],
-             z[0]+Offset[2]+Raise[2][0]);
+  glVertex3d(x[0]+Raise[0][0], y[0]+Raise[1][0], z[0]+Raise[2][0]);
   glEnd();
 }
 
@@ -25,15 +22,10 @@ void Draw_Point (double *x, double *y, double *z,
 /*  D r a w _ L i n e                                                       */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Line (double *x, double *y, double *z,
-                double *Offset, double Raise[3][5]){
+void Draw_Line (double *x, double *y, double *z, double Raise[3][5]){
   glBegin(GL_LINES);
-  glVertex3d(x[0]+Offset[0]+Raise[0][0],
-             y[0]+Offset[1]+Raise[1][0],
-             z[0]+Offset[2]+Raise[2][0]);
-  glVertex3d(x[1]+Offset[0]+Raise[0][1],
-             y[1]+Offset[1]+Raise[1][1],
-             z[1]+Offset[2]+Raise[2][1]);
+  glVertex3d(x[0]+Raise[0][0], y[0]+Raise[1][0], z[0]+Raise[2][0]);
+  glVertex3d(x[1]+Raise[0][1], y[1]+Raise[1][1], z[1]+Raise[2][1]);
   glEnd();
 }
 
@@ -42,7 +34,7 @@ void Draw_Line (double *x, double *y, double *z,
 /* ------------------------------------------------------------------------ */
 
 void Draw_Triangle (double *x, double *y, double *z, double *n,
-                    double *Offset, double Raise[3][5], int shade){
+                    double Raise[3][5], int shade){
 
   double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3];
 
@@ -64,23 +56,17 @@ void Draw_Triangle (double *x, double *y, double *z, double *n,
       glNormal3dv(&n[0]);
   }
   
-  glVertex3d(x[0]+Offset[0]+Raise[0][0],
-             y[0]+Offset[1]+Raise[1][0],
-             z[0]+Offset[2]+Raise[2][0]);
+  glVertex3d(x[0]+Raise[0][0], y[0]+Raise[1][0], z[0]+Raise[2][0]);
 
   if (shade && n)
     glNormal3dv(&n[3]);
 
-  glVertex3d(x[1]+Offset[0]+Raise[0][1],
-             y[1]+Offset[1]+Raise[1][1],
-             z[1]+Offset[2]+Raise[2][1]);
+  glVertex3d(x[1]+Raise[0][1], y[1]+Raise[1][1], z[1]+Raise[2][1]);
 
   if (shade && n)
     glNormal3dv(&n[6]);
 
-  glVertex3d(x[2]+Offset[0]+Raise[0][2],
-             y[2]+Offset[1]+Raise[1][2],
-             z[2]+Offset[2]+Raise[2][2]);
+  glVertex3d(x[2]+Raise[0][2], y[2]+Raise[1][2], z[2]+Raise[2][2]);
   glEnd();
 
 }
@@ -90,7 +76,7 @@ void Draw_Triangle (double *x, double *y, double *z, double *n,
 /* ------------------------------------------------------------------------ */
 
 void Draw_Quadrangle (double *x, double *y, double *z, double *n,
-                      double *Offset, double Raise[3][5], int shade){
+                      double Raise[3][5], int shade){
 
   /*
     I think this gives better results
@@ -100,7 +86,7 @@ void Draw_Quadrangle (double *x, double *y, double *z, double *n,
   double y2[3]={y[2],y[3],y[0]};
   double z2[3]={z[2],z[3],z[0]};
 
-  Draw_Triangle(x,y,z,n,Offset,Raise,shade);
+  Draw_Triangle(x,y,z,n,Raise,shade);
   if (n){
     double n2[9]; 
     n2[0] = n[6];
@@ -112,10 +98,10 @@ void Draw_Quadrangle (double *x, double *y, double *z, double *n,
     n2[6] = n[0];
     n2[7] = n[1];
     n2[8] = n[2];
-    Draw_Triangle(x2,y2,z2,n2,Offset,Raise,shade);
+    Draw_Triangle(x2,y2,z2,n2,Raise,shade);
   }
   else
-    Draw_Triangle(x2,y2,z2,n,Offset,Raise,shade);
+    Draw_Triangle(x2,y2,z2,n,Raise,shade);
 
 }
 
@@ -124,13 +110,13 @@ void Draw_Quadrangle (double *x, double *y, double *z, double *n,
 /* ------------------------------------------------------------------------ */
 
 void Draw_Polygon (int n, double *x, double *y, double *z,
-                   double *Offset, double Raise[3][5]){
+                   double Raise[3][5]){
   int i;
   
   glBegin(GL_POLYGON);
-  for(i=0;i<n;i++) glVertex3d(x[i]+Offset[0]+Raise[0][i],
-                              y[i]+Offset[1]+Raise[1][i],
-                              z[i]+Offset[2]+Raise[2][i]);
+  for(i=0;i<n;i++) glVertex3d(x[i]+Raise[0][i],
+                              y[i]+Raise[1][i],
+                              z[i]+Raise[2][i]);
   glEnd();
 }
 
@@ -141,17 +127,17 @@ void Draw_Polygon (int n, double *x, double *y, double *z,
 void Draw_Vector (int Type, int Fill, 
                   double x, double y, double z, 
                   double d, double dx, double dy, double dz,
-                  double *Offset, double Raise[3][5]){
+                  double Raise[3][5]){
 
   double  n[3],t[3],u[3];
   double  l,b,c, f1, f2;
 
   if(d == 0.0) return;
   
-  if(Offset != NULL && Raise != NULL){
-    x += Offset[0]+Raise[0][0] ; 
-    y += Offset[1]+Raise[1][0] ; 
-    z += Offset[2]+Raise[2][0] ; 
+  if(Raise != NULL){
+    x += Raise[0][0] ; 
+    y += Raise[1][0] ; 
+    z += Raise[2][0] ; 
   }
 
   if(Type ==  DRAW_POST_SEGMENT){
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index a7dd9b9fdb0cd33ce446f299f068193f41a24e92..afff52aad3c7341b11ab8241e0e1b27411ca881c 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,4 +1,4 @@
-// $Id: Geom.cpp,v 1.24 2001-07-26 21:26:34 geuzaine Exp $
+// $Id: Geom.cpp,v 1.25 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -150,7 +150,7 @@ void Draw_Curve (void *a, void *b){
     dd = sqrt(dv.Pos.X*dv.Pos.X+dv.Pos.Y*dv.Pos.Y+dv.Pos.Z*dv.Pos.Z);
     glColor4ubv((GLubyte*)&CTX.color.geom.tangents);
     Draw_Vector(DRAW_POST_ARROW, 0, v.Pos.X,v.Pos.Y,v.Pos.Z,
-                dd, dv.Pos.X,dv.Pos.Y,dv.Pos.Z, NULL,NULL);
+                dd, dv.Pos.X,dv.Pos.Y,dv.Pos.Z, NULL);
   }
 
   if(CTX.render_mode == GMSH_SELECT){
@@ -365,7 +365,7 @@ void Draw_Plane_Surface (Surface *s){
     nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
     glColor4ubv((GLubyte*)&CTX.color.geom.normals);
     Draw_Vector(DRAW_POST_ARROW, 0, (vv2.Pos.X+vv1.Pos.X)/2., (vv2.Pos.Y+vv1.Pos.Y)/2., 
-                (vv2.Pos.Z+vv1.Pos.Z)/2., nn, n[0],n[1],n[2],NULL,NULL);
+                (vv2.Pos.Z+vv1.Pos.Z)/2., nn, n[0],n[1],n[2],NULL);
   }
 }
 
@@ -468,7 +468,7 @@ void Draw_NonPlane_Surface (Surface *s){
     nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
     glColor4ubv((GLubyte*)&CTX.color.geom.normals);
     Draw_Vector(DRAW_POST_ARROW, 0, n1.Pos.X, n1.Pos.Y, n1.Pos.Z,
-                nn, n[0],n[1],n[2],NULL,NULL);
+                nn, n[0],n[1],n[2],NULL);
   }
 
 }
diff --git a/Graphics/IsoSimplex.cpp b/Graphics/IsoSimplex.cpp
index 1bd7ee030ba6e4b7d76f7ef8725c1c219d42a96b..60c6fb0a161ff33d3385676efa82e2799b3d9b5b 100644
--- a/Graphics/IsoSimplex.cpp
+++ b/Graphics/IsoSimplex.cpp
@@ -141,7 +141,7 @@ void IsoSimplex( Post_View *View,
 		 int preproNormals,
 		 double *X, double *Y, double *Z, double *Val, 
 		 double V, double Vmin, double Vmax, 
-		 double *Offset, double Raise[3][5]){
+		 double Raise[3][5]){
   int    nb;
   double Xp[6],Yp[6],Zp[6],PVals[6];
   double norms[12];
@@ -196,8 +196,8 @@ void IsoSimplex( Post_View *View,
   if(preproNormals)return;
 
   if(nb == 3) 
-    Draw_Triangle(Xp,Yp,Zp,norms,Offset,Raise,View->Light);
+    Draw_Triangle(Xp,Yp,Zp,norms,Raise,View->Light);
   else if(nb == 4)
-    Draw_Quadrangle(Xp,Yp,Zp,norms,Offset,Raise,View->Light);  
+    Draw_Quadrangle(Xp,Yp,Zp,norms,Raise,View->Light);  
 }
 
diff --git a/Graphics/IsoSimplex.h b/Graphics/IsoSimplex.h
index 79fc9e3f00230e7285d7b7bf8b59a5b099c8c4ee..31eaab57bb85899a519faf4c8b49817c96be3001 100644
--- a/Graphics/IsoSimplex.h
+++ b/Graphics/IsoSimplex.h
@@ -6,5 +6,5 @@ void IsoSimplex (Post_View *View,
 		 int preproNormals,
 		 double *X, double *Y, double *Z, double *Val,
                  double V, double Vmin, double Vmax,
-                 double *Offset, double Raise[3][5]);
+                 double Raise[3][5]);
 #endif
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index e92bc6a66a0c7c72143af0367755b73acc2a4c52..0edb41b324e0e9abdc5adee2eeeaa1dcbd403dbe 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.36 2001-08-03 10:02:32 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.37 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -547,7 +547,7 @@ void Draw_Simplex_Surfaces (void *a, void *b){
     m[1] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[1] ;
     m[2] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[2] ;
     mm=sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);
-    Draw_Vector(DRAW_POST_ARROW, 0, Xc,Yc,Zc, mm, m[0],m[1],m[2],NULL,NULL);
+    Draw_Vector(DRAW_POST_ARROW, 0, Xc,Yc,Zc, mm, m[0],m[1],m[2],NULL);
   }
   
 
diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp
index 42e00fcc8b74f6b09fdf83382079ab6c0e7fe10b..498cafeaffbb231f1870c35a02fb3a85a059dd65 100644
--- a/Graphics/Post.cpp
+++ b/Graphics/Post.cpp
@@ -1,4 +1,4 @@
-// $Id: Post.cpp,v 1.21 2001-07-31 06:11:24 geuzaine Exp $
+// $Id: Post.cpp,v 1.22 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -102,9 +102,40 @@ void Free_DisplayLists(void){
   }
 }
 
+void Get_Coords(double Explode, double *Offset, int nbnod, 
+		double *x1, double *y1, double *z1, 
+		double *x2, double *y2, double *z2){
+  int i;
+  double xc=0., yc=0., zc=0.;
+
+  if(Explode==1){
+    for(i=0; i<nbnod; i++){
+      x2[i] = x1[i]+Offset[0];
+      y2[i] = y1[i]+Offset[1];
+      z2[i] = z1[i]+Offset[2];
+    }
+  }
+  else{
+    for(i=0; i<nbnod; i++){
+      xc += x1[i];
+      yc += y1[i];
+      zc += z1[i];
+    }
+    xc /= (double)nbnod;
+    yc /= (double)nbnod;
+    zc /= (double)nbnod;
+    for(i=0; i<nbnod; i++){
+      x2[i] = xc + Explode * (x1[i]-xc) + Offset[0];
+      y2[i] = yc + Explode * (y1[i]-yc) + Offset[1];
+      z2[i] = zc + Explode * (z1[i]-zc) + Offset[2];
+    }
+  }
+}
+
+
 void Draw_Post (void) {
   int            iView,i,j,k,nb;
-  double         ValMin,ValMax,AbsMax;
+  double         ValMin,ValMax,AbsMax,X[4],Y[4],Z[4];
   Post_View     *v;
 
   if(!Post_ViewList) return;
@@ -214,60 +245,78 @@ void Draw_Post (void) {
 
 	if(v->NbSP && v->DrawPoints && v->DrawScalars){
 	  nb = List_Nbr(v->SP) / v->NbSP ;
-	  for(i = 0 ; i < List_Nbr(v->SP) ; i+=nb)
-	    Draw_ScalarPoint(v, ValMin, ValMax, Raise,
-			     (double*)List_Pointer_Fast(v->SP,i),
-			     (double*)List_Pointer_Fast(v->SP,i+1),
-			     (double*)List_Pointer_Fast(v->SP,i+2),
+	  for(i = 0 ; i < List_Nbr(v->SP) ; i+=nb){
+	    Get_Coords(1., v->Offset, 1, 
+		       (double*)List_Pointer_Fast(v->SP,i), 
+		       (double*)List_Pointer_Fast(v->SP,i+1), 
+		       (double*)List_Pointer_Fast(v->SP,i+2), 
+		       X, Y, Z);
+	    Draw_ScalarPoint(v, ValMin, ValMax, Raise, X, Y, Z,
 			     (double*)List_Pointer_Fast(v->SP,i+3));
+	  }
 	}
 	if(v->NbVP && v->DrawPoints && v->DrawVectors){
 	  nb = List_Nbr(v->VP) / v->NbVP ;
-	  for(i = 0 ; i < List_Nbr(v->VP) ; i+=nb)
-	    Draw_VectorPoint(v, ValMin, ValMax, Raise,
-			     (double*)List_Pointer_Fast(v->VP,i),
-			     (double*)List_Pointer_Fast(v->VP,i+1),
-			     (double*)List_Pointer_Fast(v->VP,i+2),
+	  for(i = 0 ; i < List_Nbr(v->VP) ; i+=nb){
+	    Get_Coords(1., v->Offset, 1, 
+		       (double*)List_Pointer_Fast(v->VP,i), 
+		       (double*)List_Pointer_Fast(v->VP,i+1), 
+		       (double*)List_Pointer_Fast(v->VP,i+2), 
+		       X, Y, Z);
+	    Draw_VectorPoint(v, ValMin, ValMax, Raise, X, Y, Z,
 			     (double*)List_Pointer_Fast(v->VP,i+3));
+	  }
 	}
 	if(v->NbTP && v->DrawPoints && v->DrawTensors){
 	  nb = List_Nbr(v->TP) / v->NbTP ;
-	  for(i = 0 ; i < List_Nbr(v->TP) ; i+=nb)
-	    Draw_TensorPoint(v, ValMin, ValMax, Raise,
-			     (double*)List_Pointer_Fast(v->TP,i),
-			     (double*)List_Pointer_Fast(v->TP,i+1),
-			     (double*)List_Pointer_Fast(v->TP,i+2),
+	  for(i = 0 ; i < List_Nbr(v->TP) ; i+=nb){
+	    Get_Coords(1., v->Offset, 1, 
+		       (double*)List_Pointer_Fast(v->TP,i), 
+		       (double*)List_Pointer_Fast(v->TP,i+1), 
+		       (double*)List_Pointer_Fast(v->TP,i+2), 
+		       X, Y, Z);
+	    Draw_TensorPoint(v, ValMin, ValMax, Raise, X, Y, Z,
 			     (double*)List_Pointer_Fast(v->TP,i+3));
+	  }
 	}
 
 	// Lines
 	
 	if(v->NbSL && v->DrawLines && v->DrawScalars){
 	  nb = List_Nbr(v->SL) / v->NbSL ;
-	  for(i = 0 ; i < List_Nbr(v->SL) ; i+=nb)
-	    Draw_ScalarLine(v, ValMin, ValMax, Raise,
-			    (double*)List_Pointer_Fast(v->SL,i),
-			    (double*)List_Pointer_Fast(v->SL,i+2),
-			    (double*)List_Pointer_Fast(v->SL,i+4),
+	  for(i = 0 ; i < List_Nbr(v->SL) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 2, 
+		       (double*)List_Pointer_Fast(v->SL,i), 
+		       (double*)List_Pointer_Fast(v->SL,i+2), 
+		       (double*)List_Pointer_Fast(v->SL,i+4), 
+		       X, Y, Z);
+	    Draw_ScalarLine(v, ValMin, ValMax, Raise, X, Y, Z,
 			    (double*)List_Pointer_Fast(v->SL,i+6));
+	  }
 	}
 	if(v->NbVL && v->DrawLines && v->DrawVectors){
 	  nb = List_Nbr(v->VL) / v->NbVL ;
-	  for(i = 0 ; i < List_Nbr(v->VL) ; i+=nb)
-	    Draw_VectorLine(v, ValMin, ValMax, Raise,
-			    (double*)List_Pointer_Fast(v->VL,i),
-			    (double*)List_Pointer_Fast(v->VL,i+2),
-			    (double*)List_Pointer_Fast(v->VL,i+4),
+	  for(i = 0 ; i < List_Nbr(v->VL) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 2, 
+		       (double*)List_Pointer_Fast(v->VL,i),
+		       (double*)List_Pointer_Fast(v->VL,i+2),
+		       (double*)List_Pointer_Fast(v->VL,i+4),
+		       X, Y, Z);
+	    Draw_VectorLine(v, ValMin, ValMax, Raise, X, Y, Z,
 			    (double*)List_Pointer_Fast(v->VL,i+6));
+	  }
 	}
 	if(v->NbTL && v->DrawLines && v->DrawTensors){
 	  nb = List_Nbr(v->TL) / v->NbTL ;
-	  for(i = 0 ; i < List_Nbr(v->TL) ; i+=nb)
-	    Draw_VectorLine(v, ValMin, ValMax, Raise,
-			    (double*)List_Pointer_Fast(v->TL,i),
-			    (double*)List_Pointer_Fast(v->TL,i+2),
-			    (double*)List_Pointer_Fast(v->TL,i+4),
+	  for(i = 0 ; i < List_Nbr(v->TL) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 2, 
+		       (double*)List_Pointer_Fast(v->TL,i), 
+		       (double*)List_Pointer_Fast(v->TL,i+2), 
+		       (double*)List_Pointer_Fast(v->TL,i+4), 
+		       X, Y, Z);
+	    Draw_TensorLine(v, ValMin, ValMax, Raise, X, Y, Z,
 			    (double*)List_Pointer_Fast(v->TL,i+6));
+	  }
 	}
 	
 	// Triangles
@@ -276,37 +325,49 @@ void Draw_Post (void) {
 	  nb = List_Nbr(v->ST) / v->NbST ;
 	  if(v->Light && v->SmoothNormals && v->Changed && v->IntervalsType != DRAW_POST_ISO){
 	    Msg(DEBUG, "Preprocessing of triangle normals in view %d", v->Num);
-	    for(i = 0 ; i < List_Nbr(v->ST) ; i+=nb)
-	      Draw_ScalarTriangle(v, 1, ValMin, ValMax, Raise,
-				  (double*)List_Pointer_Fast(v->ST,i),
-				  (double*)List_Pointer_Fast(v->ST,i+3),
-				  (double*)List_Pointer_Fast(v->ST,i+6),
+	    for(i = 0 ; i < List_Nbr(v->ST) ; i+=nb){
+	      Get_Coords(v->Explode, v->Offset, 3, 
+			 (double*)List_Pointer_Fast(v->ST,i), 
+			 (double*)List_Pointer_Fast(v->ST,i+3), 
+			 (double*)List_Pointer_Fast(v->ST,i+6), 
+			 X, Y, Z);
+	      Draw_ScalarTriangle(v, 1, ValMin, ValMax, Raise, X, Y, Z,
 				  (double*)List_Pointer_Fast(v->ST,i+9));
+	    }
 	  }
-	  for(i = 0 ; i < List_Nbr(v->ST) ; i+=nb)
-	    Draw_ScalarTriangle(v, 0, ValMin, ValMax, Raise,
-				(double*)List_Pointer_Fast(v->ST,i),
-				(double*)List_Pointer_Fast(v->ST,i+3),
-				(double*)List_Pointer_Fast(v->ST,i+6),
+	  for(i = 0 ; i < List_Nbr(v->ST) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 3, 
+		       (double*)List_Pointer_Fast(v->ST,i), 
+		       (double*)List_Pointer_Fast(v->ST,i+3), 
+		       (double*)List_Pointer_Fast(v->ST,i+6), 
+		       X, Y, Z);
+	    Draw_ScalarTriangle(v, 0, ValMin, ValMax, Raise, X, Y, Z,
 				(double*)List_Pointer_Fast(v->ST,i+9));
+	  }
 	}
 	if(v->NbVT && v->DrawTriangles && v->DrawVectors){
 	  nb = List_Nbr(v->VT) / v->NbVT ;
-	  for(i = 0 ; i < List_Nbr(v->VT) ; i+=nb)
-	    Draw_VectorTriangle(v, ValMin, ValMax, Raise,
-				(double*)List_Pointer_Fast(v->VT,i),
-				(double*)List_Pointer_Fast(v->VT,i+3),
-				(double*)List_Pointer_Fast(v->VT,i+6),
+	  for(i = 0 ; i < List_Nbr(v->VT) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 3, 
+		       (double*)List_Pointer_Fast(v->VT,i),
+		       (double*)List_Pointer_Fast(v->VT,i+3),
+		       (double*)List_Pointer_Fast(v->VT,i+6),
+		       X, Y, Z);
+	    Draw_VectorTriangle(v, ValMin, ValMax, Raise, X, Y, Z,
 				(double*)List_Pointer_Fast(v->VT,i+9));
+	  }
 	}
 	if(v->NbTT && v->DrawTriangles && v->DrawTensors){
 	  nb = List_Nbr(v->TT) / v->NbTT ;
-	  for(i = 0 ; i < List_Nbr(v->TT) ; i+=nb)
-	    Draw_TensorTriangle(v, ValMin, ValMax, Raise,
-				(double*)List_Pointer_Fast(v->TT,i),
-				(double*)List_Pointer_Fast(v->TT,i+3),
-				(double*)List_Pointer_Fast(v->TT,i+6),
+	  for(i = 0 ; i < List_Nbr(v->TT) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 3, 
+		       (double*)List_Pointer_Fast(v->TT,i), 
+		       (double*)List_Pointer_Fast(v->TT,i+3), 
+		       (double*)List_Pointer_Fast(v->TT,i+6), 
+		       X, Y, Z);
+	    Draw_TensorTriangle(v, ValMin, ValMax, Raise, X, Y, Z,
 				(double*)List_Pointer_Fast(v->TT,i+9));
+	  }
 	}
 	
 	// Tetrahedra
@@ -315,37 +376,49 @@ void Draw_Post (void) {
 	  nb = List_Nbr(v->SS) / v->NbSS ;
 	  if(v->Light && v->SmoothNormals && v->Changed && v->IntervalsType != DRAW_POST_ISO){
 	    Msg(DEBUG, "Preprocessing of tets normals in view %d", v->Num);
-	    for(i = 0 ; i < List_Nbr(v->SS) ; i+=nb)
-	      Draw_ScalarTetrahedron(v, 1, ValMin, ValMax, Raise,
-				     (double*)List_Pointer_Fast(v->SS,i),
-				     (double*)List_Pointer_Fast(v->SS,i+4),
-				     (double*)List_Pointer_Fast(v->SS,i+8),
+	    for(i = 0 ; i < List_Nbr(v->SS) ; i+=nb){
+	      Get_Coords(v->Explode, v->Offset, 4, 
+			 (double*)List_Pointer_Fast(v->SS,i), 
+			 (double*)List_Pointer_Fast(v->SS,i+4), 
+			 (double*)List_Pointer_Fast(v->SS,i+8), 
+			 X, Y, Z);
+	      Draw_ScalarTetrahedron(v, 1, ValMin, ValMax, Raise, X, Y, Z,
 				     (double*)List_Pointer_Fast(v->SS,i+12));
+	    }
 	  }
-	  for(i = 0 ; i < List_Nbr(v->SS) ; i+=nb)
-	    Draw_ScalarTetrahedron(v, 0, ValMin, ValMax, Raise,
-				   (double*)List_Pointer_Fast(v->SS,i),
-				   (double*)List_Pointer_Fast(v->SS,i+4),
-				   (double*)List_Pointer_Fast(v->SS,i+8),
+	  for(i = 0 ; i < List_Nbr(v->SS) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 4, 
+		       (double*)List_Pointer_Fast(v->SS,i), 
+		       (double*)List_Pointer_Fast(v->SS,i+4), 
+		       (double*)List_Pointer_Fast(v->SS,i+8), 
+		       X, Y, Z);
+	    Draw_ScalarTetrahedron(v, 0, ValMin, ValMax, Raise, X, Y, Z,
 				   (double*)List_Pointer_Fast(v->SS,i+12));
+	  }
 	}
 	if(v->NbVS && v->DrawTetrahedra && v->DrawVectors){
 	  nb = List_Nbr(v->VS) / v->NbVS ;
-	  for(i = 0 ; i < List_Nbr(v->VS) ; i+=nb)
-	    Draw_VectorTetrahedron(v, ValMin, ValMax, Raise,
-				   (double*)List_Pointer_Fast(v->VS,i),
-				   (double*)List_Pointer_Fast(v->VS,i+4),
-				   (double*)List_Pointer_Fast(v->VS,i+8),
+	  for(i = 0 ; i < List_Nbr(v->VS) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 4,
+		       (double*)List_Pointer_Fast(v->VS,i), 
+		       (double*)List_Pointer_Fast(v->VS,i+4), 
+		       (double*)List_Pointer_Fast(v->VS,i+8), 
+		       X, Y, Z);
+	    Draw_VectorTetrahedron(v, ValMin, ValMax, Raise, X, Y, Z,
 				   (double*)List_Pointer_Fast(v->VS,i+12));
+	  }
 	}
 	if(v->NbTS && v->DrawTetrahedra && v->DrawTensors){
 	  nb = List_Nbr(v->TS) / v->NbTS ;
-	  for(i = 0 ; i < List_Nbr(v->TS) ; i+=nb)
-	    Draw_TensorTetrahedron(v, ValMin, ValMax, Raise,
-				   (double*)List_Pointer_Fast(v->TS,i),
-				   (double*)List_Pointer_Fast(v->TS,i+4),
-				   (double*)List_Pointer_Fast(v->TS,i+8),
+	  for(i = 0 ; i < List_Nbr(v->TS) ; i+=nb){
+	    Get_Coords(v->Explode, v->Offset, 4,
+		       (double*)List_Pointer_Fast(v->TS,i), 
+		       (double*)List_Pointer_Fast(v->TS,i+4), 
+		       (double*)List_Pointer_Fast(v->TS,i+8), 
+		       X, Y, Z);
+	    Draw_TensorTetrahedron(v, ValMin, ValMax, Raise, X, Y, Z,
 				   (double*)List_Pointer_Fast(v->TS,i+12));
+	  }
 	}
 
 
diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp
index b5b9b9197ecbc5512e7732c702d531b422ea6aa0..1121693de4ce14d29fff2ab39f534cee394c406f 100644
--- a/Graphics/PostSimplex.cpp
+++ b/Graphics/PostSimplex.cpp
@@ -1,4 +1,4 @@
-// $Id: PostSimplex.cpp,v 1.25 2001-08-03 19:40:01 geuzaine Exp $
+// $Id: PostSimplex.cpp,v 1.26 2001-08-03 21:27:20 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -11,32 +11,30 @@
 
 extern Context_T   CTX;
 
-void Draw_Simplex(int dim, double *X, double *Y, double *Z,
-		  double *Offset, double Raise[3][5]){
+void Draw_Simplex(int nbnod, double *X, double *Y, double *Z,
+		  double Raise[3][5]){
   int k;
   double xx[4], yy[4], zz[4];
 
   glColor4ubv((GLubyte*)&CTX.color.fg);
-  switch(dim){
-  case 0 :
-    Draw_Point(X,Y,Z,Offset,Raise);
-    break;
+  switch(nbnod){
   case 1 :
-    Draw_Line(X,Y,Z,Offset,Raise);
+    Draw_Point(X,Y,Z,Raise);
     break;
   case 2 :
+    Draw_Line(X,Y,Z,Raise);
+    break;
+  case 3 :
     glBegin(GL_LINE_LOOP);
     for(k=0 ; k<3 ; k++) 
-      glVertex3d(X[k]+Offset[0]+Raise[0][k],
-		 Y[k]+Offset[1]+Raise[1][k],
-		 Z[k]+Offset[2]+Raise[2][k]);
+      glVertex3d(X[k]+Raise[0][k], Y[k]+Raise[1][k], Z[k]+Raise[2][k]);
     glEnd();
     break;
-  case 3 :
+  case 4 :
     for(k=0 ; k<4 ; k++){
-      xx[k] = X[k]+Offset[0]+Raise[0][k] ;
-      yy[k] = Y[k]+Offset[1]+Raise[1][k] ;
-      zz[k] = Z[k]+Offset[2]+Raise[2][k] ;
+      xx[k] = X[k]+Raise[0][k] ;
+      yy[k] = Y[k]+Raise[1][k] ;
+      zz[k] = Z[k]+Raise[2][k] ;
     }
     glBegin(GL_LINES);
     glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[1], yy[1], zz[1]);
@@ -72,19 +70,17 @@ void Draw_ScalarPoint(Post_View *View,
 
   RaiseFill(0, d, ValMin, Raise);
 
-  if(View->ShowElement) Draw_Simplex(0,X,Y,Z,View->Offset,Raise);
+  if(View->ShowElement) Draw_Simplex(1,X,Y,Z,Raise);
 
   if(d>=ValMin && d<=ValMax){      
     Palette2(View,ValMin,ValMax,d);
     if(View->IntervalsType == DRAW_POST_NUMERIC){
-      glRasterPos3d(X[0]+Raise[0][0]+View->Offset[0],
-		    Y[0]+Raise[1][0]+View->Offset[1],
-		    Z[0]+Raise[2][0]+View->Offset[2]);
+      glRasterPos3d(X[0]+Raise[0][0], Y[0]+Raise[1][0], Z[0]+Raise[2][0]);
       sprintf(Num, View->Format, d);
       Draw_String(Num);
     }
     else
-      Draw_Point(X,Y,Z,View->Offset,Raise);
+      Draw_Point(X,Y,Z,Raise);
   }
 }
 
@@ -126,7 +122,7 @@ void Draw_ScalarLine(Post_View *View,
   for(k=0 ; k<2 ; k++)
     RaiseFill(k, Val[k], ValMin, Raise);
 
-  if(View->ShowElement) Draw_Simplex(1,X,Y,Z,View->Offset,Raise);
+  if(View->ShowElement) Draw_Simplex(2,X,Y,Z,Raise);
 
   if(View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -135,9 +131,9 @@ void Draw_ScalarLine(Post_View *View,
     if(d >= ValMin && d <= ValMax){
       Palette2(View,ValMin,ValMax,d);
       sprintf(Num, View->Format, d);
-      glRasterPos3d((X[0]+Raise[0][0] + X[1]+Raise[0][1])/2. + View->Offset[0],
-		    (Y[0]+Raise[1][0] + Y[1]+Raise[1][1])/2. + View->Offset[1],
-		    (Z[0]+Raise[2][0] + Z[1]+Raise[2][1])/2. + View->Offset[2]);
+      glRasterPos3d((X[0]+Raise[0][0] + X[1]+Raise[0][1])/2.,
+		    (Y[0]+Raise[1][0] + Y[1]+Raise[1][1])/2.,
+		    (Z[0]+Raise[2][0] + Z[1]+Raise[2][1])/2.);
       Draw_String(Num);
     }
 
@@ -150,13 +146,9 @@ void Draw_ScalarLine(Post_View *View,
          Val[1] >= ValMin && Val[1] <= ValMax){
 	glBegin(GL_LINES);
 	Palette2(View,ValMin,ValMax,Val[0]);
-	glVertex3d(X[0]+View->Offset[0]+Raise[0][0],
-		   Y[0]+View->Offset[1]+Raise[1][0],
-		   Z[0]+View->Offset[2]+Raise[2][0]);
+	glVertex3d(X[0]+Raise[0][0], Y[0]+Raise[1][0], Z[0]+Raise[2][0]);
 	Palette2(View,ValMin,ValMax,Val[1]);
-	glVertex3d(X[1]+View->Offset[0]+Raise[0][1],
-		   Y[1]+View->Offset[1]+Raise[1][1],
-		   Z[1]+View->Offset[2]+Raise[2][1]);
+	glVertex3d(X[1]+Raise[0][1], Y[1]+Raise[1][1], Z[1]+Raise[2][1]);
 	glEnd();
       }
       else{
@@ -174,7 +166,7 @@ void Draw_ScalarLine(Post_View *View,
 		    ValMin,ValMax,Xp,Yp,Zp,&nb,value);    
 	  if(nb == 2){
 	    for(i=0;i<2;i++) RaiseFill(i,value[i],ValMin,Raise);    
-	    Draw_Line(Xp,Yp,Zp,View->Offset,Raise);  
+	    Draw_Line(Xp,Yp,Zp,Raise);  
 	  }
 	}
 	else{
@@ -183,7 +175,7 @@ void Draw_ScalarLine(Post_View *View,
 		    thev, ValMin,ValMax,Xp,Yp,Zp,&nb);    
 	  if(nb){
 	    RaiseFill(0,thev,ValMin,Raise);
-	    Draw_Point(Xp,Yp,Zp,View->Offset,Raise);    
+	    Draw_Point(Xp,Yp,Zp,Raise);    
 	  }
 	}
       }
@@ -279,7 +271,7 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
 
   if(preproNormals) return;
 
-  if(View->ShowElement) Draw_Simplex(2,X,Y,Z,View->Offset,Raise);
+  if(View->ShowElement) Draw_Simplex(3,X,Y,Z,Raise);
 
   if(View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -287,12 +279,9 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
     if(d >= ValMin && d <= ValMax){
       Palette2(View,ValMin,ValMax,d);
       sprintf(Num, View->Format, d);
-      glRasterPos3d( (X[0]+Raise[0][0] + X[1]+Raise[0][1] + X[2]+Raise[0][2])/3. + 
-		     View->Offset[0],
-		     (Y[0]+Raise[1][0] + Y[1]+Raise[1][1] + Y[2]+Raise[1][2])/3. +
-		     View->Offset[1],
-		     (Z[0]+Raise[2][0] + Z[1]+Raise[2][1] + Z[2]+Raise[2][2])/3. + 
-		     View->Offset[2] );
+      glRasterPos3d( (X[0]+Raise[0][0] + X[1]+Raise[0][1] + X[2]+Raise[0][2])/3.,
+		     (Y[0]+Raise[1][0] + Y[1]+Raise[1][1] + Y[2]+Raise[1][2])/3.,
+		     (Z[0]+Raise[2][0] + Z[1]+Raise[2][1] + Z[2]+Raise[2][2])/3.);
       Draw_String(Num);
     }
 
@@ -306,19 +295,13 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
         glBegin(GL_TRIANGLES);
 	Palette2(View,ValMin,ValMax,Val[0]);
 	glNormal3dv(&norms[0]);
-        glVertex3d(X[0]+View->Offset[0]+Raise[0][0],
-                   Y[0]+View->Offset[1]+Raise[1][0],
-                   Z[0]+View->Offset[2]+Raise[2][0]);
+        glVertex3d(X[0]+Raise[0][0], Y[0]+Raise[1][0], Z[0]+Raise[2][0]);
 	Palette2(View,ValMin,ValMax,Val[1]);
 	glNormal3dv(&norms[3]);
-        glVertex3d(X[1]+View->Offset[0]+Raise[0][1],
-                   Y[1]+View->Offset[1]+Raise[1][1],
-                   Z[1]+View->Offset[2]+Raise[2][1]);
+        glVertex3d(X[1]+Raise[0][1], Y[1]+Raise[1][1], Z[1]+Raise[2][1]);
 	Palette2(View,ValMin,ValMax,Val[2]);
 	glNormal3dv(&norms[6]);
-        glVertex3d(X[2]+View->Offset[0]+Raise[0][2],
-                   Y[2]+View->Offset[1]+Raise[1][2],
-                   Z[2]+View->Offset[2]+Raise[2][2]);
+        glVertex3d(X[2]+Raise[0][2], Y[2]+Raise[1][2], Z[2]+Raise[2][2]);
         glEnd();
       }
       else{
@@ -330,9 +313,7 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
           for(i=0 ; i<nb ; i++){
 	    Palette2(View,ValMin,ValMax,value[i]);
             RaiseFill(i,value[i],ValMin,Raise);
-            glVertex3d(Xp[i]+View->Offset[0]+Raise[0][i],
-                       Yp[i]+View->Offset[1]+Raise[1][i],
-                       Zp[i]+View->Offset[2]+Raise[2][i]);
+            glVertex3d(Xp[i]+Raise[0][i], Yp[i]+Raise[1][i], Zp[i]+Raise[2][i]);
           }
           glEnd();
         }
@@ -349,7 +330,7 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
                         Xp,Yp,Zp,&nb,value);      
           if(nb >= 3){
             for(i=0 ; i<nb ; i++) RaiseFill(i,value[i],ValMin,Raise);    
-            Draw_Polygon(nb,Xp,Yp,Zp,View->Offset,Raise);  
+            Draw_Polygon(nb,Xp,Yp,Zp,Raise);  
           }
         }
         else{
@@ -359,7 +340,7 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
                         thev, ValMin,ValMax,Xp,Yp,Zp,&nb);        
           if(nb == 2){
             for(i=0 ; i<2 ; i++) RaiseFill(i,thev,ValMin,Raise);
-            Draw_Line(Xp,Yp,Zp,View->Offset,Raise);    
+            Draw_Line(Xp,Yp,Zp,Raise);    
           }
         }
       }
@@ -413,7 +394,7 @@ void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
   for(k=0 ; k<4 ; k++)
     RaiseFill(k, Val[k], ValMin, Raise);
 
-  if(!preproNormals && View->ShowElement) Draw_Simplex(3,X,Y,Z,View->Offset,Raise);
+  if(!preproNormals && View->ShowElement) Draw_Simplex(4,X,Y,Z,Raise);
 
   if(!preproNormals && View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -422,11 +403,11 @@ void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
       Palette2(View,ValMin,ValMax,d);
       sprintf(Num, View->Format, d);
       glRasterPos3d(0.25 * (X[0]+Raise[0][0] + X[1]+Raise[0][1] + 
-			    X[2]+Raise[0][2] + X[3]+Raise[0][3]) + View->Offset[0],
+			    X[2]+Raise[0][2] + X[3]+Raise[0][3]),
 		    0.25 * (Y[0]+Raise[1][0] + Y[1]+Raise[1][1] + 
-			    Y[2]+Raise[1][2] + Y[3]+Raise[1][3]) + View->Offset[1],
+			    Y[2]+Raise[1][2] + Y[3]+Raise[1][3]),
 		    0.25 * (Z[0]+Raise[2][0] + Z[1]+Raise[2][1] + 
-			    Z[2]+Raise[2][2] + Z[3]+Raise[2][3]) + View->Offset[2]);
+			    Z[2]+Raise[2][2] + Z[3]+Raise[2][3]));
       Draw_String(Num);
     }
 
@@ -436,7 +417,7 @@ void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
       if(!preproNormals) Palette(View,View->NbIso,k);
       IsoSimplex(View, preproNormals, X, Y, Z, Val,
 		 View->GVFI(ValMin,ValMax,View->NbIso,k), 
-		 ValMin, ValMax, View->Offset, Raise);
+		 ValMin, ValMax, Raise);
     }
 
   }
@@ -467,9 +448,9 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
 
     fact = View->ArrowScale/50. ;
     for(k=0 ; k<nbnod ; k++){
-      xx[k] = X[k] + fact * Val[k][0] + Raise[0][k] + View->Offset[0];
-      yy[k] = Y[k] + fact * Val[k][1] + Raise[1][k] + View->Offset[1];
-      zz[k] = Z[k] + fact * Val[k][2] + Raise[2][k] + View->Offset[2];
+      xx[k] = X[k] + fact * Val[k][0] + Raise[0][k];
+      yy[k] = Y[k] + fact * Val[k][1] + Raise[1][k];
+      zz[k] = Z[k] + fact * Val[k][2] + Raise[2][k];
     }
 
     switch(nbnod){
@@ -486,9 +467,9 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
 	  dz = V[3*(View->TimeStep-j)+2];
 	  dd = sqrt(dx*dx+dy*dy+dz*dz);
 	  Palette2(View,ValMin,ValMax,dd);
-	  glVertex3d(X[0] + fact*dx + Raise[0][0] + View->Offset[0],
-		     Y[0] + fact*dy + Raise[1][0] + View->Offset[1],
-		     Z[0] + fact*dz + Raise[2][0] + View->Offset[2]);
+	  glVertex3d(X[0] + fact*dx + Raise[0][0],
+		     Y[0] + fact*dy + Raise[1][0],
+		     Z[0] + fact*dz + Raise[2][0]);
 	}
 	glEnd();
       }
@@ -500,7 +481,7 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
     return;
   }
 
-  if(View->ShowElement) Draw_Simplex(nbnod-1,X,Y,Z,View->Offset,Raise);
+  if(View->ShowElement) Draw_Simplex(nbnod,X,Y,Z,Raise);
 
   if(View->ArrowLocation == DRAW_POST_LOCATE_COG ||
      View->IntervalsType == DRAW_POST_NUMERIC){
@@ -516,9 +497,7 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
     if(dd!=0.0 && dd>=ValMin && dd<=ValMax){             
       Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,dd));            
       if(View->IntervalsType == DRAW_POST_NUMERIC){
-	glRasterPos3d(xc + View->Offset[0],
-		      yc + View->Offset[1],
-		      zc + View->Offset[2]);
+	glRasterPos3d(xc, yc, zc);
 	sprintf(Num, View->Format, dd);
 	Draw_String(Num);
       }
@@ -531,8 +510,7 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
 	}
 	RaiseFill(0, dd, ValMin, Raise);         
 	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-		    xc, yc, zc, fact*dd, fact*dx, fact*dy, fact*dz,
-		    View->Offset, Raise);
+		    xc, yc, zc, fact*dd, fact*dx, fact*dy, fact*dz, Raise);
       }
     }
   }
@@ -549,8 +527,7 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
 	RaiseFill(0, d[k], ValMin, Raise);         
 	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
 		    X[k], Y[k], Z[k],
-		    fact*d[k], fact*Val[k][0], fact*Val[k][1], fact*Val[k][2],
-		    View->Offset, Raise);
+		    fact*d[k], fact*Val[k][0], fact*Val[k][1], fact*Val[k][2], Raise);
       }               
     }       
   }