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);
Index: /trunk/test/data/geo.json
===================================================================
--- /trunk/test/data/geo.json	(revision 16310)
+++ /trunk/test/data/geo.json	(revision 16311)
@@ -22,5 +22,5 @@
                     [
                         102.0,
-                        0.0
+                        0.5
                     ],
                     [
Index: /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java	(revision 16310)
+++ /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java	(revision 16311)
@@ -46,5 +46,5 @@
                 .doParseDataSet(in, null)
                 .getPrimitives(it -> true));
-            assertEquals(21, primitives.size());
+            assertEquals(20, primitives.size());
 
             final Node node1 = new Node(new LatLon(0.5, 102.0));
@@ -56,5 +56,5 @@
 
             final Way way1 = new Way();
-            way1.addNode(new Node(new LatLon(0, 102)));
+            way1.addNode(new Node(new LatLon(0.5, 102.0)));
             way1.addNode(new Node(new LatLon(1, 103)));
             way1.addNode(new Node(new LatLon(0, 104)));
@@ -66,4 +66,6 @@
             assertEquals("valueB", foundWay1.get().get("propB"));
             assertEquals("0.0", foundWay1.get().get("propB2"));
+            assertEquals(foundNode1.get(), ((Way) foundWay1.get()).firstNode());
+            assertEquals("valueA", ((Way) foundWay1.get()).firstNode().get("propA"));
 
             final Way way2 = new Way();
