diff --git a/Geo/GEntity.cpp b/Geo/GEntity.cpp
index 582bb18b9a3218a0f4fe54c35d20a06c9659d0cb..083d6d1afece8bc2b4405f3e889c8a33651c4677 100644
--- a/Geo/GEntity.cpp
+++ b/Geo/GEntity.cpp
@@ -77,18 +77,3 @@ std::string GEntity::getInfoString()
 
   return out;
 }
-
-void GEntity::recomputeMeshPartitions()
-{
-  for(unsigned int i = 0; i < getNumMeshElements(); i++) {
-    int part = getMeshElement(i)->getPartition();
-    if(part) model()->getMeshPartitions().insert(part);
-  }
-}
-
-void GEntity::deleteMeshPartitions()
-{
-  for(unsigned int i = 0; i < getNumMeshElements(); i++)
-    getMeshElement(i)->setPartition(0);
-}
-
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index 78634c68b3a41959228bec9a1c90d0454b248c47..5476df2cc76743168e27147a15c5af73b4c5be5f 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -245,12 +245,6 @@ class GEntity {
 
   // get the mesh vertex at the given index
   MVertex *getMeshVertex(unsigned int index) { return mesh_vertices[index]; }
-
-  // recompute the mesh partitions defined on this entity
-  void recomputeMeshPartitions();
-
-  // delete the mesh partitions defined on this entity
-  void deleteMeshPartitions();
 };
 
 class GEntityLessThan {
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index c9965077cd1aa4203a740bf866672fcfce3f7a86..5ae903f499a97ff0e7ace963c369ee9299dfad14 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -3,7 +3,7 @@
 // See the LICENSE.txt file for license information. Please report all
 // bugs and problems to <gmsh@geuz.org>.
 
-#include <string.h>
+#include <sstream>
 #include "GModel.h"
 #include "MElement.h"
 #include "discreteRegion.h"
@@ -463,6 +463,7 @@ MVertex *GModel::getMeshVertexByTag(int n)
     std::vector<GEntity*> entities;
     getEntities(entities);
     if(dense){
+      Msg::Debug("Good: we have a dense vertex numbering in the cache");
       // numbering starts at 1
       _vertexVectorCache.resize(MVertex::getGlobalNumber() + 1);
       for(unsigned int i = 0; i < entities.size(); i++)
@@ -593,8 +594,12 @@ void GModel::recomputeMeshPartitions()
   meshPartitions.clear();
   std::vector<GEntity*> entities;
   getEntities(entities);
-  for(unsigned int i = 0; i < entities.size(); i++)
-    entities[i]->recomputeMeshPartitions();
+  for(unsigned int i = 0; i < entities.size(); i++){
+    for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
+      int part = entities[i]->getMeshElement(j)->getPartition();
+      if(part) meshPartitions.insert(part);
+    }
+  }
 }
 
 void GModel::deleteMeshPartitions()
@@ -602,7 +607,8 @@ void GModel::deleteMeshPartitions()
   std::vector<GEntity*> entities;
   getEntities(entities);
   for(unsigned int i = 0; i < entities.size(); i++)
-    entities[i]->deleteMeshPartitions();
+    for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++)
+      entities[i]->getMeshElement(j)->setPartition(0);
   meshPartitions.clear();
 }
 
@@ -658,22 +664,17 @@ void GModel::checkMeshCoherence()
 	  pos.insert(e);
 	}
 	else{
-	  char temp[256], temp2[256];
-	  sprintf(temp, "Element %d ( ", (*it)->getNum());
-	  for (int k = 0; k < (*it)->getNumVertices(); k++){
-	    sprintf(temp2, "%d ", (*it)->getVertex(k)->getNum());
-	    strcat(temp, temp2);
-	  }
-	  sprintf(temp2, ") on entity %d has same barycenter as element %d ( ",
-		  entities[i]->tag(), e->getNum());
-	  strcat(temp, temp2);
-	  for (int k = 0; k < e->getNumVertices(); k++){
-	    sprintf(temp2, "%d ", e->getVertex(k)->getNum());
-	    strcat(temp, temp2);
-	  }
-	  sprintf(temp2, ")");
-	  strcat(temp, temp2);
-	  Msg::Info("%s", temp);
+	  std::ostringstream sstream;
+	  sstream << "Element " << e->getNum() << " [ ";
+	  for (int k = 0; k < e->getNumVertices(); k++)
+	    sstream << e->getVertex(k)->getNum() << " ";
+	  sstream << "] on entity " << entities[i]->tag() 
+		  << " has same barycenter as element " << (*it)->getNum() 
+		  << " [ ";
+	  for (int k = 0; k < (*it)->getNumVertices(); k++)
+	    sstream << (*it)->getVertex(k)->getNum() << " ";
+	  sstream << "]";
+	  Msg::Info("%s", sstream.str().c_str());
 	  num++;
 	}
       }
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 8b88b8622d14c3661ece5584a05672f1ef79e915..cb40ae82810505d54623a767fcb743afa9486837 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -76,7 +76,7 @@ static bool getVertices(int num, int *indices, std::vector<MVertex*> &vec,
 
 static void createElementMSH(GModel *m, int num, int type, int physical, 
                              int reg, int part, std::vector<MVertex*> &v, 
-                             std::map<int, std::vector<MElement*> > elements[7],
+                             std::map<int, std::vector<MElement*> > elements[8],
                              std::map<int, std::map<int, std::string> > physicals[4])
 {
   MElementFactory factory;