Index: test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(revision 14484)
+++ test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(working copy)
@@ -100,11 +100,23 @@
     public void testMisspelledTag() throws IOException {
         final List<TestError> errors = test(OsmUtils.createPrimitive("node landuse=forrest"));
         assertEquals(1, errors.size());
-        assertEquals("Presets do not contain property value", errors.get(0).getMessage());
-        assertEquals("Value 'forrest' for key 'landuse' not in presets.", errors.get(0).getDescription());
+        assertEquals("Misspelled property value", errors.get(0).getMessage());
+        assertEquals("Value 'forrest' for key 'landuse' looks like 'forest'.", errors.get(0).getDescription());
     }
 
     /**
+     * Check for misspelled value with multiple alternatives in presets.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testMisspelledTag2() throws IOException {
+        final List<TestError> errors = test(OsmUtils.createPrimitive("node highway=servics"));
+        assertEquals(1, errors.size());
+        assertEquals("Misspelled property value", errors.get(0).getMessage());
+        assertEquals("Value 'servics' for key 'highway' looks like one of [service, services].", errors.get(0).getDescription());
+    }
+
+    /**
      * Checks that tags specifically ignored are effectively not in internal presets.
      * @throws IOException if any I/O error occurs
      */
Index: src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 14484)
+++ src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(working copy)
@@ -11,6 +11,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -256,7 +257,12 @@
                     } else if (line.charAt(0) == '+') {
                         okValue = line.substring(1);
                     } else if (line.charAt(0) == '-' && okValue != null) {
-                        harmonizedKeys.put(harmonizeKey(line.substring(1)), okValue);
+                        String hk = harmonizeKey(line.substring(1));
+                        if (!okValue.equals(hk)) {
+                            if (harmonizedKeys.put(hk, okValue) != null) {
+                                Logging.debug(tr("Line was ignored: {0}", line));
+                            }
+                        }
                     } else {
                         Logging.error(tr("Invalid spellcheck line: {0}", line));
                     }
@@ -312,12 +318,15 @@
     }
 
     private static void addPresetValue(KeyedItem ky) {
-        Collection<String> values = ky.getValues();
-        if (ky.key != null && values != null) {
-            harmonizedKeys.put(harmonizeKey(ky.key), ky.key);
+        if (ky.key != null && ky.getValues() != null) {
+            String hk = harmonizeKey(ky.key);
+            if (!ky.key.equals(hk)) {
+                harmonizedKeys.put(hk, ky.key);
+            }
         }
     }
 
+
     /**
      * Checks given string (key or value) if it contains characters with code below 0x20 (either newline or some other special characters)
      * @param s string to check
@@ -414,6 +423,9 @@
      */
     @Override
     public void check(OsmPrimitive p) {
+        if (!p.isTagged())
+            return;
+
         // Just a collection to know if a primitive has been already marked with error
         MultiMap<OsmPrimitive, String> withErrors = new MultiMap<>();
 
@@ -501,7 +513,7 @@
                     && !isTagIgnored(key, value)) {
                 if (!isKeyInPresets(key)) {
                     String prettifiedKey = harmonizeKey(key);
-                    String fixedKey = harmonizedKeys.get(prettifiedKey);
+                    String fixedKey = isKeyInPresets(prettifiedKey) ? prettifiedKey : harmonizedKeys.get(prettifiedKey);
                     if (fixedKey != null && !"".equals(fixedKey) && !fixedKey.equals(key)) {
                         // misspelled preset key
                         final TestError.Builder error = TestError.builder(this, Severity.WARNING, MISSPELLED_KEY)
@@ -524,6 +536,37 @@
                     // try to fix common typos and check again if value is still unknown
                     String fixedValue = harmonizeValue(prop.getValue());
                     Map<String, String> possibleValues = getPossibleValues(getPresetValues(key));
+                    List<String> fixVals = new ArrayList<>();
+                    if (!possibleValues.containsKey(fixedValue)) {
+                        int minDist = 2;
+                        String closest = null;
+                        for (String possibleVal : possibleValues.keySet()) {
+                            int dist = Utils.getLevenshteinDistance(possibleVal, fixedValue);
+                            if (dist < minDist) {
+                                closest = possibleVal;
+                                minDist = dist;
+                                fixVals.clear();
+                                fixVals.add(possibleVal);
+                            } else if (dist == minDist) {
+                                fixVals.add(possibleVal);
+                            }
+                        }
+                        if (minDist <= 1) {
+                            if (fixVals.size() < 2) {
+                                fixedValue = closest;
+                            } else {
+                                Collections.sort(fixVals);
+                                // misspelled preset value with multiple good alternatives
+                                errors.add(TestError.builder(this, Severity.WARNING, MISSPELLED_VALUE)
+                                        .message(tr("Misspelled property value"),
+                                                marktr("Value ''{0}'' for key ''{1}'' looks like one of {2}."), prop.getValue(), key, fixVals)
+                                        .primitives(p)
+                                        .build());
+                                withErrors.put(p, "WPV");
+                                continue;
+                            }
+                        }
+                    }
                     if (possibleValues.containsKey(fixedValue)) {
                         final String newValue = possibleValues.get(fixedValue);
                         // misspelled preset value
@@ -595,7 +638,7 @@
             checkValues = checkValues && Config.getPref().getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true);
         }
 
-        checkComplex = Config.getPref().getBoolean(PREF_CHECK_COMPLEX, true);
+        checkComplex = Config.getPref().getBoolean(PREF_CHECK_COMPLEX, true) && !checkerData.isEmpty();
         if (isBeforeUpload) {
             checkComplex = checkComplex && Config.getPref().getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true);
         }
Index: data/validator/words.cfg
===================================================================
--- data/validator/words.cfg	(revision 14484)
+++ data/validator/words.cfg	(working copy)
@@ -2,11 +2,14 @@
 #
 # special symbols, must be first character:
 #  # Comment
-#  + correctly spelled word
-#  - incorrectly spelled word. Must follow correctly spelled word before next correctly spelled word.
+#  + correctly spelled key
+#  - incorrectly spelled key. Must follow correctly spelled key before next correctly spelled key.
 #
 # There must not be any white space before or after words, unless they are to be included in
 # the bad spelling.
+# There is no need to add bad spelling with different upper/lower case.
+# There is no need to add bad spelling with leading or trailing blanks.
+
 +abutters
 -abuters
 -abbutter
@@ -14,10 +17,6 @@
 -abuttors
 -abuutters
 -ubutters
-+abutter
-+address
-+aka
-+ambulance
 +amenity
 -ameninty
 -amienty
@@ -26,7 +25,6 @@
 -amenety
 -amenitry
 -amnity
--amenity 
 -amentiy
 -aminity
 -amneity
@@ -36,51 +34,29 @@
 -ammenity
 -ameinty
 -anemity
--amneity
 -amemity
 -ameity
--amenity:
 -amenty
--Amenity
 -maenity
 -emenity
-+amenitylanduse
-+atm
-+Atta Oehlaweg
 +bicycle
 -bycycle
 -biycle
 -bycicle
 -bicyle
-+bike
-- bike
-+biological
-+by
-+City
-+class
--Class
-+classification
-+ele
-+emity
-+email
-+code_departement
-+code_INSEE
+-cycle
+-bike
+-bikes
 +commercial
 -comercial
-+comment
-+COMMENTLINE
-+confirmed
 +created_by
--created by
 -cretaed_by
 -crated_by
 -creared_by
 -creayed_by
 -{created_by
-- created_by
 -creeated_by
 -created_bu
-+crossing
 +denomination
 -denonimation
 -denomionation
@@ -91,18 +67,14 @@
 -denomincation
 -denominatation
 -denoination
-+domination
-+faith
-+footway
 +foot
-- foot
 -foor
 +height
 -hieght
 +highway
 -higwhay
+-highways
 -highwaay
--HighWay
 -huighway
 -highwayt
 -ghway
@@ -114,7 +86,6 @@
 -hiway
 -hihjway
 -higheway
--highwaY
 -hughway
 -hihgway
 -higoway
@@ -123,7 +94,6 @@
 -gighway
 -higyway
 -hichway
--HIGHWAY
 -hingway
 -hhighway
 -highwayu
@@ -133,9 +103,7 @@
 -hifhway
 -hihway
 -hifgway
--highway:
 -highjway
--highway 
 -highwy
 -hgihway
 -highawy
@@ -145,43 +113,22 @@
 -hignway
 -higway
 -highwayx
-- highway
 -hoghway
 -highwa
--Highway
 -hghway
-+highways
-+highspeed
-+highwaytype
-+highway_type
-+highwayunclassified
-+horse
-+hvg
-+iata_ref
-+icao_ref
-+IM2
 +image
 -imaqge
-+island
 +layer
--layer 
 -leyer
 -lyaer
-- layer
-+layer2
-+layers
-+layout
 +leisure
 -leissure
 -leiruse
 -lesure
--leisure 
--Leisure
 -liesure
 -lieusure
 -lesiure
 -leasure
-+naam
 +name
 -nane
 -nme
@@ -195,26 +142,11 @@
 -namw
 -bame
 -nam
-- name
 -namr
--name 
 -anme
--Name
--name:
--NAME
--name;
-+name_1
-+name_4
-+named_by
-+names
-+name_right
-+name_left
-+note
--Note
 +note:fa
 -note:fa 
 -notes:fa
-+Number
 +oneway
 -aneway
 -onewway
@@ -226,39 +158,13 @@
 -omeway
 -one_way
 -onway
-- oneway
 -oeway
 -eway
-+onte
 +osmarender:nameDirection
 -name_direction
--name-direction
 -osmarender:name_direction
-+place
--place 
--Place
-+passing
-+passing_places
 +railway
-- railway
--Railway
 -raillway
-+re
-+regional_name
-+ref
--ref 
--ref:
--Ref
-+ref:fa
-+ref:source
-+ref_nat
-+ref_int
-+retail
-+time
-+seats
-+seventh_wonder_of_world
-+square
-+soccer
 +source
 -sorce
 -soruce
@@ -267,52 +173,15 @@
 -sourec
 -aource
 -sourse
-+source2
-+source:ncn_ref
-+source:highway
-+SSSI
-+status
-+way
 +waterway
-- waterway
 -waterwa
--Waterway
 -waterwy
 -wateway
-+wood
 +unknown
 -unknwon
 #
 # Not sorted.
 #
-+ 
-+1
-+4wd
-+ car
-+ class
-+ horse
-+ sport
-+ open 09:00 - 16:00 daily
-+ General McArthur lived here
-+ Also coaches
-+80n:ibm
-+amenities
-+bar
-+batteries
-+Bezeichnung
-+boder
-+Brand
-+Food
-+Fussweg
-+Hauptstrasse
-+POI
-+Park
-+Strasse
-+abutment
-+abutts
-+access
-+accident_and_emergency
-+active_volcano
 +aerialway
 -areilway
 -areialway
@@ -321,276 +190,47 @@
 -aeoroway
 -areoway
 -airoway
-+ageofdgpsdata
 +airport
 -aeroport
-+airport_ident
-+airport_ref
-+airway
-+alias
-+alt
-+altname
-+alt_name
-+alt_name_2
-+alternative_name
-+altitude
-+alt_ref
-+ame
-+annotation
-+annotate
-+angle
-+angle_to_last
-+appearance
-+approximate
-+area
-+art
-+ascii_name
-+asphalt
-+author
-+autocar
-+b test tag
-+badminton
-+barnvagn
-+barrier
-+bb:name
-+beach
-+bicycleRoute
-+bicycle_Route
-+blackadder:name
-+blackadder:commerce
-+blackadder:cuisine
-+blackadder:service
-+blackadder:civic
-+bicycles
-+boat
-+bogus_footpath_going_nowhere
-+border
-+borded
-+border_edit
-+border_type
-+bottles
-+boundary
-+boundary_name
-+boundary_type
-+branch
-+branch_code:fa
-+branch_name:fa
-+brand
-+brewery
 +bridge
 -brideg
-- bridge
 -brdige
 -bridgde
 -birdge
--   bridge
 -bidge
 -brige
 -brigde
 -bridgw
-+bridge_ref
-+bridge_name
-+bridleway
 +building
 -buidling
 -buillding
 -buiding
 -bulding
-+building_name
-+build_date
-+bus
-+buss
-+busway
-+bus_routes
-+building_type
-+cafe
-+capacity
-+Car
-+car
-+carriage
-+cars
-+car park at rear
-- car park at rear
-+car_repair
-+carsharing
-+category
-+caution
-+charge
-+chemin
-+checked_by
-+cheshire_cycleway_ref
-+christian_denomination
-+cladding
+-buildinq
 +city
 -citya
-+city_id
-+clinic
-+clothes
-+cmt
 +complete
-- complete
 -complite
-+condition
 +construction
-+controlled
-+converted_by
-+core
-+cost
-+country
-+course
-+cover
-+covered
-+creator
-+cycle
--cyle
-+cycleRoute
-+cycle_route
+-constrution
+-contruction
 +cycleway
 -cylceway
--cycleway:
-+cykel
-+cuisine
-+cusine
-+cutting
-+d_lat
-+d_lon
-+danger
-+date
-+date_off
-+day_off
-+day_on
-+dead-end
-+deadend
-+depth
-+desc
 +description
 -descripion
 -desription
 -decription
-+descriptions
-+ details:naco
-+destination
-+difficulty
-+direction
-+direction_to
-+dispensing
-+distance
-+distance_meter
-+disused
-+ECautomaton
-+edited_some_more_by
-+editor
-+editor note
-+ef
-+elevated
-+embankment
-+emergency
-+emergency_ward
-+error
-+exit
-+exit_nr
-+exit_name
-+external_description
-+external_link
-+ev_charge
-+facility
-+farezone
-+farm_vehicles
-+fastfood
-+FACC_CODE
 +feature
 -featuer
-+feature: NGIA map
-- feature: NGIA map
-+features
-+feet
-+ferry
-+fenced
-+fire
-+first_number
-+fix
-+fixme
-+FIXME
-+foobar
-+food
-+footpath
--fottpath
-+forrest
-+foto
-+free
 +freight
 -frieght
-+from_to
-+from_zip
-+fuel_diesel
-+fuel_lpg
-+fuel_octane_91
-+fuel_octane_95
-+fuel_octane_98
 +full_name:fa
 -full_name:Fa
-+full_name
-+gate
-+geoname_id
-+glass
-+glass_bottles
-+glutenfree
-+gluten_free
-+goods
-+gps_network
-+grade
-+grind
-+gym
-+halt
-+hazard
-+hame
-+has_postalcode
-+hdop
-+helped_by
-+heritage
-+hgv
-+highway E-number
 +highway_border
 -highway_boarder
 -highway_boreder
-+hill
-+historic
-+historic name
-+historical
-+history
-+Higgy:ref
-+hotelclass
-+hospital:operator
-+hour_off
-+hour_on
-+hours
-+house_numbers
-+iata
-+icao
-+id
--ID
-+import_ref
-+incomplete
-+incline_steep
-+incline
-+industrial
-+info
-+ info :naco
-+infopoint
-+informal_name
 +int_name
--int name
 -iint_name
-+int_ref
-+interpolation
-+intersection
-+is
-+is_in
--is in
-- is_in
-+in_in
-+is_in:de
-+is_in:es
 +junction
 -junktion
 -junctoin
@@ -599,83 +239,29 @@
 -junctiion
 -jounction
 -jumction
-- junction
 -juction
--Junction
--junction 
-+junction_ref
-+junction:ref
-+junction:name
-+key
-+Kingsmede
-+label
 +landuse
 -land_use
 -lansuse
 -lanudse
 -lanuse
-+lane
-+lanes
--Lanes
-+last_number
-+ Last Edit: Batchoy 2006-12-14
-+learning
-+length
-+level
-+level crossing
-+license
-+liftStation
-+liftType
-+lighthouse
-+line
-+lines
-+link:naming
-+linje
-+lit
-+loc_ref
-+loc_ref:fa
-+loc_name
--loc_name 
-+loc_name:fa
 +local_name
 -local_nama
-+local_ref
-+locality
-+lock
-+lock_gate
-+long_name
-+lorries
-+Loyola Heights
-+ma,e
-+main
-+major
 +man_made
--man-made
--man_made 
 -mand_made
 -nan_made
 -madmade
 -manmade
-+mapkey
-+maplint:error
-+maplint:notice
-+maplint:warning
 +mapping_status
--mapping status
 -mappingstatus
-+markedtrail
-+marker
-+marching_step
 +minspeed
 -min_speed
 +maxspeed
 -maspeed
 -max_speed
--max speed
 -maxsepeed
 -maxseep
 -mayspeed
--maxspeed 
 -maxpeed
 +maxheight
 -max_hieght
@@ -685,431 +271,63 @@
 -max_weight
 -max_wieght
 -maxweihgt
-+maxwidth
-+membership
-+memorial
-+menu
-+military
-+missing_street
-+mixed
-+monument
-+more_data
-+motor
-+motorbike
 +motorcar
 -otorcar
-- motorcar
 -motocar
-+motor_car
-+motorcars
+-motorcars
 -motocars
 +motorcycle
 -motorcylce
 -motocycle
--motorcycle 
-+motorway
-+motorway station
-+motorway_junction
-+munro
-+museum
-+nad_ref
-+name.2
-+name.alt
-+name.en
-+name:ar
-+name:af
-+name:cy
-+name:de
-+name:en
-+name:en-cy
-+name:es
-+name:eu
-+name:fa
-+name:fi
-+name:fr
-+name:gd
-+name:la
-+name:my
-+name:nl
-+name:non
-+name:ru
-+name:sv
-+name.se
-+name.short
-+name:zh-Latn
-+name1
-+name2
-+name_alt
-+name int
-+name_int
-+name:source
-+name_source
-+name:cym
-+name_ie
-+name_loc
-+name_segment
-+namelayer
-+name:ref
-+name_ref
-+nat_name
-+nat_ref
-+nat_pref
-+nat_reg
 +natural
 -nataural
-- natural
 -natrual
 -nautral
--natural 
-+natural2
-+nature
-+navigable
-+ncn_name
-+ncn_ref
-+ncn:ref
-+ncn_route
-+needs_to_be
-+network
-+net_ref
-+newforest:pathtype
-+newsagent_code
-+nickb_marker
-+nickname
-+nlanes
-+noat
-+node
-+noentry
-+noexit
-- noexit
-+notes
 +note_1
 -note_!
 +note_2
 -note2
-+note_3
-+note_4
-+note_
-+noturn
-+number
-+numbers
-+obstacles
-+obstruction
-+official
-+ojw2
-+ojw_test
 +old_name
 -oldname
-+old_name:fa
-+old_full_name:fa
-+old_ref
-+opened
-+open_in
-+operator
-+opm:capacity
-+opm:difficulty
-+opm:liftStation
-+opm:liftType
--opm:lifttype
 +osmarender:renderName
 -osmarender:rendername
 -soamrender:renderName
 +osmarender:renderRef
 -osmrender:renderRef
-+owner
-+owners
-+park_and_ride
-+parking
-+parking:cost
-+parking:spaces
-+passenger
-+path
-+paved
-+pcv_only
-+pdop
-+pedestrian
-+pedestrians
-+permissive
-+petrol lhs
-+petrol petron
-+petrol
-+phone
-+phone_number
-+physical
-+place_postal
-+place numbers
-+place_code
-+place_name
-- place_name
-+place_numbers
-+place_of_worship
-+plave
-+playe
-+plant
-+poi
-+point_of_interest
-+population
-+popul
-+port
-+position_accuracy
-+possible_name
-+post_code
 +postal_code
-- postal_code
 -posatl_code
-+postcode
-+post_office
-+power
-+primary
 +private
 -privat
-+provided
-+Properties
-+problem
-+psv
-+public
-+public_transportation
-+punting
-+quality
-+rail
-+railroad
-+railway_tracks
-+ramp
-+recreation
-+recycling
-+recycling:batteries
-+recycling:bicycles
-+recycling:books
-+recycling:clothing
-+recycling:clothes
 +recycling:glas
 -recyling:glas
-+recycling:shoes
-+recycling:engine_oil
-+recycling:glass_bottles
-+recycling:green_waste
-+recycling:magazines
-+recycling:mobile_phones
-+recycling:newspaper
-+recycling:newspapers
-+recycling:printer_cartridges
-+recycling:cardboard
-+recycling:music
 +recycling:paper
 -reycling:paper
-+recycle:plastic_bottles
-+recycle:paper
-+recycle:magazines
-+recycle:cardboard
-+recycle:cans
-+recycling:cans
-+recycling:plastic_bottles
-+recycline:cardboard
-+recycle:glass_bottles
-+recycling:cork
-+recycling:glass
-+recycling:plastic
-+recycling:plastic_bags
-+recycling:plasic_bottles
-+recycling:scrap_metal
-+recycling:white_goods
-+recycling:wood
-+recycling:tyres
-+red
-+reference
-+ref_direction
-+reg
-+reg_name
-+reg_ref
-+reg_reg
-+region_id
 +religion
 -relgion
-+residence
 +residential
 -residentail
 +restriction
 -restrction
--Restriction
-+restricted
-+restrictions
--Restrictions
--Restrictions 
-+riverwidth
-+river_width
-+road
-+rollerblade
-+roundabout
-+route
-+routing
-+rue
-+runway
-+sat
-+sculpture
-+service
-+shape
-+sheltered
-+shortcut
-+sidewalk
-+sign
-+single_track
-+singletrack
-+shop
-+shopping
-+size
-+ski
-+slope
-+snowboarding
-+some_data
-+source:loc_name
-+source:old_name
-+source:old_ref
 +source:name
 -source:Name
-+source:ref
-+source_ref
-+source_ref:ref
-+source_ref:name
-+source:uri
-+source_uri
 +source:url
 -source_url
-+source:oneway
-+southglos:heritagetrail
-+species
-+speed
-+speed_limit
-+speed limit
-+speedlimit
-+speedevil
-+sport
-+sport_2
-+sports
-+stairs
-+start_date
-+state
-+station
-+stream
-+street
-+street_name
-+steps
-+structure
-+subtype
-+suburb
-+suggested
 +surface
 -sruface
-+surfaced
-+survey_ref
-+survey
-- survey
-+svg:font-size
-+svg:stroke-width
-+svg_font-size
-+svg:stroke-dasharray
-+swimming
-+sym
-+symbol
-+symbolic
-+tag
-+taxi
-+telephone
-+telephone:operator
-+telephone_number
-+telephonenumber
-+telephone_type
-+test
-+testing
-+testnode
-+ this was a children's playarea with a path leading through it. Didn't want to look too dodgy :)
-+the Netherlands
-+NL
-+thoroughfare
-+time_diff
-+times
-+tractor
-+track
-+tracktype_1
-+to_zip
-+todo
-+TODO
-+toll
-+tollway
-+topspeed
 +tourism
 -tourismn
 -tourim
--tourism 
 -toursim
 -touristm
-+tourist
-+tourist_attraction
-+towards
-+town
-+towpath
-+tracks
-+traffic
-+traffic_signals
-+train
 +tracktype
 -tractype
 -tracltype
 -trackype
-+tram
 +tramline
 -tram_line
-+true
-+truck
-+tube
-+tune
 +tunnel
 -tunne
--tunnel 
--Tunnel
 -tunel
 -tunnely
-+turn_right
-+typ
 +type
 -tyoe
-+type.en
-+uk:row
-+unclassified
-+upload_tag
-+uploader
-+uploaded_by
-+uri
-+url
-+use
-+use_status
-+usage
-+utility
-+vdop
-+vehicle
-+viaduct
-+vicar
-+view
-+village
-+visited_by
-+volcano
-+voltage
-+warning
-+water
-+waterfall
-+wayclass
-+waypoint
-+web
-+website
-+website:official
-+weight_limit
-+wide
-+width
-+width_restriction
-+wiki
-+wikipedia
-+wikipedia:es
-+wiki:nl
-+wrong
-+www
-+zip
-+zip_code
-+{}
