Index: trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 18884)
+++ trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 18885)
@@ -77,5 +77,5 @@
      * Then it indicates, whether it is completely hidden or
      * just shown in gray color.
-     *
+     * <p>
      * When the primitive is not disabled, this flag should be
      * unset as well (for efficient access).
@@ -521,8 +521,8 @@
     @Override
     public void visitKeys(KeyValueVisitor visitor) {
-        String[] keys = this.keys;
-        if (keys != null) {
-            for (int i = 0; i < keys.length; i += 2) {
-                visitor.visitKeyValue(this, keys[i], keys[i + 1]);
+        String[] tKeys = this.keys;
+        if (tKeys != null) {
+            for (int i = 0; i < tKeys.length; i += 2) {
+                visitor.visitKeyValue(this, tKeys[i], tKeys[i + 1]);
             }
         }
@@ -754,15 +754,15 @@
     @Override
     public final Collection<String> keySet() {
-        String[] keys = this.keys;
-        if (keys == null) {
+        String[] tKeys = this.keys;
+        if (tKeys == null) {
             return Collections.emptySet();
         }
-        if (keys.length == 2) {
-            return Collections.singleton(keys[0]);
-        }
-
-        final Set<String> result = new HashSet<>(Utils.hashMapInitialCapacity(keys.length / 2));
-        for (int i = 0; i < keys.length; i += 2) {
-            result.add(keys[i]);
+        if (tKeys.length == 2) {
+            return Collections.singleton(tKeys[0]);
+        }
+
+        final Set<String> result = new HashSet<>(Utils.hashMapInitialCapacity(tKeys.length / 2));
+        for (int i = 0; i < tKeys.length; i += 2) {
+            result.add(tKeys[i]);
         }
         return result;
@@ -810,5 +810,12 @@
      */
     public boolean hasKey(String... keys) {
-        return keys != null && Arrays.stream(keys).anyMatch(this::hasKey);
+        if (keys != null) {
+            for (String key : keys) {
+                if (this.hasKey(key)) {
+                    return true;
+                }
+            }
+        }
+        return false;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Tagged.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Tagged.java	(revision 18884)
+++ trunk/src/org/openstreetmap/josm/data/osm/Tagged.java	(revision 18885)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.data.osm;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Map;
@@ -147,5 +146,11 @@
      */
     default boolean hasTag(String key, String... values) {
-        return hasTag(key, Arrays.asList(values));
+        final String actualValue = get(key);
+        for (String value : values) {
+            if (Objects.equals(value, actualValue)) {
+                return true;
+            }
+        }
+        return false;
     }
 
@@ -182,5 +187,11 @@
      */
     default boolean hasTagDifferent(String key, String... values) {
-        return hasTagDifferent(key, Arrays.asList(values));
+        final String actual = get(key);
+        for (String value : values) {
+            if (Objects.equals(actual, value)) {
+                return false;
+            }
+        }
+        return true;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 18884)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 18885)
@@ -53,4 +53,8 @@
  */
 public abstract class UnconnectedWays extends Test {
+    private static final String POWER = "power";
+    private static final String PLATFORM = "platform";
+    private static final String PLATFORM_EDGE = "platform_edge";
+    private static final String CONSTRUCTION = "construction";
     private final int code;
     private final boolean isHighwayTest;
@@ -102,5 +106,5 @@
                     || n.isKeyTrue("noexit")
                     || n.hasKey("entrance", "barrier")
-                    || n.getParentWays().stream().anyMatch(p -> isBuilding(p) || p.hasTag(RAILWAY, "platform", "platform_edge"));
+                    || n.getParentWays().stream().anyMatch(p -> isBuilding(p) || p.hasTag(RAILWAY, PLATFORM, PLATFORM_EDGE));
         }
     }
@@ -120,8 +124,8 @@
         @Override
         protected boolean isCandidate(OsmPrimitive p) {
-            if (p.hasTag(RAILWAY, "construction") && p.hasKey("construction"))
-                return p.hasTagDifferent("construction", "platform", "platform_edge", "service_station", "station");
+            if (p.hasTag(RAILWAY, CONSTRUCTION) && p.hasKey(CONSTRUCTION))
+                return p.hasTagDifferent(CONSTRUCTION, PLATFORM, PLATFORM_EDGE, "service_station", "station");
             return p.hasTagDifferent(RAILWAY, "proposed", "planned", "abandoned", "razed", "disused", "no",
-                    "platform", "platform_edge", "service_station", "station");
+                    PLATFORM, PLATFORM_EDGE, "service_station", "station");
         }
 
@@ -197,10 +201,11 @@
         @Override
         protected boolean isCandidate(OsmPrimitive p) {
-            return p.hasTag("power", "line", "minor_line", "cable");
+            return p.hasTag(POWER, "line", "minor_line", "cable");
         }
 
         @Override
         protected boolean ignoreUnconnectedEndNode(Node n) {
-            return n.hasTag("power", "terminal") || n.hasTag("location:transition", "yes");
+            return n.hasTag(POWER, "terminal") || n.hasTag("location:transition", "yes")
+                    || n.hasTag("line_management", "transition", "termination");
         }
     }
@@ -270,9 +275,9 @@
                 return map;
             }
-            if (s.w.hasTag(HIGHWAY, "platform"))
+            if (s.w.hasTag(HIGHWAY, PLATFORM))
                 continue;
             for (Node endnode : s.nearbyNodes(mindist)) {
                 Way parentWay = getWantedParentWay(endnode);
-                if (parentWay != null && !parentWay.hasTag(HIGHWAY, "platform")
+                if (parentWay != null && !parentWay.hasTag(HIGHWAY, PLATFORM)
                         && Objects.equals(OsmUtils.getLayer(s.w), OsmUtils.getLayer(parentWay))
                         // to handle intersections of 't' shapes and similar
@@ -296,5 +301,5 @@
                 for (Node endnode : s.nearbyNodes(mindist)) {
                     if (!s.isConnectedTo(endnode)) {
-                        if (s.w.hasTag("power")) {
+                        if (s.w.hasTag(POWER)) {
                             boolean badConnection = false;
                             Way otherWay = getWantedParentWay(endnode);
