diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index cd62cfd66716300918b6dfce64b1b0d29f59de94..83ff11f5b0dda7560f15bc1ad1103ca423a5c2f2 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -790,7 +790,7 @@ int HOPatchDefParameters::inPatch(const SPoint3 &badBary,
 }
 
 
-void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
+void HighOrderMeshOptimizerNew(std::vector<GEntity*> &entities, OptHomParameters &p)
 {
   Msg::StatusBar(true, "Optimizing high order mesh...");
 
@@ -849,7 +849,7 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
     par.pass.push_back(maxCADDistPass);
   }
 
-  meshOptimizer(gm, par);
+  meshOptimizer(entities, par);
 
   p.CPU = par.CPU;
   p.minJac = minMaxJacBarFunc.getMin();
@@ -857,3 +857,11 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
 
   Msg::StatusBar(true, "Done optimizing high order mesh (%g s)", p.CPU);
 }
+
+
+void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
+{
+  std::vector<GEntity*> entities;
+  gm->getEntities(entities);
+  HighOrderMeshOptimizerNew(entities, p);
+}
diff --git a/contrib/MeshOptimizer/MeshOptimizer.cpp b/contrib/MeshOptimizer/MeshOptimizer.cpp
index 5754127c59a321677ff9e3ab17ffdfad10fc1e46..98b118299b12a86de7f43455ffc99544ae35d490 100644
--- a/contrib/MeshOptimizer/MeshOptimizer.cpp
+++ b/contrib/MeshOptimizer/MeshOptimizer.cpp
@@ -687,7 +687,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
 #endif
 
 
-void meshOptimizer(GModel *gm, MeshOptParameters &par)
+void meshOptimizer(std::vector<GEntity*> &entities, MeshOptParameters &par)
 {
 #if defined(HAVE_BFGS)
   if (par.nCurses)
@@ -709,9 +709,6 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par)
   }
   if (par.verbose > 0) Msg::StatusBar(true, "Optimizing mesh...");
 
-  std::vector<GEntity*> entities;
-  gm->getEntities(entities);
-
   vertElVecMap vertex2elements;
   elEntMap element2entity, bndEl2Ent;
   elElMap el2BndEl;
diff --git a/contrib/MeshOptimizer/MeshOptimizer.h b/contrib/MeshOptimizer/MeshOptimizer.h
index 76a6690481fb2d5ac3ee7e3cdf4000abaf99d2e8..969efa889e4226e72e090103a85048e910f11787 100644
--- a/contrib/MeshOptimizer/MeshOptimizer.h
+++ b/contrib/MeshOptimizer/MeshOptimizer.h
@@ -31,11 +31,11 @@
 #define _MESHOPTIMIZER_H_
 
 
-class GModel;
+class GEntity;
 class MeshOptParameters;
 
 
-void meshOptimizer(GModel *gm, MeshOptParameters &par);
+void meshOptimizer(std::vector<GEntity*> &entities, MeshOptParameters &par);
 
 
 #endif
diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
index 5ea5c00a9256b63521303d79bc0e45419cd6cbcd..54699091c4f56400b06b1124faef164a924fa902 100644
--- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
+++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
@@ -4,6 +4,7 @@
 #include "GEntity.h"
 #include "GFace.h"
 #include "GRegion.h"
+#include "GModel.h"
 #include "MElement.h"
 #include "MTriangle.h"
 #include "MQuadrangle.h"
@@ -117,7 +118,7 @@ int QualPatchDefParameters::inPatch(const SPoint3 &badBary, double limDist,
 }
 
 
-void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
+void MeshQualityOptimizer(std::vector<GEntity*> &entities, MeshQualOptParameters &p)
 {
   Msg::StatusBar(true, "Optimizing mesh quality...");
 
@@ -160,7 +161,7 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
     par.pass.push_back(minInvCondNumPass);
   }
 
-  meshOptimizer(gm, par);
+  meshOptimizer(entities, par);
 
   p.CPU = par.CPU;
   if (p.onlyValidity) {
@@ -172,3 +173,11 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
     p.maxInvCondNum = minInvCondNumBarFunc.getMax();
   }
 }
+
+
+void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
+{
+  std::vector<GEntity*> entities;
+  gm->getEntities(entities);
+  MeshQualityOptimizer(entities, p);
+}