diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h
index 000efdbd6ddbafbf8b7ce82f89a60bdffe31bc52..999913e9991d453898b915d36269f3aea945c736 100644
--- a/Common/GmshDefines.h
+++ b/Common/GmshDefines.h
@@ -96,6 +96,31 @@
 #define MSH_QUA_12 39
 #define MSH_QUA_16I 40
 #define MSH_QUA_20 41
+#define MSH_TRI_28 42
+#define MSH_TRI_36 43
+#define MSH_TRI_45 44
+#define MSH_TRI_55 45
+#define MSH_TRI_66 46
+#define MSH_QUA_49 47
+#define MSH_QUA_64 48
+#define MSH_QUA_81 49
+#define MSH_QUA_100 50
+#define MSH_QUA_121 51
+#define MSH_TRI_18 52
+#define MSH_TRI_21I 53
+#define MSH_TRI_24 54
+#define MSH_TRI_27 55
+#define MSH_TRI_30 56
+#define MSH_QUA_24 57
+#define MSH_QUA_28 58
+#define MSH_QUA_32 59
+#define MSH_QUA_36I 60
+#define MSH_QUA_40 61
+#define MSH_LIN_7  62
+#define MSH_LIN_8  63
+#define MSH_LIN_9  64
+#define MSH_LIN_10  65
+#define MSH_LIN_11  66
 
 #define MSH_NUM_TYPE 35
 
diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index 0913b8d2266ced55a2b5de5e0a6bc345a71d834f..d4cdaeb0be59be90b1968a6732fbfc8ce89dbc3b 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -385,6 +385,8 @@ bool GFaceCompound::checkFolding(std::vector<MVertex*> &ordered) const
 bool GFaceCompound::checkOrientation(int iter) const
 {
  
+  return true;
+
   //Only check orientation for stl files (1 patch)
   //  if(_compound.size() > 1.0) return true;
 
@@ -496,7 +498,7 @@ bool GFaceCompound::parametrize() const
   //Multiscale Laplace parametrization
   //-----------------
   else if (_mapping == MULTISCALE){
-    printf("multiscale exit \n");
+    //    printf("multiscale exit \n");
     std::vector<MElement*> _elements;
     for( std::list<GFace*>::const_iterator itt = _compound.begin(); itt != _compound.end(); ++itt)
       for(unsigned int i = 0; i < (*itt)->triangles.size(); ++i)
@@ -523,6 +525,8 @@ bool GFaceCompound::parametrize() const
 
   buildOct();  
 
+  printStuff();
+
   if (!checkOrientation(0)){
     Msg::Info("--- Parametrization switched to convex combination map");
     coordinates.clear(); 
@@ -534,7 +538,6 @@ bool GFaceCompound::parametrize() const
     buildOct();
   }
 
-  printStuff();
 
   double AR = checkAspectRatio();
   if (floor(AR)  > AR_MAX){
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 45002386829f1cbec8486eda2dcb524f7c0b2670..f0d2970503dd53630ad9e443d1527a014744abd7 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -348,15 +348,25 @@ int GModel::readMSH(const std::string &name)
             if(fscanf(fp, "%d %d %d %d %d", &num, &type, &physical, &elementary, 
                       &numVertices) != 5)
               return 0;
-            if(numVertices != MElement::getInfoMSH(type)) return 0;
+            if(numVertices != MElement::getInfoMSH(type)) {
+	      //	      printf("coucou1\n");
+	      return 0;
+	    }
           }
           else{
             int numTags;
-            if(fscanf(fp, "%d %d %d", &num, &type, &numTags) != 3) return 0;
+            if(fscanf(fp, "%d %d %d", &num, &type, &numTags) != 3) {
+	      //	      printf("coucou2\n");
+	      return 0;
+	    }
+	    //	    printf("%d %d %d\n",num,type,numTags);
             int numPartitions = 0;
             for(int j = 0; j < numTags; j++){
               int tag;
-              if(fscanf(fp, "%d", &tag) != 1) return 0;
+              if(fscanf(fp, "%d", &tag) != 1) {
+		//		printf("coucou3\n");
+		return 0;
+	      }
               if(j == 0) physical = tag;
               else if(j == 1) elementary = tag;
               else if(version < 2.2 && j == 2) partition = tag;
@@ -366,19 +376,35 @@ int GModel::readMSH(const std::string &name)
               else if(j == numTags - 1) parent = tag;
             }
             if(!(numVertices = MElement::getInfoMSH(type))) {
-              if(type != MSH_POLYG_ && type != MSH_POLYH_) return 0;
-              if(fscanf(fp, "%d", &numVertices) != 1) return 0;
+              if(type != MSH_POLYG_ && type != MSH_POLYH_) {
+		//		printf("coucou4\n");
+		return 0;
+	      }
+              if(fscanf(fp, "%d", &numVertices) != 1){
+		//		printf("coucou5\n");
+		return 0;
+	      }
             }
+	    
           }
           int *indices = new int[numVertices];
           for(int j = 0; j < numVertices; j++)
-            if(fscanf(fp, "%d", &indices[j]) != 1) return 0;
+            if(fscanf(fp, "%d", &indices[j]) != 1) {
+	      //	      printf("coucou6\n");
+	      return 0;
+	    }
           std::vector<MVertex*> vertices;
           if(vertexVector.size()){
-            if(!getVertices(numVertices, indices, vertexVector, vertices)) return 0;
+            if(!getVertices(numVertices, indices, vertexVector, vertices)) {
+	      //	      printf("coucou7\n");
+	      return 0;
+	    }
           }
           else{
-            if(!getVertices(numVertices, indices, vertexMap, vertices)) return 0;
+            if(!getVertices(numVertices, indices, vertexMap, vertices)) {
+	      //	      printf("coucou8\n");
+	      return 0;
+	    }
           }
           MElement *e = createElementMSH(this, num, type, physical, elementary,
                                          partition, vertices, elements, physicals);
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 76f0a5b08feb9c420a71df5e5680113b5f21d36e..421d93724aa22dfef1115f37d0f9383c417d51a4 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -750,6 +750,11 @@ int MElement::getInfoMSH(const int typeMSH, const char **const name)
   case MSH_LIN_4  : if(name) *name = "Line 4";          return 2 + 2;
   case MSH_LIN_5  : if(name) *name = "Line 5";          return 2 + 3;
   case MSH_LIN_6  : if(name) *name = "Line 6";          return 2 + 4;
+  case MSH_LIN_7  : if(name) *name = "Line 7";          return 2 + 5;
+  case MSH_LIN_8  : if(name) *name = "Line 8";          return 2 + 6;
+  case MSH_LIN_9  : if(name) *name = "Line 9";          return 2 + 7;
+  case MSH_LIN_10  : if(name) *name = "Line 10";        return 2 + 8;
+  case MSH_LIN_11  : if(name) *name = "Line 11";        return 2 + 9;
   case MSH_TRI_3  : if(name) *name = "Triangle 3";      return 3;
   case MSH_TRI_6  : if(name) *name = "Triangle 6";      return 3 + 3;
   case MSH_TRI_9  : if(name) *name = "Triangle 9";      return 3 + 6;
@@ -758,12 +763,27 @@ int MElement::getInfoMSH(const int typeMSH, const char **const name)
   case MSH_TRI_15 : if(name) *name = "Triangle 15";     return 3 + 9 + 3;
   case MSH_TRI_15I: if(name) *name = "Triangle 15I";    return 3 + 12;
   case MSH_TRI_21 : if(name) *name = "Triangle 21";     return 3 + 12 + 6;
+  case MSH_TRI_28 : if(name) *name = "Triangle 28";     return 3 + 15 + 10;
+  case MSH_TRI_36 : if(name) *name = "Triangle 36";     return 3 + 18 + 15;
+  case MSH_TRI_45 : if(name) *name = "Triangle 45";     return 3 + 21 + 21;
+  case MSH_TRI_55 : if(name) *name = "Triangle 55";     return 3 + 24 + 28;
+  case MSH_TRI_66 : if(name) *name = "Triangle 66";     return 3 + 27 + 36;
+  case MSH_TRI_18 : if(name) *name = "Triangle 18";     return 3 + 15;
+  case MSH_TRI_21I : if(name) *name = "Triangle 21I";   return 3 + 18;
+  case MSH_TRI_24 : if(name) *name = "Triangle 24";     return 3 + 21;
+  case MSH_TRI_27 : if(name) *name = "Triangle 27";     return 3 + 24;
+  case MSH_TRI_30 : if(name) *name = "Triangle 30";     return 3 + 27;
   case MSH_QUA_4  : if(name) *name = "Quadrilateral 4"; return 4;
   case MSH_QUA_8  : if(name) *name = "Quadrilateral 8"; return 4 + 4;
   case MSH_QUA_9  : if(name) *name = "Quadrilateral 9"; return 9;
   case MSH_QUA_16  : if(name) *name = "Quadrilateral 16"; return 16;
   case MSH_QUA_25  : if(name) *name = "Quadrilateral 25"; return 25;
   case MSH_QUA_36  : if(name) *name = "Quadrilateral 36"; return 36;
+  case MSH_QUA_49  : if(name) *name = "Quadrilateral 49"; return 49;
+  case MSH_QUA_64  : if(name) *name = "Quadrilateral 64"; return 64;
+  case MSH_QUA_81  : if(name) *name = "Quadrilateral 81"; return 81;
+  case MSH_QUA_100 : if(name) *name = "Quadrilateral 100"; return 100;
+  case MSH_QUA_121 : if(name) *name = "Quadrilateral 121"; return 121;
   case MSH_QUA_12 : if(name) *name = "Quadrilateral 12"; return 12;
   case MSH_QUA_16I : if(name) *name = "Quadrilateral 16I"; return 16;
   case MSH_QUA_20 : if(name) *name = "Quadrilateral 20"; return 20;
@@ -811,6 +831,11 @@ MElement *MElementFactory::create(int type, std::vector<MVertex*> &v,
   case MSH_LIN_4:  return new MLineN(v, num, part);
   case MSH_LIN_5:  return new MLineN(v, num, part);
   case MSH_LIN_6:  return new MLineN(v, num, part);
+  case MSH_LIN_7:  return new MLineN(v, num, part);
+  case MSH_LIN_8:  return new MLineN(v, num, part);
+  case MSH_LIN_9:  return new MLineN(v, num, part);
+  case MSH_LIN_10: return new MLineN(v, num, part);
+  case MSH_LIN_11: return new MLineN(v, num, part);
   case MSH_TRI_3:  return new MTriangle(v, num, part);
   case MSH_TRI_6:  return new MTriangle6(v, num, part);
   case MSH_TRI_9:  return new MTriangleN(v, 3, num, part);
@@ -819,12 +844,22 @@ MElement *MElementFactory::create(int type, std::vector<MVertex*> &v,
   case MSH_TRI_15: return new MTriangleN(v, 4, num, part);
   case MSH_TRI_15I:return new MTriangleN(v, 5, num, part);
   case MSH_TRI_21: return new MTriangleN(v, 5, num, part);
+  case MSH_TRI_28: return new MTriangleN(v, 6, num, part);
+  case MSH_TRI_36: return new MTriangleN(v, 7, num, part);
+  case MSH_TRI_45: return new MTriangleN(v, 8, num, part);
+  case MSH_TRI_55: return new MTriangleN(v, 9, num, part);
+  case MSH_TRI_66: return new MTriangleN(v,10, num, part);
   case MSH_QUA_4:  return new MQuadrangle(v, num, part);
   case MSH_QUA_8:  return new MQuadrangle8(v, num, part);
   case MSH_QUA_9:  return new MQuadrangle9(v, num, part);
   case MSH_QUA_16:  return new MQuadrangleN(v, 3, num, part);
   case MSH_QUA_25:  return new MQuadrangleN(v, 4, num, part);
   case MSH_QUA_36:  return new MQuadrangleN(v, 5, num, part);
+  case MSH_QUA_49:  return new MQuadrangleN(v, 6, num, part);
+  case MSH_QUA_64:  return new MQuadrangleN(v, 7, num, part);
+  case MSH_QUA_81:  return new MQuadrangleN(v, 8, num, part);
+  case MSH_QUA_100:  return new MQuadrangleN(v, 9, num, part);
+  case MSH_QUA_121:  return new MQuadrangleN(v, 10, num, part);
   case MSH_POLYG_: return new MPolygon(v, num, part);
   case MSH_TET_4:  return new MTetrahedron(v, num, part);
   case MSH_TET_10: return new MTetrahedron10(v, num, part);
diff --git a/Geo/MLine.cpp b/Geo/MLine.cpp
index 2349f0a8324a3888c31b9a440514b9701a8b2486..b6cdc2fc7f795d6bdc6f854f789e6c500cab18f7 100644
--- a/Geo/MLine.cpp
+++ b/Geo/MLine.cpp
@@ -19,6 +19,11 @@ const polynomialBasis* MLine::getFunctionSpace(int o) const
   case 3: return &polynomialBases::find(MSH_LIN_4);
   case 4: return &polynomialBases::find(MSH_LIN_5);
   case 5: return &polynomialBases::find(MSH_LIN_6);
+  case 6: return &polynomialBases::find(MSH_LIN_7);
+  case 7: return &polynomialBases::find(MSH_LIN_8);
+  case 8: return &polynomialBases::find(MSH_LIN_9);
+  case 9: return &polynomialBases::find(MSH_LIN_10);
+  case 10: return &polynomialBases::find(MSH_LIN_11);
   default: Msg::Error("Order %d line function space not implemented", order);
   }
   return 0;
diff --git a/Geo/MLine.h b/Geo/MLine.h
index 9b8198958174fede4054711bd879406daba45f66..de78ae3daea133e0b000dd15610d260fd05dfedf 100644
--- a/Geo/MLine.h
+++ b/Geo/MLine.h
@@ -178,6 +178,11 @@ class MLineN : public MLine {
     if(_vs.size() == 2) return MSH_LIN_4; 
     if(_vs.size() == 3) return MSH_LIN_5; 
     if(_vs.size() == 4) return MSH_LIN_6; 
+    if(_vs.size() == 5) return MSH_LIN_7; 
+    if(_vs.size() == 6) return MSH_LIN_8; 
+    if(_vs.size() == 7) return MSH_LIN_9; 
+    if(_vs.size() == 8) return MSH_LIN_10; 
+    if(_vs.size() == 9) return MSH_LIN_11; 
     return 0;
   }
 };
diff --git a/Geo/MQuadrangle.cpp b/Geo/MQuadrangle.cpp
index 80aaf08ee69b4cae5737a1d541f3bad6e8af342d..098e061b41ee72a5a046b441d785a5e5183d37b6 100644
--- a/Geo/MQuadrangle.cpp
+++ b/Geo/MQuadrangle.cpp
@@ -29,6 +29,11 @@ const polynomialBasis* MQuadrangle::getFunctionSpace(int o) const
       case 3: return &polynomialBases::find(MSH_QUA_12);
       case 4: return &polynomialBases::find(MSH_QUA_16I);
       case 5: return &polynomialBases::find(MSH_QUA_20);
+      case 6: return &polynomialBases::find(MSH_QUA_24);
+      case 7: return &polynomialBases::find(MSH_QUA_28);
+      case 8: return &polynomialBases::find(MSH_QUA_32);
+      case 9: return &polynomialBases::find(MSH_QUA_36I);
+      case 10: return &polynomialBases::find(MSH_QUA_40);
     }
   }
   switch (order) {
@@ -37,6 +42,11 @@ const polynomialBasis* MQuadrangle::getFunctionSpace(int o) const
     case 3: return &polynomialBases::find(MSH_QUA_16);
     case 4: return &polynomialBases::find(MSH_QUA_25);
     case 5: return &polynomialBases::find(MSH_QUA_36);
+    case 6: return &polynomialBases::find(MSH_QUA_49);
+    case 7: return &polynomialBases::find(MSH_QUA_64);
+    case 8: return &polynomialBases::find(MSH_QUA_81);
+    case 9: return &polynomialBases::find(MSH_QUA_100);
+    case 10: return &polynomialBases::find(MSH_QUA_121);
     default: Msg::Error("Order %d triangle function space not implemented", order);
   }
   return 0;
diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h
index 4cc751606b99a47f1a238924458175a50aa23cda..584ee6aa3d9385ce00786af2dddb001cb4d1e81d 100644
--- a/Geo/MQuadrangle.h
+++ b/Geo/MQuadrangle.h
@@ -375,6 +375,11 @@ class MQuadrangleN : public MQuadrangle {
     if(_order==4 && _vs.size()+4==25) return MSH_QUA_25;
     if(_order==5 && _vs.size()+4==20) return MSH_QUA_20;
     if(_order==5 && _vs.size()+4==36) return MSH_QUA_36;
+    if(_order==6 && _vs.size()+4==49) return MSH_QUA_49;
+    if(_order==7 && _vs.size()+4==64) return MSH_QUA_64;
+    if(_order==8 && _vs.size()+4==81) return MSH_QUA_81;
+    if(_order==9 && _vs.size()+4==100) return MSH_QUA_100;
+    if(_order==10 && _vs.size()+4==121) return MSH_QUA_121;
     return 0;
   }
   virtual void revert() 
diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp
index 3aa43df13b83cc253dfbae7c88362d8405274076..3365ed4250fa82c9f62bdc6fff1e85238ae27be8 100644
--- a/Geo/MTriangle.cpp
+++ b/Geo/MTriangle.cpp
@@ -78,7 +78,12 @@ const polynomialBasis* MTriangle::getFunctionSpace(int o) const
     case 3: return &polynomialBases::find(MSH_TRI_9);
     case 4: return &polynomialBases::find(MSH_TRI_12);
     case 5: return &polynomialBases::find(MSH_TRI_15I);
-    default: Msg::Error("Order %d triangle function space not implemented", order);
+    case 6: return &polynomialBases::find(MSH_TRI_18);
+    case 7: return &polynomialBases::find(MSH_TRI_21I);
+    case 8: return &polynomialBases::find(MSH_TRI_24);
+    case 9: return &polynomialBases::find(MSH_TRI_27);
+    case 10: return &polynomialBases::find(MSH_TRI_30);
+    default: Msg::Error("Order %d triangle incomplete function space not implemented", order);
     }
   }
   else { 
@@ -88,6 +93,11 @@ const polynomialBasis* MTriangle::getFunctionSpace(int o) const
     case 3: return &polynomialBases::find(MSH_TRI_10);
     case 4: return &polynomialBases::find(MSH_TRI_15);
     case 5: return &polynomialBases::find(MSH_TRI_21);
+    case 6: return &polynomialBases::find(MSH_TRI_28);
+    case 7: return &polynomialBases::find(MSH_TRI_36);
+    case 8: return &polynomialBases::find(MSH_TRI_45);
+    case 9: return &polynomialBases::find(MSH_TRI_55);
+    case 10: return &polynomialBases::find(MSH_TRI_66);
     default: Msg::Error("Order %d triangle function space not implemented", order);
     }
   }
diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h
index 5568ac8c565dd6e025b2452edd84408f3d766c7e..08b124c9a9572e00c52cd79675ebf5bbf0325c92 100644
--- a/Geo/MTriangle.h
+++ b/Geo/MTriangle.h
@@ -266,7 +266,17 @@ class MTriangleN : public MTriangle {
     if(_order == 4 && _vs.size() == 9) return 0;
     if(_order == 4 && _vs.size() == 12) return 3;
     if(_order == 5 && _vs.size() == 12) return 0;
-    if(_order == 5 && _vs.size() == 18) return 6;
+    if(_order == 5  && _vs.size() == 18) return 6;
+    if(_order == 6  && _vs.size() == 25) return 10;
+    if(_order == 7  && _vs.size() == 33) return 12;
+    if(_order == 8  && _vs.size() == 42) return 15;
+    if(_order == 9  && _vs.size() == 52) return 21;
+    if(_order == 10 && _vs.size() == 63) return 28;
+    if(_order == 6  && _vs.size() == 15) return 0;
+    if(_order == 7  && _vs.size() == 18) return 0;
+    if(_order == 8  && _vs.size() == 21) return 0;
+    if(_order == 9  && _vs.size() == 24) return 0;
+    if(_order == 10  && _vs.size() == 27) return 0;
     return 0;
   }
   virtual int getNumEdgeVertices() const { return 3 * (_order - 1); }
@@ -297,6 +307,11 @@ class MTriangleN : public MTriangle {
     if(_order == 4 && _vs.size() == 12) return MSH_TRI_15; 
     if(_order == 5 && _vs.size() == 12) return MSH_TRI_15I; 
     if(_order == 5 && _vs.size() == 18) return MSH_TRI_21;
+    if(_order == 6 && _vs.size() == 25) return MSH_TRI_28; 
+    if(_order == 7 && _vs.size() == 33) return MSH_TRI_36; 
+    if(_order == 8 && _vs.size() == 42) return MSH_TRI_45; 
+    if(_order == 9 && _vs.size() == 52) return MSH_TRI_55; 
+    if(_order ==10 && _vs.size() == 63) return MSH_TRI_66; 
     return 0;
   }
   virtual void revert() 
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 61a846627520c9d6c6fd3cba1a8d3e1983169a55..c1af7e7db62a766587074aaecd024d2fb34e14c3 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -416,7 +416,7 @@ static void getFaceVertices(GFace *gf, MElement *incomplete, MElement *ele,
     }
     else{
       std::vector<MVertex*> &vtcs = faceVertices[face];
-      SPoint2 pts[20];
+      SPoint2 pts[100];
       bool reparamOK = true;
       if(!linear){
         for(int k = 0; k < incomplete->getNumVertices(); k++)
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index c5270b06dfeef79ea92f152f36061814d0b000d5..fe0011e2b5e2dd622f8589cef12fe5034a49e1cc 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -270,12 +270,10 @@ void meshGEdge::operator() (GEdge *ge)
   ge->setLength(length);
   Points.clear();
 
-  if(length == 0.){
-    if(CTX::instance()->mesh.toleranceEdgeLength == 0.)
-      Msg::Error("Curve %d has a zero length", ge->tag());
-    else
-      Msg::Debug("Curve %d has a zero length", ge->tag());
-  }
+  if(length == 0. && CTX::instance()->mesh.toleranceEdgeLength == 0.)
+    Msg::Error("Curve %d has a zero length", ge->tag());
+  else if (length == 0.)
+    Msg::Debug("Curve %d has a zero length", ge->tag());
 
   if(length < CTX::instance()->mesh.toleranceEdgeLength)
     ge->setTooSmall(true);
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 537117d1f59d2bf304a3b99a5715cc184730ca45..8217d95b0bca7dbd957e1a835a74d84e34c85bd4 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1235,7 +1235,7 @@ void deMeshGFace::operator() (GFace *gf)
   gf->meshStatistics.nbTriangle = gf->meshStatistics.nbEdge = 0;
 }
 
-int debugSurface = -1;
+int debugSurface = -100;
 
 void meshGFace::operator() (GFace *gf)
 {
diff --git a/Mesh/qualityMeasures.cpp b/Mesh/qualityMeasures.cpp
index 703320d751e97b0f2e9e4c9ebe0a2ba189638aac..54b150ecf14ecc813a703df959dc8cfdf6d5d7a7 100644
--- a/Mesh/qualityMeasures.cpp
+++ b/Mesh/qualityMeasures.cpp
@@ -375,9 +375,9 @@ double qmTriangleAngles (MTriangle *e) {
     double c;
     prosca(v1,v2,&c);
     double x = acos(c)-M_PI/3;
-    printf("Angle %g ", (x+M_PI/3)/M_PI*180);
+    //    printf("Angle %g ", (x+M_PI/3)/M_PI*180);
     double quality = (atan(a*(x+M_PI/9)) + atan(a*(M_PI/9-x)))/den;
-    printf("Quality %g\n",quality);
+    //    printf("Quality %g\n",quality);
     worst_quality = std::min(worst_quality, quality);
   }
   //printf("\n");
diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp
index 3705ace1f3c5d9d64fe5e6faaaba7977417acea4..43fed498c7353ba87a73e17a213f6e726eaa8db2 100644
--- a/Numeric/polynomialBasis.cpp
+++ b/Numeric/polynomialBasis.cpp
@@ -716,7 +716,9 @@ static fullMatrix<double> generateLagrangeMonomialCoefficients
   (const fullMatrix<double>& monomial, const fullMatrix<double>& point)
 {
   if(monomial.size1() != point.size1() || monomial.size2() != point.size2()){
-    Msg::Fatal("Wrong sizes for Lagrange coefficients generation");
+    Msg::Fatal("Wrong sizes for Lagrange coefficients generation %d %d -- %d %d",
+	       monomial.size1(),point.size1(),
+	       monomial.size2(),point.size2() );
     return fullMatrix<double>(1, 1);
   }
 
@@ -934,6 +936,36 @@ const polynomialBasis &polynomialBases::find(int tag)
     F.points    = generate1DPoints(5);
     generate1dVertexClosure(F.closures);
     break;
+  case MSH_LIN_7:
+    F.numFaces = 2;
+    F.monomials = generate1DMonomials(6);
+    F.points    = generate1DPoints(6);
+    generate1dVertexClosure(F.closures);
+    break;
+  case MSH_LIN_8:
+    F.numFaces = 2;
+    F.monomials = generate1DMonomials(7);
+    F.points    = generate1DPoints(7);
+    generate1dVertexClosure(F.closures);
+    break;
+  case MSH_LIN_9:
+    F.numFaces = 2;
+    F.monomials = generate1DMonomials(8);
+    F.points    = generate1DPoints(8);
+    generate1dVertexClosure(F.closures);
+    break;
+  case MSH_LIN_10:
+    F.numFaces = 2;
+    F.monomials = generate1DMonomials(9);
+    F.points    = generate1DPoints(9);
+    generate1dVertexClosure(F.closures);
+    break;
+  case MSH_LIN_11:
+    F.numFaces = 2;
+    F.monomials = generate1DMonomials(10);
+    F.points    = generate1DPoints(10);
+    generate1dVertexClosure(F.closures);
+    break;
   case MSH_TRI_3 :
     F.numFaces = 3;
     F.monomials = generatePascalTriangle(1);
@@ -982,6 +1014,66 @@ const polynomialBasis &polynomialBases::find(int tag)
     F.points =    gmshGeneratePointsTriangle(5, false);
     generate2dEdgeClosure(F.closures, 5);
     break;
+  case MSH_TRI_28 :
+    F.numFaces = 3;
+    F.monomials = generatePascalTriangle(6);
+    F.points =    gmshGeneratePointsTriangle(6, false);    
+    generate2dEdgeClosure(F.closures, 6);
+    break;
+  case MSH_TRI_36 :
+    F.numFaces = 3;
+    F.monomials = generatePascalTriangle(7);
+    F.points =    gmshGeneratePointsTriangle(7, false);
+    generate2dEdgeClosure(F.closures, 7);
+    break;
+  case MSH_TRI_45 :
+    F.numFaces = 3;
+    F.monomials = generatePascalTriangle(8);
+    F.points =    gmshGeneratePointsTriangle(8, false);
+    generate2dEdgeClosure(F.closures, 8);
+    break;
+  case MSH_TRI_55 :
+    F.numFaces = 3;
+    F.monomials = generatePascalTriangle(9);
+    F.points =    gmshGeneratePointsTriangle(9, false);
+    generate2dEdgeClosure(F.closures, 9);
+    break;
+  case MSH_TRI_66 :
+    F.numFaces = 3;
+    F.monomials = generatePascalTriangle(10);
+    F.points =    gmshGeneratePointsTriangle(10, false);
+    generate2dEdgeClosure(F.closures, 10);
+    break;
+  case MSH_TRI_18 :
+    F.numFaces = 3;
+    F.monomials = generatePascalSerendipityTriangle(6);
+    F.points =    gmshGeneratePointsTriangle(6, true);
+    generate2dEdgeClosure(F.closures, 6);
+    break;
+  case MSH_TRI_21I :
+    F.numFaces = 3;
+    F.monomials = generatePascalSerendipityTriangle(7);
+    F.points =    gmshGeneratePointsTriangle(7, true);
+    generate2dEdgeClosure(F.closures, 7);
+    break;
+  case MSH_TRI_24 :
+    F.numFaces = 3;
+    F.monomials = generatePascalSerendipityTriangle(8);
+    F.points =    gmshGeneratePointsTriangle(8, true);
+    generate2dEdgeClosure(F.closures, 8);
+    break;
+  case MSH_TRI_27 :
+    F.numFaces = 3;
+    F.monomials = generatePascalSerendipityTriangle(9);
+    F.points =    gmshGeneratePointsTriangle(9, true);
+    generate2dEdgeClosure(F.closures, 9);
+    break;
+  case MSH_TRI_30 :
+    F.numFaces = 3;
+    F.monomials = generatePascalSerendipityTriangle(10);
+    F.points =    gmshGeneratePointsTriangle(10, true);
+    generate2dEdgeClosure(F.closures, 10);
+    break;
   case MSH_TET_4 :
     F.numFaces = 4;
     F.monomials = generatePascalTetrahedron(1);
@@ -1054,6 +1146,36 @@ const polynomialBasis &polynomialBases::find(int tag)
     F.points =    gmshGeneratePointsQuad(5,false);
     generate2dEdgeClosure(F.closures, 5, 4);
     break;
+  case MSH_QUA_49 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuad(6);
+    F.points =    gmshGeneratePointsQuad(6,false);
+    generate2dEdgeClosure(F.closures, 6, 4);
+    break;
+  case MSH_QUA_64 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuad(7);
+    F.points =    gmshGeneratePointsQuad(7,false);
+    generate2dEdgeClosure(F.closures, 7, 4);
+    break;
+  case MSH_QUA_81 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuad(8);
+    F.points =    gmshGeneratePointsQuad(8,false);
+    generate2dEdgeClosure(F.closures, 8, 4);
+    break;
+  case MSH_QUA_100 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuad(9);
+    F.points =    gmshGeneratePointsQuad(9,false);
+    generate2dEdgeClosure(F.closures, 9, 4);
+    break;
+  case MSH_QUA_121 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuad(10);
+    F.points =    gmshGeneratePointsQuad(10,false);
+    generate2dEdgeClosure(F.closures, 10, 4);
+    break;
   case MSH_QUA_8 :
     F.numFaces = 4;
     F.monomials = generatePascalQuadSerendip(2);
@@ -1078,6 +1200,36 @@ const polynomialBasis &polynomialBases::find(int tag)
     F.points =    gmshGeneratePointsQuad(5,true);
     generate2dEdgeClosure(F.closures, 5, 4);
     break;
+  case MSH_QUA_24 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuadSerendip(6);
+    F.points =    gmshGeneratePointsQuad(6,true);
+    generate2dEdgeClosure(F.closures, 6, 4);
+    break;
+  case MSH_QUA_28 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuadSerendip(7);
+    F.points =    gmshGeneratePointsQuad(7,true);
+    generate2dEdgeClosure(F.closures, 7, 4);
+    break;
+  case MSH_QUA_32 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuadSerendip(8);
+    F.points =    gmshGeneratePointsQuad(8,true);
+    generate2dEdgeClosure(F.closures, 8, 4);
+    break;
+  case MSH_QUA_36I :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuadSerendip(9);
+    F.points =    gmshGeneratePointsQuad(9,true);
+    generate2dEdgeClosure(F.closures, 9, 4);
+    break;
+  case MSH_QUA_40 :
+    F.numFaces = 4;
+    F.monomials = generatePascalQuadSerendip(10);
+    F.points =    gmshGeneratePointsQuad(10,true);
+    generate2dEdgeClosure(F.closures, 10, 4);
+    break;
   case MSH_PRI_6 : // first order
     F.numFaces = 5;
     F.monomials = generatePascalPrism(1);
@@ -1099,6 +1251,7 @@ const polynomialBasis &polynomialBases::find(int tag)
     generate3dFaceClosure(F.closures, 1);
     break;
   }
+
   F.coefficients = generateLagrangeMonomialCoefficients(F.monomials, F.points);
 //   printf("Case: %d coeffs:\n",tag);
 //   for (int i = 0; i<F.coefficients.size1(); i++) {
diff --git a/Numeric/polynomialBasis.h b/Numeric/polynomialBasis.h
index 3c4acab11ad53d4520fa7d60676fa8bfa0e8ef21..80cece67066ae08efb2630a70f1d26d208fbcc21 100644
--- a/Numeric/polynomialBasis.h
+++ b/Numeric/polynomialBasis.h
@@ -12,6 +12,57 @@
 #include "fullMatrix.h"
 #include <iostream>
 
+inline double pow_int (const double &a , const int &n) {
+  switch (n) {
+  case 0 : return 1.0;
+  case 1 : return a;
+  case 2 : return a*a;
+  case 3 : return a*a*a;
+  case 4 : 
+    {
+      const double a2 = a*a;
+      return a2*a2;
+    }
+  case 5 : 
+    {
+      const double a2 = a*a;
+      const double a3 = a*a*a;
+      return a2*a3;
+    }
+  case 6 : 
+    {
+      const double a3 = a*a*a;
+      return a3*a3;
+    }
+  case 7 : 
+    {
+      const double a3 = a*a*a;
+      return a3*a3*a;      
+    }
+  case 8 : 
+    {
+      const double a2 = a*a;
+      const double a4 = a2*a2;
+      return a4*a4;      
+    }
+  case 9 : 
+    {
+      const double a2 = a*a;
+      const double a4 = a2*a2;
+      return a4*a4*a;      
+    }
+  case 10 : 
+    {
+      const double a2 = a*a;
+      const double a4 = a2*a2;
+      return a4*a4*a2;      
+    }
+  default :
+    return pow_int(a,n-1)*a;
+  }
+} 
+
+
 // presently those function spaces are only for simplices and quads;
 // should be extended to other elements like hexes
 class polynomialBasis 
@@ -35,9 +86,9 @@ class polynomialBasis
   inline void evaluateMonomials(double u, double v, double w, double p[]) const
   {
     for (int j = 0; j < monomials.size1(); j++) {
-      p[j] = pow(u, (int)monomials(j, 0));
-      if (monomials.size2() > 1) p[j] *= pow(v, (int)monomials(j, 1));
-      if (monomials.size2() > 2) p[j] *= pow(w, (int)monomials(j, 2));
+      p[j] = pow_int(u, (int)monomials(j, 0));
+      if (monomials.size2() > 1) p[j] *= pow_int(v, (int)monomials(j, 1));
+      if (monomials.size2() > 2) p[j] *= pow_int(w, (int)monomials(j, 2));
     }
   }
   inline void f(double u, double v, double w, double *sf) const
@@ -62,7 +113,7 @@ class polynomialBasis
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 0)
             grads[i][0] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0);
+              pow_int(u, (int)(monomials(j, 0) - 1)) * monomials(j, 0);
         }
       }
       break;
@@ -74,12 +125,12 @@ class polynomialBasis
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 0)
             grads[i][0] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0) *
-              pow(v, monomials(j, 1));
+              pow_int(u, (int)(monomials(j, 0) - 1)) * monomials(j, 0) *
+              pow_int(v, (int)monomials(j, 1));
           if (monomials(j, 1) > 0)
             grads[i][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1) - 1) * monomials(j, 1);
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)(monomials(j, 1) - 1)) * monomials(j, 1);
         }
       }
       break;
@@ -91,19 +142,19 @@ class polynomialBasis
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 0)
             grads[i][0] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0) *
-              pow(v, monomials(j, 1)) *
-              pow(w, monomials(j, 2));
+              pow_int(u, (int)(monomials(j, 0) - 1)) * monomials(j, 0) *
+              pow_int(v, (int)monomials(j, 1)) *
+              pow_int(w, (int)monomials(j, 2));
           if (monomials(j, 1) > 0)
             grads[i][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1) - 1) * monomials(j, 1) *
-              pow(w, monomials(j, 2));
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)(monomials(j, 1) - 1)) * monomials(j, 1) *
+              pow_int(w, (int)monomials(j, 2));
           if (monomials(j, 2) > 0)
             grads[i][2] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1)) *
-              pow(w, monomials(j, 2) - 1) * monomials(j, 2);
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)monomials(j, 1)) *
+              pow_int(w, (int)(monomials(j, 2) - 1)) * monomials(j, 2);
         }
       }
       break;
@@ -120,7 +171,7 @@ class polynomialBasis
 
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 1) // second derivative !=0
-            hess[i][0][0] += coefficients(i, j) * pow(u, monomials(j, 0) - 2) *
+            hess[i][0][0] += coefficients(i, j) * pow_int(u, (int)(monomials(j, 0) - 2)) *
               monomials(j, 0) * (monomials(j, 0) - 1);
         }
       }
@@ -132,16 +183,16 @@ class polynomialBasis
         hess[i][2][0] = hess[i][2][1] = hess[i][2][2] = 0;
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 1) // second derivative !=0
-            hess[i][0][0] += coefficients(i, j) * pow(u, monomials(j, 0) - 2) *
-              monomials(j, 0) * (monomials(j, 0) - 1) * pow(v, monomials(j, 1));
+            hess[i][0][0] += coefficients(i, j) * pow_int(u, (int)(monomials(j, 0) - 2)) *
+              monomials(j, 0) * (monomials(j, 0) - 1) * pow_int(v, (int)monomials(j, 1));
           if ((monomials(j, 1) > 0) && (monomials(j, 0) > 0))
             hess[i][0][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0) *
-              pow(v, monomials(j, 1) - 1) * monomials(j, 1);
+              pow_int(u, (int)monomials(j, 0) - 1) * monomials(j, 0) *
+              pow_int(v, (int)monomials(j, 1) - 1) * monomials(j, 1);
           if (monomials(j, 1) > 1)
             hess[i][1][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1) - 2) * monomials(j, 1) * (monomials(j, 1) - 1);
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)monomials(j, 1) - 2) * monomials(j, 1) * (monomials(j, 1) - 1);
         }
         hess[i][1][0] = hess[i][0][1];
       }
@@ -154,35 +205,35 @@ class polynomialBasis
         for(int j = 0; j < coefficients.size2(); j++){
           if (monomials(j, 0) > 1)
             hess[i][0][0] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 2) * monomials(j, 0) * (monomials(j, 0)-1) *
-              pow(v, monomials(j, 1)) *
-              pow(w, monomials(j, 2));
+              pow_int(u, (int)monomials(j, 0) - 2) * monomials(j, 0) * (monomials(j, 0)-1) *
+              pow_int(v, (int)monomials(j, 1)) *
+              pow_int(w, (int)monomials(j, 2));
 
           if ((monomials(j, 0) > 0) && (monomials(j, 1) > 0))
             hess[i][0][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0) *
-              pow(v, monomials(j, 1) - 1) * monomials(j, 1) *
-              pow(w, monomials(j, 2));
+              pow_int(u, (int)monomials(j, 0) - 1) * monomials(j, 0) *
+              pow_int(v, (int)monomials(j, 1) - 1) * monomials(j, 1) *
+              pow_int(w, (int)monomials(j, 2));
           if ((monomials(j, 0) > 0) && (monomials(j, 2) > 0))
             hess[i][0][2] += coefficients(i, j) *
-              pow(u, monomials(j, 0) - 1) * monomials(j, 0) *
-              pow(v, monomials(j, 1)) *
-              pow(w, monomials(j, 2) - 1) * monomials(j, 2);
+              pow_int(u, (int)monomials(j, 0) - 1) * monomials(j, 0) *
+              pow_int(v, (int)monomials(j, 1)) *
+              pow_int(w, (int)monomials(j, 2) - 1) * monomials(j, 2);
           if (monomials(j, 1) > 1)
             hess[i][1][1] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1) - 2) * monomials(j, 1) * (monomials(j, 1)-1) *
-              pow(w, monomials(j, 2));
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)monomials(j, 1) - 2) * monomials(j, 1) * (monomials(j, 1)-1) *
+              pow_int(w, (int)monomials(j, 2));
           if ((monomials(j, 1) > 0) && (monomials(j, 2) > 0))
             hess[i][1][2] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1) - 1) * monomials(j, 1) *
-              pow(w, monomials(j, 2) - 1) * monomials(j, 2);
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)monomials(j, 1) - 1) * monomials(j, 1) *
+              pow_int(w, (int)monomials(j, 2) - 1) * monomials(j, 2);
           if (monomials(j, 2) > 1)
             hess[i][2][2] += coefficients(i, j) *
-              pow(u, monomials(j, 0)) *
-              pow(v, monomials(j, 1)) *
-              pow(w, monomials(j, 2) - 2) * monomials(j, 2) * (monomials(j, 2) - 1);
+              pow_int(u, (int)monomials(j, 0)) *
+              pow_int(v, (int)monomials(j, 1)) *
+              pow_int(w, (int)monomials(j, 2) - 2) * monomials(j, 2) * (monomials(j, 2) - 1);
         }
         hess[i][1][0] = hess[i][0][1];
         hess[i][2][0] = hess[i][0][2];
diff --git a/Solver/dofManager.h b/Solver/dofManager.h
index 6d878a2434caa7c1f9543a142270ae4b9b00a6c2..b966904ddd25df3a053001234111e7c0ba4c6c60 100644
--- a/Solver/dofManager.h
+++ b/Solver/dofManager.h
@@ -101,6 +101,7 @@ class dofManager{
   linearSystem<dataMat> *_current;
 
  public:
+ dofManager() : _current(0) { }
  dofManager(linearSystem<dataMat> *l) : _current(l) { _linearSystems["A"] = l; }
  dofManager(linearSystem<dataMat> *l1, linearSystem<dataMat> *l2) : _current(l1) { 
     _linearSystems.insert(std::make_pair("A", l1));