Index: applications/editors/josm/plugins/lang/de/de.po
===================================================================
--- applications/editors/josm/plugins/lang/de/de.po	(revision 9540)
+++ applications/editors/josm/plugins/lang/de/de.po	(revision 9561)
@@ -11,6 +11,6 @@
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-08-07 10:17+0200\n"
-"PO-Revision-Date: 2008-08-07 10:35+0200\n"
+"POT-Creation-Date: 2008-08-08 09:46+0200\n"
+"PO-Revision-Date: 2008-08-08 10:22+0200\n"
 "Last-Translator: Dirk Stöcker <openstreetmap@dstoecker.de>\n"
 "Language-Team:  <de@li.org>\n"
@@ -551,5 +551,5 @@
 #: ../colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePreference.java:79
 #: ../wmsplugin/src/wmsplugin/WMSPreferenceEditor.java:55
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:404
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:457
 msgid "Add"
 msgstr "Hinzufügen"
@@ -1404,5 +1404,5 @@
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java:566
 #: ../grid/src/grid/GridPlugin.java:43 ../grid/src/grid/GridPlugin.java:49
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:414
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:467
 msgid "Edit"
 msgstr "Bearbeiten"
@@ -1435,5 +1435,5 @@
 #: ../colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePreference.java:93
 #: ../wmsplugin/src/wmsplugin/WMSPreferenceEditor.java:75
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:445
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:498
 msgid "Delete"
 msgstr "Löschen"
@@ -1483,5 +1483,5 @@
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java:247
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java:65
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:78
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:75
 msgid "Select"
 msgstr "Auswahl"
@@ -2846,5 +2846,5 @@
 #: ../../core/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java:116
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java:552
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:433
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:486
 msgid "Please select the row to edit."
 msgstr "Bitte wählen sie eine Zeile zum Bearbeiten."
@@ -2854,5 +2854,5 @@
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java:557
 #: ../wmsplugin/src/wmsplugin/WMSPreferenceEditor.java:80
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:449
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:502
 msgid "Please select the row to delete."
 msgstr "Bitte wählen Sie die zu löschende Zeile."
@@ -2871,5 +2871,5 @@
 
 #: ../../core/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java:91
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:460
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:513
 msgid "Delete the selected source from the list."
 msgstr "Ausgewählte Quelle löschen."
@@ -3174,5 +3174,5 @@
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java:74
 #: ../../core/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java:66
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:79
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:76
 msgid "Set the selected elements on the map to the selected items in the list above."
 msgstr ""
@@ -7108,7 +7108,7 @@
 "talking to the plugin."
 msgstr ""
-"Das Fernbedienungsplugin lauscht am Port 8111 des lokalen Rechners (localhost). "
-"Dieser Port ist nicht konfigurierbar, weil er von externen Anwendungen adressiert "
-"werden muss, welche das Plugin nutzen."
+"Das Fernbedienungsplugin lauscht am Port 8111 des lokalen Rechners "
+"(localhost). Dieser Port ist nicht konfigurierbar, weil er von externen "
+"Anwendungen adressiert werden muss, welche das Plugin nutzen."
 
 #: ../remotecontrol/src/org/openstreetmap/josm/plugins/remotecontrol/RemoteControlPreferences.java:42
@@ -7116,9 +7116,5 @@
 msgstr "Erlaubte Aktionen"
 
-#: ../slippy_map_chooser/src/OsmMapControl.java:63
-msgid "left"
-msgstr "links"
-
-#: ../slippy_map_chooser/src/SlippyMapChooser.java:83
+#: ../slippy_map_chooser/src/SlippyMapChooser.java:63
 msgid ""
 "Zoom: Mousewheel or double click.   Move map: Hold right mousebutton and "
@@ -7128,5 +7124,5 @@
 "Maus bewegen.   Auswahl: Klick."
 
-#: ../slippy_map_chooser/src/SlippyMapChooser.java:84
+#: ../slippy_map_chooser/src/SlippyMapChooser.java:66
 msgid "Slippy map"
 msgstr "Schnelle Karte"
@@ -7152,5 +7148,5 @@
 msgstr "Raster Ebene:"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:66
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:63
 #: ../validator/src/org/openstreetmap/josm/plugins/validator/ErrorLayer.java:36
 #: ../validator/src/org/openstreetmap/josm/plugins/validator/ErrorLayer.java:101
@@ -7158,29 +7154,29 @@
 msgstr "Ergebnisse der Datenprüfung"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:66
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:63
 msgid "Open the validation window."
 msgstr "Fenster mit dem Ergebnis der Prüfung öffnen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:82
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:79
 msgid "Validate"
 msgstr "Prüfen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:82
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:79
 msgid "Validate the data."
 msgstr "Überprüfe die Daten."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:83
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:80
 msgid "Fix"
 msgstr "Repariere"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:83
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:80
 msgid "Fix the selected errors."
 msgstr "Korrigiere die Fehler in den Daten."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:88
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:85
 msgid "Ignore"
 msgstr "Ignoriere"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:88
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java:85
 msgid "Ignore the selected errors next time."
 msgstr "Ignoriere die Fehler beim nächsten Mal."
@@ -7340,13 +7336,13 @@
 msgstr "Knoten ohne Zusatzinformation oder ohne Verbindung"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:113
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:129
 msgid "Properties checker :"
 msgstr "Eigenschaftsprüfer:"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:114
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:130
 msgid "This plugin checks for errors in property keys and values."
 msgstr "Dieses Plugin prüft auf Fehler in Schlüsseln und Werten"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:192
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:221
 #, java-format
 msgid ""
@@ -7357,45 +7353,57 @@
 "{0}"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:246
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:274
+msgid "Illegal tag/value combinations"
+msgstr "Ungültige Schlüssel/Wert-Kombinationen"
+
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:288
 msgid "Tags with empty values"
 msgstr "Tags mit leerem Wert"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:251
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:293
 #, java-format
 msgid "Invalid property key ''{0}''"
 msgstr "Ungültiger Schlüssel \"{0}\""
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:256
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:298
 #, java-format
 msgid "Invalid white space in property key ''{0}''"
 msgstr "Ungültiger Leerraum in Schlüssel \"{0}\""
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:261
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:303
 msgid "Property values start or end with white space"
 msgstr "Werte beginnen oder enden mit Leerraum"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:269
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:311
 msgid "Unknown property values"
 msgstr "Unbekannter Werte"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:278
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:320
 msgid "FIXMES"
 msgstr "FIXMEs"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:389
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:434
 msgid "Check property keys."
 msgstr "Schlüssel prüfen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:390
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:435
 msgid "Validate that property keys are valid checking against list of words."
 msgstr "Überprüft Schlüssel auf Gültigkeit durch Abgleich mit einer Liste."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:407
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:427
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:437
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:442
+msgid "Use complex property checker."
+msgstr "Nutze komplexen Eigenschaftsprüfer."
+
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:443
+msgid "Validate property values and tags using complex rules."
+msgstr "Prüft die Gültigkeit von Werten und Schlüsseln anhand von komplexen Regeln."
+
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:460
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:480
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:490
 msgid "TagChecker source"
 msgstr "Schlüsselprüferdatenquellen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:457
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:510
 msgid ""
 "The sources (url or filename) of spell check (see http://wiki.openstreetmap."
@@ -7405,29 +7413,29 @@
 "openstreetmap.org/index.php/User:JLS/speller) oder Schlüsselprüfung."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:458
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:511
 msgid "Add a new source to the list."
 msgstr "Eine neue Quelle zur Liste hinzufügen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:459
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:512
 msgid "Edit the selected source."
 msgstr "Ausgewählte Quelle bearbeiten."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:462
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:515
 msgid "Data sources"
 msgstr "Datenquellen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:486
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:535
 msgid "Check property values."
 msgstr "Werte überprüfen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:487
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:536
 msgid "Validate that property values are valid checking against presets."
 msgstr "Prüft die Gültigkeit von Werten anhand von Presets."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:495
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:543
 msgid "Check for FIXMES."
 msgstr "Prüfe auf FIXMEs"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:496
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:544
 msgid "Looks for nodes or ways with FIXME in any property value."
 msgstr ""
@@ -7435,21 +7443,21 @@
 "haben."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:504
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:551
 msgid "Use default data file."
 msgstr "Standarddatendatei nutzen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:505
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:552
 msgid "Use the default data file (recommended)."
 msgstr "Nutzung der Standarddatendatei (empfohlen)."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:509
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:555
 msgid "Use default spellcheck file."
 msgstr "Standarddatei für Schreibprüfung nutzen."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:510
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:556
 msgid "Use the default spellcheck file (recommended)."
 msgstr "Nutzung der Standarddatei für die Schreibfehlerprüfung (empfohlen)."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:575
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java:633
 msgid "Fix properties"
 msgstr "Eigenschaften korrigieren"
@@ -7475,9 +7483,9 @@
 msgstr "Verdrehtes Land: Land nicht auf der linken Seite"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:33
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:34
 msgid "Overlapping ways."
 msgstr "Wege überlappen sich."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:34
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:35
 msgid ""
 "This test checks that a connection between two nodes is not used by more "
@@ -7487,29 +7495,29 @@
 "als einem Weg verwendet wird."
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:96
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:94
 msgid "Overlapping areas"
 msgstr "Überlappende Flächen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:98
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:96
 msgid "Overlapping highways (with area)"
 msgstr "Überlappende Straßen (mit Fläche)"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:100
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:98
 msgid "Overlapping railways (with area)"
 msgstr "Überlappende Schienen (mit Fläche)"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:102
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:100
 msgid "Overlapping ways (with area)"
 msgstr "Überlappende Wege (mit Fläche)"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:105
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:103
 msgid "Overlapping highways"
 msgstr "Überlappende Straßen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:107
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:105
 msgid "Overlapping railways"
 msgstr "Überlappende Schienen"
 
-#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:109
+#: ../validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java:107
 msgid "Overlapping ways"
 msgstr "Überlappende Wege"
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java	(revision 9540)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java	(revision 9561)
@@ -2,4 +2,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.BorderLayout;
@@ -25,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.plugins.validator.util.Bag;
@@ -48,12 +50,7 @@
 	public Collection<String> ignoredErrors = new TreeSet<String>();
 
-	/** The fix button */
-	private JButton fixButton;
-
-	/** The ignore button */
-	private JButton ignoreButton;
-
-	/** The select button */
-	private JButton selectButton;
+	private SideButton fixButton; /** The fix button */
+	private SideButton ignoreButton; /** The ignore button */
+	private SideButton selectButton; /** The select button */
 
 	/** Last selected element */
@@ -76,15 +73,15 @@
 		JPanel buttonPanel = new JPanel(new GridLayout(1,3));
 
-		selectButton = Util.createButton(tr("Select"), "select", "mapmode/selection/select",
+		selectButton = new SideButton(marktr("Select"), "select", "Validator",
 		tr("Set the selected elements on the map to the selected items in the list above."), this);
 		selectButton.setEnabled(false);
 		buttonPanel.add(selectButton);
-		buttonPanel.add(Util.createButton(tr("Validate"), "validate", "dialogs/refresh", tr("Validate the data."), this));
-		fixButton = Util.createButton(tr("Fix"), "fix", "dialogs/fix", tr("Fix the selected errors."), this);
+		buttonPanel.add(new SideButton(marktr("Validate"), "refresh", "Validator", tr("Validate the data."), this));
+		fixButton = new SideButton(marktr("Fix"), "fix", "Validator", tr("Fix the selected errors."), this);
 		fixButton.setEnabled(false);
 		buttonPanel.add(fixButton);
 		if(Main.pref.getBoolean(PreferenceEditor.PREF_USE_IGNORE, true))
 		{
-			ignoreButton = Util.createButton(tr("Ignore"), "ignore", "dialogs/delete", tr("Ignore the selected errors next time."), this);
+			ignoreButton = new SideButton(marktr("Ignore"), "delete", "Validator", tr("Ignore the selected errors next time."), this);
 			ignoreButton.setEnabled(false);
 			buttonPanel.add(ignoreButton);
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java	(revision 9540)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java	(revision 9561)
@@ -7,4 +7,5 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
@@ -65,12 +66,9 @@
 				for (WaySegment ws : duplicated) 
 				{
-					String ar;
-
 					if (ws.way.get("highway") != null)
 						highway++;
 					else if (ws.way.get("railway") != null)
 						railway++;
-					ar = ws.way.get("area");
-					if (ar != null && ("true".equalsIgnoreCase(ar) || "yes".equalsIgnoreCase(ar) || "1".equals(ar)))
+					if (OsmUtils.getOsmBoolean(ws.way.get("area")))
 						area++;
 					if (ws.way.get("landuse") != null || ws.way.get("natural") != null
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 9540)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java	(revision 9561)
@@ -3,21 +3,50 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.io.*;
+import java.awt.GridBagLayout;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
-
-import javax.swing.*;
-
+import java.util.StringTokenizer;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference;
+import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.*;
-import org.openstreetmap.josm.data.osm.*;
-import org.openstreetmap.josm.gui.tagging.TaggingPreset;
-import org.openstreetmap.josm.gui.tagging.TaggingPreset.*;
-import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference;
-import org.openstreetmap.josm.plugins.validator.*;
+import org.openstreetmap.josm.plugins.validator.OSMValidatorPlugin;
+import org.openstreetmap.josm.plugins.validator.PreferenceEditor;
+import org.openstreetmap.josm.plugins.validator.Severity;
+import org.openstreetmap.josm.plugins.validator.Test;
+import org.openstreetmap.josm.plugins.validator.TestError;
+import org.openstreetmap.josm.plugins.validator.tests.ChangePropertyKeyCommand;
 import org.openstreetmap.josm.plugins.validator.util.Bag;
 import org.openstreetmap.josm.plugins.validator.util.Util;
@@ -41,68 +70,55 @@
 	/** The spell check preset values */
 	protected static Bag<String, String> presetsValueData;
+	/** The TagChecker data */
+	protected static List<CheckerData> checkerData = new ArrayList<CheckerData>();
 
 	/** The preferences prefix */
 	protected static final String PREFIX = PreferenceEditor.PREFIX + "." + TagChecker.class.getSimpleName();
 
-	/** Preference name for checking values */
 	public static final String PREF_CHECK_VALUES = PREFIX + ".checkValues";
-	/** Preference name for checking values */
 	public static final String PREF_CHECK_KEYS = PREFIX + ".checkKeys";
-	/** Preference name for checking FIXMES */
+	public static final String PREF_CHECK_COMPLEX = PREFIX + ".checkComplex";
 	public static final String PREF_CHECK_FIXMES = PREFIX + ".checkFixmes";
-	/** Preference name for sources */
+
 	public static final String PREF_SOURCES = PREFIX + ".sources";
-	/** Preference name for sources */
 	public static final String PREF_USE_DATA_FILE = PREFIX + ".usedatafile";
-	/** Preference name for sources */
 	public static final String PREF_USE_SPELL_FILE = PREFIX + ".usespellfile";
-	/** Preference name for keys upload check */
+
 	public static final String PREF_CHECK_KEYS_BEFORE_UPLOAD = PREFIX + ".checkKeysBeforeUpload";
-	/** Preference name for values upload check */
 	public static final String PREF_CHECK_VALUES_BEFORE_UPLOAD = PREFIX + ".checkValuesBeforeUpload";
-	/** Preference name for fixmes upload check */
+	public static final String PREF_CHECK_COMPLEX_BEFORE_UPLOAD = PREFIX + ".checkComplexBeforeUpload";
 	public static final String PREF_CHECK_FIXMES_BEFORE_UPLOAD = PREFIX + ".checkFixmesBeforeUpload";
 
-	/** Whether to check keys */
 	protected boolean checkKeys = false;
-	/** Whether to check values */
 	protected boolean checkValues = false;
-	/** Whether to check for fixmes in values */
+	protected boolean checkComplex = false;
 	protected boolean checkFixmes = false;
 
-	/** Preferences checkbox for keys */
 	protected JCheckBox prefCheckKeys;
-	/** Preferences checkbox for values */
 	protected JCheckBox prefCheckValues;
-	/** Preferences checkbox for FIXMES */
+	protected JCheckBox prefCheckComplex;
 	protected JCheckBox prefCheckFixmes;
-	/** The preferences checkbox for validation of keys on upload */
+
 	protected JCheckBox prefCheckKeysBeforeUpload;
-	/** The preferences checkbox for validation of values on upload */
 	protected JCheckBox prefCheckValuesBeforeUpload;
-	/** The preferences checkbox for validation of fixmes on upload */
+	protected JCheckBox prefCheckComplexBeforeUpload;
 	protected JCheckBox prefCheckFixmesBeforeUpload;
-	/** The add button */
+
+	protected JCheckBox prefUseDataFile;
+	protected JCheckBox prefUseSpellFile;
+
 	protected JButton addSrcButton;
-	/** The edit button */
 	protected JButton editSrcButton;
-	/** The delete button */
 	protected JButton deleteSrcButton;
 
-	protected static int EMPTY_VALUES = 0; /** Empty values error */
-	protected static int INVALID_KEY = 1; /** Invalid key error */
-	protected static int INVALID_VALUE = 2; /** Invalid value error */
-	protected static int FIXME = 3; /** fixme error */
-	protected static int INVALID_SPACE = 3; /** space in value (start/end) */
+	protected static int EMPTY_VALUES = 0;
+	protected static int INVALID_KEY = 1;
+	protected static int INVALID_VALUE = 2;
+	protected static int FIXME = 3;
+	protected static int INVALID_SPACE = 3;
+	protected static int TAG_CHECK = 4;
 
 	/** List of sources for spellcheck data */
 	protected JList Sources;
-
-	/** Whether this test must check the keys before upload. Used by peferences */
-	protected boolean testKeysBeforeUpload;
-	/** Whether this test must check the values before upload. Used by peferences */
-	protected boolean testValuesBeforeUpload;
-	/** Whether this test must check form fixmes in values before upload. Used by peferences */
-	protected boolean testFixmesBeforeUpload;
 
 	/**
@@ -165,13 +181,26 @@
 
 			String okValue = null;
+			Boolean tagcheckerfile = false;
 			do
 			{
 				String line = reader.readLine();
-				if( line == null || line.length() == 0 )
+				if( line == null || (!tagcheckerfile && line.length() == 0) )
 					break;
 				if( line.startsWith("#") )
-					continue;
-	
-				if( line.charAt(0) == '+' )
+				{
+					if(line.startsWith("# JOSM TagChecker"))
+						tagcheckerfile = true;
+				}
+				else if(tagcheckerfile)
+				{
+					CheckerData d = new CheckerData();
+					String err = d.getData(line);
+
+					if(err == null)
+						checkerData.add(d);
+					else
+						System.err.println("Invalid tagchecker line - "+err+":" + line);
+				}
+				else if( line.charAt(0) == '+' )
 				{
 					okValue = line.substring(1);
@@ -237,4 +266,17 @@
 		Bag<OsmPrimitive, String> withErrors = new Bag<OsmPrimitive, String>();
 
+		if(checkComplex)
+		{
+			for(CheckerData d : checkerData)
+			{
+				if(d.match(p))
+				{
+					errors.add( new TestError(this, Severity.WARNING, tr("Illegal tag/value combinations"), p, TAG_CHECK) );
+					withErrors.add(p, "TC");
+					break;
+				}
+			}
+		}
+
 		Map<String, String> props = (p.keys == null) ? Collections.<String, String>emptyMap() : p.keys;
 		for(Entry<String, String> prop: props.entrySet() )
@@ -304,9 +346,9 @@
 		XmlObjectParser parser = new XmlObjectParser();
 		parser.mapOnStart("item", TaggingPreset.class);
-		parser.map("text", Text.class);
-		parser.map("check", Check.class);
-		parser.map("combo", Combo.class);
-		parser.map("label", Label.class);
-		parser.map("key", Key.class);
+		parser.map("text", TaggingPreset.Text.class);
+		parser.map("check", TaggingPreset.Check.class);
+		parser.map("combo", TaggingPreset.Combo.class);
+		parser.map("label", TaggingPreset.Label.class);
+		parser.map("key", TaggingPreset.Key.class);
 		parser.start(in);
 		
@@ -314,6 +356,6 @@
 		{
 			Object obj = parser.next();
-			if (obj instanceof Combo) {
-				Combo combo = (Combo)obj;
+			if (obj instanceof TaggingPreset.Combo) {
+				TaggingPreset.Combo combo = (TaggingPreset.Combo)obj;
 				for(String value : combo.values.split(",") )
 					presetsValueData.add(combo.key, value);
@@ -366,4 +408,8 @@
 			checkValues = checkValues && Main.pref.getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true);
 
+		checkComplex = Main.pref.getBoolean(PREF_CHECK_COMPLEX);
+		if( isBeforeUpload )
+			checkComplex = checkValues && Main.pref.getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true);
+
 		checkFixmes = Main.pref.getBoolean(PREF_CHECK_FIXMES);
 		if( isBeforeUpload )
@@ -374,5 +420,5 @@
 	public void visit(Collection<OsmPrimitive> selection)
 	{
-		if( checkKeys || checkValues)
+		if( checkKeys || checkValues || checkComplex)
 			super.visit(selection);
 	}
@@ -385,7 +431,6 @@
 
 		testPanel.add( new JLabel(name), GBC.eol().insets(3,0,0,0) );
-		
-		boolean checkKeys = Main.pref.getBoolean(PREF_CHECK_KEYS, true);
-		prefCheckKeys = new JCheckBox(tr("Check property keys."), checkKeys);
+
+		prefCheckKeys = new JCheckBox(tr("Check property keys."), Main.pref.getBoolean(PREF_CHECK_KEYS, true));
 		prefCheckKeys.setToolTipText(tr("Validate that property keys are valid checking against list of words."));
 		testPanel.add(prefCheckKeys, GBC.std().insets(20,0,0,0));
@@ -394,4 +439,12 @@
 		prefCheckKeysBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, true));
 		testPanel.add(prefCheckKeysBeforeUpload, a);
+
+		prefCheckComplex = new JCheckBox(tr("Use complex property checker."), Main.pref.getBoolean(PREF_CHECK_COMPLEX, true));
+		prefCheckComplex.setToolTipText(tr("Validate property values and tags using complex rules."));
+		testPanel.add(prefCheckComplex, GBC.std().insets(20,0,0,0));
+
+		prefCheckComplexBeforeUpload = new JCheckBox();
+		prefCheckComplexBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true));
+		testPanel.add(prefCheckComplexBeforeUpload, a);
 
 		Sources = new JList(new DefaultListModel());
@@ -468,21 +521,17 @@
 		buttonPanel.add(deleteSrcButton, GBC.std().insets(0,5,0,0));
 
-		ActionListener disableCheckKeysActionListener = new ActionListener(){
+		ActionListener disableCheckActionListener = new ActionListener(){
 			public void actionPerformed(ActionEvent e) {
-				boolean selected = prefCheckKeys.isSelected() || prefCheckKeysBeforeUpload.isSelected();
-				Sources.setEnabled( selected );
-				addSrcButton.setEnabled(selected);
-				editSrcButton.setEnabled(selected);
-				deleteSrcButton.setEnabled(selected);
+				handlePrefEnable();
 			}
 		};
-		prefCheckKeys.addActionListener(disableCheckKeysActionListener);
-		prefCheckKeysBeforeUpload.addActionListener(disableCheckKeysActionListener);
-
-		Sources.setEnabled( checkKeys );
-		buttonPanel.setEnabled( checkKeys );
-
-		boolean checkValues = Main.pref.getBoolean(PREF_CHECK_VALUES, true);
-		prefCheckValues = new JCheckBox(tr("Check property values."), checkValues);
+		prefCheckKeys.addActionListener(disableCheckActionListener);
+		prefCheckKeysBeforeUpload.addActionListener(disableCheckActionListener);
+		prefCheckComplex.addActionListener(disableCheckActionListener);
+		prefCheckComplexBeforeUpload.addActionListener(disableCheckActionListener);
+
+		handlePrefEnable();
+
+		prefCheckValues = new JCheckBox(tr("Check property values."), Main.pref.getBoolean(PREF_CHECK_VALUES, true));
 		prefCheckValues.setToolTipText(tr("Validate that property values are valid checking against presets."));
 		testPanel.add(prefCheckValues, GBC.std().insets(20,0,0,0));
@@ -492,6 +541,5 @@
 		testPanel.add(prefCheckValuesBeforeUpload, a);
 
-		boolean checkFixmes = Main.pref.getBoolean(PREF_CHECK_FIXMES, true);
-		prefCheckFixmes = new JCheckBox(tr("Check for FIXMES."), checkFixmes);
+		prefCheckFixmes = new JCheckBox(tr("Check for FIXMES."), Main.pref.getBoolean(PREF_CHECK_FIXMES, true));
 		prefCheckFixmes.setToolTipText(tr("Looks for nodes or ways with FIXME in any property value."));
 		testPanel.add(prefCheckFixmes, GBC.std().insets(20,0,0,0));
@@ -501,29 +549,39 @@
 		testPanel.add(prefCheckFixmesBeforeUpload, a);
 
-		boolean useDataFile = Main.pref.getBoolean(PREF_USE_DATA_FILE, true);
-		JCheckBox prefUseDataFile = new JCheckBox(tr("Use default data file."), checkValues);
+		prefUseDataFile = new JCheckBox(tr("Use default data file."), Main.pref.getBoolean(PREF_USE_DATA_FILE, true));
 		prefUseDataFile.setToolTipText(tr("Use the default data file (recommended)."));
 		testPanel.add(prefUseDataFile, GBC.eol().insets(20,0,0,0));
 
-		boolean useSpellFile = Main.pref.getBoolean(PREF_USE_SPELL_FILE, true);
-		JCheckBox prefUseSpellFile = new JCheckBox(tr("Use default spellcheck file."), checkValues);
+		prefUseSpellFile = new JCheckBox(tr("Use default spellcheck file."), Main.pref.getBoolean(PREF_USE_SPELL_FILE, true));
 		prefUseSpellFile.setToolTipText(tr("Use the default spellcheck file (recommended)."));
 		testPanel.add(prefUseSpellFile, GBC.eol().insets(20,0,0,0));
 	}
 
+	public void handlePrefEnable()
+	{
+		boolean selected = prefCheckKeys.isSelected() || prefCheckKeysBeforeUpload.isSelected()
+		|| prefCheckComplex.isSelected() || prefCheckComplexBeforeUpload.isSelected();
+		Sources.setEnabled( selected );
+		addSrcButton.setEnabled(selected);
+		editSrcButton.setEnabled(selected);
+		deleteSrcButton.setEnabled(selected);
+	}
+
 	@Override
 	public void ok()
 	{
-		enabled = prefCheckKeys.isSelected() || prefCheckValues.isSelected() || prefCheckFixmes.isSelected();
-		testBeforeUpload = prefCheckKeysBeforeUpload.isSelected() || prefCheckValuesBeforeUpload.isSelected() || prefCheckFixmesBeforeUpload.isSelected();
+		enabled = prefCheckKeys.isSelected() || prefCheckValues.isSelected() || prefCheckComplex.isSelected() || prefCheckFixmes.isSelected();
+		testBeforeUpload = prefCheckKeysBeforeUpload.isSelected() || prefCheckValuesBeforeUpload.isSelected() || prefCheckFixmesBeforeUpload.isSelected() || prefCheckComplexBeforeUpload.isSelected();
 
 		Main.pref.put(PREF_CHECK_VALUES, prefCheckValues.isSelected());
+		Main.pref.put(PREF_CHECK_COMPLEX, prefCheckComplex.isSelected());
 		Main.pref.put(PREF_CHECK_KEYS, prefCheckKeys.isSelected());
 		Main.pref.put(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected());
 		Main.pref.put(PREF_CHECK_VALUES_BEFORE_UPLOAD, prefCheckValuesBeforeUpload.isSelected());
+		Main.pref.put(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, prefCheckComplexBeforeUpload.isSelected());
 		Main.pref.put(PREF_CHECK_KEYS_BEFORE_UPLOAD, prefCheckKeysBeforeUpload.isSelected());
 		Main.pref.put(PREF_CHECK_FIXMES_BEFORE_UPLOAD, prefCheckFixmesBeforeUpload.isSelected());
-		Main.pref.put(PREF_USE_DATA_FILE, prefCheckFixmesBeforeUpload.isSelected());
-		Main.pref.put(PREF_USE_SPELL_FILE, prefCheckFixmesBeforeUpload.isSelected());
+		Main.pref.put(PREF_USE_DATA_FILE, prefUseDataFile.isSelected());
+		Main.pref.put(PREF_USE_SPELL_FILE, prefUseSpellFile.isSelected());
 		String sources = "";
 		if( Sources.getModel().getSize() > 0 )
@@ -587,3 +645,15 @@
 		return false;
 	}
+
+	private static class CheckerData {
+		public String getData(String data)
+		{
+System.out.println(data);
+			return "not implemented yet";
+		}
+		public Boolean match(OsmPrimitive osm)
+		{
+			return false;
+		}
+	}
 }
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/Util.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/Util.java	(revision 9540)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/Util.java	(revision 9561)
@@ -37,25 +37,4 @@
 	}
 
-	/**
-	 * Utility method for creating buttons
-	 * @param name The name of the button
-	 * @param icon Icon of the button
-	 * @param tooltip Tooltip
-	 * @param action The action performed when clicking the button
-	 * @return The created button
-	 */
-    public static JButton createButton(String name, String actionname, String icon, String tooltip, ActionListener action)
-    {
-		JButton button = new JButton(name, ImageProvider.get(icon));
-		button.setActionCommand(actionname);
-		button.addActionListener(action);
-		button.setToolTipText(tr(tooltip));
-		button.setMargin(new Insets(1,1,1,1));
-		button.setIconTextGap(2);
-		button.putClientProperty("help", "Dialog/SelectionList/" + actionname);
-		return button;
-	}
-    
-    
 	/**
 	 * Returns the version
