Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java	(revision 23916)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java	(revision 23917)
@@ -45,10 +45,27 @@
     private class NodeHash implements Hash<Object, Object> {
 
+        double precision = Main.pref.getDouble("validator.duplicatenodes.precision", 0.);
+
+        private LatLon RoundCoord(Node o) {
+            return new LatLon(
+                    Math.round(o.getCoor().lat() / precision) * precision,
+                    Math.round(o.getCoor().lon() / precision) * precision
+            );
+        }
+
         @SuppressWarnings("unchecked")
         private LatLon getLatLon(Object o) {
             if (o instanceof Node) {
-                return ((Node) o).getCoor().getRoundedToOsmPrecision();
+                if (precision==0) {
+                    return ((Node) o).getCoor().getRoundedToOsmPrecision();
+                } else {
+                    return RoundCoord((Node) o);
+                }
             } else if (o instanceof List<?>) {
-                return ((List<Node>) o).get(0).getCoor().getRoundedToOsmPrecision();
+                if (precision==0) {
+                    return ((List<Node>) o).get(0).getCoor().getRoundedToOsmPrecision();
+                } else {
+                    return RoundCoord(((List<Node>) o).get(0));
+                }
             } else {
                 throw new AssertionError();
@@ -68,9 +85,13 @@
     protected static int DUPLICATE_NODE = 1;
     protected static int DUPLICATE_NODE_MIXED = 2;
-    protected static int DUPLICATE_NODE_HIGHWAY = 3;
-    protected static int DUPLICATE_NODE_RAILWAY = 3;
-    protected static int DUPLICATE_NODE_WATERWAY = 4;
-    protected static int DUPLICATE_NODE_BOUNDARY = 5;
-    protected static int DUPLICATE_NODE_POWER = 6;
+    protected static int DUPLICATE_NODE_OTHER = 3;
+    protected static int DUPLICATE_NODE_BUILDING = 10;
+    protected static int DUPLICATE_NODE_BOUNDARY = 11;
+    protected static int DUPLICATE_NODE_HIGHWAY = 12;
+    protected static int DUPLICATE_NODE_LANDUSE = 13;
+    protected static int DUPLICATE_NODE_NATURAL = 14;
+    protected static int DUPLICATE_NODE_POWER = 15;
+    protected static int DUPLICATE_NODE_RAILWAY = 16;
+    protected static int DUPLICATE_NODE_WATERWAY = 17;
 
     /** The map of potential duplicates.
@@ -126,5 +147,5 @@
 
         Map<String,Boolean> typeMap=new HashMap<String,Boolean>();
-        String[] types = {"none", "highway", "railway", "waterway", "boundary", "power"};
+        String[] types = {"none", "highway", "railway", "waterway", "boundary", "power", "natural", "landuse", "building"};
 
 
@@ -171,5 +192,5 @@
                     errors.add(new TestError(
                             parentTest,
-                            Severity.ERROR,
+                            Severity.WARNING,
                             tr("Duplicated nodes"),
                             tr(msg),
@@ -233,10 +254,46 @@
                             bag.get(tagSet)
                     ));
+                } else if (typeMap.get("natural")) {
+                    String msg = marktr("Natural duplicated nodes");
+                    errors.add(new TestError(
+                            parentTest,
+                            Severity.ERROR,
+                            tr("Duplicated nodes"),
+                            tr(msg),
+                            msg,
+                            DUPLICATE_NODE_NATURAL,
+                            bag.get(tagSet)
+                    ));
+                } else if (typeMap.get("building")) {
+                    String msg = marktr("Building duplicated nodes");
+                    errors.add(new TestError(
+                            parentTest,
+                            Severity.ERROR,
+                            tr("Duplicated nodes"),
+                            tr(msg),
+                            msg,
+                            DUPLICATE_NODE_BUILDING,
+                            bag.get(tagSet)
+                    ));
+                } else if (typeMap.get("landuse")) {
+                    String msg = marktr("Landuse duplicated nodes");
+                    errors.add(new TestError(
+                            parentTest,
+                            Severity.ERROR,
+                            tr("Duplicated nodes"),
+                            tr(msg),
+                            msg,
+                            DUPLICATE_NODE_LANDUSE,
+                            bag.get(tagSet)
+                    ));
                 } else {
-                    errors.add(new TestError(
-                            parentTest,
-                            Severity.ERROR,
-                            tr("Duplicated nodes"),
-                            DUPLICATE_NODE,
+                    String msg = marktr("Other duplicated nodes");
+                    errors.add(new TestError(
+                            parentTest,
+                            Severity.WARNING,
+                            tr("Duplicated nodes"),
+                            tr(msg),
+                            msg,
+                            DUPLICATE_NODE_OTHER,
                             bag.get(tagSet)
                     ));
