Index: applications/editors/josm/plugins/validator/ignoretags.cfg
===================================================================
--- applications/editors/josm/plugins/validator/ignoretags.cfg	(revision 16435)
+++ applications/editors/josm/plugins/validator/ignoretags.cfg	(revision 16436)
@@ -48,4 +48,7 @@
 ; Highway Key/Value Pairs
 ;
+K:highway=motorway_link
+K:highway=trunk_link
+K:highway=primary_link
 K:highway=secondary_link
 K:oneway=-1
@@ -66,4 +69,5 @@
 K:aeroway=apron
 K:aeroway=hanger
+K:aeroway=helipad
 K:aeroway=runway
 K:aeroway=taxiway
@@ -72,9 +76,86 @@
 ; 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=grave_yard
+K:amenity=grit_bin
+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
 ;
 ; 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
 ;
 ; Man_made Tags
@@ -167,5 +248,42 @@
 ; 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
@@ -174,4 +292,24 @@
 K:sport=netball
 ;
+; 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
+;
 ; Type Key/Value Pairs
 ;
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java	(revision 16435)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java	(revision 16436)
@@ -79,4 +79,5 @@
     protected static ArrayList<String> ignoreDataEndsWith = new ArrayList<String>();
     protected static ArrayList<IgnoreKeyPair> ignoreDataKeyPair = new ArrayList<IgnoreKeyPair>();
+    protected static ArrayList<IgnoreTwoKeyPair> ignoreDataTwoKeyPair = new ArrayList<IgnoreTwoKeyPair>();
 
     /** The preferences prefix */
@@ -253,4 +254,17 @@
                             ignoreDataKeyPair.add(tmp);
                         }
+                        else if(key.equals("T:"))
+                        {
+                            IgnoreTwoKeyPair tmp = new IgnoreTwoKeyPair();
+                            int mid = line.indexOf("=");
+                            int split = line.indexOf("|");
+                            tmp.key1 = line.substring(0, mid);
+                            tmp.value1 = line.substring(mid+1, split);
+                            line = line.substring(split+1);
+                            mid = line.indexOf("=");
+                            tmp.key2 = line.substring(0, mid);
+                            tmp.value2 = line.substring(mid+1);
+                            ignoreDataTwoKeyPair.add(tmp);
+                        }
                         continue;
                     }
@@ -375,4 +389,44 @@
         if(checkComplex)
         {
+            Map<String, String> props = (p.keys == null) ? Collections.<String, String>emptyMap() : p.keys;
+            for(Entry<String, String> prop: props.entrySet() )
+            {
+                boolean ignore = true;
+                String key1 = prop.getKey();
+                String value1 = prop.getValue();
+
+                for(IgnoreTwoKeyPair a : ignoreDataTwoKeyPair)
+                {
+                    if(key1.equals(a.key1) && value1.equals(a.value1))
+                    {
+                        ignore = false;
+                        for(Entry<String, String> prop2: props.entrySet() )
+                        {
+                            String key2 = prop2.getKey();
+                            String value2 = prop2.getValue();
+                            for(IgnoreTwoKeyPair b : ignoreDataTwoKeyPair)
+                            {
+                                if(key2.equals(b.key2) && value2.equals(b.value2))
+                                {
+                                    ignore = true;
+                                    break;
+                                }
+                            }
+                            if(ignore)
+                                break;
+                        }
+                    }
+                    if(ignore)
+                        break;
+                }
+
+                if(!ignore)
+                {
+                    errors.add( new TestError(this, Severity.ERROR, tr("Illegal tag/value combinations"),
+                    tr("Illegal tag/value combinations"), tr("Illegal tag/value combinations"), 1272, p) );
+                    withErrors.add(p, "TC");
+                }
+            }
+
             for(CheckerData d : checkerData)
             {
@@ -469,4 +523,10 @@
                     {
                         if(key.equals(a.key) && value.equals(a.value))
+                            ignore = true;
+                    }
+
+                    for(IgnoreTwoKeyPair a : ignoreDataTwoKeyPair)
+                    {
+                        if(key.equals(a.key2) && value.equals(a.value2))
                             ignore = true;
                     }
@@ -778,4 +838,11 @@
     }
 
+    private static class IgnoreTwoKeyPair {
+        public String key1;
+        public String value1;
+        public String key2;
+        public String value2;
+    }
+
     private static class IgnoreKeyPair {
         public String key;
