diff --git a/include/opendrive_road_node.h b/include/opendrive_road_node.h
index c5625b06fb8c79f91eed62c1bb234183d622d70a..1436a113df687f98954ee859b7b3b118457c5351 100644
--- a/include/opendrive_road_node.h
+++ b/include/opendrive_road_node.h
@@ -36,7 +36,6 @@ class COpendriveRoadNode
     void add_link(COpendriveLink *link);
     void remove_link(COpendriveLink *link);
     bool has_link(COpendriveLink *link);
-    bool has_link_with(COpendriveRoadNode *node);
     COpendriveLink *get_link_with(COpendriveRoadNode *node);
     void set_resolution(double res);
     void set_scale_factor(double scale);
@@ -62,10 +61,11 @@ class COpendriveRoadNode
     unsigned int get_num_links(void) const;
     const COpendriveLink &get_link(unsigned int index) const;
     const COpendriveLink &get_link_ending_at(unsigned int node_index) const;
+    bool has_link_with(const COpendriveRoadNode &node) const;
     unsigned int get_closest_link(TOpendriveWorldPose &pose,double angle_tol=0.1) const;
     double get_closest_distance(TOpendriveWorldPose &pose,bool only_lanes=false,double angle_tol=0.1) const;
     double get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorldPose &closest_pose,bool only_lanes=false,double angle_tol=0.1) const;
-    void get_closest_poses(TOpendriveWorldPose &pose,std::vector<TOpendriveWorldPose> &closest_poses,std::vector<double> &closest_lengths,double dist_tol,bool only_lanes,double angle_tol=0.1) const;
+    void get_closest_poses(TOpendriveWorldPose &pose,std::vector<TOpendriveWorldPose> &closest_poses,std::vector<double> &closest_lengths,double dist_tol,bool only_lanes=false,double angle_tol=0.1) const;
     friend std::ostream& operator<<(std::ostream& out, COpendriveRoadNode &node);
     ~COpendriveRoadNode();
 };
diff --git a/src/g2_spline.cpp b/src/g2_spline.cpp
index acb107ca394e750d47e5a172a0d31b97b0f31fbf..5709b60c69db30232591fc6cdceefc1b9aec2d24 100644
--- a/src/g2_spline.cpp
+++ b/src/g2_spline.cpp
@@ -801,7 +801,7 @@ double CG2Spline::get_max_curvature(double max_error,unsigned int max_iter)
   {
     start_point=this->get_max_sample_point(boost::bind(&CG2Spline::curvature_pow2,this,_1));
     if(!this->curvature_grad.compute(max_error,max_iter,start_point,true))
-      return std::numeric_limits<double>::infinity();
+      return std::numeric_limits<double>::max();
     else
     {
       this->curvature_computed=true;
@@ -821,7 +821,7 @@ double CG2Spline::get_max_curvature_der(double max_error,unsigned int max_iter)
   {
     start_point=this->get_max_sample_point(boost::bind(&CG2Spline::curvature_der_pow2,this,_1));  
     if(!this->curvature_der_grad.compute(max_error,max_iter,start_point,true))
-      return std::numeric_limits<double>::infinity();
+      return std::numeric_limits<double>::max();
     else
     {
       this->curvature_der_computed=true;
@@ -839,7 +839,7 @@ double CG2Spline::find_closest_point(double x, double y, TPoint &point,double ma
   this->dist_y=y;
   start_point=this->get_min_sample_point(boost::bind(&CG2Spline::distance_pow2,this,_1));  
   if(!this->distance_grad.compute(max_error,max_iter,start_point,false))
-    return std::numeric_limits<double>::infinity();
+    return std::numeric_limits<double>::max();
   else
   {
     point=this->evaluate_parameter(this->distance_grad.get_coordinate());
@@ -858,7 +858,7 @@ double CG2Spline::find_closest_point(double x, double y,double max_error,unsigne
   this->dist_y=y;
   start_point=this->get_min_sample_point(boost::bind(&CG2Spline::distance_pow2,this,_1));  
   if(!this->distance_grad.compute(max_error,max_iter,start_point,false))
-    return std::numeric_limits<double>::infinity();
+    return std::numeric_limits<double>::max();
   else
   {
     if(this->num_points)
diff --git a/src/gradient.cpp b/src/gradient.cpp
index 92c876fe0fdbce9f1fc11d9a41bf2b9834d13756..3301bb41f45e15b9b240899469620be08f75360a 100644
--- a/src/gradient.cpp
+++ b/src/gradient.cpp
@@ -52,6 +52,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
   unsigned int iteration=0;
   double gamma=1.0,func_value,func_der_value,prev_func_value,prev_func_der_value;
   double coord,prev_coord,coord_inc;
+  bool beyond_limits=false;
 
   coord=start_point;
   func_value=this->p_function(coord);
@@ -72,6 +73,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
       coord=this->max_coord;
       this->coordinate=coord;
       this->value=this->p_function(coord);
+      beyond_limits=true;
       break;
     }
     else if(coord<this->min_coord)
@@ -79,6 +81,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
       coord=this->min_coord;
       this->coordinate=coord;
       this->value=this->p_function(coord);
+      beyond_limits=true;
       break;
     }
     prev_func_value=func_value;
@@ -90,7 +93,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
   }while((fabs(func_value-prev_func_value)>max_func_error || fabs(coord-prev_coord)>0.001) && iteration<max_iter);
   this->coordinate=coord;
   this->value=func_value;
-  if(iteration==max_iter)
+  if(iteration==max_iter || beyond_limits)
     return false;
   else
     return true;
diff --git a/src/opendrive_lane.cpp b/src/opendrive_lane.cpp
index 8e2f2457f7576ab19c264689e820071c715e8cc7..035100b03ed1c619ff82b26e11fc75173a9a1255 100644
--- a/src/opendrive_lane.cpp
+++ b/src/opendrive_lane.cpp
@@ -779,22 +779,25 @@ TOpendriveWorldPose COpendriveLane::transform_to_world_pose(TOpendriveTrackPose
 
 unsigned int COpendriveLane::get_closest_node_index(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose found_pose;
   unsigned int closest_index=-1;
 
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
-    this->nodes[i]->get_closest_pose(pose,found_pose,true,angle_tol);
-    dist=sqrt(pow(found_pose.x-pose.x,2.0)+pow(found_pose.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=this->nodes[i]->get_closest_pose(pose,found_pose,true,angle_tol);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_index=i;
+      dist=sqrt(pow(found_pose.x-pose.x,2.0)+pow(found_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_index=i;
+        distance=length;
+      }
     }
   }
 
-  distance=min_dist;
   return closest_index;
 }
 
@@ -810,7 +813,7 @@ const COpendriveRoadNode &COpendriveLane::get_closest_node(TOpendriveWorldPose &
 
 double COpendriveLane::get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorldPose &closest_pose,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max(),distance;
+  double dist,min_dist=std::numeric_limits<double>::max(),distance,length;
   TOpendriveWorldPose found_pose;
   unsigned int closest_index=-1;
   COpendriveLink *link;
@@ -820,17 +823,20 @@ double COpendriveLane::get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorl
   closest_pose.heading=std::numeric_limits<double>::max();
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
-    this->nodes[i]->get_closest_pose(pose,found_pose,true,angle_tol);
-    dist=sqrt(pow(found_pose.x-pose.x,2.0)+pow(found_pose.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=this->nodes[i]->get_closest_pose(pose,found_pose,true,angle_tol);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_index=i;
-      closest_pose=found_pose;
+      dist=sqrt(pow(found_pose.x-pose.x,2.0)+pow(found_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_index=i;
+        closest_pose=found_pose;
+        distance=length;
+      }
     }
   }
 
-  distance=0.0;
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
     if(i<closest_index)
@@ -842,7 +848,6 @@ double COpendriveLane::get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorl
     else
       break;
   }
-  distance+=min_dist;
 
   return distance;
 }
diff --git a/src/opendrive_road.cpp b/src/opendrive_road.cpp
index f26267a49ffd4fbff5286e72aeb48f07482500f0..42a9a77a2e4fbac46f958e6c1eab6ea52759e1ad 100644
--- a/src/opendrive_road.cpp
+++ b/src/opendrive_road.cpp
@@ -671,18 +671,22 @@ const COpendriveRoadSegment& COpendriveRoad::operator[](std::size_t index)
 
 unsigned int COpendriveRoad::get_closest_node_index(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose closest_pose;
   unsigned int closest_index=-1;
 
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
-    this->nodes[i]->get_closest_pose(pose,closest_pose,false,angle_tol);
-    dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=this->nodes[i]->get_closest_pose(pose,closest_pose,false,angle_tol);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_index=i;
+      dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_index=i;
+        distance=length;
+      }
     }
   }
 
@@ -701,18 +705,22 @@ const COpendriveRoadNode &COpendriveRoad::get_closest_node(TOpendriveWorldPose &
 
 unsigned int COpendriveRoad::get_closest_lane_index(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose closest_pose;
   unsigned int closest_index=-1;
 
   for(unsigned int i=0;i<this->lanes.size();i++)
   { 
-    this->lanes[i]->get_closest_pose(pose,closest_pose,angle_tol);
-    dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-    if(dist<min_dist)
-    { 
-      min_dist=dist;
-      closest_index=i;
+    length=this->lanes[i]->get_closest_pose(pose,closest_pose,angle_tol);
+    if(length<std::numeric_limits<double>::max())
+    {
+      dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      { 
+        min_dist=dist;
+        closest_index=i;
+        distance=length;
+      }
     }
   }
 
@@ -731,18 +739,22 @@ const COpendriveLane &COpendriveRoad::get_closest_lane(TOpendriveWorldPose &pose
 
 unsigned int COpendriveRoad::get_closest_segment_index(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose closest_pose;
   unsigned int closest_index=-1;
 
   for(unsigned int i=0;i<this->segments.size();i++)
   { 
-    this->segments[i]->get_closest_pose(pose,closest_pose,angle_tol);
-    dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-    if(dist<min_dist)
-    { 
-      min_dist=dist;
-      closest_index=i;
+    length=this->segments[i]->get_closest_pose(pose,closest_pose,angle_tol);
+    if(length<std::numeric_limits<double>::max())
+    {
+      dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      { 
+        min_dist=dist;
+        closest_index=i;
+        distance=length;
+      }
     }
   }
 
@@ -768,12 +780,15 @@ double COpendriveRoad::get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorl
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
     length=this->nodes[i]->get_closest_pose(pose,pose_found,false,angle_tol);
-    dist=sqrt(pow(pose_found.x-pose.x,2.0)+pow(pose_found.y-pose.y,2.0));
-    if(dist<min_dist)
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_pose=pose_found;
-      closest_length=length;
+      dist=sqrt(pow(pose_found.x-pose.x,2.0)+pow(pose_found.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_pose=pose_found;
+        closest_length=length;
+      }
     }
   }
 
@@ -784,16 +799,28 @@ void COpendriveRoad::get_closest_poses(TOpendriveWorldPose &pose,std::vector<TOp
 {
   std::vector<TOpendriveWorldPose> poses;
   std::vector<double> lengths;
+  bool already_added;
 
   closest_poses.clear();
   closest_lengths.clear();
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
     this->nodes[i]->get_closest_poses(pose,poses,lengths,dist_tol,false,angle_tol);
-    for(unsigned int j=0;j<poses.size();i++)
+    for(unsigned int j=0;j<poses.size();j++)
     {
-      closest_poses.push_back(poses[i]);
-      closest_lengths.push_back(lengths[i]);
+      already_added=false;
+      for(unsigned int k=0;k<closest_poses.size();k++)
+        if(fabs(closest_poses[k].x-poses[j].x)<this->resolution &&
+           fabs(closest_poses[k].y-poses[j].y)<this->resolution)
+        {
+          already_added=true;
+          break;
+        }
+      if(!already_added)
+      {
+        closest_poses.push_back(poses[j]);
+        closest_lengths.push_back(lengths[j]);
+      }
     }
   }
 }
diff --git a/src/opendrive_road_node.cpp b/src/opendrive_road_node.cpp
index ee7d6dfaa6384c43acdfe4a013feb2119fb08c75..bff1134db2d95040609a762c56e1bd516b6b48b1 100644
--- a/src/opendrive_road_node.cpp
+++ b/src/opendrive_road_node.cpp
@@ -47,7 +47,7 @@ bool COpendriveRoadNode::add_link(COpendriveRoadNode *node,opendrive_mark_t mark
   double start_curvature,end_curvature;
   COpendriveLink *new_link;
 
-  if(this->has_link_with(node) || node->has_link_with(this))
+  if(this->has_link_with(*node) || node->has_link_with(*this))
     return false;
   new_link=new COpendriveLink();
   new_link->set_prev(this);
@@ -118,10 +118,10 @@ bool COpendriveRoadNode::has_link(COpendriveLink *link)
   return false;
 }
 
-bool COpendriveRoadNode::has_link_with(COpendriveRoadNode *node)
+bool COpendriveRoadNode::has_link_with(const COpendriveRoadNode &node) const
 {
   for(unsigned int i=0;i<this->links.size();i++)
-    if(this->links[i]->prev==this && this->links[i]->next==node)
+    if(this->links[i]->prev==this && this->links[i]->next==&node)
       return true;
 
   return false;
@@ -325,7 +325,6 @@ void COpendriveRoadNode::update_end_pose(COpendriveLane *lane,TOpendriveWorldPos
 {
   std::vector<TOpendriveRoadNodeParent>::iterator parent_it;
   std::vector<COpendriveLink *>::iterator link_it;
-  TOpendriveRoadNodeParent *parent;
 
   // remove the references to all lanes and segments except for lane
   for(parent_it=this->parents.begin();parent_it!=this->parents.end();)
@@ -333,10 +332,7 @@ void COpendriveRoadNode::update_end_pose(COpendriveLane *lane,TOpendriveWorldPos
     if(parent_it->lane!=lane)
       parent_it=this->parents.erase(parent_it);
     else
-    {
-      parent=&(*parent_it);
       parent_it++;
-    }
   }
   // update the links
   for(link_it=this->links.begin();link_it!=this->links.end();)
@@ -438,22 +434,25 @@ unsigned int COpendriveRoadNode::get_closest_link(TOpendriveWorldPose &pose,doub
 {
   double dist,min_dist=std::numeric_limits<double>::max();
   unsigned int closest_index=-1;
-  double angle;
+  double angle,length;
   TOpendriveWorldPose closest_pose;
 
   for(unsigned int i=0;i<this->links.size();i++)
   {
     if(&this->links[i]->get_prev()==this)// links starting at this node
     {
-      this->links[i]->find_closest_world_pose(pose,closest_pose);
-      angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
-      if(fabs(angle)<angle_tol)
+      length=this->links[i]->find_closest_world_pose(pose,closest_pose);
+      if(length<std::numeric_limits<double>::max())
       {
-        dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-        if(dist<min_dist)
+        angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
+        if(fabs(angle)<angle_tol)
         {
-          min_dist=dist;
-          closest_index=i;
+          dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+          if(dist<min_dist)
+          {
+            min_dist=dist;
+            closest_index=i;
+          }
         }
       }
     }
@@ -465,7 +464,7 @@ unsigned int COpendriveRoadNode::get_closest_link(TOpendriveWorldPose &pose,doub
 double COpendriveRoadNode::get_closest_distance(TOpendriveWorldPose &pose,bool only_lanes,double angle_tol)const 
 {
   double dist,min_dist=std::numeric_limits<double>::max();
-  double angle;
+  double angle,length;
   TOpendriveWorldPose closest_pose;
 
   for(unsigned int i=0;i<this->links.size();i++)
@@ -474,13 +473,16 @@ double COpendriveRoadNode::get_closest_distance(TOpendriveWorldPose &pose,bool o
     {
       if(!only_lanes || (only_lanes && this->links[i]->lane!=NULL))
       {
-        this->links[i]->find_closest_world_pose(pose,closest_pose);
-        angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
-        if(fabs(angle)<angle_tol)
+        length=this->links[i]->find_closest_world_pose(pose,closest_pose);
+        if(length<std::numeric_limits<double>::max())
         {
-          dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-          if(dist<min_dist)
-            min_dist=dist;
+          angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
+          if(fabs(angle)<angle_tol)
+          {
+            dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+            if(dist<min_dist)
+              min_dist=dist;
+          }
         }
       }
     }
@@ -506,15 +508,18 @@ double COpendriveRoadNode::get_closest_pose(TOpendriveWorldPose &pose,TOpendrive
       if(!only_lanes || (only_lanes && this->links[i]->lane!=NULL))
       {
         length=this->links[i]->find_closest_world_pose(pose,tmp_pose);
-        angle=diff_angle(normalize_angle(pose.heading),tmp_pose.heading);
-        if(fabs(angle)<angle_tol)
+        if(length<std::numeric_limits<double>::max())
         {
-          dist=sqrt(pow(tmp_pose.x-pose.x,2.0)+pow(tmp_pose.y-pose.y,2.0));
-          if(dist<min_dist)
+          angle=diff_angle(normalize_angle(pose.heading),tmp_pose.heading);
+          if(fabs(angle)<angle_tol)
           {
-            min_dist=dist;
-            closest_length=length;
-            closest_pose=tmp_pose;
+            dist=sqrt(pow(tmp_pose.x-pose.x,2.0)+pow(tmp_pose.y-pose.y,2.0));
+            if(dist<min_dist)
+            {
+              min_dist=dist;
+              closest_length=length;
+              closest_pose=tmp_pose;
+            }
           }
         }
       }
@@ -530,6 +535,7 @@ void COpendriveRoadNode::get_closest_poses(TOpendriveWorldPose &pose,std::vector
   double angle;
   double length;
   TOpendriveWorldPose closest_pose;
+  bool already_added;
 
   closest_poses.clear();
   closest_lengths.clear();
@@ -540,14 +546,28 @@ void COpendriveRoadNode::get_closest_poses(TOpendriveWorldPose &pose,std::vector
       if(!only_lanes || (only_lanes && this->links[i]->lane!=NULL))
       {
         length=this->links[i]->find_closest_world_pose(pose,closest_pose);
-        angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
-        if(fabs(angle)<angle_tol)
+        if(length<std::numeric_limits<double>::max())
         {
-          dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-          if(dist<=dist_tol)
+          angle=diff_angle(normalize_angle(pose.heading),closest_pose.heading);
+          if(fabs(angle)<angle_tol)
           {
-            closest_poses.push_back(closest_pose);
-            closest_lengths.push_back(length);
+            dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+            if(dist<=dist_tol)
+            {
+              already_added=false;
+              for(unsigned int j=0;j<closest_poses.size();j++)
+                if(fabs(closest_poses[j].x-closest_pose.x)<this->resolution && 
+                   fabs(closest_poses[j].y-closest_pose.y)<this->resolution)
+                {
+                  already_added=true;
+                  break;
+                }
+              if(!already_added)
+              {
+                closest_poses.push_back(closest_pose);
+                closest_lengths.push_back(length);
+              }
+            }
           }
         }
       }
diff --git a/src/opendrive_road_segment.cpp b/src/opendrive_road_segment.cpp
index 60186394132d3276dc74e92e3a0646d11ee41195..c48d4765bccadfad4a915da4f8b0d61d767a144b 100644
--- a/src/opendrive_road_segment.cpp
+++ b/src/opendrive_road_segment.cpp
@@ -732,9 +732,7 @@ COpendriveRoadSegment *COpendriveRoadSegment::get_sub_segment(node_up_ref_t &new
     for(geom_it=new_segment->geometries.begin();geom_it!=new_segment->geometries.end();)
     {
       length=geom_it->spline->find_closest_point(start_pose->x,start_pose->y,new_point);
-      if(fabs(length-geom_it->spline->get_length())<this->resolution)
-        geom_it=new_segment->geometries.erase(geom_it);
-      else
+      if(length<std::numeric_limits<double>::max())
       {
         geom_it->spline->set_start_point(new_point);
         geom_it->spline->generate(this->resolution);
@@ -742,6 +740,8 @@ COpendriveRoadSegment *COpendriveRoadSegment::get_sub_segment(node_up_ref_t &new
         geom_it->opendrive->set_max_s(geom_it->opendrive->get_max_s()-length);
         break;
       }
+      else
+        geom_it=new_segment->geometries.erase(geom_it);
     }
     for(unsigned int i=1;i<new_segment->geometries.size();i++)
     {
@@ -754,7 +754,7 @@ COpendriveRoadSegment *COpendriveRoadSegment::get_sub_segment(node_up_ref_t &new
     for(geom_it=new_segment->geometries.begin();geom_it!=new_segment->geometries.end();)
     {
       length=geom_it->spline->find_closest_point(end_pose->x,end_pose->y,new_point);
-      if(length<geom_it->spline->get_length())
+      if(length<std::numeric_limits<double>::max())
       {
         geom_it->spline->set_end_point(new_point);
         geom_it->spline->generate(this->resolution);
@@ -1150,18 +1150,22 @@ TOpendriveWorldPose COpendriveRoadSegment::transform_to_world_pose(const TOpendr
 
 unsigned int COpendriveRoadSegment::get_closest_node_index(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose closest_pose;
   unsigned int closest_index=-1;
 
   for(unsigned int i=0;i<this->nodes.size();i++)
   {
-    this->nodes[i]->get_closest_pose(pose,closest_pose,false,angle_tol);
-    dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=this->nodes[i]->get_closest_pose(pose,closest_pose,false,angle_tol);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_index=i;
+      dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_index=i;
+        distance=length;
+      }
     }
   }
 
@@ -1180,19 +1184,23 @@ const COpendriveRoadNode &COpendriveRoadSegment::get_closest_node(TOpendriveWorl
 
 int COpendriveRoadSegment::get_closest_lane_id(TOpendriveWorldPose &pose,double &distance,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max();
+  double dist,min_dist=std::numeric_limits<double>::max(),length;
   TOpendriveWorldPose closest_pose;
   int closest_id=0;
   std::map<int,COpendriveLane *>::const_iterator lane_it;
 
   for(lane_it=this->lanes.begin();lane_it!=this->lanes.end();lane_it++)
   {
-    lane_it->second->get_closest_pose(pose,closest_pose,angle_tol);
-    dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=lane_it->second->get_closest_pose(pose,closest_pose,angle_tol);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_id=lane_it->first;
+      dist=sqrt(pow(closest_pose.x-pose.x,2.0)+pow(closest_pose.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_id=lane_it->first;
+        distance=length;
+      }
     }
   }
 
@@ -1209,7 +1217,7 @@ const COpendriveLane &COpendriveRoadSegment::get_closest_lane(TOpendriveWorldPos
 
 double COpendriveRoadSegment::get_closest_pose(TOpendriveWorldPose &pose,TOpendriveWorldPose &closest_pose,double angle_tol) const
 {
-  double dist,min_dist=std::numeric_limits<double>::max(),distance;
+  double dist,min_dist=std::numeric_limits<double>::max(),distance,length;
   unsigned int closest_index=-1;
   TPoint closest_spline_point;
 
@@ -1218,22 +1226,30 @@ double COpendriveRoadSegment::get_closest_pose(TOpendriveWorldPose &pose,TOpendr
   closest_pose.heading=std::numeric_limits<double>::max();
   for(unsigned int i=0;i<this->geometries.size();i++)
   {
-    this->geometries[i].spline->find_closest_point(pose.x,pose.y,closest_spline_point);
-    dist=sqrt(pow(closest_spline_point.x-pose.x,2.0)+pow(closest_spline_point.y-pose.y,2.0));
-    if(dist<min_dist)
+    length=this->geometries[i].spline->find_closest_point(pose.x,pose.y,closest_spline_point);
+    if(length<std::numeric_limits<double>::max())
     {
-      min_dist=dist;
-      closest_index=i;
-      closest_pose.x=closest_spline_point.x;
-      closest_pose.y=closest_spline_point.y;
-      closest_pose.heading=normalize_angle(closest_spline_point.heading);
+      dist=sqrt(pow(closest_spline_point.x-pose.x,2.0)+pow(closest_spline_point.y-pose.y,2.0));
+      if(dist<min_dist)
+      {
+        min_dist=dist;
+        closest_index=i;
+        closest_pose.x=closest_spline_point.x;
+        closest_pose.y=closest_spline_point.y;
+        closest_pose.heading=normalize_angle(closest_spline_point.heading);
+        distance=length;
+      }
     }
   }
 
-  distance=0.0;
-  for(unsigned int i=0;i<closest_index;i++)
-    distance+=this->geometries[i].spline->get_length();
-  distance+=min_dist;
+  if(closest_index!=(unsigned int)-1)
+  {
+    for(unsigned int i=0;i<closest_index;i++)
+      distance+=this->geometries[i].spline->get_length();
+    distance+=min_dist;
+  }
+  else
+    distance=std::numeric_limits<double>::max();
 
   return distance;
 }