Index: /trunk/data/validator/ignoretags.cfg
===================================================================
--- /trunk/data/validator/ignoretags.cfg	(revision 9022)
+++ /trunk/data/validator/ignoretags.cfg	(revision 9023)
@@ -75,127 +75,25 @@
 ;
 K:type=is_in
-K:bridge=viaduct
-K:bridge=aqueduct
 K:bridge=swing
 ;
 ; Highway Key/Value Pairs
 ;
-K:highway=motorway_link
-K:highway=trunk_link
-K:highway=primary_link
-K:highway=secondary_link
 K:oneway=-1
-;
-; traffic_calming Tags
-;
-K:traffic_calming=yes
-K:traffic_calming=bump
-K:traffic_calming=chicane
-K:traffic_calming=cushion
-K:traffic_calming=hump
-K:traffic_calming=rumble_strip
-K:traffic_calming=table
-K:traffic_calming=choker
-;
-; Aeroway Key/Value Pairs
-;
-K:aeroway=apron
-K:aeroway=hanger
-K:aeroway=helipad
-K:aeroway=runway
-K:aeroway=taxiway
-K:aeroway=terminal
-K:aeroway=aerodrome
 ;
 ; Amenity Key/Value Pairs
 ;
-K:amenity=arts_centre
-K:amenity=atm
-K:amenity=baby_hatch
-K:amenity=bank
-K:amenity=bbq
-K:amenity=bench
-K:amenity=biergarten
-K:amenity=bicycle_parking
-K:amenity=bicycle_rental
-K:amenity=bureau_de_change
-K:amenity=bus_station
-K:amenity=brothel
-K:amenity=cafe
-K:amenity=car_rental
-K:amenity=car_sharing
-K:amenity=cinema
-K:amenity=college
-K:amenity=courthouse
 K:amenity=crematorium
-K:amenity=dentist
-K:amenity=doctors
-K:amenity=drinking_water
-K:amenity=embassy
 K:amenity=emergency_phone
-K:amenity=fast_food
-K:amenity=ferry_terminal
-K:amenity=fire_station
-K:amenity=food_court
-K:amenity=fountain
-K:amenity=fuel
 K:amenity=gallery
-K:amenity=grave_yard
-K:amenity=grit_bin
 K:amenity=gym
-K:amenity=hospital
-K:amenity=hunting_stand
-K:amenity=kindergarten
-K:amenity=library
-K:amenity=marketplace
-K:amenity=nightclub
-K:amenity=parking
-K:amenity=pharmacy
-K:amenity=place_of_worship
-K:amenity=police
-K:amenity=post_box
-K:amenity=post_office
-K:amenity=prison
-K:amenity=pub
-K:amenity=public_building
-K:amenity=recycling
-K:amenity=restaurant
-K:amenity=school
-K:amenity=shelter
 K:amenity=signpost
-K:amenity=studio
-K:amenity=taxi
-K:amenity=telephone
-K:amenity=theatre
-K:amenity=toilets
-K:amenity=townhall
-K:amenity=university
-K:amenity=vending_machine
-K:amenity=veterinary
-K:amenity=waste_basket
-K:amenity=waste_disposal
 ;
 ; Cuisine Tags
 ;
 K:cuisine=coffee_shop
-K:cuisine=fish_and_chips
 K:cuisine=pie
-;
-; Cycleway Tags
-;
-K:cycleway=lane
-K:cycleway=track
-K:cycleway=opposite_lane
-K:cycleway=opposite
-K:cycleway=opposite_track
 ;
 ; Historic Tags
 ;
-K:historic=castle
-K:historic=monument
-K:historic=memorial
-K:historic=archaeological_site
-K:historic=ruins
-K:historic=battlefield
 K:historic=wreck
 K:historic=yes
@@ -212,25 +110,5 @@
 ; Natural Tags
 ;
-K:natural=bay
-K:natural=beach
-K:natural=cave_entrance
-K:natural=cliff
-K:natural=fell
-K:natural=glacier
-K:natural=heath
 K:natural=marsh
-K:natural=mud
-K:natural=peak
-K:natural=scree
-K:natural=scrub
-K:natural=spring
-K:natural=tree
-K:natural=volcano
-K:natural=wetland
-;
-; Surface Key/Value Pairs
-;
-K:surface=dirt
-K:surface=wood
 ;
 ; Relation Tags
@@ -241,8 +119,5 @@
 ; Christian Denominations
 ;
-K:denomination=anglican
 K:denomination=apostolic
-K:denomination=baptist
-K:denomination=catholic
 K:denomination=christian_community
 K:denomination=christian_scientist
@@ -250,29 +125,13 @@
 K:denomination=czechoslovak_hussite
 K:denomination=dutch_reformed
-K:denomination=evangelical
 K:denomination=foursquare
-K:denomination=greek_orthodox
-K:denomination=jehovahs_witness
 K:denomination=kabbalah
 K:denomination=karaite
 K:denomination=living_waters_church
-K:denomination=lutheran
 K:denomination=maronite
 K:denomination=mennonite
-K:denomination=methodist
-K:denomination=mormon
-K:denomination=new_apostolic
 K:denomination=nondenominational
-K:denomination=old_catholic
-K:denomination=orthodox
-K:denomination=pentecostal
-K:denomination=presbyterian
-K:denomination=protestant
-K:denomination=quaker
-K:denomination=roman_catholic
-K:denomination=russian_orthodox
 K:denomination=salvation_army
 K:denomination=serbian_orthodox
-K:denomination=seventh_day_adventist
 K:denomination=united
 K:denomination=united_reformed
@@ -283,5 +142,4 @@
 K:denomination=alternative
 K:denomination=ashkenazi
-K:denomination=conservative
 K:denomination=hasidic
 K:denomination=humanistic
@@ -290,8 +148,6 @@
 K:denomination=neo_orthodox
 K:denomination=nondenominational
-K:denomination=orthodox
 K:denomination=progressive
 K:denomination=reconstructionist
-K:denomination=reform
 K:denomination=renewal
 K:denomination=samaritan
@@ -302,9 +158,6 @@
 K:denomination=alaouite
 K:denomination=druze
-K:denomination=ibadi
 K:denomination=ismaili
 K:denomination=nondenominational
-K:denomination=shia
-K:denomination=sunni
 ;
 ; Pastafarian Denominations
@@ -318,42 +171,5 @@
 ; Shop Key/Value Pairs
 ;
-K:shop=alcohol
-K:shop=bakery
-K:shop=beverages
-K:shop=bicycle
-K:shop=books
-K:shop=butcher
-K:shop=car
-K:shop=car_repair
-K:shop=chemist
-K:shop=clothes
-K:shop=computer
-K:shop=confectionery
-K:shop=convenience
-K:shop=department_store
-K:shop=dry_cleaning
-K:shop=doityourself
-K:shop=electronics
-K:shop=florist
-K:shop=furniture
-K:shop=garden_centre
-K:shop=greengrocer
-K:shop=hairdresser
-K:shop=hardware
-K:shop=hifi
-K:shop=kiosk
-K:shop=laundry
-K:shop=mall
-K:shop=motorcycle
-K:shop=optician
 K:shop=organic
-K:shop=outdoor
-K:shop=sports
-K:shop=stationery
-K:shop=supermarket
-K:shop=shoes
-K:shop=toys
-K:shop=travel_agency
-K:shop=video
 ;
 ; Sports Tags
@@ -364,20 +180,4 @@
 ; Tourism Tags
 ;
-K:tourism=alpine_hut
-K:tourism=attraction
-K:tourism=artwork
-K:tourism=camp_site
-K:tourism=caravan_site
-K:tourism=chalet
-K:tourism=guest_house
-K:tourism=hostel
-K:tourism=hotel
-K:tourism=information
-K:tourism=motel
-K:tourism=museum
-K:tourism=picnic_site
-K:tourism=theme_park
-K:tourism=viewpoint
-K:tourism=zoo
 K:tourism=yes
 ;
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 9022)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 9023)
@@ -80,5 +80,5 @@
     private static final List<String> ignoreDataEquals = new ArrayList<>();
     private static final List<String> ignoreDataEndsWith = new ArrayList<>();
-    private static final List<IgnoreKeyPair> ignoreDataKeyPair = new ArrayList<>();
+    private static final List<Tag> ignoreDataTag = new ArrayList<>();
 
     /** The preferences prefix */
@@ -159,5 +159,5 @@
         ignoreDataEquals.clear();
         ignoreDataEndsWith.clear();
-        ignoreDataKeyPair.clear();
+        ignoreDataTag.clear();
         harmonizedKeys.clear();
 
@@ -207,9 +207,5 @@
                             break;
                         case "K:":
-                            IgnoreKeyPair tmp = new IgnoreKeyPair();
-                            int mid = line.indexOf('=');
-                            tmp.key = line.substring(0, mid);
-                            tmp.value = line.substring(mid+1);
-                            ignoreDataKeyPair.add(tmp);
+                            ignoreDataTag.add(Tag.ofString(line));
                         }
                     } else if (tagcheckerfile) {
@@ -309,4 +305,72 @@
 
     /**
+     * Determines if the given key is in internal presets.
+     * @param key key
+     * @return {@code true} if the given key is in internal presets
+     * @since 9023
+     */
+    public static boolean isKeyInPresets(String key) {
+        return presetsValueData.get(key) != null;
+    }
+
+    /**
+     * Determines if the given tag is in internal presets.
+     * @param key key
+     * @param value value
+     * @return {@code true} if the given tag is in internal presets
+     * @since 9023
+     */
+    public static boolean isTagInPresets(String key, String value) {
+        final Set<String> values = presetsValueData.get(key);
+        return values != null && (values.isEmpty() || values.contains(value));
+    }
+
+    /**
+     * Returns the list of ignored tags.
+     * @return the list of ignored tags
+     * @since 9023
+     */
+    public static List<Tag> getIgnoredTags() {
+        return new ArrayList<>(ignoreDataTag);
+    }
+
+    /**
+     * Determines if the given tag is ignored for checks "key/tag not in presets".
+     * @param key key
+     * @param value value
+     * @return {@code true} if the given tag is ignored
+     * @since 9023
+     */
+    public static boolean isTagIgnored(String key, String value) {
+        boolean tagInPresets = isTagInPresets(key, value);
+        boolean ignore = false;
+
+        for (String a : ignoreDataStartsWith) {
+            if (key.startsWith(a)) {
+                ignore = true;
+            }
+        }
+        for (String a : ignoreDataEquals) {
+            if (key.equals(a)) {
+                ignore = true;
+            }
+        }
+        for (String a : ignoreDataEndsWith) {
+            if (key.endsWith(a)) {
+                ignore = true;
+            }
+        }
+
+        if (!tagInPresets) {
+            for (Tag a : ignoreDataTag) {
+                if (key.equals(a.getKey()) && value.equals(a.getValue())) {
+                    ignore = true;
+                }
+            }
+        }
+        return ignore;
+    }
+
+    /**
      * Checks the primitive tags
      * @param p The primitive to check
@@ -373,35 +437,6 @@
             }
             if (checkValues && key != null && value != null && !value.isEmpty() && presetsValueData != null) {
-                final Set<String> values = presetsValueData.get(key);
-                final boolean keyInPresets = values != null;
-                final boolean tagInPresets = values != null && (values.isEmpty() || values.contains(prop.getValue()));
-
-                boolean ignore = false;
-                for (String a : ignoreDataStartsWith) {
-                    if (key.startsWith(a)) {
-                        ignore = true;
-                    }
-                }
-                for (String a : ignoreDataEquals) {
-                    if (key.equals(a)) {
-                        ignore = true;
-                    }
-                }
-                for (String a : ignoreDataEndsWith) {
-                    if (key.endsWith(a)) {
-                        ignore = true;
-                    }
-                }
-
-                if (!tagInPresets) {
-                    for (IgnoreKeyPair a : ignoreDataKeyPair) {
-                        if (key.equals(a.key) && value.equals(a.value)) {
-                            ignore = true;
-                        }
-                    }
-                }
-
-                if (!ignore) {
-                    if (!keyInPresets) {
+                if (!isTagIgnored(key, value)) {
+                    if (!isKeyInPresets(key)) {
                         String prettifiedKey = harmonizeKey(key);
                         String fixedKey = harmonizedKeys.get(prettifiedKey);
@@ -420,8 +455,8 @@
                             withErrors.put(p, "UPK");
                         }
-                    } else if (!tagInPresets) {
+                    } else if (!isTagInPresets(key, value)) {
                         // try to fix common typos and check again if value is still unknown
                         String fixedValue = harmonizeValue(prop.getValue());
-                        Map<String, String> possibleValues = getPossibleValues(values);
+                        Map<String, String> possibleValues = getPossibleValues(presetsValueData.get(key));
                         if (possibleValues.containsKey(fixedValue)) {
                             fixedValue = possibleValues.get(fixedValue);
@@ -642,9 +677,4 @@
 
         return false;
-    }
-
-    protected static class IgnoreKeyPair {
-        public String key;
-        public String value;
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(revision 9022)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(revision 9023)
@@ -3,6 +3,8 @@
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
@@ -12,4 +14,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
@@ -68,3 +71,19 @@
         assertEquals("Value 'forrest' for key 'landuse' not in presets.", errors.get(0).getDescription());
     }
+
+    /**
+     * Checks that tags specifically ignored are effectively not in internal presets.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testIgnoredTagsNotInPresets() throws IOException {
+        List<String> errors = new ArrayList<>();
+        new TagChecker().initialize();
+        for (Tag tag : TagChecker.getIgnoredTags()) {
+            if (TagChecker.isTagInPresets(tag.getKey(), tag.getValue())) {
+                errors.add(tag.toString());
+            }
+        }
+        assertTrue(errors.toString(), errors.isEmpty());
+    }
 }
