diff --git a/Numeric/JacobianBasis.cpp b/Numeric/JacobianBasis.cpp
index 95656b01a429afd4813eb07de7aedd295cc74673..6f1584e1bdaedafe494bef6c8994d53c6b296978 100644
--- a/Numeric/JacobianBasis.cpp
+++ b/Numeric/JacobianBasis.cpp
@@ -19,7 +19,8 @@ JacobianBasis::JacobianBasis(int tag)
   const int parentType = ElementType::ParentTypeFromTag(tag);
   const int order = ElementType::OrderFromTag(tag);
 
-  int jacType = 0, primJacType = 0;
+  //int jacType = 0,
+  int primJacType = 0;
 
   /*if (parentType == TYPE_PYR) {
     switch (tag) {
@@ -33,31 +34,59 @@ JacobianBasis::JacobianBasis(int tag)
   }
   else {*/
     int jacobianOrder, primJacobianOrder;
+
     switch (parentType) {
-      case TYPE_PNT : jacobianOrder = 0; primJacobianOrder = 0; break;
-      case TYPE_LIN : jacobianOrder = order - 1; primJacobianOrder = 0; break;
-      case TYPE_TRI : jacobianOrder = 2 * (order - 1); primJacobianOrder = 0; break;
-      case TYPE_QUA : jacobianOrder = 2 * order - 1; primJacobianOrder = 1; break;
-      case TYPE_TET : jacobianOrder = 3 * (order - 1); primJacobianOrder = 0; break;
-      case TYPE_PRI : jacobianOrder = 3 * order - 1; primJacobianOrder = 2; break;
-      case TYPE_HEX : jacobianOrder = 3 * order - 1; primJacobianOrder = 2; break;
+      case TYPE_PNT :
+        primJacobianOrder = 0;
+        jacobianOrder = 0;
+        lagPoints = gmshGeneratePointsLine(0);
+        break;
+      case TYPE_LIN :
+        primJacobianOrder = 0;
+        jacobianOrder = order - 1;
+        lagPoints = gmshGeneratePointsLine(order);
+        break;
+      case TYPE_TRI :
+        primJacobianOrder = 0;
+        jacobianOrder = 2*order - 2;
+        lagPoints = gmshGeneratePointsTriangle(order);
+        break;
+      case TYPE_QUA :
+        primJacobianOrder = 1;
+        jacobianOrder = 2*order - 1;
+        lagPoints = gmshGeneratePointsQuadrangle(order);
+        break;
+      case TYPE_TET :
+        primJacobianOrder = 0;
+        jacobianOrder = 3*order - 3;
+        lagPoints = gmshGeneratePointsTetrahedron(order);
+        break;
+      case TYPE_PRI :
+        primJacobianOrder = 2;
+        jacobianOrder = 3*order - 1;
+        lagPoints = gmshGeneratePointsPrism(order);
+        break;
+      case TYPE_HEX :
+        primJacobianOrder = 2;
+        jacobianOrder = 3*order - 1;
+        lagPoints = gmshGeneratePointsHexahedron(order);
+        break;
       default :
         Msg::Error("Unknown Jacobian function space for element type %d", tag);
         jacobianOrder = 0;
         break;
     }
-    jacType = ElementType::getTag(parentType, jacobianOrder, false);
     primJacType = ElementType::getTag(parentType, primJacobianOrder, false);
   //}
 
   // Store Bezier basis
-  bezier = BasisFactory::getBezierBasis(jacType);
+  bezier = BasisFactory::getBezierBasis(parentType, jacobianOrder);
 
   // Store shape function gradients of mapping at Jacobian nodes
   const nodalBasis *mapBasis = BasisFactory::getNodalBasis(tag);
   fullMatrix<double> allDPsi;
-  mapBasis->df(getPoints(), allDPsi);
-  numJacNodes = getPoints().size1();
+  mapBasis->df(lagPoints, allDPsi);
+  numJacNodes = lagPoints.size1();
   numMapNodes = allDPsi.size1();
   gradShapeMatX.resize(numJacNodes,numMapNodes);
   gradShapeMatY.resize(numJacNodes,numMapNodes);
@@ -73,7 +102,7 @@ JacobianBasis::JacobianBasis(int tag)
   const nodalBasis *primJacBasis = BasisFactory::getNodalBasis(primJacType);
   numPrimJacNodes = primJacBasis->getNumShapeFunctions();
   matrixPrimJac2Jac.resize(numJacNodes,numPrimJacNodes);
-  primJacBasis->f(getPoints(),matrixPrimJac2Jac);
+  primJacBasis->f(lagPoints, matrixPrimJac2Jac); //FIXME not too much sampling points ??
 
   // Compute shape function gradients of primary mapping at barycenter,
   // in order to compute normal to straight element
@@ -193,7 +222,7 @@ double JacobianBasis::getPrimJac3D(const fullMatrix<double> &nodesXYZ) const
 void JacobianBasis::getSignedJacobian(const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const
 {
 
-  switch (bezier->dim) {
+  switch (bezier->getDim()) {
 
     case 1 : {
       fullMatrix<double> normals(2,3);
@@ -225,7 +254,7 @@ void JacobianBasis::getSignedJacobian(const fullMatrix<double> &nodesXYZ, fullVe
 void JacobianBasis::getScaledJacobian(const fullMatrix<double> &nodesXYZ, fullVector<double> &jacobian) const
 {
 
-  switch (bezier->dim) {
+  switch (bezier->getDim()) {
 
     case 1 : {
       fullMatrix<double> normals(2,3);
@@ -262,7 +291,7 @@ void JacobianBasis::getSignedJacobian(const fullMatrix<double> &nodesXYZ,
                                       const fullMatrix<double> &normals, fullVector<double> &jacobian) const
 {
 
-  switch (bezier->dim) {
+  switch (bezier->getDim()) {
 
     case 0 : {
       for (int i = 0; i < numJacNodes; i++) jacobian(i) = 1.;
@@ -270,7 +299,7 @@ void JacobianBasis::getSignedJacobian(const fullMatrix<double> &nodesXYZ,
     }
 
     case 1 : {
-      fullMatrix<double> dxyzdX(numJacNodes,3), dxyzdY(numJacNodes,3);
+      fullMatrix<double> dxyzdX(numJacNodes,3);
       gradShapeMatX.mult(nodesXYZ, dxyzdX);
       for (int i = 0; i < numJacNodes; i++) {
         const double &dxdX = dxyzdX(i,0), &dydX = dxyzdX(i,1), &dzdX = dxyzdX(i,2);
@@ -319,7 +348,7 @@ void JacobianBasis::getSignedJacAndGradients(const fullMatrix<double> &nodesXYZ,
                                              fullMatrix<double> &JDJ) const
 {
 
-  switch (bezier->dim) {
+  switch (bezier->getDim()) {
 
     case 0 : {
       for (int i = 0; i < numJacNodes; i++) {
@@ -473,7 +502,7 @@ void JacobianBasis::getSignedJacobian(const fullMatrix<double> &nodesX, const fu
                                       const fullMatrix<double> &nodesZ, fullMatrix<double> &jacobian) const
 {
 
-  switch (bezier->dim) {
+  switch (bezier->getDim()) {
 
     case 0 : {
       const int numEl = nodesX.size2();
diff --git a/Numeric/JacobianBasis.h b/Numeric/JacobianBasis.h
index d5f34792bfe5d0fe36e62ba3b22cfead7b63729c..b38e78aa73dba7b8e19f1a5442a4c977172c3eb5 100644
--- a/Numeric/JacobianBasis.h
+++ b/Numeric/JacobianBasis.h
@@ -15,11 +15,11 @@
 class JacobianBasis {
  private:
   const bezierBasis *bezier;
+  fullMatrix<double> lagPoints; // sampling point
   fullMatrix<double> gradShapeMatX, gradShapeMatY, gradShapeMatZ;
   fullVector<double> primGradShapeBarX, primGradShapeBarY, primGradShapeBarZ;
   fullMatrix<double> matrixPrimJac2Jac;                                   // Lifts Lagrange basis of primary Jac. to Lagrange basis of Jac.
   int numJacNodes, numMapNodes, numPrimJacNodes, numPrimMapNodes;
-  inline const fullMatrix<double> &getPoints() const { return bezier->lagPoints; }
 
  public :
   JacobianBasis(int tag);
@@ -29,9 +29,9 @@ class JacobianBasis {
   inline int getNumMapNodes() const { return numMapNodes; }
   inline int getNumPrimJacNodes() const { return numPrimJacNodes; }
   inline int getNumPrimMapNodes() const { return numPrimMapNodes; }
-  inline int getNumDivisions() const { return bezier->numDivisions; }
+  inline int getNumDivisions() const { return bezier->getNumDivision(); }
   inline int getNumSubNodes() const { return bezier->subDivisor.size1(); }
-  inline int getNumLagPts() const { return bezier->numLagPts; }
+  inline int getNumLagCoeff() const { return bezier->getNumLagCoeff(); }
 
   //
   double getPrimNormals1D(const fullMatrix<double> &nodesXYZ, fullMatrix<double> &result) const;
diff --git a/Numeric/bezierBasis.cpp b/Numeric/bezierBasis.cpp
index f8884abebae5ff040d7676ba00167dea36d8d742..7db0b0904cc783aa0cc29cc91fb546d17c623730 100644
--- a/Numeric/bezierBasis.cpp
+++ b/Numeric/bezierBasis.cpp
@@ -336,62 +336,55 @@ void bezierBasis::_construct(int parentType, int p)
     switch (parentType) {
       case TYPE_PNT :
         dim = 0;
-        numLagPts = 1;
+        numLagCoeff = 1;
         dimSimplex = 0;
         exponents = gmshGenerateMonomialsLine(0);
-        lagPoints = gmshGeneratePointsLine(0);
         break;
       case TYPE_LIN : {
         dim = 1;
-        numLagPts = 2;
+        numLagCoeff = 2;
         dimSimplex = 0;
         exponents = gmshGenerateMonomialsLine(order);
-        lagPoints = gmshGeneratePointsLine(order);
         subPoints = generateSubPointsLine(order);
         break;
       }
       case TYPE_TRI : {
         dim = 2;
-        numLagPts = 3;
+        numLagCoeff = 3;
         dimSimplex = 2;
         exponents = gmshGenerateMonomialsTriangle(order);
-        lagPoints = gmshGeneratePointsTriangle(order);
         subPoints = generateSubPointsTriangle(order);
         break;
       }
       case TYPE_QUA : {
         dim = 2;
-        numLagPts = 4;
+        numLagCoeff = 4;
         dimSimplex = 0;
         exponents = gmshGenerateMonomialsQuadrangle(order);
-        lagPoints = gmshGeneratePointsQuadrangle(order);
         subPoints = generateSubPointsQuad(order);
         break;
       }
       case TYPE_TET : {
         dim = 3;
-        numLagPts = 4;
+        numLagCoeff = 4;
         dimSimplex = 3;
         exponents = gmshGenerateMonomialsTetrahedron(order);
-        lagPoints = gmshGeneratePointsTetrahedron(order);
         subPoints = generateSubPointsTetrahedron(order);
         break;
       }
       case TYPE_PRI : {
         dim = 3;
-        numLagPts = 6;
+        numLagCoeff = 6;
         dimSimplex = 2;
         exponents = gmshGenerateMonomialsPrism(order);
-        lagPoints = gmshGeneratePointsPrism(order);
         subPoints = generateSubPointsPrism(order);
         break;
       }
       case TYPE_HEX : {
         dim = 3;
-        numLagPts = 8;
+        numLagCoeff = 8;
         dimSimplex = 0;
         exponents = gmshGenerateMonomialsHexahedron(order);
-        lagPoints = gmshGeneratePointsHexahedron(order);
         subPoints = generateSubPointsHex(order);
         break;
       }
@@ -400,10 +393,9 @@ void bezierBasis::_construct(int parentType, int p)
             "reverting to TET_1", parentType);
         dim = 3;
         order = 0;
-        numLagPts = 4;
+        numLagCoeff = 4;
         dimSimplex = 3;
         exponents = gmshGenerateMonomialsTetrahedron(order);
-        lagPoints = gmshGeneratePointsTetrahedron(order);
         subPoints = generateSubPointsTetrahedron(order);
         break;
       }
diff --git a/Numeric/bezierBasis.h b/Numeric/bezierBasis.h
index 62aca79d0810d1c243f81c3ec0f832a119d1bab8..4e0c519383de1637d4aa73da22d8ad7d06e0e44b 100644
--- a/Numeric/bezierBasis.h
+++ b/Numeric/bezierBasis.h
@@ -14,18 +14,18 @@
 class MElement;
 
 class bezierBasis {
- public:
- //private :
-  // the 'numLagPts' first exponents are related to 'Lagrangian' values
+ private :
+  // the 'numLagCoeff' first exponents are related to 'Lagrangian' values
+  int numLagCoeff;
   int dim, order;
-  int numLagPts;
   int numDivisions;
-  fullMatrix<double> subDivisor;
 
  public :
-  fullMatrix<double> lagPoints; // sampling point
-  fullMatrix<double> matrixLag2Bez, matrixBez2Lag;
+  fullMatrix<double> matrixLag2Bez;
+  fullMatrix<double> matrixBez2Lag;
+  fullMatrix<double> subDivisor;
 
+  // Constructors
   inline bezierBasis(int tag) {
     _construct(ElementType::ParentTypeFromTag(tag), ElementType::OrderFromTag(tag));
   }
@@ -34,10 +34,10 @@ class bezierBasis {
   }
 
   // get methods
-  inline int getDim() {return dim;}
-  inline int getOrder() {return order;}
-  inline int getNumLagPts() {return numLagPts;}
-  inline int getNumDivision() {return numDivisions;}
+  inline int getDim() const {return dim;}
+  inline int getOrder() const {return order;}
+  inline int getNumLagCoeff() const {return numLagCoeff;}
+  inline int getNumDivision() const {return numDivisions;}
 
  private :
   void _construct(int parendtType, int order);
diff --git a/Plugin/AnalyseCurvedMesh.cpp b/Plugin/AnalyseCurvedMesh.cpp
index 1e4f5438ce8d92dc3a847a0419e1060c50fc2704..182e76d5dabcd734618d2e971d7be0b86efcef48 100644
--- a/Plugin/AnalyseCurvedMesh.cpp
+++ b/Plugin/AnalyseCurvedMesh.cpp
@@ -339,7 +339,7 @@ int GMSH_AnalyseCurvedMeshPlugin::subDivision(const JacobianBasis *jb,
   jb->subDivisor(jacobian, newJacobian);
 
   for (int i = 0; i < jb->getNumDivisions(); i++)
-  for (int j = 0; j < jb->getNumLagPts(); j++)
+  for (int j = 0; j < jb->getNumLagCoeff(); j++)
   if (newJacobian(i * jb->getNumJacNodes() + j) <= _jacBreak)
     return -1;
 
@@ -727,7 +727,7 @@ BezierJacobian::BezierJacobian(fullVector<double> &v, const JacobianBasis *jfs,
 
   _minJ = _maxJ = v(0);
   int i = 1;
-  for (; i < jfs->getNumLagPts(); i++) {
+  for (; i < jfs->getNumLagCoeff(); i++) {
     if (_minJ > v(i)) _minJ = v(i);
     if (_maxJ < v(i)) _maxJ = v(i);
   }