diff --git a/Geo/MElement.h b/Geo/MElement.h
index 50fc874c3c981e58cd4220eba04a6df7fc45660f..3a91e59975571580bc8225f33a43dfebf03a4fb7 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -458,4 +458,11 @@ template <> struct DimTr<3>
   }
 };
 
+struct Less_ElementPtr : public std::binary_function<MElement *, MElement *, bool> {
+  bool operator()(const MElement *e1, const MElement *e2) const
+  {
+    return e1->getNum()<e2->getNum();
+  }
+};
+
 #endif
diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h
index 0a7958f164ba2bb7bc0f56ac2b5a369b3396287b..3be0475e9830bc6043f90fbac2596132106e8c89 100644
--- a/Geo/MTriangle.h
+++ b/Geo/MTriangle.h
@@ -359,9 +359,9 @@ class MTriangleN : public MTriangle {
 };
 
 template <class T>
-void sort3(T *t[3])
+void sort3(T t[3])
 {
-  T *temp;
+  T temp;
   if(t[0] > t[1]){
     temp = t[1];
     t[1] = t[0];
@@ -383,8 +383,8 @@ struct compareMTriangleLexicographic
 {
   bool operator () (MTriangle *t1, MTriangle *t2) const
   {
-    MVertex *_v1[3] = {t1->getVertex(0), t1->getVertex(1), t1->getVertex(2)};
-    MVertex *_v2[3] = {t2->getVertex(0), t2->getVertex(1), t2->getVertex(2)};
+    int _v1[3] = {t1->getVertex(0)->getNum(), t1->getVertex(1)->getNum(), t1->getVertex(2)->getNum()};
+    int _v2[3] = {t2->getVertex(0)->getNum(), t2->getVertex(1)->getNum(), t2->getVertex(2)->getNum()};
     sort3(_v1);
     sort3(_v2);
     if(_v1[0] < _v2[0]) return true;
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 4c91f07b7b3c05b1956c88fcf4493fd84374e108..f737949d93c12c2af942f333017f29c493c33d4d 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -672,7 +672,7 @@ static void MeshDelaunayVolumeNewCode(std::vector<GRegion*> &regions)
 {
   GRegion *gr = regions[0];
   std::list<GFace*> faces = gr->faces();
-  std::set<GFace*> allFacesSet;
+  std::set<GFace*, GEntityLessThan> allFacesSet;
   for(unsigned int i = 0; i < regions.size(); i++){
     std::list<GFace*> f = regions[i]->faces();
     allFacesSet.insert(f.begin(), f.end());
diff --git a/Mesh/meshGRegionDelaunayInsertion.h b/Mesh/meshGRegionDelaunayInsertion.h
index 88af9966f4e0aefe18ec4c014eda725b7be08a0b..3ed5d4020dcf03b44066acc53f725e4e1a30a428 100644
--- a/Mesh/meshGRegionDelaunayInsertion.h
+++ b/Mesh/meshGRegionDelaunayInsertion.h
@@ -188,7 +188,7 @@ class compareTet4Ptr
   { 
     if (a->getRadius() > b->getRadius()) return true;
     if (a->getRadius() < b->getRadius()) return false;
-    return a < b;
+    return a->tet()->getNum() < b->tet()->getNum();
   }
 };
 
diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.cpp b/contrib/HighOrderMeshOptimizer/OptHOM.cpp
index ca081c94cd6a2384e7691e1068c3b94cdf497b5e..0487530484b257b6262622a0773dc3b8bf2099da 100644
--- a/contrib/HighOrderMeshOptimizer/OptHOM.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHOM.cpp
@@ -75,7 +75,7 @@ static inline double compute_f1(double v, double barrier)
 }
 
 OptHOM::OptHOM(const std::map<MElement*,GEntity*> &element2entity,
-               const std::set<MElement*> &els, std::set<MVertex*> & toFix,
+               const std::set<MElement*, Less_ElementPtr> &els, std::set<MVertex*> & toFix,
                bool fixBndNodes, bool fastJacEval) :
   mesh(element2entity, els, toFix, fixBndNodes, fastJacEval)
 {
diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.h b/contrib/HighOrderMeshOptimizer/OptHOM.h
index 179e19be2ad152211f03a5b4eeefee265375644d..f36b71ce3f38601206325efbd26e2002c6f336d8 100644
--- a/contrib/HighOrderMeshOptimizer/OptHOM.h
+++ b/contrib/HighOrderMeshOptimizer/OptHOM.h
@@ -45,7 +45,7 @@ class OptHOM
 public:
   Mesh mesh;
   OptHOM(const std::map<MElement*,GEntity*> &element2entity,
-         const std::set<MElement*> &els, std::set<MVertex*> & toFix,
+         const std::set<MElement*, Less_ElementPtr> &els, std::set<MVertex*> & toFix,
          bool fixBndNodes, bool fastJacEval = false);
   // returns 1 if the mesh has been optimized with success i.e. all jacobians
   // are in the range; returns 0 if the mesh is valid (all jacobians positive,
diff --git a/contrib/HighOrderMeshOptimizer/OptHomMesh.cpp b/contrib/HighOrderMeshOptimizer/OptHomMesh.cpp
index d91c48c9c16983658134a734ba93cf66b263f63b..a818794bb004a7384754d346c1253aadfefb70d3 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomMesh.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomMesh.cpp
@@ -39,7 +39,7 @@
 #include "OptHomIntegralBoundaryDist.h"
 
 Mesh::Mesh(const std::map<MElement*,GEntity*> &element2entity,
-           const std::set<MElement*> &els, std::set<MVertex*> &toFix,
+           const std::set<MElement*, Less_ElementPtr> &els, std::set<MVertex*> &toFix,
            bool fixBndNodes, bool fastJacEval) :
   _fastJacEval(fastJacEval)
 {
diff --git a/contrib/HighOrderMeshOptimizer/OptHomMesh.h b/contrib/HighOrderMeshOptimizer/OptHomMesh.h
index 8ccdd35e4513f78fd91d4b25c5f3af76baa48d83..d4ff7e3ac5b34de835ded8032f1bc1ea09236d48 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomMesh.h
+++ b/contrib/HighOrderMeshOptimizer/OptHomMesh.h
@@ -44,7 +44,7 @@ class Mesh
 {
 public:
   Mesh(const std::map<MElement*,GEntity*> &element2entity,
-       const std::set<MElement*> &els, std::set<MVertex*> & toFix, bool fixBndNodes, bool fastJacEval);
+       const std::set<MElement*, Less_ElementPtr> &els, std::set<MVertex*> & toFix, bool fixBndNodes, bool fastJacEval);
 
   inline const int &nPC() { return _nPC; }
   inline int nVert() { return _vert.size(); }
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 578f7aece41b64e46e4a01dd9f710d07a0e302fa..96cd8c848934598c4d8f916a73873d54ddd2bf4d 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -51,7 +51,7 @@
 
 typedef std::vector<MElement*> elVec;
 typedef elVec::const_iterator elVecConstIter;
-typedef std::set<MElement*> elSet;
+typedef std::set<MElement*, Less_ElementPtr> elSet;
 typedef elSet::iterator elSetIter;
 typedef std::set<MVertex*> vertSet;