diff --git a/src/steering-method/cross-state-optimization.cc b/src/steering-method/cross-state-optimization.cc
index f07cbe776a68691e620c39dd735878eacc57b1d1..4216f5edd3e2dd5824e448415985d5ec50d657e6 100644
--- a/src/steering-method/cross-state-optimization.cc
+++ b/src/steering-method/cross-state-optimization.cc
@@ -296,6 +296,8 @@ namespace hpp {
         std::vector <Solver_t> solvers;
         // Waypoints lying in each intermediate state
         matrix_t waypoint;
+        // Initial guess of each solver stored as matrix columns
+        matrix_t qInit;
         Configuration_t q1, q2;
         core::DevicePtr_t robot;
         // Matrix specifying for each constraint and each waypoint how
@@ -311,8 +313,8 @@ namespace hpp {
                           ) :
           N (transitions.size () - 1), nq (_robot->configSize()),
           nv (_robot->numberDof()), solvers (N, _robot->configSpace ()),
-          waypoint (nq, N), q1 (_q1), q2 (_q2), robot (_robot), M_rhs (),
-          M_status ()
+          waypoint (nq, N), qInit (nq, N), q1 (_q1), q2 (_q2), robot (_robot),
+          M_rhs (), M_status ()
         {
           assert (transitions.size () > 0);
         }
@@ -490,6 +492,26 @@ namespace hpp {
             }
           }
         }
+        // Initial guess
+        std::vector<size_type> ks;
+        size_type K = 0;
+        ks.resize(d.N);
+        for (std::size_t i = 0; i < d.N + 1; ++i) {
+          if (!transitions[i]->isShort()) ++K;
+          if (i < d.N) ks[i] = K;
+        }
+        if (K==0) {
+          ++K;
+          for (std::size_t i = d.N/2; i < d.N; ++i)
+            ks[i] = 1;
+        }
+        for (std::size_t i = 0; i < d.N; ++i) {
+          value_type u = value_type(ks[i]) / value_type(K);
+          pinocchio::interpolate (d.robot, d.q1, d.q2, u, d.qInit.col (i));
+          hppDout (info, "qInit = " << pinocchio::displayConfig
+                   (d.qInit.col (i)));
+        }
+
         return true;
       }
 
@@ -519,8 +541,7 @@ namespace hpp {
               ;
             }
           }
-          if (j==0) d.waypoint.col (j) = d.q1;
-          else d.waypoint.col (j) = d.waypoint.col (j-1);
+          d.waypoint.col (j) = d.qInit.col (j);
           Solver_t::Status status = solver.solve
             (d.waypoint.col (j),
              constraints::solver::lineSearch::Backtracking ());