diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp
index 8eb925445a2850959c6c66534d97f976179e4541..aef8ae5a0fbe1e0622cdfd32f42b3a04eeb39900 100644
--- a/Numeric/polynomialBasis.cpp
+++ b/Numeric/polynomialBasis.cpp
@@ -1009,12 +1009,12 @@ static fullMatrix<double> generateLagrangeMonomialCoefficients
   return coefficient;
 }
 
-static void generate1dVertexClosure(polynomialBasis::clCont &closure)
+static void generate1dVertexClosure(polynomialBasis::clCont &closure, int order)
 {
   closure.clear();
   closure.resize(2);
   closure[0].push_back(0);
-  closure[1].push_back(1);
+  closure[1].push_back(order == 0 ? 0 : 1);
   closure[0].type = MSH_PNT;
   closure[1].type = MSH_PNT;
 }
@@ -1025,8 +1025,10 @@ static void generate1dVertexClosureFull(polynomialBasis::clCont &closure, std::v
   closure.clear();
   closure.resize(2);
   closure[0].push_back(0);
-  closure[0].push_back(1);
-  closure[1].push_back(1);
+  if (order != 0) {
+    closure[0].push_back(1);
+    closure[1].push_back(1);
+  }
   closure[1].push_back(0);
   for (int i = 0; i < order - 1; i++) {
     closure[0].push_back(2 + i);
@@ -1406,759 +1408,188 @@ static void generateClosureOrder0(polynomialBasis::clCont &closure, int nb)
   }
 }
 
-void _oulala_  (const char* a, fullMatrix<double> & m){
-  FILE *f = fopen (a,"w");
-  fprintf(f,"View \"\"{\n");
-  for (int i=0;i<m.size1();i++){
-    fprintf(f,"SP(%g,%g,%g){%d};\n",m(i,0),m(i,1),m(i,2),i);
-  }
-  fprintf(f,"};\n");
-  fclose (f);
-}
-
 std::map<int, polynomialBasis> polynomialBases::fs;
 const polynomialBasis *polynomialBases::find(int tag)
 {
   std::map<int, polynomialBasis>::const_iterator it = fs.find(tag);
   if (it != fs.end())     return &it->second;
   polynomialBasis F;
-  F.numFaces = -1;
-  switch (tag){
-  case MSH_PNT:
-    F.numFaces = 1;
-    F.monomials = generate1DMonomials(0);
-    F.points    = generate1DPoints(0);
-    F.parentType = TYPE_PNT;
-    break;
-  case MSH_LIN_1 :
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(0);
-    F.points    = generate1DPoints(0);
-    generateClosureOrder0(F.closures,2);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 0);
-    F.parentType = TYPE_LIN;
-    break;
-  case MSH_LIN_2 :
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(1);
-    F.points    = generate1DPoints(1);
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 1);
-    F.parentType = TYPE_LIN;
-    break;
-  case MSH_LIN_3 :
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(2);
-    F.points    = generate1DPoints(2);
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 2);
-    F.parentType = TYPE_LIN;
-    break;
-  case MSH_LIN_4:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(3);
-    F.points    = generate1DPoints(3);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 3);
-    break;
-  case MSH_LIN_5:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(4);
-    F.points    = generate1DPoints(4);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 4);
-    break;
-  case MSH_LIN_6:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(5);
-    F.points    = generate1DPoints(5);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 5);
-    break;
-  case MSH_LIN_7:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(6);
-    F.points    = generate1DPoints(6);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 6);
-    break;
-  case MSH_LIN_8:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(7);
-    F.points    = generate1DPoints(7);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 7);
-    break;
-  case MSH_LIN_9:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(8);
-    F.points    = generate1DPoints(8);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 8);
-    break;
-  case MSH_LIN_10:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(9);
-    F.points    = generate1DPoints(9);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 9);
-    break;
-  case MSH_LIN_11:
-    F.numFaces = 2;
-    F.monomials = generate1DMonomials(10);
-    F.points    = generate1DPoints(10);
-    F.parentType = TYPE_LIN;
-    generate1dVertexClosure(F.closures);
-    generate1dVertexClosureFull(F.fullClosures, F.closureRef, 10);
-    break;
-  case MSH_TRI_1 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(0);
-    F.points =    gmshGeneratePointsTriangle(0, false);
-    F.parentType = TYPE_TRI;
-    generateClosureOrder0(F.closures, 6);
-    generateClosureOrder0(F.fullClosures, 6);
-    F.closureRef.resize(6, 0);
-    break;
-  case MSH_TRI_3 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(1);
-    F.points =    gmshGeneratePointsTriangle(1, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 1);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 1, 3, false);
-    break;
-  case MSH_TRI_6 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(2);
-    F.points =    gmshGeneratePointsTriangle(2, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 2);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 2, 3, false);
-    break;
-  case MSH_TRI_9 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(3);
-    F.points =    gmshGeneratePointsTriangle(3, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 3);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 3, 3, true);
-    break;
-  case MSH_TRI_10 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(3);
-    F.points =    gmshGeneratePointsTriangle(3, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 3);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 3, 3, false);
-    break;
-  case MSH_TRI_12 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(4);
-    F.points =    gmshGeneratePointsTriangle(4, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 4, 3, true);
-    break;
-  case MSH_TRI_15 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(4);
-    F.points =    gmshGeneratePointsTriangle(4, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 4, 3, false);
-    break;
-  case MSH_TRI_15I :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(5);
-    F.points =    gmshGeneratePointsTriangle(5, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 5);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 5, 3, true);
-    break;
-  case MSH_TRI_21 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(5);
-    F.points =    gmshGeneratePointsTriangle(5, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 5);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 5, 3, false);
-    break;
-  case MSH_TRI_28 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(6);
-    F.points =    gmshGeneratePointsTriangle(6, false);    
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 6);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 6, 3, false);
-    break;
-  case MSH_TRI_36 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(7);
-    F.points =    gmshGeneratePointsTriangle(7, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 7);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 7, 3, false);
-    break;
-  case MSH_TRI_45 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(8);
-    F.points =    gmshGeneratePointsTriangle(8, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 8);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 8, 3, false);
-    break;
-  case MSH_TRI_55 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(9);
-    F.points =    gmshGeneratePointsTriangle(9, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 9);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 9, 3, false);
-    break;
-  case MSH_TRI_66 :
-    F.numFaces = 3;
-    F.monomials = generatePascalTriangle(10);
-    F.points =    gmshGeneratePointsTriangle(10, false);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 10);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 10, 3, false);
-    break;
-  case MSH_TRI_18 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(6);
-    F.points =    gmshGeneratePointsTriangle(6, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 6);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 6, 3, true);
-    break;
-  case MSH_TRI_21I :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(7);
-    F.points =    gmshGeneratePointsTriangle(7, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 7);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 7, 3, true);
-    break;
-  case MSH_TRI_24 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(8);
-    F.points =    gmshGeneratePointsTriangle(8, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 8);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 8, 3, true);
-    break;
-  case MSH_TRI_27 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(9);
-    F.points =    gmshGeneratePointsTriangle(9, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 9);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 9, 3, true);
-    break;
-  case MSH_TRI_30 :
-    F.numFaces = 3;
-    F.monomials = generatePascalSerendipityTriangle(10);
-    F.points =    gmshGeneratePointsTriangle(10, true);
-    F.parentType = TYPE_TRI;
-    generate2dEdgeClosure(F.closures, 10);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 10, 3, true);
-    break;
-  case MSH_TET_1 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(0);
-    F.points =    gmshGeneratePointsTetrahedron(0, false);
-    F.parentType = TYPE_TET;
-    generateClosureOrder0(F.closures,24);
-    generateClosureOrder0(F.fullClosures, 24);
-    F.closureRef.resize(24, 0);
-    break;
-  case MSH_TET_4 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(1);
-    F.points =    gmshGeneratePointsTetrahedron(1, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 1);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 1, false);
-    break;
-  case MSH_TET_10 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(2);
-    F.points =    gmshGeneratePointsTetrahedron(2, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 2);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 2, false);
-    break;
-  case MSH_TET_20 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(3);
-    F.points =    gmshGeneratePointsTetrahedron(3, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 3);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 3, false);
-    break;
-  case MSH_TET_35 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(4);
-    F.points =    gmshGeneratePointsTetrahedron(4, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 4);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 4, false);
-    break;
-  case MSH_TET_34 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(4);
-    F.points =    gmshGeneratePointsTetrahedron(4, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 4);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 4, true);
-    break;
-  case MSH_TET_52 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(5);
-    F.points =    gmshGeneratePointsTetrahedron(5, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 5);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 5, true);
-    break;
-  case MSH_TET_56 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(5);
-    F.points =    gmshGeneratePointsTetrahedron(5, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 5);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 5, false);
-    break;
-  case MSH_TET_74 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(6);
-    F.points =    gmshGeneratePointsTetrahedron(6, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 6);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 6, true);
-    break;
-  case MSH_TET_84 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(6);
-    F.points =    gmshGeneratePointsTetrahedron(6, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 6);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 6, false);
-    break;
-  case MSH_TET_100 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(7);
-    F.points =    gmshGeneratePointsTetrahedron(7, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 7);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 7, true);
-    break;
-  case MSH_TET_120 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(7);
-    F.points =    gmshGeneratePointsTetrahedron(7, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 7);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 7, false);
-    break;
-  case MSH_TET_130 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(8);
-    F.points =    gmshGeneratePointsTetrahedron(8, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 8);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 8, true);
-    break;
-  case MSH_TET_164 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(9);
-    F.points =    gmshGeneratePointsTetrahedron(9, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 9);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 9, true);
-    break;
-  case MSH_TET_165 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(8);
-    F.points =    gmshGeneratePointsTetrahedron(8, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 8);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 8, false);
-    break;
-  case MSH_TET_202 :
-    F.numFaces = 4;
-    F.monomials = generatePascalSerendipityTetrahedron(10);
-    F.points =    gmshGeneratePointsTetrahedron(10, true);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 10);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 10, true);
-    break;
-  case MSH_TET_220 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(9);
-    F.points =    gmshGeneratePointsTetrahedron(9, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 9);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 9, false);
-    break;
-  case MSH_TET_286 :
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(10);
-    F.points =    gmshGeneratePointsTetrahedron(10, false);
-    F.parentType = TYPE_TET;
-    generateFaceClosureTet(F.closures, 10);
-    generateFaceClosureTetFull(F.fullClosures, F.closureRef, 10, false);
-    break;
-  case MSH_QUA_1 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(0);
-    F.points =    gmshGeneratePointsQuad(0,false);
-    F.parentType = TYPE_QUA;
-    generateClosureOrder0(F.closures,8);
-    generateClosureOrder0(F.fullClosures,8);
-    F.closureRef.resize(8, 0);
-    break;
-  case MSH_QUA_4 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(1);
-    F.points =    gmshGeneratePointsQuad(1,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 1, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 1, 4, false);
-    break;
-  case MSH_QUA_9 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(2);
-    F.points =    gmshGeneratePointsQuad(2,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 2, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 2, 4, false);
-    break;
-  case MSH_QUA_16 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(3);
-    F.points =    gmshGeneratePointsQuad(3,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 3, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 3, 4, false);
-    break;
-  case MSH_QUA_25 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(4);
-    F.points =    gmshGeneratePointsQuad(4,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 4, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 4, 4, false);
-    break;
-  case MSH_QUA_36 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(5);
-    F.points =    gmshGeneratePointsQuad(5,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 5, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 5, 4, false);
-    break;
-  case MSH_QUA_49 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(6);
-    F.points =    gmshGeneratePointsQuad(6,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 6, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 6, 4, false);
-    break;
-  case MSH_QUA_64 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(7);
-    F.points =    gmshGeneratePointsQuad(7,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 7, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 7, 4, false);
-    break;
-  case MSH_QUA_81 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(8);
-    F.points =    gmshGeneratePointsQuad(8,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 8, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 8, 4, false);
-    break;
-  case MSH_QUA_100 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(9);
-    F.points =    gmshGeneratePointsQuad(9,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 9, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 9, 4, false);
-    break;
-  case MSH_QUA_121 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuad(10);
-    F.points =    gmshGeneratePointsQuad(10,false);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 10, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 10, 4, false);
-    break;
-  case MSH_QUA_8 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(2);
-    F.points =    gmshGeneratePointsQuad(2,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 2, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 2, 4, true);
-    break;
-  case MSH_QUA_12 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(3);
-    F.points =    gmshGeneratePointsQuad(3,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 3, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 3, 4, true);
-    break;
-  case MSH_QUA_16I :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(4);
-    F.points =    gmshGeneratePointsQuad(4,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 4, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 4, 4, true);
-    break;
-  case MSH_QUA_20 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(5);
-    F.points =    gmshGeneratePointsQuad(5,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 5, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 5, 4, true);
-    break;
-  case MSH_QUA_24 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(6);
-    F.points =    gmshGeneratePointsQuad(6,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 6, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 6, 4, true);
-    break;
-  case MSH_QUA_28 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(7);
-    F.points =    gmshGeneratePointsQuad(7,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 7, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 7, 4, true);
-    break;
-  case MSH_QUA_32 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(8);
-    F.points =    gmshGeneratePointsQuad(8,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 8, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 8, 4, true);
-    break;
-  case MSH_QUA_36I :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(9);
-    F.points =    gmshGeneratePointsQuad(9,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 9, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 9, 4, true);
-    break;
-  case MSH_QUA_40 :
-    F.numFaces = 4;
-    F.monomials = generatePascalQuadSerendip(10);
-    F.points =    gmshGeneratePointsQuad(10,true);
-    F.parentType = TYPE_QUA;
-    generate2dEdgeClosure(F.closures, 10, 4);
-    generate2dEdgeClosureFull(F.fullClosures, F.closureRef, 10, 4, true);
-    break;
-  case MSH_PRI_1 :
-    F.numFaces = 5;
-    F.monomials = generatePascalPrism(0);
-    F.points =    gmshGeneratePointsPrism(0, false);
-    F.parentType = TYPE_PRI;
-    generateClosureOrder0(F.closures,48);
-    generateClosureOrder0(F.fullClosures,48);
-    F.closureRef.resize(48, 0);
-    break;
-  case MSH_PRI_6 :
-    F.numFaces = 5;
-    F.monomials = generatePascalPrism(1);
-    F.points =    gmshGeneratePointsPrism(1, false);
-    F.parentType = TYPE_PRI;
-    generateFaceClosurePrism(F.closures, 1);
-    generateFaceClosurePrismFull(F.fullClosures, F.closureRef, 1);
-    break;
-  case MSH_PRI_18 :
-    F.numFaces = 5;
-    F.monomials = generatePascalPrism(2);
-    F.points =    gmshGeneratePointsPrism(2, false);
-    F.parentType = TYPE_PRI;
-    generateFaceClosurePrism(F.closures, 2);
-    generateFaceClosurePrismFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_20 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(2,true);
-    F.points =    gmshGeneratePointsHex(2, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_27 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(2,false);
-    F.points =    gmshGeneratePointsHex(2, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_56 :
-    //    printf("in complete hex at order 3\n");
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(3,true);
-    F.points =    gmshGeneratePointsHex(3, true);
-    F.parentType = TYPE_HEX;
-    //    _oulala_("hex56.pos",F.points);
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_64 :
-    //    printf("complete hex at order 3\n");
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(3,false);
-    //    printf("pas complete hex at order 3 done\n");
-    F.points =    gmshGeneratePointsHex(3, false);
-    //    printf("complete hex at order 3 done\n");
-    //    F.points.print("P3");
-    F.parentType = TYPE_HEX;
-    //    _oulala_("hex64.pos",F.points);
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_98 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(4,true);
-    F.points =    gmshGeneratePointsHex(4, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_125 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(4,false);
-    F.points =    gmshGeneratePointsHex(4, false);
-    F.parentType = TYPE_HEX;
-    //    _oulala_("hex125.pos",F.points);
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_152 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(5,true);
-    F.points =    gmshGeneratePointsHex(5, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_216 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(5,false);
-    F.points =    gmshGeneratePointsHex(5, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_222 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(6,true);
-    F.points =    gmshGeneratePointsHex(6, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_343 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(6,false);
-    F.points =    gmshGeneratePointsHex(6, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_296 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(7,true);
-    F.points =    gmshGeneratePointsHex(7, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_512 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(7,false);
-    F.points =    gmshGeneratePointsHex(7, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_386 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(8,true);
-    F.points =    gmshGeneratePointsHex(8, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_729 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(8,false);
-    F.points =    gmshGeneratePointsHex(8, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_488 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(9,true);
-    F.points =    gmshGeneratePointsHex(9, true);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  case MSH_HEX_1000 :
-    F.numFaces = 6;
-    F.monomials = generatePascalHex(9,false);
-    F.points =    gmshGeneratePointsHex(9, false);
-    F.parentType = TYPE_HEX;
-    //    generateFaceClosureHex(F.closures, 2);
-    //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, 2);
-    break;
-  default :
-    Msg::Error("Unknown function space %d: reverting to TET_4", tag);
-    F.numFaces = 4;
-    F.monomials = generatePascalTetrahedron(1);
-    F.parentType = TYPE_TET;
-    F.points =    gmshGeneratePointsTetrahedron(1, false);
-    generateFaceClosureTet(F.closures, 1);
-    break;
-  }
   F.type = tag;
-
+  switch (tag) {
+    case MSH_PNT     : F.parentType = TYPE_PNT; F.order = 0; F.serendip = false; break;
+    case MSH_LIN_1   : F.parentType = TYPE_LIN; F.order = 0; F.serendip = false; break;
+    case MSH_LIN_2   : F.parentType = TYPE_LIN; F.order = 1; F.serendip = false; break;
+    case MSH_LIN_3   : F.parentType = TYPE_LIN; F.order = 2; F.serendip = false; break;
+    case MSH_LIN_4   : F.parentType = TYPE_LIN; F.order = 3; F.serendip = false; break;
+    case MSH_LIN_5   : F.parentType = TYPE_LIN; F.order = 4; F.serendip = false; break;
+    case MSH_LIN_6   : F.parentType = TYPE_LIN; F.order = 5; F.serendip = false; break;
+    case MSH_LIN_7   : F.parentType = TYPE_LIN; F.order = 6; F.serendip = false; break;
+    case MSH_LIN_8   : F.parentType = TYPE_LIN; F.order = 7; F.serendip = false; break;
+    case MSH_LIN_9   : F.parentType = TYPE_LIN; F.order = 8; F.serendip = false; break;
+    case MSH_LIN_10  : F.parentType = TYPE_LIN; F.order = 9; F.serendip = false; break;
+    case MSH_LIN_11  : F.parentType = TYPE_LIN; F.order = 10;F.serendip = false; break;
+    case MSH_TRI_1   : F.parentType = TYPE_TRI; F.order = 0; F.serendip = false; break;
+    case MSH_TRI_3   : F.parentType = TYPE_TRI; F.order = 1; F.serendip = false; break;
+    case MSH_TRI_6   : F.parentType = TYPE_TRI; F.order = 2; F.serendip = false; break;
+    case MSH_TRI_10  : F.parentType = TYPE_TRI; F.order = 3; F.serendip = false; break;
+    case MSH_TRI_15  : F.parentType = TYPE_TRI; F.order = 4; F.serendip = false; break;
+    case MSH_TRI_21  : F.parentType = TYPE_TRI; F.order = 5; F.serendip = false; break;
+    case MSH_TRI_28  : F.parentType = TYPE_TRI; F.order = 6; F.serendip = false; break;
+    case MSH_TRI_36  : F.parentType = TYPE_TRI; F.order = 7; F.serendip = false; break;
+    case MSH_TRI_45  : F.parentType = TYPE_TRI; F.order = 8; F.serendip = false; break;
+    case MSH_TRI_55  : F.parentType = TYPE_TRI; F.order = 9; F.serendip = false; break;
+    case MSH_TRI_66  : F.parentType = TYPE_TRI; F.order = 10;F.serendip = false; break;
+    case MSH_TRI_9   : F.parentType = TYPE_TRI; F.order = 3; F.serendip = true;  break;
+    case MSH_TRI_12  : F.parentType = TYPE_TRI; F.order = 4; F.serendip = true;  break;
+    case MSH_TRI_15I : F.parentType = TYPE_TRI; F.order = 5; F.serendip = true;  break;
+    case MSH_TRI_18  : F.parentType = TYPE_TRI; F.order = 6; F.serendip = true;  break;
+    case MSH_TRI_21I : F.parentType = TYPE_TRI; F.order = 7; F.serendip = true;  break;
+    case MSH_TRI_24  : F.parentType = TYPE_TRI; F.order = 8; F.serendip = true;  break;
+    case MSH_TRI_27  : F.parentType = TYPE_TRI; F.order = 9; F.serendip = true;  break;
+    case MSH_TRI_30  : F.parentType = TYPE_TRI; F.order = 10;F.serendip = true;  break;
+    case MSH_TET_1   : F.parentType = TYPE_TET; F.order = 0; F.serendip = false; break;
+    case MSH_TET_4   : F.parentType = TYPE_TET; F.order = 1; F.serendip = false; break;
+    case MSH_TET_10  : F.parentType = TYPE_TET; F.order = 2; F.serendip = false; break;
+    case MSH_TET_20  : F.parentType = TYPE_TET; F.order = 3; F.serendip = false; break;
+    case MSH_TET_35  : F.parentType = TYPE_TET; F.order = 4; F.serendip = false; break;
+    case MSH_TET_56  : F.parentType = TYPE_TET; F.order = 5; F.serendip = false; break;
+    case MSH_TET_84  : F.parentType = TYPE_TET; F.order = 6; F.serendip = false; break;
+    case MSH_TET_120 : F.parentType = TYPE_TET; F.order = 7; F.serendip = false; break;
+    case MSH_TET_165 : F.parentType = TYPE_TET; F.order = 8; F.serendip = false; break;
+    case MSH_TET_220 : F.parentType = TYPE_TET; F.order = 9; F.serendip = false; break;
+    case MSH_TET_286 : F.parentType = TYPE_TET; F.order = 10;F.serendip = false; break;
+    case MSH_TET_34  : F.parentType = TYPE_TET; F.order = 4; F.serendip = true;  break;
+    case MSH_TET_52  : F.parentType = TYPE_TET; F.order = 5; F.serendip = true;  break;
+    case MSH_TET_74  : F.parentType = TYPE_TET; F.order = 6; F.serendip = true;  break;
+    case MSH_TET_100 : F.parentType = TYPE_TET; F.order = 7; F.serendip = true;  break;
+    case MSH_TET_130 : F.parentType = TYPE_TET; F.order = 8; F.serendip = true;  break;
+    case MSH_TET_164 : F.parentType = TYPE_TET; F.order = 9; F.serendip = true;  break;
+    case MSH_TET_202 : F.parentType = TYPE_TET; F.order = 10;F.serendip = true;  break;
+    case MSH_QUA_1   : F.parentType = TYPE_QUA; F.order = 0; F.serendip = false; break;
+    case MSH_QUA_4   : F.parentType = TYPE_QUA; F.order = 1; F.serendip = false; break;
+    case MSH_QUA_9   : F.parentType = TYPE_QUA; F.order = 2; F.serendip = false; break;
+    case MSH_QUA_16  : F.parentType = TYPE_QUA; F.order = 3; F.serendip = false; break;
+    case MSH_QUA_25  : F.parentType = TYPE_QUA; F.order = 4; F.serendip = false; break;
+    case MSH_QUA_36  : F.parentType = TYPE_QUA; F.order = 5; F.serendip = false; break;
+    case MSH_QUA_49  : F.parentType = TYPE_QUA; F.order = 6; F.serendip = false; break;
+    case MSH_QUA_64  : F.parentType = TYPE_QUA; F.order = 7; F.serendip = false; break;
+    case MSH_QUA_81  : F.parentType = TYPE_QUA; F.order = 8; F.serendip = false; break;
+    case MSH_QUA_100 : F.parentType = TYPE_QUA; F.order = 9; F.serendip = false; break;
+    case MSH_QUA_121 : F.parentType = TYPE_QUA; F.order = 10;F.serendip = false; break;
+    case MSH_QUA_8   : F.parentType = TYPE_QUA; F.order = 2; F.serendip = true;  break;
+    case MSH_QUA_12  : F.parentType = TYPE_QUA; F.order = 3; F.serendip = true;  break;
+    case MSH_QUA_16I : F.parentType = TYPE_QUA; F.order = 4; F.serendip = true;  break;
+    case MSH_QUA_20  : F.parentType = TYPE_QUA; F.order = 5; F.serendip = true;  break;
+    case MSH_QUA_24  : F.parentType = TYPE_QUA; F.order = 6; F.serendip = true;  break;
+    case MSH_QUA_28  : F.parentType = TYPE_QUA; F.order = 7; F.serendip = true;  break;
+    case MSH_QUA_32  : F.parentType = TYPE_QUA; F.order = 8; F.serendip = true;  break;
+    case MSH_QUA_36I : F.parentType = TYPE_QUA; F.order = 9; F.serendip = true;  break;
+    case MSH_QUA_40  : F.parentType = TYPE_QUA; F.order = 10;F.serendip = true;  break;
+    case MSH_PRI_1   : F.parentType = TYPE_PRI; F.order = 0; F.serendip = false; break;
+    case MSH_PRI_6   : F.parentType = TYPE_PRI; F.order = 1; F.serendip = false; break;
+    case MSH_PRI_18  : F.parentType = TYPE_PRI; F.order = 2; F.serendip = false; break;
+    case MSH_HEX_8   : F.parentType = TYPE_HEX; F.order = 1; F.serendip = false; break;
+    case MSH_HEX_27  : F.parentType = TYPE_HEX; F.order = 2; F.serendip = false; break;
+    case MSH_HEX_64  : F.parentType = TYPE_HEX; F.order = 3; F.serendip = false; break;
+    case MSH_HEX_125 : F.parentType = TYPE_HEX; F.order = 4; F.serendip = false; break;
+    case MSH_HEX_216 : F.parentType = TYPE_HEX; F.order = 5; F.serendip = false; break;
+    case MSH_HEX_343 : F.parentType = TYPE_HEX; F.order = 6; F.serendip = false; break;
+    case MSH_HEX_512 : F.parentType = TYPE_HEX; F.order = 7; F.serendip = false; break;
+    case MSH_HEX_729 : F.parentType = TYPE_HEX; F.order = 8; F.serendip = false; break;
+    case MSH_HEX_1000: F.parentType = TYPE_HEX; F.order = 9; F.serendip = false; break;
+    case MSH_HEX_20  : F.parentType = TYPE_HEX; F.order = 2; F.serendip = false; break;
+    case MSH_HEX_56  : F.parentType = TYPE_HEX; F.order = 3; F.serendip = false; break;
+    case MSH_HEX_98  : F.parentType = TYPE_HEX; F.order = 4; F.serendip = false; break;
+    case MSH_HEX_152 : F.parentType = TYPE_HEX; F.order = 5; F.serendip = false; break;
+    case MSH_HEX_222 : F.parentType = TYPE_HEX; F.order = 6; F.serendip = false; break;
+    case MSH_HEX_296 : F.parentType = TYPE_HEX; F.order = 7; F.serendip = false; break;
+    case MSH_HEX_386 : F.parentType = TYPE_HEX; F.order = 8; F.serendip = false; break;
+    case MSH_HEX_488 : F.parentType = TYPE_HEX; F.order = 9; F.serendip = false; break;
+    default :
+      Msg::Error("Unknown function space %d: reverting to TET_4", tag);
+      F.parentType = TYPE_TET; F.order = 1; F.serendip = false;
+  }
+  switch (F.parentType) {
+    case TYPE_PNT :
+      F.numFaces = 1;
+      F.dimension = 0;
+      F.monomials = generate1DMonomials(0);
+      F.points = generate1DPoints(0);
+      break;
+    case TYPE_LIN :
+      F.numFaces = 2;
+      F.dimension = 1;
+      F.monomials = generate1DMonomials(F.order);
+      F.points = generate1DPoints(F.order);
+      generate1dVertexClosure(F.closures, F.order);
+      generate1dVertexClosureFull(F.fullClosures, F.closureRef, F.order);
+      break;
+    case TYPE_TRI :
+      F.numFaces = 3;
+      F.dimension = 2;
+      F.monomials = generatePascalTriangle(F.order);
+      F.points =    gmshGeneratePointsTriangle(F.order, F.serendip);
+      if (F.order == 0) {
+        generateClosureOrder0(F.closures, 6);
+        generateClosureOrder0(F.fullClosures, 6);
+        F.closureRef.resize(6, 0);
+      } else {
+        generate2dEdgeClosure(F.closures, F.order);
+        generate2dEdgeClosureFull(F.fullClosures, F.closureRef, F.order, 3, F.serendip);
+      }
+      break;
+    case TYPE_QUA :
+      F.numFaces = 4;
+      F.dimension = 2;
+      F.monomials = generatePascalQuad(F.order);
+      F.points = gmshGeneratePointsQuad(F.order, F.serendip);
+      if (F.order == 0) {
+        generateClosureOrder0(F.closures, 8);
+        generateClosureOrder0(F.fullClosures, 8);
+        F.closureRef.resize(8, 0);
+      } else {
+        generate2dEdgeClosure(F.closures, F.order, 4);
+        generate2dEdgeClosureFull(F.fullClosures, F.closureRef, F.order, 4, F.serendip);
+      }
+      break;
+    case TYPE_TET :
+      F.numFaces = 4;
+      F.dimension = 3;
+      F.monomials = generatePascalTetrahedron(F.order);
+      F.points = gmshGeneratePointsTetrahedron(F.order, F.serendip);
+      if (F.order == 0) {
+        generateClosureOrder0(F.closures,24);
+        generateClosureOrder0(F.fullClosures, 24);
+        F.closureRef.resize(24, 0);
+      } else {
+        generateFaceClosureTet(F.closures, F.order);
+        generateFaceClosureTetFull(F.fullClosures, F.closureRef, F.order, F.serendip);
+      }
+      break;
+    case TYPE_PRI :
+      F.numFaces = 5;
+      F.dimension = 3;
+      F.monomials = generatePascalPrism(0);
+      F.points = gmshGeneratePointsPrism(0, F.serendip);
+      if (F.order == 0) {
+        generateClosureOrder0(F.closures,48);
+        generateClosureOrder0(F.fullClosures,48);
+        F.closureRef.resize(48, 0);
+      } else {
+        generateFaceClosurePrism(F.closures, 1);
+        generateFaceClosurePrismFull(F.fullClosures, F.closureRef, F.order);
+      }
+      break;
+    case TYPE_HEX :
+      F.numFaces = 6;
+      F.dimension = 3;
+      F.monomials = generatePascalHex(F.order,F.serendip);
+      F.points =    gmshGeneratePointsHex(F.order, F.serendip);
+      //    generateFaceClosureHex(F.closures, F.order);
+      //    generateFaceClosureHexFull(F.fullClosures, F.closureRef, F.order, F.serendip);
+      break;
+  }
   F.coefficients = generateLagrangeMonomialCoefficients(F.monomials, F.points);
-
-  // printf("Case: %d coeffs:\n",tag);
-  // for (int i = 0; i<F.coefficients.size1(); i++) {
-  //   for (int j = 0; j<F.coefficients.size2(); j++) {
-  //     printf("%4.1f ",F.coefficients(i,j));
-  //   }
-  //   printf("\n");
-  // }
-
   fs.insert(std::make_pair(tag, F));
   return &fs[tag];
 }
diff --git a/Numeric/polynomialBasis.h b/Numeric/polynomialBasis.h
index 3e212b5406ae61e53be92b06fc7f57a8dd55c316..54131bbc0d6b47c15d3d3efe230e67d8445d8c6c 100644
--- a/Numeric/polynomialBasis.h
+++ b/Numeric/polynomialBasis.h
@@ -71,7 +71,8 @@ class polynomialBasis
  public:
   //for now the only implemented polynomial basis are nodal poly
   //basis, we use the type of the corresponding gmsh element as type
-  int type, parentType;
+  int type, parentType, order, dimension;
+  bool serendip;
   class closure : public std::vector<int> {
     public: 
     int type;