diff --git a/src/osm/osm_node.cpp b/src/osm/osm_node.cpp
index f3d1dbd6bf21ee8daa199341e50c632d3076043a..5c61a6e611a5b82c9b09aadbfafa863bab5919cb 100644
--- a/src/osm/osm_node.cpp
+++ b/src/osm/osm_node.cpp
@@ -143,26 +143,56 @@ void COSMNode::split_ways(void)
 
 void COSMNode::remove_in_junction_nodes(void)
 {
-  double width,max_width=0.0,dist;
-  COSMNode *check_node;
+  double width,width2,dist,x,y,heading,length,start_x,start_y,end_x,end_y,cross;
+  COSMNode *check_node,*node1,*node2;
 
   if(this->ways.size()>1)
   {
     for(unsigned int i=0;i<this->ways.size();i++)
     {
-      width=this->ways[i]->get_num_lanes()*this->ways[i]->get_lane_width()/2.0;
-      if(width>max_width)
-        max_width=width;
-    }
-    for(unsigned int i=0;i<this->ways.size();i++)
-    {
+      width=std::max(this->ways[i]->get_num_forward_lanes(),this->ways[i]->get_num_backward_lanes())*this->ways[i]->get_lane_width();
       if(this->ways[i]->is_node_first(this->id))
-        check_node=(COSMNode *)&this->ways[i]->get_segment_end_node(FIRST_SEGMENT);
+      {
+        node1=(COSMNode *)&this->ways[i]->get_segment_end_node(FIRST_SEGMENT);
+        node2=(COSMNode *)&this->ways[i]->get_segment_start_node(FIRST_SEGMENT);
+      }
       else
-        check_node=(COSMNode *)&this->ways[i]->get_segment_start_node(LAST_SEGMENT);
-      dist=this->compute_distance(*check_node);
-      if(dist<max_width)
-        this->ways[i]->delete_node(check_node);
+      {
+        node1=(COSMNode *)&this->ways[i]->get_segment_end_node(LAST_SEGMENT);
+        node2=(COSMNode *)&this->ways[i]->get_segment_start_node(LAST_SEGMENT);
+      }
+      node1->get_location(start_x,start_y);
+      node2->get_location(end_x,end_y);
+      length=node1->compute_distance(*node2);
+      for(unsigned int j=0;j<this->ways.size();j++)
+      {
+        if(j!=i)
+        {
+          if(this->ways[j]->is_node_first(this->id))
+            check_node=(COSMNode *)&this->ways[j]->get_segment_end_node(FIRST_SEGMENT);
+          else
+            check_node=(COSMNode *)&this->ways[j]->get_segment_start_node(LAST_SEGMENT);
+          width2=std::max(this->ways[j]->get_num_forward_lanes(),this->ways[j]->get_num_backward_lanes())*this->ways[j]->get_lane_width();
+          heading=this->compute_heading(*check_node);
+          check_node->get_location(x,y);
+          x=x-width2*sin(heading);
+          y=y+width2*cos(heading);
+          cross=(x-start_x)*(end_y-start_y)-(y-start_y)*(end_x-start_x);
+          dist=fabs(cross)/length;
+          if(dist<width)
+          {
+            this->ways[j]->delete_node(check_node);
+            continue;
+          }
+          check_node->get_location(x,y);
+          x=x+width2*sin(heading);
+          y=y-width2*cos(heading);
+          cross=(x-start_x)*(end_y-start_y)-(y-start_y)*(end_x-start_x);
+          dist=fabs(cross)/length;
+          if(dist<width)
+            this->ways[j]->delete_node(check_node);
+        }
+      }
     }
   }
 }