diff --git a/include/hpp/manipulation/fwd.hh b/include/hpp/manipulation/fwd.hh
index 6f257c787215fd10342e26c29dce8b0e32c45c75..516b7b78b45ecf322a1fb5dc8ecc0ae9a35cc3d1 100644
--- a/include/hpp/manipulation/fwd.hh
+++ b/include/hpp/manipulation/fwd.hh
@@ -48,7 +48,6 @@ typedef std::vector<pinocchio::FrameIndex> FrameIndices_t;
 typedef pinocchio::Configuration_t Configuration_t;
 typedef pinocchio::ConfigurationIn_t ConfigurationIn_t;
 typedef pinocchio::ConfigurationOut_t ConfigurationOut_t;
-typedef core::ConfigurationPtr_t ConfigurationPtr_t;
 typedef pinocchio::GripperPtr_t GripperPtr_t;
 typedef pinocchio::LiegroupElement LiegroupElement;
 typedef pinocchio::LiegroupSpace LiegroupSpace;
diff --git a/include/hpp/manipulation/manipulation-planner.hh b/include/hpp/manipulation/manipulation-planner.hh
index ef5937f5c9b97795f8672e387691afc4a310528a..a6adec40ac27f6fbb1ed33f86f44dc95f41cc49f 100644
--- a/include/hpp/manipulation/manipulation-planner.hh
+++ b/include/hpp/manipulation/manipulation-planner.hh
@@ -65,7 +65,7 @@ class HPP_MANIPULATION_DLLAPI ManipulationPlanner
   /// \retval validPath the longest valid path (possibly of length 0),
   ///         resulting from the extension.
   /// \return True if the returned path is valid.
-  bool extend(RoadmapNodePtr_t q_near, const ConfigurationPtr_t& q_rand,
+  bool extend(RoadmapNodePtr_t q_near, ConfigurationIn_t q_rand,
               core::PathPtr_t& validPath);
 
   /// Get the number of occurrence of each errors.
diff --git a/include/hpp/manipulation/path-planner/states-path-finder.hh b/include/hpp/manipulation/path-planner/states-path-finder.hh
index 44c442c51459363d930feac4a78dd4622e57c8ac..30e4dcd2883b1555b0da6dd7c932b1a7bd4f881b 100644
--- a/include/hpp/manipulation/path-planner/states-path-finder.hh
+++ b/include/hpp/manipulation/path-planner/states-path-finder.hh
@@ -117,7 +117,7 @@ class HPP_MANIPULATION_DLLAPI StatesPathFinder : public core::PathPlanner {
   /// \return a Configurations_t from q1 to q2 if found. An empty
   /// vector if a path could not be built.
   core::Configurations_t computeConfigList(ConfigurationIn_t q1,
-                                           ConfigurationPtr_t q2);
+                                           ConfigurationIn_t q2);
 
   // access functions for Python interface
   std::vector<std::string> constraintNamesFromSolverAtWaypoint(std::size_t wp);
@@ -246,7 +246,7 @@ class HPP_MANIPULATION_DLLAPI StatesPathFinder : public core::PathPlanner {
   NumericalConstraints_t goalConstraints_;
   bool goalDefinedByConstraints_;
   // Variables used across several calls to oneStep
-  ConfigurationPtr_t q1_, q2_;
+  Configuration_t q1_, q2_;
   core::Configurations_t configList_;
   std::size_t idxConfigList_;
   size_type nTryConfigList_;
diff --git a/include/hpp/manipulation/path-planner/transition-planner.hh b/include/hpp/manipulation/path-planner/transition-planner.hh
index 6e41cc97fb3aacf22a5cc4ab77bb2dd1d6132feb..0e6240f3f30f5d09147bbe7d2d02610e348b3b0f 100644
--- a/include/hpp/manipulation/path-planner/transition-planner.hh
+++ b/include/hpp/manipulation/path-planner/transition-planner.hh
@@ -108,7 +108,7 @@ class HPP_MANIPULATION_DLLAPI TransitionPlanner : public core::PathPlanner {
   /// \retval status a message in case of failure.
   /// If a path projector has been selected, the path is tested for
   /// continuity.
-  PathPtr_t directPath(const Configuration_t& q1, const Configuration_t& q2,
+  PathPtr_t directPath(ConfigurationIn_t q1, ConfigurationIn_t q2,
                        bool validate, bool& success, std::string& status);
   /// Optimize path using the selected path optimizers
   /// \param path input path
diff --git a/include/hpp/manipulation/roadmap-node.hh b/include/hpp/manipulation/roadmap-node.hh
index f281285f4e9c223c425857dd32d610f2a578c9c8..ad821f319565a665c3260059ace432f200d4490e 100644
--- a/include/hpp/manipulation/roadmap-node.hh
+++ b/include/hpp/manipulation/roadmap-node.hh
@@ -41,10 +41,10 @@ namespace hpp {
 namespace manipulation {
 class HPP_MANIPULATION_DLLAPI RoadmapNode : public core::Node {
  public:
-  RoadmapNode(const ConfigurationPtr_t& configuration)
+  RoadmapNode(ConfigurationIn_t configuration)
       : core::Node(configuration), state_() {}
 
-  RoadmapNode(const ConfigurationPtr_t& configuration,
+  RoadmapNode(ConfigurationIn_t configuration,
               ConnectedComponentPtr_t cc);
 
   /// \name Cache
diff --git a/include/hpp/manipulation/roadmap.hh b/include/hpp/manipulation/roadmap.hh
index de34c4c14aa670389c74d997b6731d7e08eeb3be..831385672505b94cc85c9aa5b0d9c564c4a601ce 100644
--- a/include/hpp/manipulation/roadmap.hh
+++ b/include/hpp/manipulation/roadmap.hh
@@ -68,7 +68,7 @@ class HPP_MANIPULATION_DLLAPI Roadmap : public core::Roadmap {
   /// Get the nearest neighbor in a given graph::Node and in a given
   /// ConnectedComponent.
   RoadmapNodePtr_t nearestNodeInState(
-      const ConfigurationPtr_t& configuration,
+      ConfigurationIn_t configuration,
       const ConnectedComponentPtr_t& connectedComponent,
       const graph::StatePtr_t& state, value_type& minDistance) const;
 
@@ -104,7 +104,7 @@ class HPP_MANIPULATION_DLLAPI Roadmap : public core::Roadmap {
   Roadmap(const core::DistancePtr_t& distance, const core::DevicePtr_t& robot);
 
   /// Node factory
-  core::NodePtr_t createNode(const ConfigurationPtr_t& config) const;
+  core::NodePtr_t createNode(ConfigurationIn_t config) const;
 
   void init(const RoadmapPtr_t& shPtr) {
     Parent::init(shPtr);
diff --git a/src/astar.hh b/src/astar.hh
index ae9508cc784af683e4785d543737952b42d49f63..1b3ccd74ee00d56c5c7c437f9e1167e940b2555f 100644
--- a/src/astar.hh
+++ b/src/astar.hh
@@ -137,8 +137,8 @@ class Astar {
 
   inline value_type heuristic(RoadmapNodePtr_t node,
                               RoadmapNodePtr_t to) const {
-    const ConfigurationPtr_t& config = node->configuration();
-    return (*distance_)(*config, *to->configuration());
+    const Configuration_t& config = node->configuration();
+    return (*distance_)(config, to->configuration());
   }
 
   inline value_type edgeCost(const core::EdgePtr_t& edge) const {
diff --git a/src/graph/edge.cc b/src/graph/edge.cc
index c4c5409bdfffafb6b9a775c1024e1b5d0a7317e8..b5a727e62649c98f114795a66a8d28bd43a488a0 100644
--- a/src/graph/edge.cc
+++ b/src/graph/edge.cc
@@ -359,7 +359,7 @@ bool Edge::build(core::PathPtr_t& path, ConfigurationIn_t q1,
 
 bool Edge::generateTargetConfig(core::NodePtr_t nStart,
                                 ConfigurationOut_t q) const {
-  return generateTargetConfig(*(nStart->configuration()), q);
+  return generateTargetConfig(nStart->configuration(), q);
 }
 
 bool Edge::generateTargetConfig(ConfigurationIn_t qStart,
@@ -577,7 +577,7 @@ bool LevelSetEdge::generateTargetConfig(ConfigurationIn_t qStart,
     hppDout(warning, "Edge " << name() << ": Distrib is empty");
     return false;
   }
-  const Configuration_t& qLeaf = *(distrib()->configuration());
+  const Configuration_t& qLeaf = distrib()->configuration();
 
   return generateTargetConfigOnLeaf(qStart, qLeaf, q);
 }
@@ -592,8 +592,8 @@ bool LevelSetEdge::generateTargetConfig(core::NodePtr_t nStart,
     hppDout(warning, "Edge " << name() << ": Distrib is empty");
     return false;
   }
-  const Configuration_t &qLeaf = *(distrib()->configuration()),
-                        qStart = *(nStart->configuration());
+  const Configuration_t &qLeaf = distrib()->configuration(),
+                        qStart = nStart->configuration();
 
   return generateTargetConfigOnLeaf(qStart, qLeaf, q);
 }
diff --git a/src/graph/state-selector.cc b/src/graph/state-selector.cc
index e68e669fc66630a8ad6a549795d57e0551d87a9d..e0fbe7fdf997823ccd6263847b19c60dc327a702 100644
--- a/src/graph/state-selector.cc
+++ b/src/graph/state-selector.cc
@@ -91,7 +91,7 @@ StatePtr_t StateSelector::getState(ConfigurationIn_t config) const {
 
 StatePtr_t StateSelector::getState(RoadmapNodePtr_t node) const {
   if (!node->cacheUpToDate())
-    node->graphState(getState(*(node->configuration())));
+    node->graphState(getState(node->configuration()));
   return node->graphState();
 }
 
diff --git a/src/graph/statistics.cc b/src/graph/statistics.cc
index f651e154c5561adfae069ecb1a57818b887710a0..40c686d7ee5cfd5b2437ed55065db2b8ad3ef7f5 100644
--- a/src/graph/statistics.cc
+++ b/src/graph/statistics.cc
@@ -153,8 +153,8 @@ LeafHistogram::LeafHistogram(const Foliation f) : f_(f), threshold_(0) {
 }
 
 void LeafHistogram::add(const RoadmapNodePtr_t& n) {
-  if (!f_.contains(*n->configuration())) return;
-  iterator it = insert(LeafBin(f_.parameter(*n->configuration()), &threshold_));
+  if (!f_.contains(n->configuration())) return;
+  iterator it = insert(LeafBin(f_.parameter(n->configuration()), &threshold_));
   it->push_back(n);
   if (numberOfObservations() % 10 == 0) {
     hppDout(info, *this);
diff --git a/src/manipulation-planner.cc b/src/manipulation-planner.cc
index d91a1d2e69901a6a0c9c8f30a4f17a049368dd5a..f8b953ed4ba8cb6aa79f4db27126a3ba15305c63 100644
--- a/src/manipulation-planner.cc
+++ b/src/manipulation-planner.cc
@@ -75,7 +75,7 @@ graph::StatePtr_t getState(const graph::GraphPtr_t graph,
   if (mnode != NULL)
     return mnode->graphState();
   else
-    return graph->getState(*node->configuration());
+    return graph->getState(node->configuration());
 }
 
 core::PathPtr_t connect(const Configuration_t& q1, const Configuration_t& q2,
@@ -177,13 +177,13 @@ void ManipulationPlanner::oneStep() {
   core::Nodes_t newNodes;
   core::PathPtr_t path;
 
-  typedef std::tuple<core::NodePtr_t, ConfigurationPtr_t, core::PathPtr_t>
+  typedef std::tuple<core::NodePtr_t, Configuration_t, core::PathPtr_t>
       DelayedEdge_t;
   typedef std::vector<DelayedEdge_t> DelayedEdges_t;
   DelayedEdges_t delayedEdges;
 
   // Pick a random node
-  ConfigurationPtr_t q_rand = shooter_->shoot();
+  Configuration_t q_rand = shooter_->shoot();
 
   // Extend each connected component
   for (core::ConnectedComponents_t::const_iterator itcc =
@@ -210,12 +210,11 @@ void ManipulationPlanner::oneStep() {
         value_type t_final = path->timeRange().second;
         if (t_final != path->timeRange().first) {
           bool success;
-          ConfigurationPtr_t q_new(
-              new Configuration_t(path->eval(t_final, success)));
+          Configuration_t q_new(path->eval(t_final, success));
           assert(success);
           assert(!path->constraints() ||
-                 path->constraints()->isSatisfied(*q_new));
-          assert(problem_->constraintGraph()->getState(*q_new));
+                 path->constraints()->isSatisfied(q_new));
+          assert(problem_->constraintGraph()->getState(q_new));
           delayedEdges.push_back(DelayedEdge_t(near, q_new, path));
         }
       }
@@ -226,7 +225,7 @@ void ManipulationPlanner::oneStep() {
   // Insert delayed edges
   for (const auto& edge : delayedEdges) {
     const core::NodePtr_t& near = std::get<0>(edge);
-    const ConfigurationPtr_t& q_new = std::get<1>(edge);
+    Configuration_t q_new = std::get<1>(edge);
     const core::PathPtr_t& validPath = std::get<2>(edge);
     core::NodePtr_t newNode = roadmap()->addNode(q_new);
     roadmap()->addEdge(near, newNode, validPath);
@@ -263,21 +262,21 @@ void ManipulationPlanner::oneStep() {
 }
 
 bool ManipulationPlanner::extend(RoadmapNodePtr_t n_near,
-                                 const ConfigurationPtr_t& q_rand,
+                                 ConfigurationIn_t q_rand,
                                  core::PathPtr_t& validPath) {
   graph::GraphPtr_t graph = problem_->constraintGraph();
   PathProjectorPtr_t pathProjector = problem_->pathProjector();
   pinocchio::DevicePtr_t robot(problem_->robot());
   value_type eps(graph->errorThreshold());
   // Select next node in the constraint graph.
-  const ConfigurationPtr_t q_near = n_near->configuration();
+  const Configuration_t q_near = n_near->configuration();
   HPP_START_TIMECOUNTER(chooseEdge);
   graph::EdgePtr_t edge = graph->chooseEdge(n_near);
   HPP_STOP_TIMECOUNTER(chooseEdge);
   if (!edge) {
     return false;
   }
-  qProj_ = *q_rand;
+  qProj_ = q_rand;
   HPP_START_TIMECOUNTER(generateTargetConfig);
   SuccessStatistics& es = edgeStat(edge);
   if (!edge->generateTargetConfig(n_near, qProj_)) {
@@ -286,7 +285,7 @@ bool ManipulationPlanner::extend(RoadmapNodePtr_t n_near,
     es.addFailure(reasons_[PROJECTION]);
     return false;
   }
-  if (pinocchio::isApprox(robot, qProj_, *q_near, eps)) {
+  if (pinocchio::isApprox(robot, qProj_, q_near, eps)) {
     es.addFailure(reasons_[FAILURE]);
     es.addFailure(reasons_[PATH_PROJECTION_ZERO]);
     return false;
@@ -294,7 +293,7 @@ bool ManipulationPlanner::extend(RoadmapNodePtr_t n_near,
   HPP_STOP_TIMECOUNTER(generateTargetConfig);
   core::PathPtr_t path;
   HPP_START_TIMECOUNTER(buildPath);
-  if (!edge->build(path, *q_near, qProj_)) {
+  if (!edge->build(path, q_near, qProj_)) {
     HPP_STOP_TIMECOUNTER(buildPath);
     es.addFailure(reasons_[FAILURE]);
     es.addFailure(reasons_[STEERING_METHOD]);
@@ -396,7 +395,7 @@ inline std::size_t ManipulationPlanner::tryConnectToRoadmap(
   value_type distance;
   for (core::Nodes_t::const_iterator itn1 = nodes.begin(); itn1 != nodes.end();
        ++itn1) {
-    const Configuration_t& q1(*(*itn1)->configuration());
+    const Configuration_t& q1((*itn1)->configuration());
     graph::StatePtr_t s1 = getState(graph, *itn1);
     connectSucceed = false;
     for (core::ConnectedComponents_t::const_iterator itcc =
@@ -411,7 +410,7 @@ inline std::size_t ManipulationPlanner::tryConnectToRoadmap(
         bool _2to1 = (*itn1)->isInNeighbor(*itn2);
         assert(!_1to2 || !_2to1);
 
-        const Configuration_t& q2(*(*itn2)->configuration());
+        const Configuration_t& q2((*itn2)->configuration());
         graph::StatePtr_t s2 = getState(graph, *itn2);
         assert(q1 != q2);
 
@@ -445,7 +444,7 @@ inline std::size_t ManipulationPlanner::tryConnectNewNodes(
   std::size_t nbConnection = 0;
   for (core::Nodes_t::const_iterator itn1 = nodes.begin(); itn1 != nodes.end();
        ++itn1) {
-    const Configuration_t& q1(*(*itn1)->configuration());
+    const Configuration_t& q1((*itn1)->configuration());
     graph::StatePtr_t s1 = getState(graph, *itn1);
 
     for (core::Nodes_t::const_iterator itn2 = std::next(itn1);
@@ -455,7 +454,7 @@ inline std::size_t ManipulationPlanner::tryConnectNewNodes(
       bool _1to2 = (*itn1)->isOutNeighbor(*itn2);
       bool _2to1 = (*itn1)->isInNeighbor(*itn2);
       assert(!_1to2 || !_2to1);
-      const Configuration_t& q2(*(*itn2)->configuration());
+      const Configuration_t& q2((*itn2)->configuration());
       graph::StatePtr_t s2 = getState(graph, *itn2);
       assert(q1 != q2);
 
diff --git a/src/path-planner/end-effector-trajectory.cc b/src/path-planner/end-effector-trajectory.cc
index 4a708bb2b930c394be6c2f38e7c4b54b3491dc3b..360fbb4070c2d6942a866ee4173213e054e342b6 100644
--- a/src/path-planner/end-effector-trajectory.cc
+++ b/src/path-planner/end-effector-trajectory.cc
@@ -73,7 +73,7 @@ void EndEffectorTrajectory::startSolve() {
     throw std::runtime_error(msg);
   }
 
-  if (!problem()->initConfig()) {
+  if (problem()->initConfig().size() == 0) {
     std::string msg("No init config in problem.");
     hppDout(error, msg);
     throw std::runtime_error(msg);
@@ -154,7 +154,7 @@ void EndEffectorTrajectory::oneStep() {
   // Generate a vector if configuration where the first one is the initial
   // configuration and the following ones are random configurations
   std::vector<core::Configuration_t> qs(
-      configurations(*problem()->initConfig()));
+      configurations(problem()->initConfig()));
   if (qs.empty()) {
     hppDout(info, "Failed to generate initial configs.");
     return;
@@ -238,10 +238,9 @@ void EndEffectorTrajectory::oneStep() {
     //   - insert q_init as initial configuration of the roadmap,
     //   - insert final configuration as goal node in the roadmap,
     //   - add a roadmap edge between them and stop.
-    roadmap()->initNode(make_shared<Configuration_t>(steps.col(0)));
+    roadmap()->initNode(steps.col(0));
     core::NodePtr_t init = roadmap()->initNode();
-    core::NodePtr_t goal = roadmap()->addGoalNode(
-        make_shared<Configuration_t>(steps.col(nDiscreteSteps_)));
+    core::NodePtr_t goal = roadmap()->addGoalNode(steps.col(nDiscreteSteps_));
     roadmap()->addEdge(init, goal, path);
     success = true;
     if (feasibilityOnly_) break;
diff --git a/src/path-planner/states-path-finder.cc b/src/path-planner/states-path-finder.cc
index 4f79a8ea31f67aefeac4b7fbe5c2440675140153..20eb2515570917a056eb803191c859a85761e486 100644
--- a/src/path-planner/states-path-finder.cc
+++ b/src/path-planner/states-path-finder.cc
@@ -77,7 +77,7 @@ static void displayRoadmap(const core::RoadmapPtr_t& roadmap) {
   for (auto cc : roadmap->connectedComponents()) {
     hppDout(info, " CC " << i++);
     for (auto n : cc->nodes()) {
-      hppDout(info, pinocchio::displayConfig(*(n->configuration())));
+      hppDout(info, pinocchio::displayConfig(n->configuration()));
     }
   }
 }
@@ -96,8 +96,8 @@ StatesPathFinder::StatesPathFinder(const core::ProblemConstPtr_t& problem,
       lastBuiltTransitions_(),
       goalConstraints_(),
       goalDefinedByConstraints_(false),
-      q1_(0x0),
-      q2_(0x0),
+      q1_(),
+      q2_(),
       configList_(),
       idxConfigList_(0),
       nTryConfigList_(0),
@@ -409,7 +409,7 @@ struct StatesPathFinder::OptimizationData {
   // Number of trials to generate each waypoint configuration
   // _solveGoalConfig: whether we need to solve for goal configuration
   OptimizationData(const core::ProblemConstPtr_t _problem,
-                   const Configuration_t& _q1, const ConfigurationPtr_t& _q2,
+                   ConfigurationIn_t _q1, ConfigurationIn_t _q2,
                    const Edges_t& transitions, const bool _solveGoalConfig)
       : N(_solveGoalConfig ? transitions.size() : transitions.size() - 1),
         nq(_problem->robot()->configSize()),
@@ -421,8 +421,8 @@ struct StatesPathFinder::OptimizationData {
         M_rhs(),
         M_status() {
     if (!_solveGoalConfig) {
-      assert(_q2);
-      q2 = *_q2;
+      assert(_q2.size() > 0);
+      q2 = _q2;
     }
     waypoint.setZero();
     for (auto solver : solvers) {
@@ -893,7 +893,7 @@ bool StatesPathFinder::analyseOptimizationProblem(
     size_type tries = 0;
     Configuration_t q;
     do {
-      q = *(problem()->configurationShooter()->shoot());
+      q = problem()->configurationShooter()->shoot();
       preInitializeRHS(j, q);
       status = solver.solve(q, constraints::solver::lineSearch::Backtracking());
     } while ((status != Solver_t::SUCCESS) && (++tries <= nTriesMax));
@@ -1044,8 +1044,8 @@ bool StatesPathFinder::analyseOptimizationProblem2(
     }
   }
   // initialize the right hand side with the initial config
-  analyseSolver.rightHandSideFromConfig(*q1_);
-  if (analyseSolver.isSatisfied(*q1_)) {
+  analyseSolver.rightHandSideFromConfig(q1_);
+  if (analyseSolver.isSatisfied(q1_)) {
     return true;
   }
   hppDout(info,
@@ -1091,8 +1091,7 @@ void StatesPathFinder::initializeRHS(std::size_t j) {
 void StatesPathFinder::initWPRandom(std::size_t wp) {
   assert(wp >= 1 && wp <= (std::size_t)optData_->waypoint.cols());
   initializeRHS(wp - 1);
-  optData_->waypoint.col(wp - 1) =
-      *(problem()->configurationShooter()->shoot());
+  optData_->waypoint.col(wp - 1) = problem()->configurationShooter()->shoot();
 }
 void StatesPathFinder::initWPNear(std::size_t wp) {
   assert(wp >= 1 && wp <= (std::size_t)optData_->waypoint.cols());
@@ -1278,15 +1277,12 @@ bool StatesPathFinder::solveOptimizationProblem() {
 core::Configurations_t StatesPathFinder::getConfigList() const {
   OptimizationData& d = *optData_;
   core::Configurations_t pv;
-  ConfigurationPtr_t q1(new Configuration_t(d.q1));
-  pv.push_back(q1);
+  pv.push_back(d.q1);
   for (std::size_t i = 0; i < d.N; ++i) {
-    ConfigurationPtr_t q(new Configuration_t(d.waypoint.col(i)));
-    pv.push_back(q);
+    pv.push_back(d.waypoint.col(i));
   }
   if (!goalDefinedByConstraints_) {
-    ConfigurationPtr_t q2(new Configuration_t(d.q2));
-    pv.push_back(q2);
+    pv.push_back(d.q2);
   }
   return pv;
 }
@@ -1297,7 +1293,7 @@ core::Configurations_t StatesPathFinder::getConfigList() const {
 // [one of potential goal states if goal defined as set of constraints]
 // and compute waypoint configurations in each state.
 core::Configurations_t StatesPathFinder::computeConfigList(
-    ConfigurationIn_t q1, ConfigurationPtr_t q2) {
+    ConfigurationIn_t q1, ConfigurationIn_t q2) {
   const graph::GraphPtr_t& graph(problem_->constraintGraph());
   GraphSearchData& d = *graphData_;
 
@@ -1352,8 +1348,7 @@ core::Configurations_t StatesPathFinder::computeConfigList(
     }
   }
   core::Configurations_t empty_path;
-  ConfigurationPtr_t q(new Configuration_t(q1));
-  empty_path.push_back(q);
+  empty_path.push_back(q1);
   return empty_path;
 }
 
@@ -1374,7 +1369,7 @@ void StatesPathFinder::startSolve() {
   PathPlanner::startSolve();
   assert(problem_);
   q1_ = problem_->initConfig();
-  assert(q1_);
+  assert(q1_.size() > 0);
 
   // core::PathProjectorPtr_t pathProjector
   //   (core::pathProjector::Progressive::create(inStateProblem_, 0.01));
@@ -1383,7 +1378,7 @@ void StatesPathFinder::startSolve() {
   const graph::GraphPtr_t& graph(problem_->constraintGraph());
   graphData_.reset(new GraphSearchData());
   GraphSearchData& d = *graphData_;
-  d.s1 = graph->getState(*q1_);
+  d.s1 = graph->getState(q1_);
   d.maxDepth = problem_->getParameter("StatesPathFinder/maxDepth").intValue();
 
   d.queue1.push_back(d.addInitState());
@@ -1416,7 +1411,7 @@ void StatesPathFinder::startSolve() {
       throw std::logic_error(os.str().c_str());
     }
     q2_ = q2s[0];
-    d.s2.push_back(graph->getState(*q2_));
+    d.s2.push_back(graph->getState(q2_));
   } else {
     TaskTargetPtr_t taskTarget(HPP_DYNAMIC_PTR_CAST(TaskTarget, target));
     if (!taskTarget) {
@@ -1425,7 +1420,7 @@ void StatesPathFinder::startSolve() {
             "either a configuration or a set of constraints.";
       throw std::logic_error(os.str().c_str());
     }
-    assert(!q2_);
+    assert(q2_.size() == 0);
     goalDefinedByConstraints_ = true;
     goalConstraints_ = taskTarget->constraints();
     hppDout(info, "goal defined as a set of constraints");
@@ -1460,15 +1455,15 @@ void StatesPathFinder::startSolve() {
 void StatesPathFinder::oneStep() {
   if (idxConfigList_ == 0) {
     // TODO: accommodate when goal is a set of constraints
-    assert(q1_);
-    configList_ = computeConfigList(*q1_, q2_);
+    assert(q1_.size()>0);
+    configList_ = computeConfigList(q1_, q2_);
     if (configList_.size() <= 1) {  // max depth reached
       reset();
       throw core::path_planning_failed("Maximal depth reached.");
     }
   }
   size_t& idxSol = graphData_->idxSol;
-  ConfigurationPtr_t q1, q2;
+  Configuration_t q1, q2;
   if (idxConfigList_ >= configList_.size() - 1) {
     reset();
     throw core::path_planning_failed(
@@ -1481,8 +1476,8 @@ void StatesPathFinder::oneStep() {
   core::ConstraintSetPtr_t constraints(HPP_DYNAMIC_PTR_CAST(
       core::ConstraintSet, edge->pathConstraint()->copy()));
   // Initialize right hand side
-  constraints->configProjector()->rightHandSideFromConfig(*q1);
-  assert(constraints->isSatisfied(*q2));
+  constraints->configProjector()->rightHandSideFromConfig(q1);
+  assert(constraints->isSatisfied(q2));
   inStateProblem_->constraints(constraints);
   inStateProblem_->pathValidation(edge->pathValidation());
   inStateProblem_->steeringMethod(edge->steeringMethod());
diff --git a/src/path-planner/transition-planner.cc b/src/path-planner/transition-planner.cc
index 53f415d490e9bc4c5f8e0ae1689b01eae7c83eec..bbde195044749ba32541cdf4aadbe6c1e04ae701 100644
--- a/src/path-planner/transition-planner.cc
+++ b/src/path-planner/transition-planner.cc
@@ -68,7 +68,7 @@ void TransitionPlanner::startSolve() {
         " no constraints. You probably forgot to select "
         "the transition.");
   innerProblem_->constraints()->configProjector()->rightHandSideFromConfig(
-      *(innerProblem_->initConfig()));
+      innerProblem_->initConfig());
   // Forward maximal number of iterations to inner planner
   innerPlanner_->maxIterations(this->maxIterations());
   // Forward timeout to inner planner
@@ -88,12 +88,12 @@ core::PathVectorPtr_t TransitionPlanner::planPath(const Configuration_t qInit,
   if (configProjector) {
     configProjector->rightHandSideFromConfig(qInit);
   }
-  ConfigurationPtr_t q(new Configuration_t(qInit));
+  Configuration_t q(qInit);
   innerProblem_->initConfig(q);
   innerProblem_->resetGoalConfigs();
   for (size_type r = 0; r < qGoals.rows(); ++r) {
-    ConfigurationPtr_t q(new Configuration_t(qGoals.row(r)));
-    if (!configProjector->isSatisfied(*q)) {
+    Configuration_t q(qGoals.row(r));
+    if (!configProjector->isSatisfied(q)) {
       std::ostringstream os;
       os << "hpp::manipulation::TransitionPlanner::computePath: "
          << "goal configuration at rank " << r
@@ -110,8 +110,8 @@ core::PathVectorPtr_t TransitionPlanner::planPath(const Configuration_t qInit,
   return path;
 }
 
-core::PathPtr_t TransitionPlanner::directPath(const Configuration_t& q1,
-                                              const Configuration_t& q2,
+core::PathPtr_t TransitionPlanner::directPath(ConfigurationIn_t q1,
+                                              ConfigurationIn_t q2,
                                               bool validate, bool& success,
                                               std::string& status) {
   core::PathPtr_t res(innerProblem_->steeringMethod()->steer(q1, q2));
diff --git a/src/problem-target/astar.hh b/src/problem-target/astar.hh
index f3062b8b13b13ecc173c1eb689956e333e5348f5..5fc3d2cbddcda15aab077169da08bae7e3c9f795 100644
--- a/src/problem-target/astar.hh
+++ b/src/problem-target/astar.hh
@@ -144,13 +144,13 @@ class HPP_MANIPULATION_LOCAL Astar {
   }
 
   value_type heuristic(const RoadmapNodePtr_t node) const {
-    const ConfigurationPtr_t config = node->configuration();
+    const Configuration_t& config = node->configuration();
     value_type res = std::numeric_limits<value_type>::infinity();
     for (core::NodeVector_t::const_iterator itGoal =
              roadmap_->goalNodes().begin();
          itGoal != roadmap_->goalNodes().end(); ++itGoal) {
-      ConfigurationPtr_t goal = (*itGoal)->configuration();
-      value_type dist = (*distance_)(*config, *goal);
+      const Configuration_t& goal = (*itGoal)->configuration();
+      value_type dist = (*distance_)(config, goal);
       if (dist < res) {
         res = dist;
       }
diff --git a/src/roadmap-node.cc b/src/roadmap-node.cc
index 0d0f81c53bd949c269c9528cf2ede50e03eba6a8..02700589d5afe1d029b9a677df2b6361f7592c72 100644
--- a/src/roadmap-node.cc
+++ b/src/roadmap-node.cc
@@ -32,7 +32,7 @@
 
 namespace hpp {
 namespace manipulation {
-RoadmapNode::RoadmapNode(const ConfigurationPtr_t& configuration,
+RoadmapNode::RoadmapNode(ConfigurationIn_t configuration,
                          ConnectedComponentPtr_t cc)
     : core::Node(configuration, cc), state_() {}
 }  // namespace manipulation
diff --git a/src/roadmap.cc b/src/roadmap.cc
index 26e4fd50c5fe00d963e1b48e9cdd8f882154cbfa..1b174b8ab2c9abc7b90ed583ec224ac9789823aa 100644
--- a/src/roadmap.cc
+++ b/src/roadmap.cc
@@ -91,7 +91,7 @@ void Roadmap::constraintGraph(const graph::GraphPtr_t& graph) {
 }
 
 RoadmapNodePtr_t Roadmap::nearestNodeInState(
-    const ConfigurationPtr_t& configuration,
+    ConfigurationIn_t configuration,
     const ConnectedComponentPtr_t& connectedComponent,
     const graph::StatePtr_t& state, value_type& minDistance) const {
   core::NodePtr_t result = NULL;
@@ -103,7 +103,7 @@ RoadmapNodePtr_t Roadmap::nearestNodeInState(
   // 		<< std::endl;
   for (RoadmapNodes_t::const_iterator itNode = roadmapNodes.begin();
        itNode != roadmapNodes.end(); ++itNode) {
-    value_type d = (*distance())(*(*itNode)->configuration(), *configuration);
+    value_type d = (*distance())((*itNode)->configuration(), configuration);
     if (d < minDistance) {
       minDistance = d;
       result = *itNode;
@@ -112,7 +112,7 @@ RoadmapNodePtr_t Roadmap::nearestNodeInState(
   return static_cast<RoadmapNode*>(result);
 }
 
-core::NodePtr_t Roadmap::createNode(const ConfigurationPtr_t& q) const {
+core::NodePtr_t Roadmap::createNode(ConfigurationIn_t q) const {
   // call RoadmapNode constructor with new manipulation connected component
   RoadmapNodePtr_t node = new RoadmapNode(q, ConnectedComponent::create(weak_));
   LeafConnectedCompPtr_t sc = WeighedLeafConnectedComp::create(weak_.lock());
diff --git a/src/steering-method/cross-state-optimization.cc b/src/steering-method/cross-state-optimization.cc
index a9ac705889ba4bad620b581f8550cf93fa88186d..6da90a05f805024957151f8b0c2602924c9e239a 100644
--- a/src/steering-method/cross-state-optimization.cc
+++ b/src/steering-method/cross-state-optimization.cc
@@ -534,7 +534,7 @@ bool CrossStateOptimization::solveOptimizationProblem(
             .intValue());
 
     while (status != Solver_t::SUCCESS && nbTry < nRandomConfigs) {
-      d.waypoint.col(j) = *(problem()->configurationShooter()->shoot());
+      d.waypoint.col(j) = problem()->configurationShooter()->shoot();
       status = solver.solve(d.waypoint.col(j),
                             constraints::solver::lineSearch::Backtracking());
       ++nbTry;
diff --git a/src/weighed-distance.cc b/src/weighed-distance.cc
index f3a0e980b2edc6af15f11a01e532aa18cc2eb8f1..388f729397590d320be56837e2b9488cc1b35100 100644
--- a/src/weighed-distance.cc
+++ b/src/weighed-distance.cc
@@ -86,7 +86,7 @@ value_type WeighedDistance::impl_distance(ConfigurationIn_t q1,
 
 value_type WeighedDistance::impl_distance(core::NodePtr_t n1,
                                           core::NodePtr_t n2) const {
-  Configuration_t &q1 = *n1->configuration(), q2 = *n2->configuration();
+  const Configuration_t &q1 = n1->configuration(), q2 = n2->configuration();
   value_type d = core::WeighedDistance::impl_distance(q1, q2);
 
   graph::Edges_t pes =