diff --git a/Geo/MEdge.h b/Geo/MEdge.h
index eefbf9337487335a88f98b90f23259b425db1b2f..e4fcf195a6bb227f6a6f3b3626901aee00ada0c6 100644
--- a/Geo/MEdge.h
+++ b/Geo/MEdge.h
@@ -63,9 +63,9 @@ class MEdge {
   }
   inline SPoint3 interpolate(const double &t) const
   {
-    return SPoint3(t * _v[1]->x() + (1.-t)* _v[0]->x(), 
-                   t * _v[1]->y() + (1.-t)* _v[0]->y(), 
-		   t * _v[1]->z() + (1.-t)* _v[0]->z());
+    return SPoint3(t * _v[1]->x() + (1. - t) * _v[0]->x(),
+                   t * _v[1]->y() + (1. - t) * _v[0]->y(),
+		   t * _v[1]->z() + (1. - t) * _v[0]->z());
   }
 };
 
diff --git a/Geo/MFace.h b/Geo/MFace.h
index f618d1828c62de1d00768d32bb6e522a80d68001..524f7f8229f2636379550b7f0418b074599e5f6f 100644
--- a/Geo/MFace.h
+++ b/Geo/MFace.h
@@ -129,7 +129,7 @@ class MFace {
     p[2] /= (double)n;
     return p;
   }
-  SPoint3 interpolate (const double &u, const double &v) const
+  SPoint3 interpolate(const double &u, const double &v) const
   {
     SPoint3 p(0., 0., 0.);
     int n = getNumVertices();
@@ -144,9 +144,9 @@ class MFace {
     }
     else if(n == 4){
       const double ff[4] = {(1 - u) * (1. - v),
-			    (1 - u) * (1. + v),
+			    (1 + u) * (1. - v),
 			    (1 + u) * (1. + v),
-			    (1 + u) * (1. - v)};	
+			    (1 - u) * (1. + v)};	
       for(int i = 0; i < n; i++) {
 	MVertex *v = getVertex(i);
 	p[0] += v->x() * ff[i] * .25;
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 414c10b133ab68b3789b262b6e7434602db82b5c..349842ce322f1d78741662f31980a3b4eb8dbcd1 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -1,4 +1,4 @@
-// $Id: HighOrder.cpp,v 1.1 2007-02-28 06:58:46 geuzaine Exp $
+// $Id: HighOrder.cpp,v 1.2 2007-02-28 11:39:32 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -207,8 +207,8 @@ void getEdgeVertices(GFace *gf, MElement *ele, std::vector<MVertex*> &ve,
 	else{
 	  SPoint2 p0, p1;
 	  if(reparamOnFace(v0, gf, p0) && reparamOnFace(v1, gf, p1)){
-	    double uc = (1.-t) * p0[0] + t * p1[0];
-	    double vc = (1.-t) * p0[1] + t * p1[1];
+	    double uc = (1. - t) * p0[0] + t * p1[0];
+	    double vc = (1. - t) * p0[1] + t * p1[1];
 	    GPoint pc = gf->point(uc, vc);
 	    v = new MFaceVertex(pc.x(), pc.y(), pc.z(), gf, uc, vc);
 	  }
@@ -240,7 +240,7 @@ void getEdgeVertices(GRegion *gr, MElement *ele, std::vector<MVertex*> &ve,
       ve.insert(ve.end(), edgeVertices[p].begin(), edgeVertices[p].end());
     }
     else{
-      for(int j = 0; j <nPts; j++){
+      for(int j = 0; j < nPts; j++){
 	double t = (double)(j + 1) / (nPts + 1);
 	SPoint3 pc = edge.interpolate(t);
 	MVertex *v = new MVertex(pc.x(), pc.y(), pc.z(), gr);
@@ -265,18 +265,17 @@ void getFaceVertices(GFace *gf, MElement *ele, std::vector<MVertex*> &vf,
     else{
       if(face.getNumVertices() == 3){ // triangles
 	for(int j = 0; j < nPts; j++){
-	  for (int k = 0 ; k < nPts - j - 1; k++){
+	  for(int k = 0 ; k < nPts - j - 1; k++){
 	    MVertex *v;
 	    double t1 = (double)(j + 1) / (nPts + 1);
 	    double t2 = (double)(k + 1) / (nPts + 1);
 	    if(linear || gf->geomType() == GEntity::DiscreteSurface){
-	      SPoint3 pc = face.interpolate(t1,t2);
+	      SPoint3 pc = face.interpolate(t1, t2);
 	      v = new MVertex(pc.x(), pc.y(), pc.z(), gf);
 	    }
 	    else{
 	      SPoint2 p0, p1, p2;
-	      if(reparamOnFace(p[0], gf, p0) && 
-		 reparamOnFace(p[1], gf, p1) &&
+	      if(reparamOnFace(p[0], gf, p0) && reparamOnFace(p[1], gf, p1) &&
 		 reparamOnFace(p[2], gf, p2)){
 		double uc = (1. - t1 - t2) * p0[0] + t1 * p1[0] + t2 * p2[0];
 		double vc = (1. - t1 - t2) * p0[1] + t1 * p1[1] + t2 * p2[1];
@@ -285,7 +284,7 @@ void getFaceVertices(GFace *gf, MElement *ele, std::vector<MVertex*> &vf,
 	      }
 	      else{
 		// need to treat seams correctly!
-		SPoint3 pc = face.interpolate(t1,t2);
+		SPoint3 pc = face.interpolate(t1, t2);
 		v = new MVertex(pc.x(), pc.y(), pc.z(), gf);
 	      }
 	    }
@@ -297,12 +296,13 @@ void getFaceVertices(GFace *gf, MElement *ele, std::vector<MVertex*> &vf,
       }
       else if(face.getNumVertices() == 4){ // quadrangles
 	for(int j = 0; j < nPts; j++){
-	  for(int k = 0; k < nPts; k++ ){
+	  for(int k = 0; k < nPts; k++){
 	    MVertex *v;
-	    double t1 = (double)(j + 1) / (nPts + 1);
-	    double t2 = (double)(k + 1) / (nPts + 1);
+	    // parameters are between -1 and 1
+	    double t1 = 2. * (double)(j + 1) / (nPts + 1) - 1.;
+	    double t2 = 2. * (double)(k + 1) / (nPts + 1) - 1.;
 	    if(linear || gf->geomType() == GEntity::DiscreteSurface){
-	      SPoint3 pc = face.interpolate(t1,t2);
+	      SPoint3 pc = face.interpolate(t1, t2);
 	      v = new MVertex(pc.x(), pc.y(), pc.z(), gf);
 	    }
 	    else{
@@ -310,19 +310,19 @@ void getFaceVertices(GFace *gf, MElement *ele, std::vector<MVertex*> &vf,
 	      if(reparamOnFace(p[0], gf, p0) && reparamOnFace(p[1], gf, p1) &&
 		 reparamOnFace(p[2], gf, p2) && reparamOnFace(p[3], gf, p3)){
 		double uc = 0.25 * ((1 - t1) * (1 - t2) * p0[0] + 
-				    (1 - t1) * (1 + t2) * p0[0] + 
-				    (1 + t1) * (1 + t2) * p0[0] + 
-				    (1 + t1) * (1 - t2) * p0[0]); 
+				    (1 + t1) * (1 - t2) * p1[0] + 
+				    (1 + t1) * (1 + t2) * p2[0] + 
+				    (1 - t1) * (1 + t2) * p3[0]); 
 		double vc = 0.25 * ((1 - t1) * (1 - t2) * p0[1] + 
-				    (1 - t1) * (1 + t2) * p0[1] + 
-				    (1 + t1) * (1 + t2) * p0[1] + 
-				    (1 + t1) * (1 - t2) * p0[1]); 
+				    (1 + t1) * (1 - t2) * p1[1] + 
+				    (1 + t1) * (1 + t2) * p2[1] + 
+				    (1 - t1) * (1 + t2) * p3[1]); 
 		GPoint pc = gf->point(uc, vc);
 		v = new MFaceVertex(pc.x(), pc.y(), pc.z(), gf, uc, vc);
 	      }
 	      else{
 		// need to treat seams correctly!
-		SPoint3 pc = face.interpolate(t1,t2);
+		SPoint3 pc = face.interpolate(t1, t2);
 		v = new MVertex(pc.x(), pc.y(), pc.z(), gf);
 	      }
 	    }
@@ -348,19 +348,36 @@ void getFaceVertices(GRegion *gr, MElement *ele, std::vector<MVertex*> &vf,
       vf.insert(vf.begin(), faceVertices[p].begin(), faceVertices[p].end());
     }
     else{      
-      for(int j = 0; j < nPts; j++){
-	int st = nPts;
-	if(face.getNumVertices() == 3) st = j;
-	for(int k = 0; k < st; k++){
-	  double t1 = (double)(j + 1) / (nPts + 1);
-	  double t2 = (double)(k + 1) / (nPts + 1);
-	  SPoint3 pc = face.interpolate(t1, t2);
-	  MVertex *v = new MVertex(pc.x(), pc.y(), pc.z(), gr);
-	  faceVertices[p].push_back(v);
-	  gr->mesh_vertices.push_back(v);
-	  vf.push_back(v);
+      if(face.getNumVertices() == 3){ // triangles
+	/*
+	for(int j = 0; j < nPts; j++){
+	  for(int k = 0 ; k < nPts - j - 1; k++){
+	    double t1 = (double)(j + 1) / (nPts + 1);
+	    double t2 = (double)(k + 1) / (nPts + 1);
+	    SPoint3 pc = face.interpolate(t1, t2);
+	    MVertex *v = new MVertex(pc.x(), pc.y(), pc.z(), gr);
+	    faceVertices[p].push_back(v);
+	    gr->mesh_vertices.push_back(v);
+	    vf.push_back(v);
+	  }
+	}
+	*/
+      }
+      else if(face.getNumVertices() == 4){ // quadrangles
+	for(int j = 0; j < nPts; j++){
+	  for(int k = 0; k < nPts; k++){
+	    // parameters are between -1 and 1
+	    double t1 = 2. * (double)(j + 1) / (nPts + 1) - 1.;
+	    double t2 = 2. * (double)(k + 1) / (nPts + 1) - 1.;
+	    SPoint3 pc = face.interpolate(t1, t2);
+	    MVertex *v = new MVertex(pc.x(), pc.y(), pc.z(), gr);
+	    faceVertices[p].push_back(v);
+	    gr->mesh_vertices.push_back(v);
+	    vf.push_back(v);
+	  }
 	}
       }
+      else throw; // not tri or quad
     }
   }
 }
@@ -420,14 +437,14 @@ void setHighOrder(GFace *gf, edgeContainer &edgeVertices,
   for(unsigned int i = 0; i < gf->quadrangles.size(); i++){
     MQuadrangle *q = gf->quadrangles[i];
     std::vector<MVertex*> ve, vf;
-    getEdgeVertices(gf, q, ve, edgeVertices, linear,nPts);
+    getEdgeVertices(gf, q, ve, edgeVertices, linear, nPts);
     if(incomplete){
       quadrangles2.push_back
 	(new MQuadrangle8(q->getVertex(0), q->getVertex(1), q->getVertex(2),
 			  q->getVertex(3), ve[0], ve[1], ve[2], ve[3]));
     }
     else{
-      getFaceVertices(gf, q, vf, faceVertices, linear);
+      getFaceVertices(gf, q, vf, faceVertices, linear, nPts);
       quadrangles2.push_back
 	(new MQuadrangle9(q->getVertex(0), q->getVertex(1), q->getVertex(2),
 			  q->getVertex(3), ve[0], ve[1], ve[2], ve[3], vf[0]));
@@ -469,7 +486,7 @@ void setHighOrder(GRegion *gr, edgeContainer &edgeVertices,
 			   ve[11]));
     }
     else{
-      getFaceVertices(gr, h, vf, faceVertices, linear);
+      getFaceVertices(gr, h, vf, faceVertices, linear, nPts);
       SPoint3 pc = h->barycenter();
       MVertex *v = new MVertex(pc.x(), pc.y(), pc.z(), gr);
       gr->mesh_vertices.push_back(v);
@@ -496,7 +513,7 @@ void setHighOrder(GRegion *gr, edgeContainer &edgeVertices,
 		      ve[0], ve[1], ve[2], ve[3], ve[4], ve[5], ve[6], ve[7], ve[8]));
     }
     else{
-      getFaceVertices(gr, p, vf, faceVertices, linear);
+      getFaceVertices(gr, p, vf, faceVertices, linear, nPts);
       prisms2.push_back
 	(new MPrism18(p->getVertex(0), p->getVertex(1), p->getVertex(2), 
 		      p->getVertex(3), p->getVertex(4), p->getVertex(5), 
@@ -519,7 +536,7 @@ void setHighOrder(GRegion *gr, edgeContainer &edgeVertices,
 			ve[3], ve[4], ve[5], ve[6], ve[7]));
     }
     else{
-      getFaceVertices(gr, p, vf, faceVertices, linear);
+      getFaceVertices(gr, p, vf, faceVertices, linear, nPts);
       pyramids2.push_back
 	(new MPyramid14(p->getVertex(0), p->getVertex(1), p->getVertex(2), 
 			p->getVertex(3), p->getVertex(4), ve[0], ve[1], ve[2],