diff --git a/include/osm/osm_road_segment.h b/include/osm/osm_road_segment.h
index b0108a1358d1d88eea36ec32bf5800f30ffd2276..14b0205e71b71557eaf214432a05c54717a19568 100644
--- a/include/osm/osm_road_segment.h
+++ b/include/osm/osm_road_segment.h
@@ -21,7 +21,9 @@ class COSMRoadSegment
     COSMJunction *start_junction;
     COSMJunction *end_junction;
     double start_distance;
+    double original_start_distance;
     double end_distance;
+    double original_end_distance;
   protected:
     void set_start_distance(double dist);
     void set_end_distance(double dist);
diff --git a/src/examples/osm_import_test.cpp b/src/examples/osm_import_test.cpp
index adfd30a46b4543561591ebdff47db12327db770c..4d15f586aabc7f31fac924ad24233caf2f9ed2d1 100644
--- a/src/examples/osm_import_test.cpp
+++ b/src/examples/osm_import_test.cpp
@@ -5,7 +5,7 @@
 
 //const std::string osm_file="/home/shernand/Downloads/test_osm.osm";
 //const std::string osm_file="/home/shernand/Downloads/test_osm2.osm";
-const std::string osm_file="/home/shernand/Downloads/diagonal.osm";
+const std::string osm_file="/home/shernand/Downloads/diagonal2.osm";
 
 int main(int argc, char *argv[])
 {
@@ -17,6 +17,13 @@ int main(int argc, char *argv[])
  
     map.load_osm(osm_file);
 
+    /*
+    map.get_segment_geometry(x,y,heading);
+    for(unsigned int i=0;i<x.size();i++)
+      std::cout << x[i] << "," << y[i] << "," << heading[i] << std::endl;
+
+    return 0;
+*/
     map.get_lane_geometry(x,y,heading);
     for(unsigned int i=0;i<x.size();i++)
       std::cout << x[i] << "," << y[i] << "," << heading[i] << std::endl;
diff --git a/src/osm/osm_road_segment.cpp b/src/osm/osm_road_segment.cpp
index d92ecec82974a64cd843864d3f5d31c2268886fb..7ed8da2e771be666316ba716f513c68d18d02870 100644
--- a/src/osm/osm_road_segment.cpp
+++ b/src/osm/osm_road_segment.cpp
@@ -8,7 +8,9 @@ COSMRoadSegment::COSMRoadSegment(COSMWay *way)
   this->start_junction=NULL;
   this->end_junction=NULL;
   this->start_distance=0.0;
+  this->original_start_distance=0.0;
   this->end_distance=0.0;
+  this->original_end_distance=0.0;
 }
 
 void COSMRoadSegment::set_start_distance(double dist)
@@ -16,6 +18,8 @@ void COSMRoadSegment::set_start_distance(double dist)
   COSMNode *node1,*node2;
   double length,start_end_distance;
 
+  if(dist>this->original_start_distance)
+    this->original_start_distance=dist;
   if(dist>this->start_distance)
   {
     node1=&this->parent_way->get_segment_start_node(FIRST_SEGMENT);
@@ -25,12 +29,12 @@ void COSMRoadSegment::set_start_distance(double dist)
     {
       if((length-this->end_distance-dist)<MIN_ROAD_LENGTH)
       {
-        if(this->end_distance==0.0)
+        if(this->original_end_distance==0.0)
           this->start_distance=length-MIN_ROAD_LENGTH;
         else
         {
-          start_end_distance=this->end_distance+dist;
-          this->end_distance*=length/start_end_distance;
+          start_end_distance=this->original_end_distance+dist;
+          this->end_distance=this->original_end_distance*length/start_end_distance;
           this->end_distance-=MIN_ROAD_LENGTH/2.0;
           this->start_distance=dist*length/start_end_distance;
           this->start_distance-=MIN_ROAD_LENGTH/2.0;
@@ -54,6 +58,8 @@ void COSMRoadSegment::set_end_distance(double dist)
   COSMNode *node1,*node2;
   double length,start_end_distance;
 
+  if(dist>this->original_end_distance)
+    this->original_end_distance=dist;
   if(dist>this->end_distance)
   {
     node1=&this->parent_way->get_segment_start_node(LAST_SEGMENT);
@@ -63,14 +69,14 @@ void COSMRoadSegment::set_end_distance(double dist)
     {
       if((length-this->start_distance-dist)<MIN_ROAD_LENGTH)
       {
-        if(this->start_distance==0.0)
+        if(this->original_start_distance==0.0)
           this->end_distance=length-MIN_ROAD_LENGTH;
         else
         {
-          start_end_distance=dist+this->start_distance;
+          start_end_distance=dist+this->original_start_distance;
           this->end_distance=dist*length/start_end_distance;
           this->end_distance-=MIN_ROAD_LENGTH/2.0;
-          this->start_distance*=length/start_end_distance;
+          this->start_distance=this->original_start_distance*length/start_end_distance;
           this->start_distance-=MIN_ROAD_LENGTH/2.0;
         }
       }
@@ -112,15 +118,13 @@ bool COSMRoadSegment::generate_fwd_geometry(CRoad *road,double resolution)
       start_point.heading=heading1;
       start_point.curvature=0.0;
       road->set_start_point(start_point);
-      //prev_heading=heading1;
+//      prev_heading=heading1;
     }
     if((i+1)==(this->parent_way->get_num_nodes()-1))// straight line
     {
 //      angle2=atan2(y_offset,length1-this->end_distance);
 //      angle3=diff_angle(heading1,prev_heading)+angle2;
-//      if(fabs(angle3)<1.5707)
-//      {
-      if((length1-this->end_distance-prev_dist)>0.0)
+      if((length1-this->end_distance-prev_dist)>resolution)// && fabs(angle3)<1.5707)
       {
         end_point.x=x+(length1-this->end_distance)*cos(heading1)-y_offset*sin(heading1);
         end_point.y=y+(length1-this->end_distance)*sin(heading1)+y_offset*cos(heading1);    
@@ -128,7 +132,6 @@ bool COSMRoadSegment::generate_fwd_geometry(CRoad *road,double resolution)
         end_point.curvature=0.0;
         road->add_segment(end_point);
       }
-//      }
     }
     else 
     {
@@ -141,23 +144,23 @@ bool COSMRoadSegment::generate_fwd_geometry(CRoad *road,double resolution)
         if(i==0)
         {
           node2->get_location(x,y);
-          start_point.x=x-y_offset*sin(heading1);
-          start_point.y=y+y_offset*cos(heading1);
+          start_point.x=x-y_offset*sin(heading2);
+          start_point.y=y+y_offset*cos(heading2);
           start_point.heading=heading2;
           start_point.curvature=0.0;
           road->set_start_point(start_point);
           prev_dist=0.0;
-          //prev_heading=heading2;
+//          prev_heading=heading2;
         }
         else if((i+2)==(this->parent_way->get_num_nodes()-1))
         {
           prev_dist=dist;
-          //prev_heading=heading2;
+//          prev_heading=heading2;
         }
         else
         {
           prev_dist=dist;
-          //prev_heading=heading1;
+//          prev_heading=heading1;
         }
         continue;
       }
@@ -213,15 +216,14 @@ bool COSMRoadSegment::generate_bwd_geometry(CRoad *road,double resolution)
       start_point.heading=heading1;
       start_point.curvature=0.0;
       road->set_start_point(start_point);
-      //prev_heading=heading1;
+//      prev_heading=heading1;
     }
     if((i-1)==0)// straight line
     {
 //      angle2=atan2(y_offset,length1-this->end_distance);
 //      angle3=diff_angle(heading1,prev_heading)+angle2;
 //      if(fabs(angle3)<1.5707)
-//      {
-      if((length1-this->start_distance-prev_dist)>0.0)
+      if((length1-this->start_distance-prev_dist)>resolution)// && fabs(angle3)<1.5707)
       {
         end_point.x=x+(length1-this->start_distance)*cos(heading1)-y_offset*sin(heading1);
         end_point.y=y+(length1-this->start_distance)*sin(heading1)+y_offset*cos(heading1);
@@ -229,7 +231,6 @@ bool COSMRoadSegment::generate_bwd_geometry(CRoad *road,double resolution)
         end_point.curvature=0.0;
         road->add_segment(end_point);
       }
-//      }
     }
     else 
     {
@@ -242,23 +243,23 @@ bool COSMRoadSegment::generate_bwd_geometry(CRoad *road,double resolution)
         if(i==(this->parent_way->get_num_nodes()-1))
         {
           node2->get_location(x,y);
-          start_point.x=x-y_offset*sin(heading1);
-          start_point.y=y+y_offset*cos(heading1);
+          start_point.x=x-y_offset*sin(heading2);
+          start_point.y=y+y_offset*cos(heading2);
           start_point.heading=heading2;
           start_point.curvature=0.0;
           road->set_start_point(start_point);
           prev_dist=0.0;
-          //prev_heading=heading2;
+//          prev_heading=heading2;
         }
         else if((i-2)==0)
         {
           prev_dist=dist;
-          //prev_heading=heading2;
+//          prev_heading=heading2;
         }
         else
         {
           prev_dist=dist;
-          //prev_heading=heading1;
+//          prev_heading=heading1;
         }
         continue;
       }
@@ -280,7 +281,7 @@ bool COSMRoadSegment::generate_bwd_geometry(CRoad *road,double resolution)
       end_point.curvature=0.0;
       road->add_segment(end_point);
       prev_dist=dist;
-      //prev_heading=heading1;
+//      prev_heading=heading1;
     } 
   }
   if(road->get_num_segments()==0)