diff --git a/Geo/MElement.h b/Geo/MElement.h
index 6f98c42918f07210126c84662aaea07cfcf49520..46107c3bb2f4b35ffc56877aa770ae19488d2a9e 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -216,8 +216,7 @@ class MElement
                         int order=-1);
 
   // integration routines
-  virtual int getNumIntegrationPointsToAllocate(int pOrder) const { return 0; }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
   {
     Msg::Error("No integration points defined for this type of element");
   }
diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp
index fdecf9a6705d07ca149e953da4a9ac42591b7f23..7e20a17989dd748f41b7b7d5d90f1697953fd4d1 100644
--- a/Geo/MElementCut.cpp
+++ b/Geo/MElementCut.cpp
@@ -96,10 +96,12 @@ bool MPolyhedron::isInside(double u, double v, double w)
   return false;
 }
 
-void MPolyhedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MPolyhedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = 0;
   double jac[3][3];
+  if(_intpt) delete [] _intpt;
+  _intpt = new IntPt[getNGQTetPts(pOrder) * _parts.size()];
   for(unsigned int i = 0; i < _parts.size(); i++) {
     int nptsi;
     IntPt *ptsi;
@@ -124,13 +126,14 @@ void MPolyhedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
       const double weight = ptsi[ip].weight;
       const double detJ = tt.getJacobian(u, v, w, jac);
       SPoint3 p; tt.pnt(u, v, w, p);
-      (*pts[*npts + ip]).pt[0] = p.x();
-      (*pts[*npts + ip]).pt[1] = p.y();
-      (*pts[*npts + ip]).pt[2] = p.z();
-      (*pts[*npts + ip]).weight = detJ * weight;
+      _intpt[*npts + ip].pt[0] = p.x();
+      _intpt[*npts + ip].pt[1] = p.y();
+      _intpt[*npts + ip].pt[2] = p.z();
+      _intpt[*npts + ip].weight = detJ * weight;
     }
     *npts += nptsi;
   }
+  *pts = _intpt;
 }
 
 void MPolyhedron::writeMSH(FILE *fp, double version, bool binary, int num,
@@ -275,10 +278,12 @@ bool MPolygon::isInside(double u, double v, double w)
   return false;
 }
 
-void MPolygon::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MPolygon::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = 0;
   double jac[3][3];
+  if(_intpt) delete [] _intpt;
+  _intpt = new IntPt[getNGQTPts(pOrder) * _parts.size()];
   for(unsigned int i = 0; i < _parts.size(); i++) {
     int nptsi;
     IntPt *ptsi;
@@ -300,13 +305,14 @@ void MPolygon::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
       const double weight = ptsi[ip].weight;
       const double detJ = tt.getJacobian(u, v, w, jac);
       SPoint3 p; tt.pnt(u, v, w, p);
-      (*pts[*npts + ip]).pt[0] = p.x();
-      (*pts[*npts + ip]).pt[1] = p.y();
-      (*pts[*npts + ip]).pt[2] = p.z();
-      (*pts[*npts + ip]).weight = detJ * weight;
+      _intpt[*npts + ip].pt[0] = p.x();
+      _intpt[*npts + ip].pt[1] = p.y();
+      _intpt[*npts + ip].pt[2] = p.z();
+      _intpt[*npts + ip].weight = detJ * weight;
     }
     *npts += nptsi;
   }
+  *pts = _intpt;
 }
 
 void MPolygon::writeMSH(FILE *fp, double version, bool binary, int num,
@@ -362,7 +368,7 @@ void MPolygon::writeMSH(FILE *fp, double version, bool binary, int num,
 
 //----------------------------------- MTriangleBorder ------------------------------
 
-void MTriangleBorder::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MTriangleBorder::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   double uvw[3][3];
   for(int j = 0; j < 3; j++) {
@@ -391,7 +397,7 @@ void MTriangleBorder::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) c
 
 //-------------------------------------- MLineBorder ------------------------------
 
-void MLineBorder::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MLineBorder::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   double uvw[2][3];
   for(int j = 0; j < 2; j++) {
diff --git a/Geo/MElementCut.h b/Geo/MElementCut.h
index 7027e5d9afb947190848298cb8aaf7718c5b6b0d..fa37382c5a5d12df1e5202e392f494840078f6e6 100644
--- a/Geo/MElementCut.h
+++ b/Geo/MElementCut.h
@@ -19,6 +19,7 @@ class MPolyhedron : public MElement {
  protected:
   bool _owner;
   MElement* _orig;
+  IntPt *_intpt;
   std::vector<MTetrahedron*> _parts;
   std::vector<MVertex*> _vertices;
   std::vector<MVertex*> _innerVertices;
@@ -28,7 +29,7 @@ class MPolyhedron : public MElement {
  public:
   MPolyhedron(std::vector<MVertex*> v, int num = 0, int part = 0,
               bool owner = false, MElement* orig = NULL)
-    : MElement(num, part), _owner(owner), _orig(orig)
+    : MElement(num, part), _owner(owner), _orig(orig), _intpt(0)
   {
     if(v.size() % 4){
       Msg::Error("Got %d vertices for polyhedron", (int)v.size());
@@ -40,7 +41,7 @@ class MPolyhedron : public MElement {
   }
   MPolyhedron(std::vector<MTetrahedron*> vT, int num = 0, int part = 0,
               bool owner = false, MElement* orig = NULL)
-    : MElement(num, part), _owner(owner), _orig(orig)
+    : MElement(num, part), _owner(owner), _orig(orig), _intpt(0)
   {
     for(unsigned int i = 0; i < vT.size(); i++)
       _parts.push_back(vT[i]);
@@ -52,6 +53,7 @@ class MPolyhedron : public MElement {
       delete _orig;
     for(unsigned int i = 0; i < _parts.size(); i++)
       delete _parts[i];
+    if(_intpt) delete [] _intpt;
   }
   virtual int getDim() { return 3; }
   virtual int getNumVertices() const { return _vertices.size() + _innerVertices.size(); }
@@ -120,11 +122,7 @@ class MPolyhedron : public MElement {
     _orig->xyz2uvw(xyz,uvw);
   }
   virtual bool isInside(double u, double v, double w);
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
-  virtual int getNumIntegrationPointsToAllocate (int pOrder)
-  {
-    return _parts.size() * getNGQTetPts(pOrder);
-  }
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
   virtual void writeMSH(FILE *fp, double version=1.0, bool binary=false, 
                         int num=0, int elementary=1, int physical=1, int parentNum=0);
   virtual MElement *getParent() const { return _orig; }
@@ -138,6 +136,7 @@ class MPolygon : public MElement {
  protected:
   bool _owner;
   MElement* _orig;
+  IntPt *_intpt;
   std::vector<MTriangle*> _parts;
   std::vector<MVertex*> _vertices;
   std::vector<MVertex*> _innerVertices;
@@ -146,7 +145,7 @@ class MPolygon : public MElement {
  public:
   MPolygon(std::vector<MVertex*> v, int num = 0, int part = 0,
            bool owner = false, MElement* orig = NULL)
-    : MElement(num, part), _owner(owner), _orig(orig)
+    : MElement(num, part), _owner(owner), _orig(orig), _intpt(0)
   {
     for(unsigned int i = 0; i < v.size() / 3; i++)
       _parts.push_back(new MTriangle(v[i * 3], v[i * 3 + 1], v[i * 3 + 2]));
@@ -154,7 +153,7 @@ class MPolygon : public MElement {
   }
   MPolygon(std::vector<MTriangle*> vT, int num = 0, int part = 0,
            bool owner = false, MElement* orig = NULL)
-    : MElement(num, part), _owner(owner), _orig(orig)
+    : MElement(num, part), _owner(owner), _orig(orig), _intpt(0)
   {
     for(unsigned int i = 0; i < vT.size(); i++){
       MTriangle *t = (MTriangle*) vT[i];
@@ -168,6 +167,7 @@ class MPolygon : public MElement {
       delete _orig;
     for(unsigned int i = 0; i < _parts.size(); i++)
       delete _parts[i];
+    if(_intpt) delete [] _intpt;
   }
   virtual int getDim(){ return 2; }
   virtual int getNumVertices() const { return _vertices.size() + _innerVertices.size(); }
@@ -224,11 +224,7 @@ class MPolygon : public MElement {
     _orig->xyz2uvw(xyz,uvw);
   }
   virtual bool isInside(double u, double v, double w);
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
-  virtual int getNumIntegrationPointsToAllocate (int pOrder)
-  {
-    return _parts.size() * getNGQTPts(pOrder);
-  }
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
   virtual void writeMSH(FILE *fp, double version=1.0, bool binary=false, 
                         int num=0, int elementary=1, int physical=1, int parentNum=0);
   virtual MElement *getParent() const { return _orig; }
@@ -271,11 +267,7 @@ class MTriangleBorder : public MTriangle {
   {
     getParent()->xyz2uvw(xyz,uvw);
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
-  virtual int getNumIntegrationPointsToAllocate (int pOrder)
-  {
-    return getNGQTPts(pOrder);
-  }
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
 };
 
 class MLineBorder : public MLine {
@@ -311,11 +303,7 @@ class MLineBorder : public MLine {
   {
     getParent()->xyz2uvw(xyz,uvw);
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
-  virtual int getNumIntegrationPointsToAllocate (int pOrder)
-  {
-    return pOrder / 2 + 1;
-  }
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
 };
 
 GModel *buildCutMesh(GModel *gm, gLevelset *ls,
diff --git a/Geo/MHexahedron.cpp b/Geo/MHexahedron.cpp
index f7bbf706dcd667175a378421c114d5032da391fd..8c53b9438c6ceac03466a2461b54c74f52b9577c 100644
--- a/Geo/MHexahedron.cpp
+++ b/Geo/MHexahedron.cpp
@@ -21,7 +21,7 @@ int MHexahedron::getVolumeSign()
   return sign(det3x3(mat));
 }
 
-void MHexahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MHexahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = getNGQHPts(pOrder);
   *pts = getGQHPts(pOrder);
diff --git a/Geo/MHexahedron.h b/Geo/MHexahedron.h
index 31a59a7cca40d09a9b8a1533011bdcc12ec4d830..350a23e23bcea6aebbbca4afc10174c8552f5d07 100644
--- a/Geo/MHexahedron.h
+++ b/Geo/MHexahedron.h
@@ -171,7 +171,7 @@ class MHexahedron : public MElement {
       return false;
     return true;
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
  private:
   int edges_hexa(const int edge, const int vert) const
   {
diff --git a/Geo/MLine.cpp b/Geo/MLine.cpp
index 16c1a7a6dbc5096b5d76048e72d4c073b497c4da..cdd91eb117e667e31bc0270a87901eb1c59271bc 100644
--- a/Geo/MLine.cpp
+++ b/Geo/MLine.cpp
@@ -23,7 +23,7 @@ const functionSpace* MLine::getFunctionSpace(int o) const
   return 0;
 }
 
-void MLine::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MLine::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   static IntPt GQL[100]; 
   double *t, *w;
diff --git a/Geo/MLine.h b/Geo/MLine.h
index 265c4662ebed76f85722c37ef36aca0e8a387bc8..c78fe34652fa691f3a1ab38a0f7209d8f3d3a66e 100644
--- a/Geo/MLine.h
+++ b/Geo/MLine.h
@@ -71,7 +71,7 @@ class MLine : public MElement {
       return false;
     return true;
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
 };
 
 /*
diff --git a/Geo/MQuadrangle.cpp b/Geo/MQuadrangle.cpp
index 6880925b401ec8499927e9251c4d0d0c85f0e431..3daf1324c1f5ad2b7a5b98cf18d0fae633725fed 100644
--- a/Geo/MQuadrangle.cpp
+++ b/Geo/MQuadrangle.cpp
@@ -153,7 +153,7 @@ void MQuadrangle9::getFaceRep(int num, double *x, double *y, double *z, SVector3
   _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges);
 }
 
-void MQuadrangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MQuadrangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = getNGQQPts(pOrder);
   *pts = getGQQPts(pOrder);
diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h
index 62603daf10fed9431ee9147855e979053b49f9a3..d6457574b0787d6b698561b9d928599ff3970f65 100644
--- a/Geo/MQuadrangle.h
+++ b/Geo/MQuadrangle.h
@@ -127,7 +127,7 @@ class MQuadrangle : public MElement {
       return false;
     return true;
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
  private:
   int edges_quad(const int edge, const int vert) const
   {
diff --git a/Geo/MTetrahedron.cpp b/Geo/MTetrahedron.cpp
index fb4d18f7918bb11f16d0ac1391b6dd511e79cf52..e4dcfaadcc29da91f26f45e5227770292f3ca3fb 100644
--- a/Geo/MTetrahedron.cpp
+++ b/Geo/MTetrahedron.cpp
@@ -249,7 +249,7 @@ void MTetrahedron10::getFaceRep(int num, double *x, double *y, double *z, SVecto
   _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges);
 }
 
-void MTetrahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MTetrahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = getNGQTetPts(pOrder);
   *pts = getGQTetPts(pOrder);
diff --git a/Geo/MTetrahedron.h b/Geo/MTetrahedron.h
index 0d0c2745071069a4e935e47a44798cc29eea6085..dec9e6e20a47ae64b3b8118880fc5c8aa2ed4ac3 100644
--- a/Geo/MTetrahedron.h
+++ b/Geo/MTetrahedron.h
@@ -138,7 +138,7 @@ class MTetrahedron : public MElement {
       return false;
     return true;
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
   virtual SPoint3 circumcenter();
  private:
   int edges_tetra(const int edge, const int vert) const
diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp
index 1a8ecf699fc9c7dd1fb9e561f7c13563f3f3b57f..4d66d6a1264f837da131a257261f65bc16d92c68 100644
--- a/Geo/MTriangle.cpp
+++ b/Geo/MTriangle.cpp
@@ -193,7 +193,7 @@ void MTriangle6::getFaceRep(int num, double *x, double *y, double *z, SVector3 *
   _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges);
 }
 
-void MTriangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MTriangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
 {
   *npts = getNGQTPts(pOrder);
   *pts = getGQTPts(pOrder);
diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h
index c63c328c04f89a37d797f73b86bac785951a19df..e59c1b159a91510807db523518289e8e8e5d6bb7 100644
--- a/Geo/MTriangle.h
+++ b/Geo/MTriangle.h
@@ -129,7 +129,7 @@ class MTriangle : public MElement {
       return false; 
     return true;
   }
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
   virtual SPoint3 circumcenter();
  private:
   int edges_tri(const int edge, const int vert) const