Index: resources/data/validator/highway.mapcss
===================================================================
--- resources/data/validator/highway.mapcss	(revision 17912)
+++ resources/data/validator/highway.mapcss	(working copy)
@@ -147,6 +147,8 @@
 /* #11270, #9297, #15439, #16424, #17022 */
 way[railway =~ /^(miniature|narrow_gauge|preserved|rail)$/][!highway] > node { set .is_in_railway }
 way[highway =~ /^(bridleway|cycleway|footway|path|steps)$/] > node { set .is_in_minor_road }
+way[railway] > node {set .node_on_way_with_railway_tag}
+way[highway] > node {set .is_in_road}
 way[highway =~ /^(bus_guideway|living_street|motorway|motorway_link|pedestrian|primary|primary_link|raceway|residential|road|secondary|secondary_link|service|tertiary|tertiary_link|track|trunk|trunk_link|unclassified)$/] > node { set .is_in_major_road }
 node[railway!=crossing][crossing!=no].is_in_railway.is_in_minor_road!.is_in_major_road {
   throwWarning: tr("pedestrian railway crossing without {0}", "{0.tag}");
@@ -159,6 +161,13 @@
   fixAdd: "railway=level_crossing";
 }
 
+/* #17074 detect railway=level_crossing nodes that are not on crossing of railway=* and highway=* ways */
+node:in-downloaded-area[railway=level_crossing]!.is_in_road.node_on_way_with_railway_tag,
+node:in-downloaded-area[railway=level_crossing].is_in_road!.node_on_way_with_railway_tag {
+  throwWarning: tr("railway crossing is missing a connected way with either {0} or {1}", "highway=*", "railway=*");
+  group: tr("missing tag");
+}
+
 node[highway=crossing][barrier=kerb].is_in_major_road {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "kerb=*";
