diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 718f08216d19d8cd4df9ad3e994e6fd9640e2e55..08d36913f440444f040f07f45f117f92d80c695d 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -772,7 +772,8 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
   par.dim = p.dim;
   par.onlyVisible = p.onlyVisible;
   par.fixBndNodes = p.fixBndNodes;
-  par.useGeom = false;
+  par.useGeomForPatches = false;
+  par.useGeomForOpt = false;
   HOPatchDefParameters patchDef(p);
   par.patchDef = &patchDef;
   par.optDisplay = 30;
diff --git a/contrib/MeshOptimizer/MeshOptCommon.h b/contrib/MeshOptimizer/MeshOptCommon.h
index dbb81abf1918c777a480453cee5e9a1bea6c8779..594f895bce68bfbc6ff013ae421839f9dda27961 100644
--- a/contrib/MeshOptimizer/MeshOptCommon.h
+++ b/contrib/MeshOptimizer/MeshOptCommon.h
@@ -77,7 +77,7 @@ struct MeshOptParameters {                              // Parameters controllin
   int dim ;                                             // Which dimension to optimize
   bool onlyVisible ;                                    // Apply optimization to visible entities ONLY
   bool fixBndNodes;                                     // If points can move on boundaries
-  bool useGeom;                                         // Compute and use info from geometric (CAD model) entities where helpful
+  bool useGeomForPatches, useGeomForOpt;                // Whether to use info from CAD for creation of patches and for optimization
   MeshOptPatchDef *patchDef;
   std::vector<MeshOptPass> pass;
   int optDisplay;                                       // Sampling rate in opt. iterations for display
diff --git a/contrib/MeshOptimizer/MeshOptimizer.cpp b/contrib/MeshOptimizer/MeshOptimizer.cpp
index 5ddd0848f88e5c60b4f32cb018c06f56af5e1125..f0a49eaef0c89f2ba797d341f17a90559e39aed2 100644
--- a/contrib/MeshOptimizer/MeshOptimizer.cpp
+++ b/contrib/MeshOptimizer/MeshOptimizer.cpp
@@ -259,9 +259,11 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements,
 {
   par.success = 1;
 
+  const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap();
+  const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap();
+
   std::vector<elSetVertSetPair> toOptimize = getConnectedPatches(vertex2elements,
-                                                                 element2entity,
-                                                                 badasses, par);
+                                                                 e2ePatch, badasses, par);
 
   for (int iPatch = 0; iPatch < toOptimize.size(); ++iPatch) {
 
@@ -269,7 +271,7 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements,
     if (par.verbose > 1)
       Msg::Info("Optimizing patch %i/%i composed of %i elements", iPatch,
                       toOptimize.size()-1, toOptimize[iPatch].first.size());
-    MeshOpt opt(element2entity, toOptimize[iPatch].first, toOptimize[iPatch].second, par);
+    MeshOpt opt(e2eOpt, toOptimize[iPatch].first, toOptimize[iPatch].second, par);
     if (par.verbose > 3) {
       std::ostringstream ossI1;
       ossI1 << "initial_patch-" << iPatch << ".msh";
@@ -329,6 +331,9 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
 {
   par.success = 1;
 
+  const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap();
+  const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap();
+
   const int initNumBadElts = badElts.size();
   if (par.verbose > 0) Msg::Info("%d bad elements, starting to iterate...", initNumBadElts);
 
@@ -340,7 +345,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
     if (badElts.empty()) break;
 
     // Create patch around worst element and remove it from badElts
-    MElement *worstEl = getWorstElement(badElts, element2entity, par);
+    MElement *worstEl = getWorstElement(badElts, e2ePatch, par);
     badElts.erase(worstEl);
 
     // Initialize patch size to be adapted
@@ -355,7 +360,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
       const double limDist = par.patchDef->maxDistance(worstEl);
       elSet toOptimizePrim = getSurroundingPatch(worstEl, par.patchDef, limDist,
                                                  maxLayers, vertex2elements,
-                                                 element2elements, element2entity);
+                                                 element2elements, e2ePatch);
       vertSet toFix = getAllBndVertices(toOptimizePrim, vertex2elements);
       elSet toOptimize;
       std::set_difference(toOptimizePrim.begin(),toOptimizePrim.end(),
@@ -366,7 +371,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
       if (par.verbose > 1)
         Msg::Info("Optimizing patch %i (max. %i remaining) composed of %4d elements",
                                             iBadEl, badElts.size(), toOptimize.size());
-      MeshOpt opt(element2entity, toOptimize, toFix, par);
+      MeshOpt opt(e2eOpt, toOptimize, toFix, par);
       if (par.verbose > 3) {
         std::ostringstream ossI1;
         ossI1 << "initial_patch-" << iBadEl << ".msh";
@@ -446,7 +451,8 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par)
     Msg::Info("Computing connectivity and bad elements for entity %d...",
               entity->tag());
     calcVertex2Elements(par.dim, entity, vertex2elements);
-    if (par.useGeom) calcElement2Entity(entity, element2entity);
+    if ((par.useGeomForPatches) || (par.useGeomForOpt))
+      calcElement2Entity(entity, element2entity);
     for (int iEl = 0; iEl < entity->getNumMeshElements();iEl++) {                               // Detect bad elements
       double jmin, jmax;
       MElement *el = entity->getMeshElement(iEl);
diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
index 86c5b578667839bb936e227b9e022f0776d9e8cf..90794527f877e2b76248f6a3dceafa474ca95abf 100644
--- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
+++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
@@ -118,7 +118,8 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
   par.dim = p.dim;
   par.onlyVisible = p.onlyVisible;
   par.fixBndNodes = p.fixBndNodes;
-  par.useGeom = p.excludeBL;
+  par.useGeomForPatches = p.excludeBL;
+  par.useGeomForOpt = false;
   QualPatchDefParameters patchDef(p);
   par.patchDef = &patchDef;
   par.optDisplay = 20;