diff --git a/src/path-planner/states-path-finder.cc b/src/path-planner/states-path-finder.cc
index bd836a62d84ea172abd3a7ad47b3306a1a70fa9a..ce7389a432a2aeeb76708a144fe6948d9f442de3 100644
--- a/src/path-planner/states-path-finder.cc
+++ b/src/path-planner/states-path-finder.cc
@@ -1182,49 +1182,62 @@ namespace hpp {
         matrix_t longestSolved(d.nq, d.N);
         longestSolved.setZero();
         while (wp <= d.solvers.size()) {
-          // enough tries for a waypoint: backtrack or stop
-          while (nTriesDone[wp] >= nTriesMax) {
-            if (wp == 1) {
-              if (nTriesDone[wp] < nTriesMax1)
-                break;
+          if (wp == 1) {
+            // stop if number of tries for the first waypoint exceeds
+            if (nTriesDone[1] >= nTriesMax1) {
               // if cannot solve all the way, return longest VALID sequence
               d.waypoint = longestSolved;
               displayConfigsSolved();
-              return false; // too many tries that need to reset the entire solution
+              return false;
             }
+            // Reset the fail counter while the solution is empty
+            nFails = 0;
+            nBadSolves = 0;
+
+          }  else if (nFails >= nFailsMax || nBadSolves >= nBadSolvesMax) {
+            // Completely reset a solution when too many tries have failed
+
             // update the longest valid sequence of waypoints solved
-            if (wp -1 > wp_max) {
+            if (wp - 1 > wp_max) {
               // update the maximum index of valid waypoint
               wp_max = wp - 1;
               // save the sequence
               longestSolved.leftCols(wp_max) = d.waypoint.leftCols(wp_max);
             }
-            do {
-              nTriesDone[wp] = 0;
-              wp--; // backtrack: try a new solution for the latest waypoint
-            } while (wp>1 && d.isTargetWaypoint[wp-1]);
-          }
 
-          // Completely reset a solution when too many tries have failed
-          if (wp > 1 && (nFails >= nFailsMax || nBadSolves >= nBadSolvesMax)) {
-            for (std::size_t k = 2; k <= d.solvers.size(); k++)
-              nTriesDone[k] = 0;
+            std::fill(nTriesDone.begin()+2, nTriesDone.end(), 0);
             wp = 1;
+
+#ifdef HPP_DEBUG
+            if (nFails >= nFailsMax) {
+              hppDout (warning, " Solution " << graphData_->idxSol << ": too many collisions. Resetting back to WP1");
+            }
             if (nBadSolves >= nBadSolvesMax) {
               hppDout (warning, " Solution " << graphData_->idxSol << ": too many bad solve statuses. Resetting back to WP1");
+            }            
+#endif
+
+            continue;
+
+          } else if (nTriesDone[wp] >= nTriesMax) {
+            // enough tries for a waypoint: backtrack
+            
+            // update the longest valid sequence of waypoints solved
+            if (wp -1 > wp_max) {
+              // update the maximum index of valid waypoint
+              wp_max = wp - 1;
+              // save the sequence
+              longestSolved.leftCols(wp_max) = d.waypoint.leftCols(wp_max);
             }
-            if (nTriesDone[1] >= nTriesMax1) {
-              // if cannot solve all the way, return longest VALID sequence
-              d.waypoint = longestSolved;
-              displayConfigsSolved();
-              return false;
-            }
-          }
-          // Reset the fail counter while the solution is empty
-          if (wp == 1) {
-            nFails = 0;
-            nBadSolves = 0;
+
+            do {
+              nTriesDone[wp] = 0;
+              wp--; // backtrack: try a new solution for the latest waypoint
+            } while (wp>1 && (d.isTargetWaypoint[wp-1] || nTriesDone[wp] >= nTriesMax));
+
+            continue;
           }
+
           // Initialize right hand sides, and
           // Choose a starting configuration for the solver.solve method:
           // - from previous waypoint if it's the first time we see this solver
@@ -1564,7 +1577,8 @@ namespace hpp {
             Parameter((size_type)60)));
       core::Problem::declareParameter(ParameterDescription(Parameter::FLOAT,
             "StatesPathFinder/errorThreshold",
-            "Error threshold of the Newton Raphson algorithm.",
+            "Error threshold of the Newton Raphson algorithm."
+            "Should be at most the same as error threshold in constraint graph",
             Parameter(1e-4)));
       core::Problem::declareParameter(ParameterDescription(Parameter::INT,
             "StatesPathFinder/nTriesUntilBacktrack",