diff --git a/src/org/openstreetmap/josm/data/validation/tests/TurnrestrictionTest.java b/src/org/openstreetmap/josm/data/validation/tests/TurnrestrictionTest.java
index aed103c9ce..93735aab42 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/TurnrestrictionTest.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/TurnrestrictionTest.java
@@ -51,6 +51,18 @@ public class TurnrestrictionTest extends Test {
             "no_entry", "no_exit"
         );
 
+    // This should really be replaced with a transport mode hierarchy, i.e. #18383
+    private static final List<String> SUPPORTED_VEHICLE_TYPES = Arrays.asList(
+            "agricultural", "bicycle", "bus", "caravan", "foot", "hazmat",
+            "hgv", "horse", "motor_vehicle", "motorcar", "motorcycle",
+            "psv", "vehicle"
+    );
+
+    /** A string for "restriction" */
+    private static final String RESTRICTION_STRING = "restriction";
+    /** A string for "conditional" */
+    private static final String CONDITIONAL_STRING = "conditional";
+
     /**
      * Constructs a new {@code TurnrestrictionTest}.
      */
@@ -58,21 +70,35 @@ public class TurnrestrictionTest extends Test {
         super(tr("Turn restrictions"), tr("This test checks if turn restrictions are valid."));
     }
 
-    private static boolean hasSupportedRestrictionTag(Relation r) {
-        if (r.hasTag("restriction", SUPPORTED_RESTRICTIONS))
-            return true;
-        String conditionalValue = r.get("restriction:conditional");
-        if (conditionalValue != null) {
+    /**
+     * Check for any restriction tag (e.g., "restriction:mode:conditional")
+     * @param key The key to check
+     * @param value The value to check
+     * @return {@code true} if the tag is supported
+     */
+    private static boolean restrictionTagIsSupported(final String key, final String value) {
+        if (key.startsWith(RESTRICTION_STRING) && key.endsWith(CONDITIONAL_STRING)
+            && SUPPORTED_VEHICLE_TYPES.contains(key.substring(RESTRICTION_STRING.length() + 1, key.length() - CONDITIONAL_STRING.length() - 1))) {
             try {
-                List<ConditionalValue> values = ConditionalValue.parse(conditionalValue);
-                return !values.isEmpty() && SUPPORTED_RESTRICTIONS.contains(values.get(0).restrictionValue);
+                final List<ConditionalValue> conditionalValues = ConditionalValue.parse(value);
+                return !conditionalValues.isEmpty() && conditionalValues.stream()
+                        .anyMatch(conditional -> SUPPORTED_RESTRICTIONS.contains(conditional.restrictionValue));
             } catch (ConditionalParsingException e) {
                 Logging.trace(e);
             }
+        } else if (key.startsWith(RESTRICTION_STRING)) {
+            return SUPPORTED_RESTRICTIONS.contains(value);
         }
         return false;
     }
 
+    private static boolean hasSupportedRestrictionTag(Relation r) {
+        if (r.hasTag(RESTRICTION_STRING, SUPPORTED_RESTRICTIONS))
+            return true;
+        return r.getKeys().entrySet().stream()
+                .anyMatch(entry -> restrictionTagIsSupported(entry.getKey(), entry.getValue()));
+    }
+
     @Override
     public void visit(Relation r) {
         if (!r.hasTag("type", "restriction"))
