Index: trunk/data/defaultpresets.xml
===================================================================
--- trunk/data/defaultpresets.xml	(revision 15324)
+++ trunk/data/defaultpresets.xml	(revision 15325)
@@ -2671,4 +2671,7 @@
             <optional>
                 <text key="ref" text="Reference" />
+                <text key="iata" text="IATA" />
+                <text key="icao" text="ICAO" />
+                <text key="wikipedia" text="Wikipedia" />
             </optional>
         </item> <!-- Helipad -->
Index: trunk/data/validator/combinations.mapcss
===================================================================
--- trunk/data/validator/combinations.mapcss	(revision 15324)
+++ trunk/data/validator/combinations.mapcss	(revision 15325)
@@ -116,5 +116,7 @@
 }
 
-/* {0.key} without {1.tag} or {2.tag} */
+/* {0.key} without {1.tag} or {2.tag}, #15107 */
+*[iata                         ][aeroway!=aerodrome][aeroway!=helipad],
+*[icao                         ][aeroway!=aerodrome][aeroway!=helipad],
 *[bridge:movable               ][bridge!=movable][man_made!=bridge],
 *[substation                   ][power!=substation][pipeline!=substation],
@@ -147,5 +149,7 @@
 }
 
-/* {0.tag} without {1.key} (info level) */
+/* {0.tag} without {1.key} (info level), #15107 */
+*[aeroway=runway               ][!ref],
+*[aeroway=runway               ][!surface],
 way[highway=track              ][!tracktype],
 way[power=cable                ][!location],
Index: trunk/data/validator/ignoretags.cfg
===================================================================
--- trunk/data/validator/ignoretags.cfg	(revision 15324)
+++ trunk/data/validator/ignoretags.cfg	(revision 15325)
@@ -133,4 +133,5 @@
 E:expressway
 E:border_type
+E:faa
 ;
 ; Ignore valid and semi-valid keys that end with...
Index: trunk/data/validator/numeric.mapcss
===================================================================
--- trunk/data/validator/numeric.mapcss	(revision 15324)
+++ trunk/data/validator/numeric.mapcss	(revision 15325)
@@ -375,2 +375,29 @@
   assertMatch: "way interval=00:65:00";
 }
+
+/* #15107 */
+*[aeroway=helipad  ][iata][iata!~/^[A-Z]{3}$/],
+*[aeroway=aerodrome][iata][iata!~/^[A-Z]{3}$/] {
+  throwWarning: tr("wrong value: {0}", "{1.tag}");
+  group: tr("Airport tagging");
+  assertNoMatch: "way aeroway=aerodrome iata=BER";
+  assertMatch: "way aeroway=aerodrome iata=BERL";
+  assertMatch: "way aeroway=aerodrome iata=BE";
+  assertMatch: "way aeroway=aerodrome iata=ber";
+}
+*[aeroway=helipad  ][icao][icao!~/^[A-Z]{4}$/],
+*[aeroway=aerodrome][icao][icao!~/^[A-Z]{4}$/] {
+  throwWarning: tr("wrong value: {0}", "{1.tag}");
+  group: tr("Airport tagging");
+  assertNoMatch: "way aeroway=aerodrome icao=EDDB";
+  assertMatch: "way aeroway=aerodrome icao=EDDBA";
+  assertMatch: "way aeroway=aerodrome icao=EDD";
+  assertMatch: "way aeroway=aerodrome icao=eddb";
+}
+*[aeroway=helipad  ][icao][icao!~/^(AG|AN|AY|BG|BI|BK|C|DA|DB|DF|DG|DI|DN|DR|DT|DX|EB|ED|EE|EF|EG|EH|EI|EK|EL|EN|EP|ES|ET|EV|EY|FA|FB|FC|FD|FE|FG|FH|FI|FJ|FK|FL|FM|FN|FO|FP|FQ|FS|FT|FV|FW|FX|FY|FZ|GA|GB|GC|GE|GF|GG|GL|GM|GO|GQ|GS|GU|GV|HA|HB|HC|HD|HE|HH|HK|HL|HR|HS|HT|HU|K|LA|LB|LC|LD|LE|LF|LG|LH|LI|LJ|LK|LL|LM|LN|LO|LP|LQ|LR|LS|LT|LU|LV|LW|LX|LY|LZ|MB|MD|MG|MH|MK|MM|MN|MP|MR|MS|MT|MU|MW|MY|MZ|NC|NF|NG|NI|NL|NS|NT|NV|NW|NZ|OA|OB|OE|OI|OJ|OK|OL|OM|OO|OP|OR|OS|OT|OY|PA|PB|PC|PF|PG|PH|PJ|PK|PL|PM|PO|PP|PT|PW|RC|RJ|RK|RO|RP|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SP|SS|SU|SV|SW|SY|TA|TB|TD|TF|TG|TI|TJ|TK|TL|TN|TQ|TR|TT|TU|TV|TX|U|UA|UB|UC|UD|UG|UK|UM|UT|VA|VC|VD|VE|VG|VH|VI|VL|VM|VN|VO|VQ|VR|VT|VV|VY|WA|WB|WI|WM|WP|WQ|WR|WS|Y|Z|ZK|ZM)/],
+*[aeroway=aerodrome][icao][icao!~/^(AG|AN|AY|BG|BI|BK|C|DA|DB|DF|DG|DI|DN|DR|DT|DX|EB|ED|EE|EF|EG|EH|EI|EK|EL|EN|EP|ES|ET|EV|EY|FA|FB|FC|FD|FE|FG|FH|FI|FJ|FK|FL|FM|FN|FO|FP|FQ|FS|FT|FV|FW|FX|FY|FZ|GA|GB|GC|GE|GF|GG|GL|GM|GO|GQ|GS|GU|GV|HA|HB|HC|HD|HE|HH|HK|HL|HR|HS|HT|HU|K|LA|LB|LC|LD|LE|LF|LG|LH|LI|LJ|LK|LL|LM|LN|LO|LP|LQ|LR|LS|LT|LU|LV|LW|LX|LY|LZ|MB|MD|MG|MH|MK|MM|MN|MP|MR|MS|MT|MU|MW|MY|MZ|NC|NF|NG|NI|NL|NS|NT|NV|NW|NZ|OA|OB|OE|OI|OJ|OK|OL|OM|OO|OP|OR|OS|OT|OY|PA|PB|PC|PF|PG|PH|PJ|PK|PL|PM|PO|PP|PT|PW|RC|RJ|RK|RO|RP|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SP|SS|SU|SV|SW|SY|TA|TB|TD|TF|TG|TI|TJ|TK|TL|TN|TQ|TR|TT|TU|TV|TX|U|UA|UB|UC|UD|UG|UK|UM|UT|VA|VC|VD|VE|VG|VH|VI|VL|VM|VN|VO|VQ|VR|VT|VV|VY|WA|WB|WI|WM|WP|WQ|WR|WS|Y|Z|ZK|ZM)/] {
+  throwWarning: tr("wrong value: {0}", "{1.tag}");
+  group: tr("Airport tagging");
+  assertNoMatch: "way aeroway=aerodrome icao=EDDB";
+  assertMatch: "way aeroway=aerodrome icao=EQQQ";
+}
Index: trunk/data/validator/territories.mapcss
===================================================================
--- trunk/data/validator/territories.mapcss	(revision 15324)
+++ trunk/data/validator/territories.mapcss	(revision 15325)
@@ -30,2 +30,16 @@
   group: tr("deprecated tagging");
 }
+
+/* #15107 */
+*[aeroway=helipad  ][!faa][inside("US")],
+*[aeroway=aerodrome][!faa][inside("US")] {
+  throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
+  group: tr("Airport tagging");
+}
+*[aeroway=aerodrome][!icao][faa!~/\d/][inside("US")],
+*[aeroway=aerodrome][!iata][faa!~/\d/][inside("US")] {
+  throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
+  group: tr("Airport tagging");
+  /* assertNoMatch: "way aeroway=aerodrome faa=OK12"; not properly working due to inside() */
+  /* assertMatch: "way aeroway=aerodrome faa=ORD"; */
+}
