diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index baf21464593c4e3039606574d42c84d8b4e185d0..06e01ff4b7f2fc53710c2297e2643b874fa1c845 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.67 2004-03-04 23:08:31 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.68 2004-04-18 03:12:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -268,7 +268,10 @@ void Draw_Mesh_Points(void *a, void *b)
     glPushName(v->Num);
   }
 
-  glColor4ubv((GLubyte *) & CTX.color.mesh.vertex);
+  if(v->Degree == 2)
+    glColor4ubv((GLubyte *) & CTX.color.mesh.vertex_deg2);
+  else
+    glColor4ubv((GLubyte *) & CTX.color.mesh.vertex);
 
   if(CTX.mesh.points) {
     if(CTX.mesh.point_type) {
@@ -295,14 +298,27 @@ void Draw_Mesh_Points(void *a, void *b)
   }
 }
 
-// Draw simplex
+void glNormal3verts(Vertex *v0, Vertex *v1, Vertex *v2, double n[3])
+{
+  double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
+  x1x0 = v1->Pos.X - v0->Pos.X;
+  y1y0 = v1->Pos.Y - v0->Pos.Y;
+  z1z0 = v1->Pos.Z - v0->Pos.Z;
+  x2x0 = v2->Pos.X - v0->Pos.X;
+  y2y0 = v2->Pos.Y - v0->Pos.Y;
+  z2z0 = v2->Pos.Z - v0->Pos.Z;
+  n[0] = y1y0 * z2z0 - z1z0 * y2y0;
+  n[1] = z1z0 * x2x0 - x1x0 * z2z0;
+  n[2] = x1x0 * y2y0 - y1y0 * x2x0;
+  glNormal3dv(n);
+}
 
 void Draw_Simplex_Volume(void *a, void *b)
 {
   Simplex *s;
   char Num[100];
   int fulldraw = 0;
-  double tmp, X[4], Y[4], Z[4];
+  double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6];
 
   s = *(Simplex **) a;
 
@@ -365,36 +381,51 @@ void Draw_Simplex_Volume(void *a, void *b)
   else
     glColor4ubv((GLubyte *) & CTX.color.mesh.line);
 
-  // this is killing us!!!
   for(int i = 0; i < 4; i++) {
     X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc);
     Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc);
     Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
   }
+  if(s->VSUP){
+    for(int i = 0; i < 6; i++) {
+      X2[i] = Xc + CTX.mesh.explode * (s->VSUP[i]->Pos.X - Xc);
+      Y2[i] = Yc + CTX.mesh.explode * (s->VSUP[i]->Pos.Y - Yc);
+      Z2[i] = Zc + CTX.mesh.explode * (s->VSUP[i]->Pos.Z - Zc);
+    }
+  }
 
   if(CTX.mesh.volumes) {
-    glBegin(GL_LINES);
-    glVertex3d(X[1], Y[1], Z[1]);
-    glVertex3d(X[0], Y[0], Z[0]);
+    if(!s->VSUP){
+      glBegin(GL_LINES);
+      glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]);
+      glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[2], Y[2], Z[2]);
+      glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X[0], Y[0], Z[0]);
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[0], Y[0], Z[0]);
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[2], Y[2], Z[2]); 
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[1], Y[1], Z[1]);
+      glEnd();
+    }
+    else{
+      glBegin(GL_LINES);
+      glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X2[0], Y2[0], Z2[0]); 
+      glVertex3d(X2[0], Y2[0], Z2[0]); glVertex3d(X[1], Y[1], Z[1]);
 
-    glVertex3d(X[2], Y[2], Z[2]);
-    glVertex3d(X[0], Y[0], Z[0]);
+      glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X2[1], Y2[1], Z2[1]); 
+      glVertex3d(X2[1], Y2[1], Z2[1]); glVertex3d(X[2], Y[2], Z[2]);
 
-    glVertex3d(X[3], Y[3], Z[3]);
-    glVertex3d(X[0], Y[0], Z[0]);
+      glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X2[2], Y2[2], Z2[2]); 
+      glVertex3d(X2[2], Y2[2], Z2[2]); glVertex3d(X[0], Y[0], Z[0]);
 
-    glVertex3d(X[3], Y[3], Z[3]);
-    glVertex3d(X[1], Y[1], Z[1]);
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[3], Y2[3], Z2[3]); 
+      glVertex3d(X2[3], Y2[3], Z2[3]); glVertex3d(X[0], Y[0], Z[0]);
 
-    glVertex3d(X[3], Y[3], Z[3]);
-    glVertex3d(X[2], Y[2], Z[2]);
-
-    glVertex3d(X[1], Y[1], Z[1]);
-    glVertex3d(X[2], Y[2], Z[2]);
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[4], Y2[4], Z2[4]); 
+      glVertex3d(X2[4], Y2[4], Z2[4]); glVertex3d(X[2], Y[2], Z[2]); 
 
-    glVertex3d(X[2], Y[2], Z[2]);
-    glVertex3d(X[3], Y[3], Z[3]);
-    glEnd();
+      glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[5], Y2[5], Z2[5]); 
+      glVertex3d(X2[5], Y2[5], Z2[5]); glVertex3d(X[1], Y[1], Z[1]);
+      glEnd();
+    }
   }
 
   if(CTX.mesh.volumes_num) {
@@ -429,8 +460,6 @@ void Draw_Simplex_Volume(void *a, void *b)
   if(!fulldraw)
     return;
 
-  double n[4], x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
-
   if(theColor.type)
     glColor4ubv((GLubyte *) & theColor.mesh);
   else if(CTX.mesh.color_carousel == 1)
@@ -443,85 +472,27 @@ void Draw_Simplex_Volume(void *a, void *b)
     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);
-
-    if(CTX.mesh.light) {
-      x1x0 = X[2] - X[0];
-      y1y0 = Y[2] - Y[0];
-      z1z0 = Z[2] - Z[0];
-      x2x0 = X[1] - X[0];
-      y2y0 = Y[1] - Y[0];
-      z2z0 = Z[1] - Z[0];
-      n[0] = y1y0 * z2z0 - z1z0 * y2y0;
-      n[1] = z1z0 * x2x0 - x1x0 * z2z0;
-      n[2] = x1x0 * y2y0 - y1y0 * x2x0;
-      glNormal3dv(n);
-    }
-
     glBegin(GL_TRIANGLES);
+    if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[2], s->V[1], n);
     glVertex3d(X[0], Y[0], Z[0]);
     glVertex3d(X[2], Y[2], Z[2]);
     glVertex3d(X[1], Y[1], Z[1]);
-    glEnd();
-
-    if(CTX.mesh.light) {
-      x1x0 = X[1] - X[0];
-      y1y0 = Y[1] - Y[0];
-      z1z0 = Z[1] - Z[0];
-      x2x0 = X[3] - X[0];
-      y2y0 = Y[3] - Y[0];
-      z2z0 = Z[3] - Z[0];
-      n[0] = y1y0 * z2z0 - z1z0 * y2y0;
-      n[1] = z1z0 * x2x0 - x1x0 * z2z0;
-      n[2] = x1x0 * y2y0 - y1y0 * x2x0;
-      glNormal3dv(n);
-    }
-
-    glBegin(GL_TRIANGLES);
+    if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[1], s->V[3], n);
     glVertex3d(X[0], Y[0], Z[0]);
     glVertex3d(X[1], Y[1], Z[1]);
     glVertex3d(X[3], Y[3], Z[3]);
-    glEnd();
-
-    if(CTX.mesh.light) {
-      x1x0 = X[3] - X[0];
-      y1y0 = Y[3] - Y[0];
-      z1z0 = Z[3] - Z[0];
-      x2x0 = X[2] - X[0];
-      y2y0 = Y[2] - Y[0];
-      z2z0 = Z[2] - Z[0];
-      n[0] = y1y0 * z2z0 - z1z0 * y2y0;
-      n[1] = z1z0 * x2x0 - x1x0 * z2z0;
-      n[2] = x1x0 * y2y0 - y1y0 * x2x0;
-      glNormal3dv(n);
-    }
-
-    glBegin(GL_TRIANGLES);
+    if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[3], s->V[2], n);
     glVertex3d(X[0], Y[0], Z[0]);
     glVertex3d(X[3], Y[3], Z[3]);
     glVertex3d(X[2], Y[2], Z[2]);
-    glEnd();
-
-    if(CTX.mesh.light) {
-      x1x0 = X[3] - X[1];
-      y1y0 = Y[3] - Y[1];
-      z1z0 = Z[3] - Z[1];
-      x2x0 = X[2] - X[1];
-      y2y0 = Y[2] - Y[1];
-      z2z0 = Z[2] - Z[1];
-      n[0] = y1y0 * z2z0 - z1z0 * y2y0;
-      n[1] = z1z0 * x2x0 - x1x0 * z2z0;
-      n[2] = x1x0 * y2y0 - y1y0 * x2x0;
-      glNormal3dv(n);
-    }
-
-    glBegin(GL_TRIANGLES);
+    if(CTX.mesh.light) glNormal3verts(s->V[3], s->V[1], s->V[2], n);
     glVertex3d(X[3], Y[3], Z[3]);
     glVertex3d(X[1], Y[1], Z[1]);
     glVertex3d(X[2], Y[2], Z[2]);
     glEnd();
-
     glDisable(GL_LIGHTING);
   }
 }
@@ -529,27 +500,15 @@ void Draw_Simplex_Volume(void *a, void *b)
 void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
                                  double *pZ, double n[3])
 {
-  double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
   int i, K, L;
 
   L = (s->VSUP) ? 1 : 0;
   K = (s->V[3]) ? 4 : 3;
 
-  if(CTX.mesh.normals || CTX.mesh.light) {
-    x1x0 = s->V[1]->Pos.X - s->V[0]->Pos.X;
-    y1y0 = s->V[1]->Pos.Y - s->V[0]->Pos.Y;
-    z1z0 = s->V[1]->Pos.Z - s->V[0]->Pos.Z;
-    x2x0 = s->V[2]->Pos.X - s->V[0]->Pos.X;
-    y2y0 = s->V[2]->Pos.Y - s->V[0]->Pos.Y;
-    z2z0 = s->V[2]->Pos.Z - s->V[0]->Pos.Z;
-    n[0] = y1y0 * z2z0 - z1z0 * y2y0;
-    n[1] = z1z0 * x2x0 - x1x0 * z2z0;
-    n[2] = x1x0 * y2y0 - y1y0 * x2x0;
-    glNormal3dv(n);
-  }
+  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);
@@ -612,10 +571,33 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
 
     if(pX && pY && pZ) {        // using precomputed vertices
       if(L) {
-        glBegin(GL_POLYGON);
-        for(i = 0; i < K * (1 + L); i++)
-          glVertex3d(pX[i], pY[i], pZ[i]);
-        glEnd();
+	if(K == 4){
+	  // FIXME: should subdivide...
+	  glBegin(GL_POLYGON);
+	  for(i = 0; i < K * (1 + L); i++)
+	    glVertex3d(pX[i], pY[i], pZ[i]);
+	  glEnd();
+	}
+	else{
+	  glBegin(GL_TRIANGLES);
+	  glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[2], n);
+	  glVertex3d(pX[0], pY[0], pZ[0]);
+	  glVertex3d(pX[1], pY[1], pZ[1]);
+	  glVertex3d(pX[5], pY[5], pZ[5]);
+	  glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[1], n);
+	  glVertex3d(pX[1], pY[1], pZ[1]);
+	  glVertex3d(pX[2], pY[2], pZ[2]);
+	  glVertex3d(pX[3], pY[3], pZ[3]);
+	  glNormal3verts(s->VSUP[1], s->V[2], s->VSUP[2], n);
+	  glVertex3d(pX[3], pY[3], pZ[3]);
+	  glVertex3d(pX[4], pY[4], pZ[4]);
+	  glVertex3d(pX[5], pY[5], pZ[5]);
+	  glNormal3verts(s->VSUP[0], s->VSUP[1], s->VSUP[2], n);
+	  glVertex3d(pX[1], pY[1], pZ[1]);
+	  glVertex3d(pX[3], pY[3], pZ[3]);
+	  glVertex3d(pX[5], pY[5], pZ[5]);
+	  glEnd();
+	}
       }
       else if(K == 4) {
         glBegin(GL_QUADS);
@@ -635,12 +617,35 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
     }
     else {      // using the element's unmodified coordinates
       if(L) {
-        glBegin(GL_POLYGON);
-        for(i = 0; i < K; i++) {
-          glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z);
-          glVertex3d(s->VSUP[i]->Pos.X, s->VSUP[i]->Pos.Y, s->VSUP[i]->Pos.Z);
-        }
-        glEnd();
+   	if(K == 4) {
+	  // FIXME: should subdivide...
+	  glBegin(GL_POLYGON);
+	  for(i = 0; i < K; i++) {
+	    glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z);
+	    glVertex3d(s->VSUP[i]->Pos.X, s->VSUP[i]->Pos.Y, s->VSUP[i]->Pos.Z);
+	  }
+	  glEnd();
+	}
+	else{
+	  glBegin(GL_TRIANGLES);
+	  glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[2], n);
+	  glVertex3d(s->V[0]->Pos.X, s->V[0]->Pos.Y, s->V[0]->Pos.Z);
+	  glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z);
+	  glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z);
+	  glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[1], n);
+	  glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z);
+	  glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z);
+	  glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z);
+	  glNormal3verts(s->VSUP[1], s->V[2], s->VSUP[2], n);
+	  glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z);
+	  glVertex3d(s->V[2]->Pos.X, s->V[2]->Pos.Y, s->V[2]->Pos.Z);
+	  glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z);
+	  glNormal3verts(s->VSUP[0], s->VSUP[1], s->VSUP[2], n);
+	  glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z);
+	  glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z);
+	  glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z);
+	  glEnd();
+	}
       }
       else if(K == 4) {
         glBegin(GL_QUADS);