diff --git a/include/hpp/manipulation/graph/edge.hh b/include/hpp/manipulation/graph/edge.hh
index 4b5f32867a8e20d01064887f135d3ba5e49ead3f..135edea083e4df0e9b9bc7cfdf59297fbb1c9282 100644
--- a/include/hpp/manipulation/graph/edge.hh
+++ b/include/hpp/manipulation/graph/edge.hh
@@ -297,6 +297,9 @@ namespace hpp {
           virtual void populateTooltip (dot::Tooltip& tp) const;
 
         private:
+          bool applyConstraintsWithOffset (ConfigurationIn_t qoffset,
+              ConfigurationIn_t qlevelset, ConfigurationOut_t q) const;
+
           typedef Cache < ConstraintSetPtr_t > Constraint_t;
 
           /// See pathConstraint member function.
diff --git a/include/hpp/manipulation/graph/statistics.hh b/include/hpp/manipulation/graph/statistics.hh
index fea288a333138a09be36675fd480ba92b0ea7c35..ed93750ade2b7c119ecf70ccf039c922a4b98792 100644
--- a/include/hpp/manipulation/graph/statistics.hh
+++ b/include/hpp/manipulation/graph/statistics.hh
@@ -122,6 +122,8 @@ namespace hpp {
           statistics::DiscreteDistribution < RoadmapNodePtr_t > getDistribOutOfConnectedComponent (
               const core::ConnectedComponentPtr_t& cc) const;
 
+          statistics::DiscreteDistribution < RoadmapNodePtr_t > getDistrib () const;
+
         private:
           /// The constraint that creates the foliation.
           ConstraintSetPtr_t constraint_;
diff --git a/src/graph/edge.cc b/src/graph/edge.cc
index 1c2089f94d6c27c18424205f52b4539407ee7a15..6cc0705f2ed361779f2e382ceddacede824bd837 100644
--- a/src/graph/edge.cc
+++ b/src/graph/edge.cc
@@ -469,35 +469,46 @@ namespace hpp {
         }
       }
 
-      bool LevelSetEdge::applyConstraints (ConfigurationIn_t, ConfigurationOut_t) const
+      bool LevelSetEdge::applyConstraints (ConfigurationIn_t qoffset, ConfigurationOut_t q) const
       {
-        throw std::logic_error ("I need to know which connected component we wish to use.");
+        // First, get an offset from the histogram
+        statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib = hist_->getDistrib ();
+        const Configuration_t& qlevelset = *(distrib ()->configuration ());
+
+        return applyConstraintsWithOffset (qoffset, qlevelset, q);
       }
 
       bool LevelSetEdge::applyConstraints (core::NodePtr_t n_offset, ConfigurationOut_t q) const
       {
         // First, get an offset from the histogram that is not in the same connected component.
         statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib = hist_->getDistribOutOfConnectedComponent (n_offset->connectedComponent ());
-        const Configuration_t& levelsetTarget = *(distrib ()->configuration ()),
-                               q_offset = *(n_offset->configuration ());
-        // Then, set the offset.
+        const Configuration_t& qlevelset = *(distrib ()->configuration ()),
+                               qoffset = *(n_offset->configuration ());
+
+        return applyConstraintsWithOffset (qoffset, qlevelset, q);
+      }
+
+      bool LevelSetEdge::applyConstraintsWithOffset (ConfigurationIn_t qoffset,
+          ConfigurationIn_t qlevelset, ConfigurationOut_t q) const
+      {
+        // First, set the offset.
         ConstraintSetPtr_t cs = extraConfigConstraint ();
         const ConfigProjectorPtr_t cp = cs->configProjector ();
         assert (cp);
-	cp->rightHandSideFromConfig (q_offset);
+	cp->rightHandSideFromConfig (qoffset);
 	for (NumericalConstraints_t::const_iterator it =
 	       extraNumericalConstraints_.begin ();
 	     it != extraNumericalConstraints_.end (); ++it) {
-          (*it)->rightHandSideFromConfig (levelsetTarget);
+          (*it)->rightHandSideFromConfig (qlevelset);
         }
         for (LockedJoints_t::const_iterator it = extraLockedJoints_.begin ();
 	     it != extraLockedJoints_.end (); ++it) {
-          (*it)->rightHandSideFromConfig (levelsetTarget);
+          (*it)->rightHandSideFromConfig (qlevelset);
         }
 	cp->updateRightHandSide ();
 
         // Eventually, do the projection.
-        if (isShort_) q = q_offset;
+        if (isShort_) q = qoffset;
         if (cs->apply (q)) return true;
 	::hpp::statistics::SuccessStatistics& ss = cp->statistics ();
 	if (ss.nbFailure () > ss.nbSuccess ()) {
diff --git a/src/graph/statistics.cc b/src/graph/statistics.cc
index 3bdde7c1621a54e0fbb516507685d75801c788e0..e50c43210f830cf845b90b8bb8f21101c26520e0 100644
--- a/src/graph/statistics.cc
+++ b/src/graph/statistics.cc
@@ -250,6 +250,18 @@ namespace hpp {
         return distrib;
       }
 
+      statistics::DiscreteDistribution < RoadmapNodePtr_t > LeafHistogram::getDistrib () const
+      {
+        statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib;
+        for (const_iterator bin = begin(); bin != end (); ++bin) {
+          unsigned int w = bin->freq ();
+          if (w == 0)
+            continue;
+          distrib.insert (bin->nodes ().front (), w);
+        }
+        return distrib;
+      }
+
       const LeafBin::RoadmapNodes_t& LeafBin::nodes () const
       {
         return nodes_;