diff --git a/src/path-optimization/config-optimization.cc b/src/path-optimization/config-optimization.cc
index a654d847e2d1abce3a0210d5ec7726a7aaf5db84..f93149d93adf9e07260c8f61a2a15f19c8e067bf 100644
--- a/src/path-optimization/config-optimization.cc
+++ b/src/path-optimization/config-optimization.cc
@@ -42,13 +42,17 @@ namespace hpp {
                          n2 = graph->getNode (after->initial ()),
                          n3 = graph->getNode (after->end ());
         /// Find if path were computed from init or goal config
+        /// There is a nasty case: when build a path fails partially, then you
+        /// end up where the edge->to() do not correspond to the node of
+        /// path->end(). In that case, path->end () should be in edge->node().
+        /// (obviously, in this case, we have edge->isInNodeFrom_ = true)
         assert ((n0 == setB->edge()->from () && n1 == setB->edge()->to ())
                 || (n1 == setB->edge()->from () && n0 == setB->edge()->to ()));
         assert ((n2 == setA->edge()->from () && n3 == setA->edge()->to ())
                 || (n3 == setA->edge()->from () && n2 == setA->edge()->to ()));
-        bool reverseB =
+        bool reverseB = (n0 != n1) &&
           (n1 == setB->edge()->from () && n0 == setB->edge()->to ());
-        bool reverseA =
+        bool reverseA = (n2 != n3) &&
           (n3 == setA->edge()->from () && n2 == setA->edge()->to ());
 
         reverse = reverseB;
@@ -71,10 +75,10 @@ namespace hpp {
         vector_t rhsB = p->rightHandSideFromConfig (before->initial ());
 
         setA->edge()->insertNumericalConstraints (p);
-        if (nodeB_Eq_nodeA)
+        if (!nodeB_Eq_nodeA)
           setA->edge()->node()->insertNumericalConstraints (p);
         setA->edge()->insertLockedJoints (p);
-        if (nodeB_Eq_nodeA)
+        if (!nodeB_Eq_nodeA)
           setA->edge()->node()->insertLockedJoints (p);
 
         p->rightHandSideFromConfig (before->end ());