diff --git a/Fltk/highOrderToolsWindow.cpp b/Fltk/highOrderToolsWindow.cpp
index f2cc517103cc9f46536491bb6d81d0f0d67a0354..9beebec87cae34eabdb74ee0aa6548ef314273d3 100644
--- a/Fltk/highOrderToolsWindow.cpp
+++ b/Fltk/highOrderToolsWindow.cpp
@@ -151,8 +151,7 @@ static void highordertools_runopti_cb(Fl_Widget *w, void *data)
     p.dim = dim;
     p.itMax = (int) o->value[3]->value();
     p.optPassMax = (int) o->value[4]->value();
-    p.weightFixed =  o->value[5]->value();
-    p.weightFree =  o->value[6]->value();
+    p.weight = o->value[5]->value();
     p.distanceFactor =  o->value[7]->value();
     p.fixBndNodes = (!o->CAD) || (o->choice[0]->value() == 0);
     p.strategy = o->choice[3]->value();
@@ -336,13 +335,9 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
 
   y += BH;
   value[5] = new Fl_Value_Input
-    (x, y, IW/2, BH);
+    (x, y, IW, BH, "Weight on node displacement");
   value[5]->align(FL_ALIGN_RIGHT);
-  value[5]->value(1000.);
-  value[6] = new Fl_Value_Input
-    (x+IW/2,y, IW/2, BH, "W fixed / W free");
-  value[6]->align(FL_ALIGN_RIGHT);
-  value[6]->value(1.);
+  value[5]->value(1.);
 
   y += BH;
   value[3] = new Fl_Value_Input
diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.cpp b/contrib/HighOrderMeshOptimizer/OptHOM.cpp
index 17b633b604cd787339dde86b672b5722d286e9fd..b255bcc8a6346e71451d565ec9be09590931b7dd 100644
--- a/contrib/HighOrderMeshOptimizer/OptHOM.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHOM.cpp
@@ -615,7 +615,7 @@ bool OptHOM::addMetricMinObjGrad(double &Obj, alglib::real_1d_array &gradObj)
 
 // Contribution of the vertex distance to the objective function value and
 // gradients
-bool OptHOM::addDistObjGrad(double Fact, double Fact2, double &Obj,
+bool OptHOM::addDistObjGrad(double Fact, double &Obj,
                             alglib::real_1d_array &gradObj)
 {
   maxDist = 0;
@@ -623,13 +623,12 @@ bool OptHOM::addDistObjGrad(double Fact, double Fact2, double &Obj,
   int nbBnd = 0;
 
   for (int iFV = 0; iFV < mesh.nFV(); iFV++) {
-    const double Factor = invLengthScaleSq*(mesh.forced(iFV) ? Fact : Fact2);
     const double dSq = mesh.distSq(iFV), dist = sqrt(dSq);
-    Obj += Factor * dSq;
+    Obj += Fact * dSq;
     std::vector<double> gDSq(mesh.nPCFV(iFV));
     mesh.gradDistSq(iFV,gDSq);
     for (int iPC = 0; iPC < mesh.nPCFV(iFV); iPC++)
-      gradObj[mesh.indPCFV(iFV,iPC)] += Factor*gDSq[iPC];
+      gradObj[mesh.indPCFV(iFV,iPC)] += Fact*gDSq[iPC];
     maxDist = std::max(maxDist, dist);
     avgDist += dist;
     nbBnd++;
@@ -641,7 +640,7 @@ bool OptHOM::addDistObjGrad(double Fact, double Fact2, double &Obj,
   return true;
 }
 
-bool OptHOM::addDistObjGrad(double Fact, double Fact2, double &Obj,
+bool OptHOM::addDistObjGrad(double Fact, double &Obj,
                             std::vector<double> &gradObj)
 {
   maxDist = 0;
@@ -649,13 +648,12 @@ bool OptHOM::addDistObjGrad(double Fact, double Fact2, double &Obj,
   int nbBnd = 0;
 
   for (int iFV = 0; iFV < mesh.nFV(); iFV++) {
-    const double Factor = invLengthScaleSq*(mesh.forced(iFV) ? Fact : Fact2);
     const double dSq = mesh.distSq(iFV), dist = sqrt(dSq);
-    Obj += Factor * dSq;
+    Obj += Fact * dSq;
     std::vector<double> gDSq(mesh.nPCFV(iFV));
     mesh.gradDistSq(iFV,gDSq);
     for (int iPC = 0; iPC < mesh.nPCFV(iFV); iPC++)
-      gradObj[mesh.indPCFV(iFV,iPC)] += Factor*gDSq[iPC];
+      gradObj[mesh.indPCFV(iFV,iPC)] += Fact*gDSq[iPC];
     maxDist = std::max(maxDist, dist);
     avgDist += dist;
     nbBnd++;
@@ -693,7 +691,7 @@ void OptHOM::evalObjGrad(std::vector<double> &x,
   /// control Jacobians
   addJacObjGrad(Obj, gradObj);
   /// Control distance to the straight sided mesh
-  addDistObjGrad(lambda, lambda2, Obj, gradObj);
+  addDistObjGrad(lambda, Obj, gradObj);
   if(_optimizeCAD)
     addBndObjGrad(lambda3, Obj, gradObj);
 
@@ -713,7 +711,7 @@ void OptHOM::evalObjGrad(const alglib::real_1d_array &x, double &Obj,
   /// control Jacobians
   addJacObjGrad(Obj, gradObj);
   /// Control distance to the straight sided mesh
-  addDistObjGrad(lambda, lambda2, Obj, gradObj);
+  addDistObjGrad(lambda, Obj, gradObj);
 
   if(_optimizeMetricMin)
     addMetricMinObjGrad(Obj, gradObj);
@@ -881,7 +879,7 @@ void OptHOM::OptimPass(alglib::real_1d_array &x, int itMax)
 }
 
 
-int OptHOM::optimize(double weightFixed, double weightFree, double weightCAD, double b_min,
+int OptHOM::optimize(double weight, double weightCAD, double b_min,
                      double b_max, bool optimizeMetricMin, int pInt,
                      int itMax, int optPassMax, int optCAD, double distanceMax, double tolerance)
 {
@@ -895,8 +893,7 @@ int OptHOM::optimize(double weightFixed, double weightFree, double weightCAD, do
   _optimizeMetricMin = optimizeMetricMin;
   _optimizeCAD = optCAD;
   // Set weights & length scale for non-dimensionalization
-  lambda = weightFixed;
-  lambda2 = weightFree;
+  lambda = weight;
   lambda3 = weightCAD;
   geomTol = tolerance;
   std::vector<double> dSq(mesh.nEl());
@@ -982,7 +979,7 @@ int OptHOM::optimize(double weightFixed, double weightFree, double weightCAD, do
 }
 
 
-int OptHOM::optimize_inhouse(double weightFixed, double weightFree, double weightCAD, double b_min,
+int OptHOM::optimize_inhouse(double weight, double weightCAD, double b_min,
 			     double b_max, bool optimizeMetricMin, int pInt,
 			     int itMax, int optPassMax, int optCAD, double distanceMax, double tolerance)
 {
@@ -996,8 +993,7 @@ int OptHOM::optimize_inhouse(double weightFixed, double weightFree, double weigh
   _optimizeMetricMin = optimizeMetricMin;
   _optimizeCAD = optCAD;
   // Set weights & length scale for non-dimensionalization
-  lambda = weightFixed;
-  lambda2 = weightFree;
+  lambda = weight;
   lambda3 = weightCAD;
   geomTol = tolerance;
   std::vector<double> dSq(mesh.nEl());
diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.h b/contrib/HighOrderMeshOptimizer/OptHOM.h
index 3eaf09d89c35f325f15b60934dc4c530dcd282a5..a4927fd7a6596fd01ac085f47e7b9ba0557b3262 100644
--- a/contrib/HighOrderMeshOptimizer/OptHOM.h
+++ b/contrib/HighOrderMeshOptimizer/OptHOM.h
@@ -51,15 +51,16 @@ public:
   // are in the range; returns 0 if the mesh is valid (all jacobians positive,
   // JMIN > 0) but JMIN < barrier_min || JMAX > barrier_max; returns -1 if the
   // mesh is invalid : some jacobians cannot be made positive
-  int optimize(double lambda, double lambda2, double lambda3, double barrier_min, double barrier_max,
-               bool optimizeMetricMin, int pInt, int itMax, int optPassMax, int optimizeCAD, double optCADDistMax, double tolerance);
-  int optimize_inhouse(double weightFixed, double weightFree, double weightCAD, double b_min,
-		       double b_max, bool optimizeMetricMin, int pInt,
-		       int itMax, int optPassMax, int optCAD, double distanceMax, double tolerance);
+  int optimize(double lambda, double lambda3, double barrier_min, double barrier_max,
+               bool optimizeMetricMin, int pInt, int itMax, int optPassMax,
+               int optimizeCAD, double optCADDistMax, double tolerance);
+  int optimize_inhouse(double weight, double weightCAD, double b_min, double b_max,
+                       bool optimizeMetricMin, int pInt, int itMax, int optPassMax,
+                       int optCAD, double distanceMax, double tolerance);
   void recalcJacDist();
   inline void getJacDist(double &minJ, double &maxJ, double &maxD, double &avgD);
   void updateMesh(const alglib::real_1d_array &x);
-  void evalObjGrad(std::vector<double> &x, double &Obj, bool gradsNeeded, 
+  void evalObjGrad(std::vector<double> &x, double &Obj, bool gradsNeeded,
 		   std::vector<double> &gradObj);
 
   void evalObjGrad(const alglib::real_1d_array &x, double &Obj,
@@ -68,7 +69,7 @@ public:
 
   double barrier_min, barrier_max, distance_max, geomTol;
  private:
-  double lambda, lambda2, lambda3, jacBar, invLengthScaleSq;
+  double lambda, lambda3, jacBar, invLengthScaleSq;
   int iter, progressInterv; // Current iteration, interval of iterations for reporting
   bool _optimizeMetricMin;
   double initObj, initMaxDist, initAvgDist; // Values for reporting
@@ -84,10 +85,8 @@ public:
   bool addBndObjGrad2(double Fact, double &Obj, alglib::real_1d_array &gradObj);
   bool addBndObjGrad(double Fact, double &Obj, std::vector<double> &gradObj);
   bool addMetricMinObjGrad(double &Obj, alglib::real_1d_array &gradObj);
-  bool addDistObjGrad(double Fact, double Fact2, double &Obj,
-                      std::vector<double> &gradObj);
-  bool addDistObjGrad(double Fact, double Fact2, double &Obj,
-                      alglib::real_1d_array &gradObj);
+  bool addDistObjGrad(double Fact, double &Obj, std::vector<double> &gradObj);
+  bool addDistObjGrad(double Fact, double &Obj, alglib::real_1d_array &gradObj);
   void calcScale(alglib::real_1d_array &scale);
   void OptimPass(alglib::real_1d_array &x, int itMax);
   void OptimPass(std::vector<double> &x, int itMax);
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 196202a3e7330ee525a95fc50031cf1509133a42..340620daf0dd480f2bc4ccf60eab4162afe5bba4 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -451,12 +451,14 @@ static void optimizeConnectedBlobs(const vertElVecMap &vertex2elements,
     if (temp.mesh.nPC() == 0)
       Msg::Info("Blob %i has no degree of freedom, skipping", i+1);
     else
-      success = temp.optimize(p.weightFixed, p.weightFree, p.optCADWeight, p.BARRIER_MIN,
-                              p.BARRIER_MAX, false, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax, p.discrTolerance);
+      success = temp.optimize(p.weight, p.optCADWeight, p.BARRIER_MIN, p.BARRIER_MAX,
+                              false, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,
+                              p.discrTolerance);
     if (success >= 0 && p.BARRIER_MIN_METRIC > 0) {
       Msg::Info("Jacobian optimization succeed, starting svd optimization");
-      success = temp.optimize(p.weightFixed, p.weightFree, p.optCADWeight, p.BARRIER_MIN_METRIC, p.BARRIER_MAX,
-                              true, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,p.discrTolerance);
+      success = temp.optimize(p.weight, p.optCADWeight, p.BARRIER_MIN_METRIC, p.BARRIER_MAX,
+                              true, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,
+                              p.discrTolerance);
     }
     double minJac, maxJac, distMaxBND, distAvgBND;
     temp.recalcJacDist();
@@ -537,12 +539,14 @@ static void optimizeOneByOne
       std::ostringstream ossI1;
       ossI1 << "initial_blob-" << iBadEl << ".msh";
       opt->mesh.writeMSH(ossI1.str().c_str());
-      success = opt->optimize(p.weightFixed, p.weightFree, p.optCADWeight, p.BARRIER_MIN,
-                              p.BARRIER_MAX, false, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,p.discrTolerance);
+      success = opt->optimize(p.weight, p.optCADWeight, p.BARRIER_MIN, p.BARRIER_MAX,
+                              false, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,
+                              p.discrTolerance);
       if (success >= 0 && p.BARRIER_MIN_METRIC > 0) {
         Msg::Info("Jacobian optimization succeed, starting svd optimization");
-        success = opt->optimize(p.weightFixed, p.weightFree, p.optCADWeight, p.BARRIER_MIN_METRIC,
-                                p.BARRIER_MAX, true, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,p.discrTolerance);
+        success = opt->optimize(p.weight, p.optCADWeight, p.BARRIER_MIN_METRIC, p.BARRIER_MAX,
+                                true, samples, p.itMax, p.optPassMax, p.optCAD, p.optCADDistMax,
+                                p.discrTolerance);
       }
 
       // Measure min and max Jac., update mesh
@@ -779,7 +783,7 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
   par.optDisplay = 30;
   par.verbose = 4;
 
-  ObjContribScaledNodeDispSq<ObjContribFuncSimple> nodeDistFunc(p.weightFixed, p.weightFree,
+  ObjContribScaledNodeDispSq<ObjContribFuncSimple> nodeDistFunc(p.weight,
                                                                 Patch::LS_MAXNODEDIST);
   ObjContribScaledJac<ObjContribFuncBarrierMovMin> minJacBarFunc(1.);
   minJacBarFunc.setTarget(p.BARRIER_MIN, 1.);
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.h b/contrib/HighOrderMeshOptimizer/OptHomRun.h
index 2f2e1d9f816bbf42f7e07fd0d84a9d7fc5453780..56befba458bd5793e29dba930aa6df0bf8ddb661 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.h
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.h
@@ -37,8 +37,7 @@ struct OptHomParameters {
   double BARRIER_MIN_METRIC ; // minimum scaled jcaobian
   double BARRIER_MIN ; // minimum scaled jcaobian
   double BARRIER_MAX ; // maximum scaled jcaobian
-  double weightFixed ; // weight of the energy for fixed nodes
-  double weightFree ; // weight of the energy for free nodes
+  double weight ; // weight of the energy for nodes
   int nbLayers ; // number of layers taken around a bad element
   int dim ; // which dimension to optimize
   int itMax ; // max number of iterations in the optimization process
@@ -65,8 +64,8 @@ struct OptHomParameters {
   double CPU; // Time for optimization
 
   OptHomParameters ()
-    : BARRIER_MIN_METRIC(-1.), BARRIER_MIN(0.1), BARRIER_MAX(2.0), weightFixed(1000.),
-      weightFree (1.), nbLayers (6) , dim(3) , itMax(300), onlyVisible(true),
+    : BARRIER_MIN_METRIC(-1.), BARRIER_MIN(0.1), BARRIER_MAX(2.0), weight(1.),
+      nbLayers (6) , dim(3) , itMax(300), onlyVisible(true),
       distanceFactor(12), fixBndNodes(false), strategy(0), maxAdaptBlob(3),
       adaptBlobLayerFact(2.), adaptBlobDistFact(2.), optPrimSurfMesh(false), optCAD(false),
       optCADWeight(1000.), optCADDistMax(1.e22), discrTolerance(1.e-4)
diff --git a/contrib/MeshOptimizer/MeshOptObjContribScaledNodeDispSq.h b/contrib/MeshOptimizer/MeshOptObjContribScaledNodeDispSq.h
index 6aa3c7ec05f6caacf82e4975732f073dcd2ea2f3..ae42119fef4c081645a2c4a4706a705ee4ff8446 100644
--- a/contrib/MeshOptimizer/MeshOptObjContribScaledNodeDispSq.h
+++ b/contrib/MeshOptimizer/MeshOptObjContribScaledNodeDispSq.h
@@ -11,8 +11,7 @@ template<class FuncType>
 class ObjContribScaledNodeDispSq : public ObjContrib, public FuncType
 {
 public:
-  ObjContribScaledNodeDispSq(double weightFixed, double weightFree,
-                             Patch::LengthScaling scaling);
+  ObjContribScaledNodeDispSq(double weight, Patch::LengthScaling scaling);
   virtual ~ObjContribScaledNodeDispSq() {}
   virtual ObjContrib *copy() const;
   virtual void initialize(Patch *mesh);
@@ -25,17 +24,16 @@ public:
 
 protected:
   Patch *_mesh;
-  double _weightFixed, _weightFree;
+  double _weight;
   Patch::LengthScaling _scaling;
 };
 
 
 template<class FuncType>
-ObjContribScaledNodeDispSq<FuncType>::ObjContribScaledNodeDispSq(double weightFixed,
-                                                                 double weightFree,
+ObjContribScaledNodeDispSq<FuncType>::ObjContribScaledNodeDispSq(double weight,
                                                                  Patch::LengthScaling scaling) :
   ObjContrib("ScaledNodeDispSq", FuncType::getNamePrefix()+"ScaledNodeDispSq"),
-  _mesh(0), _weightFixed(weightFixed), _weightFree(weightFree), _scaling(scaling)
+  _mesh(0), _weight(weight), _scaling(scaling)
 {
 }
 
@@ -65,12 +63,11 @@ bool ObjContribScaledNodeDispSq<FuncType>::addContrib(double &Obj,
   _max = -BIGVAL;
 
   for (int iFV = 0; iFV < _mesh->nFV(); iFV++) {
-    const double Factor = _mesh->forced(iFV) ? _weightFixed : _weightFree;
     const double dSq = _mesh->scaledNodeDispSq(iFV);
-    Obj += Factor * FuncType::compute(dSq);
+    Obj += _weight * FuncType::compute(dSq);
     std::vector<double> gDSq(_mesh->nPCFV(iFV));
     _mesh->gradScaledNodeDispSq(iFV, gDSq);
-    const double dfact = Factor * FuncType::computeDiff(dSq);
+    const double dfact = _weight * FuncType::computeDiff(dSq);
     for (int iPC = 0; iPC < _mesh->nPCFV(iFV); iPC++)
       gradObj[_mesh->indPCFV(iFV, iPC)] += dfact * gDSq[iPC];
     _min = std::min(_min, dSq);
diff --git a/contrib/MeshOptimizer/MeshOptPatch.cpp b/contrib/MeshOptimizer/MeshOptPatch.cpp
index ce0aa46d77da05e3777efc2602f953f4f7a3c96a..b6d457cd91b1fd49dbf6c91f240b0febd2f45495 100644
--- a/contrib/MeshOptimizer/MeshOptPatch.cpp
+++ b/contrib/MeshOptimizer/MeshOptPatch.cpp
@@ -133,7 +133,6 @@ int Patch::addFreeVert(MVertex* vert, const int iV, const int nPCV,
     _startPCFV.push_back(iStart);
     _nPCFV.push_back(nPCV);
     _nPC += nPCV;
-    _forced.push_back(forcedV);
     return _freeVert.size()-1;
   }
   else return std::distance(_freeVert.begin(),itVert);
diff --git a/contrib/MeshOptimizer/MeshOptPatch.h b/contrib/MeshOptimizer/MeshOptPatch.h
index 6dea34f62de5bda5af56c0c04d65ae19d327f315..6b1c0d16b0aead1816d8468306dfda0086e1cbb0 100644
--- a/contrib/MeshOptimizer/MeshOptPatch.h
+++ b/contrib/MeshOptimizer/MeshOptPatch.h
@@ -54,7 +54,6 @@ public:
   inline const int &nPC() { return _nPC; }
   inline int nVert() { return _vert.size(); }
   inline int nFV() { return _freeVert.size(); }
-  inline const bool forced(int iV) { return _forced[iV]; }
   inline int nEl() { return _el.size(); }
   inline const int &nPCFV(int iFV) { return _nPCFV[iFV]; }
   inline int indPCFV(int iFV, int iPC) { return _startPCFV[iFV]+iPC; }
@@ -111,7 +110,6 @@ private:
   std::vector<GEntity*> _gEnt;                      // Geometric entity corresponding to each element
   std::vector<MVertex*> _vert, _freeVert;           // List of vert., free vert.
   std::vector<int> _fv2V;                           // Index of free vert. -> index of vert.
-  std::vector<bool> _forced;                        // Is vertex forced?
   std::vector<SPoint3> _xyz, _ixyz;                 // Physical coord. of ALL vertices (current, straight, init.)
   std::vector<SPoint3> _uvw, _iuvw;                 // Parametric coord. of FREE vertices (current, straight, init.)
   std::vector<int> _startPCFV;                      // Start index of parametric coordinates for a free vertex
diff --git a/contrib/MeshOptimizer/doc/mesh_optimization.tex b/contrib/MeshOptimizer/doc/mesh_optimization.tex
index 729a80486158fbfc39bdfa8cbfc6c4abadbcc382..472a277ac256358cde7802da18c4675118e24cc5 100644
--- a/contrib/MeshOptimizer/doc/mesh_optimization.tex
+++ b/contrib/MeshOptimizer/doc/mesh_optimization.tex
@@ -689,9 +689,9 @@ in a straight-sided version of the bad element.
 \item \texttt{Boundary nodes} determines whether the boundary nodes
 are fixed or are allowed to move along the corresponding boundary
 in case a CAD model is available.
-\item \texttt{W fixed} and \texttt{W free} are the relative weights
-of the node displacement contribution for fixed and free vertices
-respectively, compared to the Jacobian contributions.
+\item \texttt{Weight on node displacement} is the relative weight
+of the node displacement contribution compared to the Jacobian
+contributions.
 \item \texttt{Maximum number of iterations} is the maximum number
 of iterations in the Conjugate Gradient algorithm (see
 \texttt{optIterMax} in Section~\ref{sec:input-param}).
@@ -732,8 +732,7 @@ struct MeshQualOptParameters {
   bool excludeQuad, excludeHex, excludePrism, excludeBL;
   double minTargetIdealJac;
   double minTargetInvCondNum;
-  double weightFixed;
-  double weightFree;
+  double weight;
   int nbLayers;
   int dim;
   int optIterMax;
@@ -754,9 +753,8 @@ struct MeshQualOptParameters {
     : onlyValidity(false), excludeQuad(false),
       excludeHex(false), excludePrism(false), excludeBL(false),
       minTargetIdealJac(0.1), minTargetInvCondNum(0.1),
-      weightFixed(1000.), weightFree (1.), nbLayers (6),
-      dim(3), optIterMax(300), barrierIterMax(50),
-      onlyVisible(true), distanceFactor(12),
+      weight(1.), nbLayers(6), dim(3), optIterMax(300),
+      barrierIterMax(50), onlyVisible(true), distanceFactor(12),
       fixBndNodes(false), strategy(0), maxAdaptBlob(3),
       adaptBlobLayerFact(2.), adaptBlobDistFact(2.), CPU(0.),
       minIdealJac(0.), maxIdealJac(0.), minInvCondNum(0.),
@@ -786,10 +784,9 @@ for the minimum ideal Jacobian (if \texttt{onlyValidity} is
 \item The field \texttt{minTargetInvCondNum} sets the target
 value for the inverse condition number (if \texttt{onlyValidity}
 is \texttt{false}).
-\item The fields \texttt{weightFixed} and \texttt{weightFree} are
-the relative weights of the node displacement contribution for
-fixed and free vertices respectively, compared to the inverse
-condition number or Jacobian contribution.
+\item The field \texttt{weight} is the relative weight of the node
+displacement contribution compared to the inverse condition number
+or Jacobian contribution.
 \item The field \texttt{strategy} determines the strategy in the
 manner of the patch selection options in
 Section~\ref{sec:patch-selec}: $0$ corresponds to
diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
index bd1c86fa94a9c1533774d34a756a856c84b4ab90..0f4171fbf4e615efbf5c7bbce1cd21efe97ec639 100644
--- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
+++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp
@@ -131,7 +131,7 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
   par.optDisplay = 20;
   par.verbose = 4;
 
-  ObjContribScaledNodeDispSq<ObjContribFuncSimple> nodeDistFunc(p.weightFixed, p.weightFree,
+  ObjContribScaledNodeDispSq<ObjContribFuncSimple> nodeDistFunc(p.weight,
                                                                 Patch::LS_MINEDGELENGTH);
   ObjContribIdealJac<ObjContribFuncBarrierMovMin> minIdealJacBarFunc(1.);
   minIdealJacBarFunc.setTarget(p.minTargetIdealJac, 1.);
diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
index 01af71cc6d48acb304a6a21324d16075a510a595..a83a23f1aec2f6302e034a03e78d62ed30514d59 100644
--- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
+++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
@@ -37,13 +37,12 @@ struct MeshQualOptParameters {
   bool excludeQuad, excludeHex, excludePrism, excludeBL;
   double minTargetIdealJac;
   double minTargetInvCondNum;
-  double weightFixed;                                                 // weight of the energy for fixed nodes
-  double weightFree;                                                  // weight of the energy for free nodes
-  int nbLayers;                                                       // number of layers taken around a bad element
-  int dim;                                                            // which dimension to optimize
+  double weight;                                                      // Weight of the node displacement contribution
+  int nbLayers;                                                       // Number of layers taken around a bad element
+  int dim;                                                            // Which dimension to optimize
   int optIterMax;                                                     // Max number of iterations in the optimization process
   int barrierIterMax;                                                 // Max number of barrier moves ("runs")
-  bool onlyVisible;                                                   // apply optimization to visible entities ONLY
+  bool onlyVisible;                                                   // If optimization applied to visible entities ONLY
   double distanceFactor;                                              // Distance criterion for patch creation
   bool fixBndNodes;                                                   // If points can move on boundaries
   int strategy;                                                       // 0 = connected blobs, 1 = adaptive one-by-one
@@ -59,8 +58,8 @@ struct MeshQualOptParameters {
   MeshQualOptParameters ()
     : onlyValidity(false), excludeQuad(false),
       excludeHex(false), excludePrism(false), excludeBL(false),
-      minTargetIdealJac(0.1), minTargetInvCondNum(0.1), weightFixed(1000.),
-      weightFree (1.), nbLayers (6) , dim(3) , optIterMax(300), barrierIterMax(50),
+      minTargetIdealJac(0.1), minTargetInvCondNum(0.1), weight(1.),
+      nbLayers (6) , dim(3) , optIterMax(300), barrierIterMax(50),
       onlyVisible(true), distanceFactor(12), fixBndNodes(false), strategy(0),
       maxAdaptBlob(3), adaptBlobLayerFact(2.), adaptBlobDistFact(2.), CPU(0.),
       minIdealJac(0.), maxIdealJac(0.), minInvCondNum(0.), maxInvCondNum(0.),