Index: trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java	(revision 16310)
+++ trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java	(revision 16311)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -267,4 +268,9 @@
 
     private Node createNode(final LatLon latlon) {
+        final List<Node> existingNodes = getDataSet().searchNodes(new BBox(latlon, latlon));
+        if (!existingNodes.isEmpty()) {
+            // reuse existing node, avoid multiple nodes on top of each other
+            return existingNodes.get(0);
+        }
         final Node node = new Node(latlon);
         getDataSet().addPrimitive(node);
@@ -277,6 +283,7 @@
         }
 
-        final List<LatLon> latlons = coordinates.stream().map(
-                coordinate -> getLatLon(coordinate.asJsonArray())).collect(Collectors.toList());
+        final List<LatLon> latlons = coordinates.stream()
+                .map(coordinate -> getLatLon(coordinate.asJsonArray()))
+                .collect(Collectors.toList());
 
         final int size = latlons.size();
@@ -295,11 +302,9 @@
 
         final Way way = new Way();
-        way.setNodes(latlons.stream().map(Node::new).collect(Collectors.toList()));
+        getDataSet().addPrimitive(way);
+        way.setNodes(latlons.stream().map(this::createNode).collect(Collectors.toList()));
         if (doAutoclose) {
             way.addNode(way.getNode(0));
         }
-
-        way.getNodes().stream().distinct().forEach(it -> getDataSet().addPrimitive(it));
-        getDataSet().addPrimitive(way);
 
         return Optional.of(way);
