diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index 5eb4730cb7762b59d528fc0db8184cb60d8e90d1..e364b460b0fc9adc5aa5c1658914ac29f19f6955 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -757,16 +757,14 @@ MElement *GModel::getMeshElementByTag(int n)
 
 int GModel::getMeshElementIndex(MElement *e)
 {
-  int num = e->getNum();
-  if(num >= _elementIndexCache.size()) return num;
-  return _elementIndexCache[num];
+  std::map<int, int>::iterator it = _elementIndexCache.find(e->getNum());
+  if(it != _elementIndexCache.end()) return it->second;
+  return e->getNum();
 }
 
 void GModel::setMeshElementIndex(MElement *e, int index)
 {
-  int num = e->getNum();
-  if(num >= _elementIndexCache.size()) _elementIndexCache.resize(num + 1, 0);
-  _elementIndexCache[num] = index; 
+  _elementIndexCache[e->getNum()] = index; 
 }
 
 template <class T>
diff --git a/Geo/GModel.h b/Geo/GModel.h
index 8cb2b55f11cf669dca747483ccb3e84f19fcccf4..6f0ad466df9f8aae5d242a78f580de4fec9515f7 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -51,7 +51,7 @@ class GModel
   std::map<int, MVertex*> _vertexMapCache;
   std::vector<MElement*> _elementVectorCache;
   std::map<int, MElement*> _elementMapCache;
-  std::vector<int> _elementIndexCache;
+  std::map<int, int> _elementIndexCache;
 
   // ghost cell information (stores partitions for each element acting
   // as a ghost cell)
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 46163460db0db4802bb710bd8f6ffd4f7b0af116..956a7f85bb667fab7ae9767d668523d74fd7afe2 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -695,7 +695,7 @@ int GModel::writeMSH(const std::string &name, double version, bool binary,
   fprintf(fp, "%d\n", numElements);
   int num = elementStartNum;
   std::map<MElement*, int> parentsNum;
-  _elementIndexCache.resize(numElements + 1);
+  _elementIndexCache.clear();
 
   // points
   for(viter it = firstVertex(); it != lastVertex(); ++it)