diff --git a/contrib/HighOrderMeshOptimizer/OptHomObjContribCADDist.h b/contrib/HighOrderMeshOptimizer/OptHomObjContribCADDist.h
index 75e225fa953e60a1a0f243b1d5e7d97cfda843b1..aee3baed41b9dfe77e91acf13527713bd8e5ca1f 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomObjContribCADDist.h
+++ b/contrib/HighOrderMeshOptimizer/OptHomObjContribCADDist.h
@@ -30,7 +30,7 @@ protected:
 
 template<class FuncType>
 ObjContribCADDist<FuncType>::ObjContribCADDist(double weight, double geomTol) :
-  ObjContrib("MetricMin", FuncType::getNamePrefix()+"CADDist"),
+  ObjContrib("CADDist", FuncType::getNamePrefix()+"CADDist"),
   _mesh(0), _weight(weight), _geomTol(geomTol)
 {
 }
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 478b085c819217b3ebacf997682985c030f94b12..8cc3573451f308d0f85ed6afba3be70934b6cbeb 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -825,7 +825,7 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
   minJacBarFunc.setTarget(p.BARRIER_MIN, 1.);
   ObjContribScaledJac<ObjContribFuncBarrierFixMinMovMax> minMaxJacBarFunc(1.);
   minMaxJacBarFunc.setTarget(p.BARRIER_MAX, 1.);
-  ObjContribCADDist<ObjContribFuncSimpleTargetMin> CADDistFunc(p.optCADWeight, p.discrTolerance);
+  ObjContribCADDist<ObjContribFuncSimpleTargetMax> CADDistFunc(p.optCADWeight, p.discrTolerance);
   CADDistFunc.setTarget(p.optCADDistMax);
 
   MeshOptParameters::PassParameters minJacPass;
@@ -842,7 +842,7 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
     minMaxJacPass.optIterMax = p.itMax;
     minMaxJacPass.contrib.push_back(&nodeDistFunc);
     minMaxJacPass.contrib.push_back(&minMaxJacBarFunc);
-    if (p.optCAD) minJacPass.contrib.push_back(&CADDistFunc);
+    if (p.optCAD) minMaxJacPass.contrib.push_back(&CADDistFunc);
     par.pass.push_back(minMaxJacPass);
   }
 
diff --git a/contrib/MeshOptimizer/MeshOpt.cpp b/contrib/MeshOptimizer/MeshOpt.cpp
index 6f29b5ab857bcc5693bf01eb4faab33497a86c64..6163d8f8f19dcac46a746b1b668ff9046776676c 100644
--- a/contrib/MeshOptimizer/MeshOpt.cpp
+++ b/contrib/MeshOptimizer/MeshOpt.cpp
@@ -68,7 +68,7 @@ MeshOpt::MeshOpt(const std::map<MElement*,GEntity*> &element2entity,
                  const std::set<MElement*> &els, std::set<MVertex*> &toFix,
                  const MeshOptParameters &par) :
   patch(element2entity, els, toFix, par.fixBndNodes), _verbose(0),
-  _iPass(0), _objFunc(), _iter(0), _intervDisplay(0), _initObj(0)
+  _iPass(0), _iter(0), _intervDisplay(0), _initObj(0)
 {
   _allObjFunc.resize(par.pass.size());
   for (int iPass=0; iPass<par.pass.size(); iPass++) {
@@ -76,6 +76,7 @@ MeshOpt::MeshOpt(const std::map<MElement*,GEntity*> &element2entity,
     for (int iC=0; iC<par.pass[iPass].contrib.size(); iC++)
       _allObjFunc[iPass][iC] = par.pass[iPass].contrib[iC]->copy();
   }
+  _objFunc = &_allObjFunc[0];
 }
 
 
diff --git a/contrib/MeshOptimizer/MeshOptObjContribFunc.cpp b/contrib/MeshOptimizer/MeshOptObjContribFunc.cpp
index 034eb2a1cfa605e6d3e3401c9961e9bdb307b96d..8be99a8567af2d97a16df53205f7f2fc493edd44 100644
--- a/contrib/MeshOptimizer/MeshOptObjContribFunc.cpp
+++ b/contrib/MeshOptimizer/MeshOptObjContribFunc.cpp
@@ -4,30 +4,30 @@
 #include "MeshOptObjContribFunc.h"
 
 
-const double ObjContribFuncSimpleTargetMin::STAGTHRESHOLD = 0.01;
+const double ObjContribFuncSimpleTargetMax::STAGTHRESHOLD = 0.01;
 
 
-ObjContribFuncSimpleTargetMin::ObjContribFuncSimpleTargetMin() :
+ObjContribFuncSimpleTargetMax::ObjContribFuncSimpleTargetMax() :
     _target(0.), _init(0.)
 {
 }
 
 
-void ObjContribFuncSimpleTargetMin::setTarget(double target)
+void ObjContribFuncSimpleTargetMax::setTarget(double target)
 {
   _target = target;
 }
 
 
-void ObjContribFuncSimpleTargetMin::updateParameters(double vMin, double vMax)
+void ObjContribFuncSimpleTargetMax::updateParameters(double vMin, double vMax)
 {
-  _init = vMin;
+  _init = vMax;
 }
 
 
-bool ObjContribFuncSimpleTargetMin::stagnated(double vMin, double vMax)
+bool ObjContribFuncSimpleTargetMax::stagnated(double vMin, double vMax)
 {
-  return (fabs((vMin-_init)/_init) < STAGTHRESHOLD);
+  return (fabs((vMax-_init)/_init) < STAGTHRESHOLD);
 }
 
 
diff --git a/contrib/MeshOptimizer/MeshOptObjContribFunc.h b/contrib/MeshOptimizer/MeshOptObjContribFunc.h
index 118b9977036582c9b7a5682279e403a0ef3bd8a8..04c7aef64f5185f541b09f629c2aba6c60153188 100644
--- a/contrib/MeshOptimizer/MeshOptObjContribFunc.h
+++ b/contrib/MeshOptimizer/MeshOptObjContribFunc.h
@@ -19,17 +19,17 @@ protected:
 };
 
 
-class ObjContribFuncSimpleTargetMin : public ObjContribFuncSimple
+class ObjContribFuncSimpleTargetMax : public ObjContribFuncSimple
 {
 public:
-  ObjContribFuncSimpleTargetMin();
+  ObjContribFuncSimpleTargetMax();
   void setTarget(double target);
 
 protected:
   static const double STAGTHRESHOLD;                                              // Threshold to consider that measures stagnates
   double _target, _init;
   void updateParameters(double vMin, double vMax);
-  bool targetReached(double vMin, double vMax) { return (vMin >= _target); }
+  bool targetReached(double vMin, double vMax) { return (vMax <= _target); }
   bool stagnated(double vMin, double vMax);
 };
 
diff --git a/contrib/MeshOptimizer/MeshOptObjectiveFunction.cpp b/contrib/MeshOptimizer/MeshOptObjectiveFunction.cpp
index 6e0a05039a4f97a92dcb3320384ddb7f4adb483a..45e339924fc07887d6c661557653eb6e475a409e 100644
--- a/contrib/MeshOptimizer/MeshOptObjectiveFunction.cpp
+++ b/contrib/MeshOptimizer/MeshOptObjectiveFunction.cpp
@@ -57,9 +57,9 @@ void ObjectiveFunction::updateResults()
 
 bool ObjectiveFunction::stagnated()
 {
-  bool stagnated = false;
+  bool stagnated = true;
   for (std::vector<ObjContrib*>::iterator it=begin(); it!=end(); it++)
-    stagnated |= (*it)->stagnated();
+    stagnated &= (*it)->stagnated();
   return stagnated;
 }