diff --git a/src/opendrive_road.cpp b/src/opendrive_road.cpp
index 825bd68c79e28b6f2bddd897f432d1539530c222..84765bf57a014c316923531e0a28891035843625 100644
--- a/src/opendrive_road.cpp
+++ b/src/opendrive_road.cpp
@@ -369,6 +369,7 @@ void COpendriveRoad::add_segment(const COpendriveRoadSegment *segment,segment_up
   std::stringstream road_name;
   int lane_id,inner_lane_id=std::numeric_limits<int>::max();
   unsigned int num_right_lanes=0,num_left_lanes=0;
+  double offset;
 
   if(segment->is_junction())
   {
@@ -386,9 +387,18 @@ void COpendriveRoad::add_segment(const COpendriveRoadSegment *segment,segment_up
           cand_prev_segments=candidate_segment->get_prev_segments(-1,prev_sides);
           if(prev_segments[0]==cand_prev_segments[0])
           {
-            lane_id=candidate_segment->get_lane(-1).get_prev_lane(0).get_id();
+            const COpendriveRoadNode &node=candidate_segment->get_node(0);
+            for(unsigned int j=0;j<node.get_num_links();j++)
+            {
+              if(node.get_link(j).segment==prev_segments[0])
+                if(node.get_link(j).lane!=NULL)
+                {
+                  lane_id=node.get_link(j).lane->get_id();
+                  break;
+                }
+            }
             junction_segments[lane_id]=candidate_segment;
-            if(abs(lane_id) < abs(inner_lane_id))
+            if(lane_id<0 && (abs(lane_id) < abs(inner_lane_id)))
               inner_lane_id=lane_id;
             if(lane_id>0 && ((unsigned int)lane_id)>num_left_lanes)
               num_left_lanes=lane_id;
@@ -397,8 +407,19 @@ void COpendriveRoad::add_segment(const COpendriveRoadSegment *segment,segment_up
           }
           else
           {
-            lane_id=candidate_segment->get_lane(-1).get_next_lane(0).get_id();
+            const COpendriveRoadNode &node=candidate_segment->get_node(candidate_segment->get_num_nodes()-1);
+            for(unsigned int j=0;j<node.get_num_links();j++)
+            {
+              if(node.get_link(j).segment==next_segments[0])
+                if(node.get_link(j).lane!=NULL)
+                {
+                  lane_id=node.get_link(j).lane->get_id();
+                  break;
+                }
+            }
             junction_segments[lane_id]=candidate_segment;
+            if(lane_id<0 && (abs(lane_id) < abs(inner_lane_id)))
+              inner_lane_id=lane_id;
             if(lane_id>0 && ((unsigned int)lane_id)>num_left_lanes)
               num_left_lanes=lane_id;
             else if(lane_id<0 && ((unsigned int)-lane_id)>num_right_lanes)
@@ -421,22 +442,31 @@ void COpendriveRoad::add_segment(const COpendriveRoadSegment *segment,segment_up
       const COpendriveRoadSegment *inner_segment=junction_segments[inner_lane_id];
       for(unsigned int i=0;i<inner_segment->geometries.size();i++)
         new_segment->add_geometry(inner_segment->geometries[i].opendrive);
+      offset=0.0;
       for(unsigned int i=1;i<=num_right_lanes;i++)
       {
         new_segment->lanes[-i]=junction_segments[-i]->lanes[-1];
+        new_segment->lanes[-i]->id=-i;
+        new_segment->lanes[-i]->offset=-offset;
+        offset+=junction_segments[-i]->lanes[-1]->width;
+        for(unsigned int j=0;j<junction_segments[-i]->lanes[-1]->get_num_nodes();j++)
+          new_segment->nodes.push_back(junction_segments[-i]->lanes[-1]->nodes[j]);
+        junction_segments[-i]->lanes[-1]->clone(new_node_ref,new_lane_ref,new_link_ref);
         new_segment->num_right_lanes++;
-        new_lane_ref[junction_segments[-i]->lanes[-1]]=new_segment->lanes[-i];
-        for(unsigned int j=0;j<junction_segments[-i]->lanes[-1]->nodes.size();j++)
-          new_node_ref[junction_segments[-i]->lanes[-1]->nodes[j]]=new_segment->lanes[-i]->nodes[j];
       }
+      offset=0.0;
       for(unsigned int i=1;i<=num_left_lanes;i++)
       {
         new_segment->lanes[i]=junction_segments[i]->lanes[-1];
+        new_segment->lanes[i]->id=i;
+        new_segment->lanes[i]->offset=offset;
+        offset+=junction_segments[i]->lanes[-1]->width;
+        for(unsigned int j=0;j<junction_segments[i]->lanes[-1]->get_num_nodes();j++)
+          new_segment->nodes.push_back(junction_segments[i]->lanes[-1]->nodes[j]);
+        junction_segments[i]->lanes[-1]->clone(new_node_ref,new_lane_ref,new_link_ref);
         new_segment->num_left_lanes++;
-        new_lane_ref[junction_segments[i]->lanes[-1]]=new_segment->lanes[i];
-        for(unsigned int j=0;j<junction_segments[i]->lanes[-1]->nodes.size();j++)
-          new_node_ref[junction_segments[i]->lanes[-1]->nodes[j]]=new_segment->lanes[i]->nodes[j];
       }
+      new_segment->connecting=segment->connecting;
       this->add_segment(new_segment);
       for(std::map<int,COpendriveRoadSegment *>::iterator it=junction_segments.begin();it!=junction_segments.end();it++)
         new_segment_ref[(*it).second]=new_segment;
@@ -526,25 +556,25 @@ void COpendriveRoad::complete_open_lanes(void)
 {
   std::vector<COpendriveLane *>::iterator lane_it;
   TOpendriveWorldPose end_pose;
-  TOpendriveTrackPose track_pose;
+//  TOpendriveTrackPose track_pose;
 
   for(lane_it=this->lanes.begin();lane_it!=this->lanes.end();lane_it++)
   {
 //    try{
 //      end_pose=(*lane_it)->get_end_pose();
 //  }catch(CException &e){
-      track_pose.t=(*lane_it)->get_center_offset();
-      if((*lane_it)->get_id()<0)
-      {
-        track_pose.heading=0.0;
-        track_pose.s=(*lane_it)->segment->get_length(true);
-      }
-      else
-      {
-        track_pose.s=0.0;
-        track_pose.heading=3.14159;
-      }
-      end_pose=(*lane_it)->segment->transform_to_world_pose(track_pose);
+//      track_pose.t=(*lane_it)->get_center_offset();
+//      if((*lane_it)->get_id()<0)
+//      {
+//        track_pose.heading=0.0;
+//        track_pose.s=(*lane_it)->segment->get_length(true);
+//      }
+//      else
+//      {
+//        track_pose.s=0.0;
+//        track_pose.heading=3.14159;
+//      }
+      end_pose=(*lane_it)->get_end_pose(true);
 //    }
     if(!this->node_exists_at(end_pose))// there is no node at the end pose
     {
@@ -1531,11 +1561,13 @@ std::vector<unsigned int> COpendriveRoad::get_sub_road(TOpendriveWorldPose &star
     segment=segment->get_next_path_segment(path_nodes,node_side,node_side);
     if((rem_length-segment->get_length())<0.0)
     {
-      int_end_pose=segment->get_pose_at(rem_length,node_side);
-      if((rem_length-segment->get_length())>-0.5)
+      if((rem_length-segment->get_length())>-2.0)
         new_segment=segment->clone(new_node_ref,new_lane_ref,new_link_ref);
       else
+      {  
+        int_end_pose=segment->get_pose_at(rem_length+2.0,node_side);
         new_segment=segment->get_sub_segment(new_node_ref,new_lane_ref,new_link_ref,node_side,NULL,&int_end_pose);
+      }
       new_road.add_segment(new_segment);
       new_segment_ref[(COpendriveRoadSegment *)segment]=new_segment;
       new_road.update_references(new_segment_ref,new_lane_ref,new_node_ref);