diff --git a/include/hpp/manipulation/graph/state.hh b/include/hpp/manipulation/graph/state.hh
index 01fc6649ea0ab812f1f451823e0302b1f7f39ff9..7970bf67da22ed3c8409372c5fc3b06dfa89b120 100644
--- a/include/hpp/manipulation/graph/state.hh
+++ b/include/hpp/manipulation/graph/state.hh
@@ -139,13 +139,8 @@ namespace hpp {
           /// \return true is at least one ImplicitPtr_t was inserted.
           bool insertNumericalConstraintsForPath (ConfigProjectorPtr_t& proj) const
           {
-            assert (numericalConstraintsForPath_.size () == passiveDofsForPath_.size ());
-            IntervalsContainer_t::const_iterator itpdofs = passiveDofsForPath_.begin ();
-            for (NumericalConstraints_t::const_iterator it = numericalConstraintsForPath_.begin();
-                it != numericalConstraintsForPath_.end(); it++) {
-              proj->add (*it, *itpdofs);
-              itpdofs++;
-            }
+            for (const auto& nc : numericalConstraintsForPath_)
+              proj->add (nc);
             return !numericalConstraintsForPath_.empty ();
           }
 
diff --git a/src/graph/edge.cc b/src/graph/edge.cc
index 6012044b6b33d229b930ba3e152ed1bb5c75d6b3..7d84052147e70831140434580954a54a74d9f23d 100644
--- a/src/graph/edge.cc
+++ b/src/graph/edge.cc
@@ -214,61 +214,43 @@ namespace hpp {
        const GraphPtr_t& graph)
       {
         NumericalConstraints_t nc;
-        std::vector <segments_t> pdof;
-        for (std::vector <GraphComponentPtr_t>::const_iterator it
-               (components.begin ()); it != components.end (); ++it) {
-          nc.insert (nc.end (), (*it)->numericalConstraints ().begin (),
-                     (*it)->numericalConstraints ().end ());
-          pdof.insert (pdof.end (), (*it)->passiveDofs ().begin (),
-                       (*it)->passiveDofs ().end ());
-        }
-        assert (nc.size () == pdof.size ());
-        NumericalConstraints_t::iterator itnc1, itnc2;
-        std::vector <segments_t>::iterator itpdof1, itpdof2;
+        for (const auto& gc : components)
+          nc.insert(nc.end(), gc->numericalConstraints().begin(),
+                     gc->numericalConstraints ().end ());
 
         // Remove duplicate constraints
-        for (itnc1 = nc.begin(), itpdof1 = pdof.begin(); itnc1 != nc.end(); ++itnc1, ++itpdof1) {
-          itnc2 = itnc1; ++itnc2;
-          itpdof2 = itpdof1; ++itpdof2;
-          while (itnc2 != nc.end()) {
-            if (*itnc1 == *itnc2) {
-              itnc2   = nc.erase (itnc2);
-              itpdof2 = pdof.erase (itpdof2);
-            } else {
-              ++itnc2;
-              ++itpdof2;
-            }
-          }
-        }
+        auto end = nc.end();
+        for (auto it = nc.begin(); it != end; ++it)
+          end = std::remove(std::next(it), end, *it);
+        nc.erase(end, nc.end());
+
+        NumericalConstraints_t::iterator itnc1, itnc2;
+
+        itnc2 = nc.end();
+        for (itnc1 = nc.begin(); itnc1 != itnc2; ++itnc1)
+          itnc2 = std::remove(std::next(itnc1), itnc2, *itnc1);
+        nc.erase(itnc2, nc.end());
 
         // Look for complement
-        for (itnc1 = nc.begin(), itpdof1 = pdof.begin(); itnc1 != nc.end(); ++itnc1, ++itpdof1) {
-          itnc2 = itnc1; ++itnc2;
-          itpdof2 = itpdof1; ++itpdof2;
+        for (itnc1 = nc.begin(); itnc1 != nc.end(); ++itnc1) {
+          const auto& c1 = *itnc1;
+          itnc2 = std::next(itnc1);
           constraints::ImplicitPtr_t combination;
-          while (itnc2 != nc.end()) {
+          itnc2 = std::find_if(std::next(itnc1), nc.end(),
+              [&c1, &combination, &graph](const auto& c2) -> bool {
+                assert (c1 != c2);
+                return    graph->isComplement (c1, c2, combination)
+                       || graph->isComplement (c2, c1, combination);
+              });
+          if (itnc2 != nc.end()) {
             assert (*itnc1 != *itnc2);
-            if (   graph->isComplement (*itnc1, *itnc2, combination)
-                || graph->isComplement (*itnc2, *itnc1, combination)) {
-              // Replace constraint by combination of both and remove
-              // complement.
-              *itnc1 = combination;
-              nc.erase (itnc2);
-              pdof.erase (itpdof2);
-              break;
-            } else {
-              ++itnc2;
-              ++itpdof2;
-            }
+            *itnc1 = combination;
+            nc.erase (itnc2);
           }
         }
 
-        NumericalConstraints_t::iterator itnc (nc.begin ());
-        std::vector <segments_t>::iterator itpdof (pdof.begin ());
-        while (itnc != nc.end ()) {
-          proj->add (*itnc, *itpdof);
-          ++itnc; ++itpdof;
-        }
+        for (const auto& _nc : nc)
+          proj->add (_nc);
       }
 
       ConstraintSetPtr_t Edge::buildConfigConstraint()
@@ -741,13 +723,8 @@ namespace hpp {
 
         ConfigProjectorPtr_t proj = ConfigProjector::create(g->robot(), "projParam_" + n, g->errorThreshold(), g->maxIterations());
 
-        IntervalsContainer_t::const_iterator itpdof = paramPassiveDofs_.begin ();
-        for (NumericalConstraints_t::const_iterator it = paramNumericalConstraints_.begin ();
-            it != paramNumericalConstraints_.end (); ++it) {
-          proj->add (*it, *itpdof);
-          ++itpdof;
-        }
-        assert (itpdof == paramPassiveDofs_.end ());
+        for (const auto& nc : paramNumericalConstraints_)
+          proj->add (nc);
 
         param->addConstraint (proj);
         param->edge (wkPtr_.lock ());
@@ -763,13 +740,8 @@ namespace hpp {
         ConstraintSetPtr_t cond = ConstraintSet::create (g->robot (), "Set " + n);
         proj = ConfigProjector::create(g->robot(), "projCond_" + n, g->errorThreshold(), g->maxIterations());
 
-        itpdof = condPassiveDofs_.begin ();
-        for (NumericalConstraints_t::const_iterator it = condNumericalConstraints_.begin ();
-            it != condNumericalConstraints_.end (); ++it) {
-          proj->add (*it, *itpdof);
-          ++itpdof;
-        }
-        assert (itpdof == condPassiveDofs_.end ());
+        for (const auto& nc : condNumericalConstraints_)
+          proj->add (nc);
 
         f.condition (cond);
         cond->addConstraint (proj);
@@ -816,13 +788,8 @@ namespace hpp {
         // - the state in which the transition lies if different
 
         g->insertNumericalConstraints (proj);
-        IntervalsContainer_t::const_iterator itpdof = paramPassiveDofs_.begin ();
-        for (NumericalConstraints_t::const_iterator it = paramNumericalConstraints_.begin ();
-            it != paramNumericalConstraints_.end (); ++it) {
-          proj->add (*it, *itpdof);
-          ++itpdof;
-        }
-        assert (itpdof == paramPassiveDofs_.end ());
+        for (const auto& nc : paramNumericalConstraints_)
+          proj->add (nc);
 
         insertNumericalConstraints (proj);
         stateTo ()->insertNumericalConstraints (proj);
diff --git a/src/graph/graph-component.cc b/src/graph/graph-component.cc
index 0900acc1a30a762fc4a8e7ebfa91583e50e75e01..50ef1a791a6d7a7ffe6aca796ba705303bdb1043 100644
--- a/src/graph/graph-component.cc
+++ b/src/graph/graph-component.cc
@@ -85,17 +85,10 @@ namespace hpp {
 
       bool GraphComponent::insertNumericalConstraints (ConfigProjectorPtr_t& proj) const
       {
-        IntervalsContainer_t::const_iterator itpdof = passiveDofs_.begin ();
-        for (NumericalConstraints_t::const_iterator it = numericalConstraints_.begin();
-            it != numericalConstraints_.end(); ++it) {
-          proj->add (*it, *itpdof);
-          ++itpdof;
-        }
-        assert (itpdof == passiveDofs_.end ());
-        for (NumericalConstraints_t::const_iterator it = numericalCosts_.begin();
-            it != numericalCosts_.end(); ++it) {
-          proj->add (*it, 1);
-        }
+        for (const auto& nc : numericalConstraints_)
+          proj->add (nc);
+        for (const auto& nc : numericalCosts_)
+          proj->add (nc, 1);
         return !numericalConstraints_.empty ();
       }
 
diff --git a/src/handle.cc b/src/handle.cc
index 945e584706c617992f71b0cd5575b1f9debf4b3e..16f2e2c049c2dfd5a6d21746c5e6871c1891493b 100644
--- a/src/handle.cc
+++ b/src/handle.cc
@@ -27,7 +27,6 @@
 #include <hpp/pinocchio/joint-collection.hh>
 #include <hpp/pinocchio/gripper.hh>
 
-#include <hpp/constraints/generic-transformation.hh>
 #include <hpp/constraints/implicit.hh>
 #include <hpp/constraints/explicit/relative-pose.hh>
 #include <hpp/constraints/generic-transformation.hh>
@@ -162,7 +161,6 @@ namespace hpp {
     ImplicitPtr_t Handle::createGraspAndComplement
     (const GripperPtr_t& gripper, std::string n) const
     {
-      using core::ExplicitRelativeTransformation;
       if (n.empty()) {
         n = gripper->name() + "_holds_" + name();
       }
diff --git a/src/problem-solver.cc b/src/problem-solver.cc
index 86df217bb91fd452c1ffc84d5de91c50a556a572..b7bc3f03d4ff41d49d40071eb5b740b0c9da9f3f 100644
--- a/src/problem-solver.cc
+++ b/src/problem-solver.cc
@@ -156,7 +156,7 @@ namespace hpp {
           createPathProjector <core::pathProjector::RecursiveHermite>);
 
       steeringMethods.add ("Graph-SteeringMethodStraight",
-          steeringMethod::Graph::create <core::SteeringMethodStraight>);
+          steeringMethod::Graph::create <core::steeringMethod::Straight>);
       steeringMethods.add ("Graph-Straight",
           steeringMethod::Graph::create <core::steeringMethod::Straight>);
       steeringMethods.add ("Graph-Hermite",
diff --git a/src/steering-method/graph.cc b/src/steering-method/graph.cc
index f7d778ca52a3917bb0d78da32c0b5f90b451308c..48cefdf7732044931a6db903999a3da0f67190b3 100644
--- a/src/steering-method/graph.cc
+++ b/src/steering-method/graph.cc
@@ -29,7 +29,7 @@ namespace hpp {
   namespace manipulation {
     SteeringMethod::SteeringMethod (const ProblemConstPtr_t& problem) :
       core::SteeringMethod (problem), problem_ (problem),
-      steeringMethod_ (core::SteeringMethodStraight::create (problem))
+      steeringMethod_ (core::steeringMethod::Straight::create (problem))
     {
     }