diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp
index 018c0c0ce68c0cee1e6d35cbbcb226304b94f42b..4aa0af1655726fc1ef98b2ef48a3aa6f790ccbdd 100644
--- a/Geo/GEdge.cpp
+++ b/Geo/GEdge.cpp
@@ -37,6 +37,8 @@ void GEdge::deleteMesh()
   mesh_vertices.clear();
   for(unsigned int i = 0; i < lines.size(); i++) delete lines[i];
   lines.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 void GEdge::reverse()
diff --git a/Geo/GEntity.cpp b/Geo/GEntity.cpp
index 17247cb3a65e769b737b0f384b870bdf717474df..abd2baef4a92da0e581c18bb28a88848094d5152 100644
--- a/Geo/GEntity.cpp
+++ b/Geo/GEntity.cpp
@@ -17,11 +17,6 @@ GEntity::GEntity(GModel *m, int t)
   _color = CTX::instance()->packColor(0, 0, 255, 0);
 }
 
-GEntity::~GEntity()
-{
-  deleteVertexArrays();
-}
-
 void GEntity::deleteVertexArrays()
 {
   if(va_lines) delete va_lines; va_lines = 0;
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index b24b6db0d7b9c8877ddebc087c7c75d2779c7a69..a4d2f2d59370e8c090383f0ad20b3ec72964d166 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -158,7 +158,7 @@ class GEntity {
 
   GEntity(GModel *m, int t);
 
-  virtual ~GEntity();
+  virtual ~GEntity(){}
 
   // delete the mesh data
   virtual void deleteMesh(){}
diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index 7032c53b1a9990b75a0337af854d3eb8b7da3716..e1f4a904ef0084f53ad4adb0bb99caac3da3b512 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -37,10 +37,10 @@ GFace::~GFace()
     ++it;
   }
 
-  deleteMesh();
-
   if(va_geom_triangles)
     delete va_geom_triangles;
+
+  deleteMesh();
 }
 
 void GFace::delFreeEdge(GEdge *e)
@@ -83,6 +83,8 @@ void GFace::deleteMesh()
   quadrangles.clear();
   for(unsigned int i = 0; i < polygons.size(); i++) delete polygons[i];
   polygons.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 unsigned int GFace::getNumMeshElements()
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index 82707ba69848a06e570ebcf336d507c267aea321..2b5700d570f549a19ffed7d0e71d05ee478595c0 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -704,6 +704,7 @@ void GModel::removeInvisibleElements()
     removeInvisible((*it)->lines, all);
     (*it)->deleteVertexArrays();
   }
+  destroyMeshCaches();
 }
 
 int GModel::indexMeshVertices(bool all, int singlePartition)
diff --git a/Geo/GRegion.cpp b/Geo/GRegion.cpp
index ca75fff6a63f8a7d597f682ab50d7d147b8f9bca..a09843cc7648e534a860cafe813a1c8af25270a6 100644
--- a/Geo/GRegion.cpp
+++ b/Geo/GRegion.cpp
@@ -46,6 +46,8 @@ void GRegion::deleteMesh()
   pyramids.clear();
   for(unsigned int i = 0; i < polyhedra.size(); i++) delete polyhedra[i];
   polyhedra.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 unsigned int GRegion::getNumMeshElements()
diff --git a/Geo/GVertex.cpp b/Geo/GVertex.cpp
index 2e465d05e10e7125b01c35fd16d1619c52380efe..206abc95151bff40e831ceef8700faab0be64096 100644
--- a/Geo/GVertex.cpp
+++ b/Geo/GVertex.cpp
@@ -5,6 +5,7 @@
 
 #include <sstream>
 #include <algorithm>
+#include "GModel.h"
 #include "GVertex.h"
 #include "GFace.h"
 #include "MPoint.h"
@@ -25,6 +26,8 @@ void GVertex::deleteMesh()
   mesh_vertices.clear();
   for(unsigned int i = 0; i < points.size(); i++) delete points[i];
   points.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 void GVertex::setPosition(GPoint &p)
diff --git a/Geo/discreteEdge.cpp b/Geo/discreteEdge.cpp
index cc28500503b3f7771e1a89a1cd5bd210ba1da347..baa8ee5e7cd6373341e61c7f6344a62a6055ea32 100644
--- a/Geo/discreteEdge.cpp
+++ b/Geo/discreteEdge.cpp
@@ -277,6 +277,8 @@ void discreteEdge::parametrize()
   mesh_vertices = newVertices;
 
   deleteVertexArrays();
+  model()->destroyMeshCaches();
+
   lines.clear();
   lines = newLines;
 
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 4399e427f1efbd31c699305319dfc18fea4aaba2..73f512ba6d916413f231c0dda2a529a8890926d9 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -737,7 +737,8 @@ static void setHighOrder(GFace *gf, edgeContainer &edgeVertices,
   std::vector<MQuadrangle*> quadrangles2;
   for(unsigned int i = 0; i < gf->quadrangles.size(); i++){
     MQuadrangle *q = gf->quadrangles[i];
-    MQuadrangle *qNew = setHighOrder(q,gf,edgeVertices,faceVertices,linear,incomplete,nPts,displ2D,displ3D);
+    MQuadrangle *qNew = setHighOrder(q, gf, edgeVertices, faceVertices, linear,
+                                     incomplete, nPts, displ2D, displ3D);
     quadrangles2.push_back(qNew);
     delete q;
   }
@@ -898,6 +899,8 @@ static void removeHighOrderVertices(GEntity *e)
 
 void SetOrder1(GModel *m)
 {
+  m->destroyMeshCaches();
+
   // replace all elements with first order elements
   for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it){
     setFirstOrder(*it, (*it)->lines);
diff --git a/Mesh/highOrderSmoother.cpp b/Mesh/highOrderSmoother.cpp
index 94d016b437ea6dfb75912e8184e5dde6ae3a2bb7..6500b83aabef7ea8569925545fc2aca727772fab 100644
--- a/Mesh/highOrderSmoother.cpp
+++ b/Mesh/highOrderSmoother.cpp
@@ -1396,7 +1396,7 @@ static int swapHighOrderTriangles(GFace *gf,
     }    
   }
   gf->mesh_vertices = mesh_vertices2;
-  printf("Deleted %d vertices from %d\n",c2,gf->mesh_vertices.size());
+  printf("Deleted %d vertices from %d\n", c2, (int)gf->mesh_vertices.size());
   printf("Added %d vertices\n",c1);
 
   for (unsigned int i = 0; i < gf->triangles.size(); i++){
@@ -1408,7 +1408,7 @@ static int swapHighOrderTriangles(GFace *gf,
     }    
   }
 
-  printf("replacing %d by %d\n",gf->triangles.size(),triangles2.size());
+  printf("replacing %d by %d\n", (int)gf->triangles.size(), (int)triangles2.size());
   gf->triangles = triangles2;
   return nbSwap;
 }
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index da4ef33df77be7fa0c5905c2d53bb82a3de0e2aa..d3b3a345dfadba8a8c91097ec3e166752a5d5e2e 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -235,10 +235,7 @@ static double Integration(GEdge *ge, double t1, double t2,
 void deMeshGEdge::operator() (GEdge *ge) 
 {
   if(ge->geomType() == GEntity::DiscreteCurve) return;
-
   ge->deleteMesh();
-  ge->deleteVertexArrays();
-  ge->model()->destroyMeshCaches();
 }
 
 void meshGEdge::operator() (GEdge *ge) 
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 822e029a63c5c0d0acc42f0ae898f2835609fe1b..45b80b95f822f42fc78da7d1fda5150412168284 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1229,17 +1229,12 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
 void deMeshGFace::operator() (GFace *gf)
 {
   if(gf->geomType() == GEntity::DiscreteSurface) return;
-
   gf->deleteMesh();
- 
-  gf->deleteVertexArrays();
-  gf->model()->destroyMeshCaches();
-
   gf->meshStatistics.status = GFace::PENDING;
   gf->meshStatistics.nbTriangle = gf->meshStatistics.nbEdge = 0;
 }
 
-int debugSurface = -100;
+int debugSurface = -1;
 
 void meshGFace::operator() (GFace *gf)
 {
diff --git a/Mesh/meshGFaceLloyd.cpp b/Mesh/meshGFaceLloyd.cpp
index 8978c5d8780e705356a1d223d821f0a03b07eeae..f7f8da48797bc6961f28dbd4cbb31abf67c3f8ee 100644
--- a/Mesh/meshGFaceLloyd.cpp
+++ b/Mesh/meshGFaceLloyd.cpp
@@ -30,8 +30,8 @@ void lloydAlgorithm::operator () ( GFace * gf) {
   const double LC2D = sqrt ((du.high()-du.low())*(du.high()-du.low()) +
 			    (dv.high()-dv.low())*(dv.high()-dv.low()));  
 
-  printf("Lloyd on face %d %d elements %d nodes LC %g\n",gf->tag(),
-	 gf->getNumMeshElements(),all.size(),LC2D);
+  printf("Lloyd on face %d %d elements %d nodes LC %g\n", gf->tag(),
+	 gf->getNumMeshElements(), (int)all.size(), LC2D);
 
   int i = 0;
 
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 073ba271cfd371995230d832196b6c2bc94ee47e..2bc09056ceaba5a38e8fdd836b8510d8c33517c2 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -124,6 +124,7 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out,
 
   // Tetgen modifies both surface & edge mesh, so we need to re-create
   // everything
+  gr->model()->destroyMeshCaches();
   std::list<GFace*> faces = gr->faces();
   std::list<GFace*>::iterator it = faces.begin();
   while(it != faces.end()){
@@ -438,10 +439,7 @@ void TransferVolumeMesh(GRegion *gr, Ng_Mesh *ngmesh,
 void deMeshGRegion::operator() (GRegion *gr)
 {
   if(gr->geomType() == GEntity::DiscreteVolume) return;
-
   gr->deleteMesh();
-  gr->deleteVertexArrays();
-  gr->model()->destroyMeshCaches();
 }
 
 int intersect_line_triangle(double X[3], double Y[3], double Z[3] , 
diff --git a/Solver/multiscaleLaplace.cpp b/Solver/multiscaleLaplace.cpp
index 5852f1d9bff9f2d699b1ced4bfc612c84f890bb3..6430614ccd601da799151246e5295adf8b10afca 100644
--- a/Solver/multiscaleLaplace.cpp
+++ b/Solver/multiscaleLaplace.cpp
@@ -585,16 +585,16 @@ static void connected_left_right (std::vector<MElement *> &left,
 
 }
 //--------------------------------------------------------------
-static void printLevel ( const char* fn,
-			 std::vector<MElement *> &elements,
-			 std::map<MVertex*,SPoint2> *coordinates,
-			 double version){
-
-  if( !CTX::instance()->mesh.saveAll) return;  
+static void printLevel(const char* fn,
+                       std::vector<MElement *> &elements,
+                       std::map<MVertex*,SPoint2> *coordinates,
+                       double version)
+{
+  if(!CTX::instance()->mesh.saveAll) return;  
 
   std::set<MVertex*> vs;
-  for (int i=0;i<elements.size();i++)
-    for (int j=0;j<elements[i]->getNumVertices();j++)
+  for (int i = 0; i < elements.size(); i++)
+    for (int j = 0; j < elements[i]->getNumVertices(); j++)
       vs.insert(elements[i]->getVertex(j));
 
   bool binary = false;
@@ -603,23 +603,23 @@ static void printLevel ( const char* fn,
   fprintf(fp, "%g %d %d\n", version, binary ? 1 : 0, (int)sizeof(double));
   fprintf(fp, "$EndMeshFormat\n");  
 
-  fprintf(fp,"$Nodes\n%d\n",vs.size());
+  fprintf(fp, "$Nodes\n%d\n", (int)vs.size());
   std::set<MVertex*> :: iterator it = vs.begin();
   int index = 1;
   for (; it != vs.end() ; ++it){
     (*it)->setIndex(index++);
     SPoint2 p = (coordinates) ? (*coordinates)[*it] : SPoint2(0,0);
-    if (coordinates) fprintf(fp,"%d %g %g 0\n",(*it)->getIndex(),p.x(),p.y());
-    else fprintf(fp,"%d %g %g %g\n",(*it)->getIndex(),
-		 (*it)->x(),(*it)->y(),(*it)->z());
+    if (coordinates) fprintf(fp, "%d %g %g 0\n", (*it)->getIndex(), p.x(), p.y());
+    else fprintf(fp, "%d %g %g %g\n", (*it)->getIndex(),
+		 (*it)->x(), (*it)->y(), (*it)->z());
   }
-  fprintf(fp,"$EndNodes\n",elements.size());
+  fprintf(fp, "$EndNodes\n");
   
-  fprintf(fp,"$Elements\n%d\n",elements.size());
-  for (int i=0;i<elements.size();i++){
-    elements[i]->writeMSH(fp,version);
+  fprintf(fp, "$Elements\n%d\n", (int)elements.size());
+  for (int i = 0; i < elements.size(); i++){
+    elements[i]->writeMSH(fp, version);
   }
-  fprintf(fp,"$EndElements\n%d\n",elements.size());
+  fprintf(fp, "$EndElements\n");
   
   fclose(fp);
 }