diff --git a/OpenRoadEd/create_junction_road.cpp b/OpenRoadEd/create_junction_road.cpp
index 1194c60cc840ab5e8793cb28f9098a81241e7284..84f6454d573288744dc842b392c0d1734cc816d9 100644
--- a/OpenRoadEd/create_junction_road.cpp
+++ b/OpenRoadEd/create_junction_road.cpp
@@ -27,6 +27,7 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
   std::stringstream name,id;
   static unsigned int road_id=1000;
   double line1,line2;
+  double check_x,check_y,check_heading;
 
   // check if the junction is fully defined and the road exists
   junction=open_drive->GetJunction(junction_index);
@@ -68,7 +69,7 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
   {
     if(predecessor->GetPredecessor()->GetElementType()=="junction" && predecessor->GetPredecessor()->GetElementId()==junction->GetId())
     {
-      predecessor->GetLastGeometryBlock()->GetCoords(0,start_x,start_y,original_start_heading);
+      predecessor->GetGeometryBlock(0)->GetCoords(0,start_x,start_y,original_start_heading);
       start_heading=original_start_heading+3.14158;
       if(start_heading>2*3.14158)
         start_heading-=2*3.14158;
@@ -80,6 +81,8 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
         if(predecessor->GetSuccessor()->GetElementType()=="junction" && predecessor->GetSuccessor()->GetElementId()==junction->GetId())
         {
           predecessor->GetLastGeometryBlock()->GetLastCoords(s,start_x,start_y,original_start_heading);
+          if(original_start_heading>2*3.14158)
+            original_start_heading-=2*3.14158;
           start_heading=original_start_heading;
         }
         else
@@ -113,7 +116,7 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
   }
   // get lane offset
   lane_start_offset=0.0;
-  if(original_start_heading==start_heading)
+  if(fabs(original_start_heading-start_heading)<0.01)
   {
     for(unsigned int i=0;i<lanes->size();i++)
     {
@@ -141,17 +144,16 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
       }
     }
   }
-  std::cout << "start offset: " << lane_start_offset << std::endl;
-  std::cout << "start position: " << start_x << "," << start_y << std::endl;
   start_x-=lane_start_offset*sin(start_heading);
   start_y+=lane_start_offset*cos(start_heading);
-  std::cout << "start position: " << start_x << "," << start_y << std::endl;
   // get successor road start position
   if(successor->GetPredecessor()!=NULL)
   {
     if(successor->GetPredecessor()->GetElementType()=="junction" && successor->GetPredecessor()->GetElementId()==junction->GetId())
     {
-      successor->GetLastGeometryBlock()->GetCoords(0,end_x,end_y,original_end_heading);
+      successor->GetGeometryBlock(0)->GetCoords(0,end_x,end_y,original_end_heading);
+      if(original_end_heading>2*3.14158)
+        original_end_heading-=2*3.14158;
       end_heading=original_end_heading;
     }
     else 
@@ -186,8 +188,7 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
   // get lane offset
   lanes=successor->GetLaneSection(0)->GetLaneVector();
   lane_end_offset=0.0;
-  std::cout << original_end_heading << "," << end_heading << std::endl;
-  if(original_end_heading==end_heading)
+  if(fabs(original_end_heading-end_heading)<0.01)
   {
     for(unsigned int i=0;i<lanes->size();i++)
     {
@@ -215,47 +216,9 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
       }
     }
   }
-  std::cout << "end offset: " << lane_end_offset << std::endl;
-  std::cout << "end position: " << end_x << "," << end_y << std::endl;
   end_x-=lane_end_offset*sin(end_heading);
   end_y+=lane_end_offset*cos(end_heading);
-  std::cout << "end position: " << end_x << "," << end_y << std::endl;
 
-  if(road==NULL)
-  {
-    // the road does not exist
-    id << road_id;
-    // Creates a new record in openDrive structure and returns it's index
-    road_index=open_drive->AddRoad("", 0, "", "");
-    // Add the road to the road tree
-    road_tree->AddRoad(road_index,false);
-    road=open_drive->GetLastRoad();
-    road->SetRoadName(name.str());
-    road->SetRoadId(id.str());
-    road->SetRoadJunction(junction->GetId());
-    if(predecessor->GetPredecessor()->GetElementType()=="junction")
-      road->SetPredecessor("road", connection->GetIncomingRoad(), "start");
-    else
-      road->SetPredecessor("road", connection->GetIncomingRoad(), "end");
-    if(successor->GetPredecessor()->GetElementType()=="junction")
-      road->SetSuccessor("road",connection->GetConnectingRoad(), "start");
-    else
-      road->SetSuccessor("road",connection->GetConnectingRoad(), "end");
-    road->AddRoadType(0,"town");// que sigui el tipus del predecessor
-    road_tree->AddRoadType(road_index,0,false);
-    road_id++;
-  }
-
-  if(road->GetGeometryBlockCount()!=0)
-  {
-    while(road->GetGeometryBlockCount()!=0)
-    {
-      road_tree->SelectGeometry(road_index,road->GetGeometryBlockCount()-1);
-      road_tree->DeleteLastGeometry();
-      road->DeleteGeometryBlock(road->GetGeometryBlockCount()-1);
-    }
-    road->SetRoadLength(0);
-  }
   // compute geometry
   // LINE
   if(fabs(start_heading-1.5707)<0.01 || fabs(start_heading-4.71238898)<0.01)
@@ -270,6 +233,42 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
   }
   if(fabs(line2-line1)<0.01 && fabs(start_heading-end_heading)<0.01)
   {
+    if(road==NULL)
+    {
+      // the road does not exist
+      id << road_id;
+      // Creates a new record in openDrive structure and returns it's index
+      road_index=open_drive->AddRoad("", 0, "", "");
+      // Add the road to the road tree
+      road_tree->AddRoad(road_index,false);
+      road=open_drive->GetLastRoad();
+      road->SetRoadName(name.str());
+      road->SetRoadId(id.str());
+      road->SetRoadJunction(junction->GetId());
+      if(predecessor->GetPredecessor()->GetElementType()=="junction")
+        road->SetPredecessor("road", connection->GetIncomingRoad(), "start");
+      else
+        road->SetPredecessor("road", connection->GetIncomingRoad(), "end");
+      if(successor->GetPredecessor()->GetElementType()=="junction")
+        road->SetSuccessor("road",connection->GetConnectingRoad(), "start");
+      else
+        road->SetSuccessor("road",connection->GetConnectingRoad(), "end");
+      road->AddRoadType(0,"town");// que sigui el tipus del predecessor
+      road_tree->AddRoadType(road_index,0,false);
+      road_id++;
+    }
+
+    if(road->GetGeometryBlockCount()!=0)
+    {
+      while(road->GetGeometryBlockCount()!=0)
+      {
+        road_tree->SelectGeometry(road_index,road->GetGeometryBlockCount()-1);
+        road_tree->DeleteLastGeometry();
+        road->DeleteGeometryBlock(road->GetGeometryBlockCount()-1);
+      }
+      road->SetRoadLength(0);
+    }
+
     s=0;
     length=sqrt(pow(end_x-start_x,2.0)+pow(end_y-start_y,2.0));
     new_geometry.AddGeometryLine(s,start_x,start_y,start_heading,length);
@@ -321,7 +320,74 @@ unsigned int create_junction_road(RoadTree *road_tree, OpenDrive *open_drive,uns
       start_length=0.0;
       end_length=fabs(sol(1))-fabs(sol(0));
     }
+    // check geometry
+    s=0;
+    check_x=start_x;
+    check_y=start_y;
+    check_heading=start_heading;
+    if(start_length>0)
+    {
+      new_geometry.AddGeometryLine(s,check_x,check_y,check_heading,start_length);
+      new_geometry.GetLastCoords(s,check_x,check_y,check_heading);
+    }
+    new_geometry.AddGeometrySpiral(s,check_x,check_y,check_heading,0.001,0.0,curvature);
+    new_geometry.GetLastCoords(s,check_x,check_y,check_heading);
+    new_geometry.AddGeometryArc(s,check_x,check_y,check_heading,length,curvature);
+    new_geometry.GetLastCoords(s,check_x,check_y,check_heading);
+    new_geometry.AddGeometrySpiral(s,check_x,check_y,check_heading,0.001,curvature,0.0);
+    new_geometry.GetLastCoords(s,check_x,check_y,check_heading);
+    if(end_length>0)
+    {
+      new_geometry.AddGeometryLine(s,check_x,check_y,check_heading,end_length);
+      new_geometry.GetLastCoords(s,check_x,check_y,check_heading);
+    }
+    std::cout << end_heading << "," << check_heading << std::endl;
+    if(check_heading>2*3.14159)
+      check_heading-=2*3.14159;
+    std::cout << end_heading << "," << check_heading << std::endl;
+    if(fabs(end_x-check_x)>0.1 || fabs(end_y-check_y)>0.1 || fabs(end_heading-check_heading)>0.1)
+    {
+      std::cout << "Warning: Impossible to create connecting road from " << connection->GetIncomingRoad() << " lane " << lane_link->GetFrom() << " to " << connection->GetConnectingRoad() << " lane " << lane_link->GetTo() << std::endl;
+      return -1;
+    }
+    if(road==NULL)
+    {
+      // the road does not exist
+      id << road_id;
+      // Creates a new record in openDrive structure and returns it's index
+      road_index=open_drive->AddRoad("", 0, "", "");
+      // Add the road to the road tree
+      road_tree->AddRoad(road_index,false);
+      road=open_drive->GetLastRoad();
+      road->SetRoadName(name.str());
+      road->SetRoadId(id.str());
+      road->SetRoadJunction(junction->GetId());
+      if(predecessor->GetPredecessor()->GetElementType()=="junction")
+        road->SetPredecessor("road", connection->GetIncomingRoad(), "start");
+      else
+        road->SetPredecessor("road", connection->GetIncomingRoad(), "end");
+      if(successor->GetPredecessor()->GetElementType()=="junction")
+        road->SetSuccessor("road",connection->GetConnectingRoad(), "start");
+      else
+        road->SetSuccessor("road",connection->GetConnectingRoad(), "end");
+      road->AddRoadType(0,"town");// que sigui el tipus del predecessor
+      road_tree->AddRoadType(road_index,0,false);
+      road_id++;
+    }
+
+    if(road->GetGeometryBlockCount()!=0)
+    {
+      while(road->GetGeometryBlockCount()!=0)
+      {
+        road_tree->SelectGeometry(road_index,road->GetGeometryBlockCount()-1);
+        road_tree->DeleteLastGeometry();
+        road->DeleteGeometryBlock(road->GetGeometryBlockCount()-1);
+      }
+      road->SetRoadLength(0);
+    }
+
     // add geometry
+    new_geometry=GeometryBlock();
     s=0;
     if(start_length>0)
     {