Index: src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 15688)
+++ src/org/openstreetmap/josm/data/validation/OsmValidator.java	(working copy)
@@ -117,7 +117,6 @@
         DuplicatedWayNodes.class, // ID  501 ..  599
         CrossingWays.Ways.class, // ID  601 ..  699
         CrossingWays.Boundaries.class, // ID  601 ..  699
-        CrossingWays.Barrier.class, // ID  601 ..  699
         CrossingWays.SelfCrossing.class, // ID  601 ..  699
         SimilarNamedWays.class, // ID  701 ..  799
         Coastlines.class, // ID  901 ..  999
Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 15688)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -32,6 +32,7 @@
  */
 public abstract class CrossingWays extends Test {
 
+    static final String BARRIER = "barrier";
     static final String HIGHWAY = "highway";
     static final String RAILWAY = "railway";
     static final String WATERWAY = "waterway";
@@ -51,9 +52,11 @@
      * Type of way. Entries have to be declared in alphabetical order, see sort below.
      */
     private enum WayType {
-        BUILDING, HIGHWAY, RAILWAY, RESIDENTIAL_AREA, WATERWAY, WAY;
+        BARRIER, BUILDING, HIGHWAY, RAILWAY, RESIDENTIAL_AREA, WATERWAY, WAY;
 
         static WayType of(Way w) {
+            if (w.hasKey(CrossingWays.BARRIER))
+                return BARRIER;
             if (isBuilding(w))
                 return BUILDING;
             else if (w.hasKey(CrossingWays.HIGHWAY))
@@ -99,6 +102,7 @@
                     || isRailway(w)
                     || isCoastline(w)
                     || isBuilding(w)
+                    || w.hasKey(BARRIER)
                     || isResidentialArea(w));
         }
 
@@ -112,8 +116,8 @@
             if (w1.hasKey(HIGHWAY) && w2.hasKey(HIGHWAY) && !Objects.equals(w1.get("level"), w2.get("level"))) {
                 return true;
             }
-            if ((w1.hasKey(HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w2))
-             || (w2.hasKey(HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w1)))
+            if ((w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w2))
+             || (w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w1)))
                 return true;
             if (isSubwayOrTramOrRazed(w2)) {
                 return true;
@@ -134,64 +138,80 @@
             Arrays.sort(types);
 
             if (types[0] == types[1]) {
-                switch(types[0]) {
+                switch (types[0]) {
+                case BARRIER:
+                    return new MessageHelper(tr("Crossing barriers"), 603);
+                case BUILDING:
+                    return new MessageHelper(tr("Crossing buildings"), 610);
+                case HIGHWAY:
+                    return new MessageHelper(tr("Crossing highways"), 620);
+                case RAILWAY:
+                    return new MessageHelper(tr("Crossing railways"), 630);
+                case RESIDENTIAL_AREA:
+                    return new MessageHelper(tr("Crossing residential areas"), 640);
+                case WATERWAY:
+                    return new MessageHelper(tr("Crossing waterways"), 650);
+                case WAY:
+                default:
+                    return new MessageHelper(tr("Crossing ways"), CROSSING_WAYS);
+                }
+            } else {
+                switch (types[0]) {
+                case BARRIER:
+                    switch (types[1]) {
                     case BUILDING:
-                        return new MessageHelper(tr("Crossing buildings"), 610);
+                        return new MessageHelper(tr("Crossing barrier/building"), 661);
                     case HIGHWAY:
-                        return new MessageHelper(tr("Crossing highways"), 620);
+                        return new MessageHelper(tr("Crossing barrier/highway"), 662);
                     case RAILWAY:
-                        return new MessageHelper(tr("Crossing railways"), 630);
-                    case RESIDENTIAL_AREA:
-                        return new MessageHelper(tr("Crossing residential areas"), 640);
+                        return new MessageHelper(tr("Crossing barrier/railway"), 663);
                     case WATERWAY:
-                        return new MessageHelper(tr("Crossing waterways"), 650);
+                        return new MessageHelper(tr("Crossing barrier/waterway"), 664);
                     case WAY:
                     default:
-                        return new MessageHelper(tr("Crossing ways"), CROSSING_WAYS);
-                }
-            } else {
-                switch (types[0]) {
-                    case BUILDING:
-                        switch (types[1]) {
-                            case HIGHWAY:
-                                return new MessageHelper(tr("Crossing building/highway"), 612);
-                            case RAILWAY:
-                                return new MessageHelper(tr("Crossing building/railway"), 613);
-                            case RESIDENTIAL_AREA:
-                                return new MessageHelper(tr("Crossing building/residential area"), 614);
-                            case WATERWAY:
-                                return new MessageHelper(tr("Crossing building/waterway"), 615);
-                            case WAY:
-                            default:
-                                return new MessageHelper(tr("Crossing building/way"), 611);
-                        }
+                        return new MessageHelper(tr("Crossing barrier/way"), 665);
+                    }
+                case BUILDING:
+                    switch (types[1]) {
                     case HIGHWAY:
-                        switch (types[1]) {
-                            case RAILWAY:
-                                return new MessageHelper(tr("Crossing highway/railway"), 622);
-                            case WATERWAY:
-                                return new MessageHelper(tr("Crossing highway/waterway"), 623);
-                            case WAY:
-                            default:
-                                return new MessageHelper(tr("Crossing highway/way"), 621);
-                        }
+                        return new MessageHelper(tr("Crossing building/highway"), 612);
                     case RAILWAY:
-                        switch (types[1]) {
-                            case WATERWAY:
-                                return new MessageHelper(tr("Crossing railway/waterway"), 632);
-                            case WAY:
-                            default:
-                                return new MessageHelper(tr("Crossing railway/way"), 631);
-                        }
+                        return new MessageHelper(tr("Crossing building/railway"), 613);
                     case RESIDENTIAL_AREA:
-                        switch (types[1]) {
-                            case WAY:
-                            default:
-                                return new MessageHelper(tr("Crossing residential area/way"), 641);
-                        }
+                        return new MessageHelper(tr("Crossing building/residential area"), 614);
                     case WATERWAY:
+                        return new MessageHelper(tr("Crossing building/waterway"), 615);
+                    case WAY:
                     default:
-                        return new MessageHelper(tr("Crossing waterway/way"), 651);
+                        return new MessageHelper(tr("Crossing building/way"), 611);
+                    }
+                case HIGHWAY:
+                    switch (types[1]) {
+                    case RAILWAY:
+                        return new MessageHelper(tr("Crossing highway/railway"), 622);
+                    case WATERWAY:
+                        return new MessageHelper(tr("Crossing highway/waterway"), 623);
+                    case WAY:
+                    default:
+                        return new MessageHelper(tr("Crossing highway/way"), 621);
+                    }
+                case RAILWAY:
+                    switch (types[1]) {
+                    case WATERWAY:
+                        return new MessageHelper(tr("Crossing railway/waterway"), 632);
+                    case WAY:
+                    default:
+                        return new MessageHelper(tr("Crossing railway/way"), 631);
+                    }
+                case RESIDENTIAL_AREA:
+                    switch (types[1]) {
+                    case WAY:
+                    default:
+                        return new MessageHelper(tr("Crossing residential area/way"), 641);
+                    }
+                case WATERWAY:
+                default:
+                    return new MessageHelper(tr("Crossing waterway/way"), 651);
                 }
             }
         }
@@ -231,31 +251,6 @@
     }
 
     /**
-     * Crossing barriers ways test.
-     */
-    public static class Barrier extends CrossingWays {
-
-        protected static final int CROSSING_BARRIERS = 603;
-
-        /**
-         * Constructs a new crossing {@code Barrier} test.
-         */
-        public Barrier() {
-            super(tr("Crossing barriers"), CROSSING_BARRIERS);
-        }
-
-        @Override
-        public boolean isPrimitiveUsable(OsmPrimitive p) {
-            return super.isPrimitiveUsable(p) && p.hasKey("barrier");
-        }
-
-        @Override
-        boolean ignoreWaySegmentCombination(Way w1, Way w2) {
-            return areLayerOrLevelDifferent(w1, w2);
-        }
-    }
-
-    /**
      * Self crossing ways test (for all the rest)
      */
     public static class SelfCrossing extends CrossingWays {
@@ -263,7 +258,6 @@
         protected static final int CROSSING_SELF = 604;
 
         CrossingWays.Ways normalTest = new Ways();
-        CrossingWays.Barrier barrierTest = new Barrier();
         CrossingWays.Boundaries boundariesTest = new Boundaries();
 
         /**
@@ -275,7 +269,7 @@
 
         @Override
         public boolean isPrimitiveUsable(OsmPrimitive p) {
-            return super.isPrimitiveUsable(p) && !(normalTest.isPrimitiveUsable(p) || barrierTest.isPrimitiveUsable(p)
+            return super.isPrimitiveUsable(p) && !(normalTest.isPrimitiveUsable(p)
                     || boundariesTest.isPrimitiveUsable(p));
         }
 
Index: test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(revision 15688)
+++ test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(working copy)
@@ -16,7 +16,6 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
-import org.openstreetmap.josm.data.validation.tests.CrossingWays.Barrier;
 import org.openstreetmap.josm.data.validation.tests.CrossingWays.Boundaries;
 import org.openstreetmap.josm.data.validation.tests.CrossingWays.SelfCrossing;
 import org.openstreetmap.josm.data.validation.tests.CrossingWays.Ways;
@@ -143,6 +142,16 @@
         testMessage(641, test, "landuse=residential", "amenity=restaurant");
         testMessage(650, test, "waterway=river", "waterway=river");
         testMessage(651, test, "waterway=river", "amenity=restaurant");
+        testMessage(603, test, "barrier=hedge", "barrier=yes");
+        testMessage(661, test, "barrier=hedge", "building=yes");
+        testMessage(662, test, "barrier=hedge", "highway=road");
+        testMessage(663, test, "barrier=hedge", "railway=rail");
+        testMessage(664, test, "barrier=hedge", "waterway=river");
+
+        assertFalse(test.isPrimitiveUsable(newUsableWay("amenity=restaurant")));
+        assertFalse(test.isPrimitiveUsable(TestUtils.newWay("barrier=yes"))); // Unusable (0 node)
+        assertTrue(test.isPrimitiveUsable(newUsableWay("barrier=yes"))); // Usable (2 nodes)
+
     }
 
     /**
@@ -160,18 +169,6 @@
     }
 
     /**
-     * Unit test of {@link CrossingWays.Barrier}
-     */
-    @Test
-    public void testBarrier() {
-        Barrier test = new CrossingWays.Barrier();
-        // isPrimitiveUsable
-        assertFalse(test.isPrimitiveUsable(newUsableWay("amenity=restaurant")));
-        assertFalse(test.isPrimitiveUsable(TestUtils.newWay("barrier=yes"))); // Unusable (0 node)
-        assertTrue(test.isPrimitiveUsable(newUsableWay("barrier=yes"))); // Usable (2 nodes)
-    }
-
-    /**
      * Unit test of {@link CrossingWays.SelfCrossing}
      */
     @Test
