Index: applications/editors/josm/plugins/validator/build.xml
===================================================================
--- applications/editors/josm/plugins/validator/build.xml	(revision 12768)
+++ applications/editors/josm/plugins/validator/build.xml	(revision 12777)
@@ -42,5 +42,5 @@
 	<attribute name="Plugin-Description" value="A OSM data validator"/>
 	<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
-        <attribute name="Plugin-Mainversion" value="1180"/>
+        <attribute name="Plugin-Mainversion" value="1200"/>
 	<attribute name="Plugin-Date" value="${version.entry.commit.date}"/>
 	<attribute name="Author" value="Francisco R. Santos"/>
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java	(revision 12768)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java	(revision 12777)
@@ -44,4 +44,5 @@
 import org.openstreetmap.josm.plugins.validator.tests.SelfIntersectingWay;
 import org.openstreetmap.josm.plugins.validator.tests.SimilarNamedWays;
+import org.openstreetmap.josm.plugins.validator.tests.TagChecker;
 import org.openstreetmap.josm.plugins.validator.tests.UnclosedWays;
 import org.openstreetmap.josm.plugins.validator.tests.UnconnectedWays;
@@ -94,4 +95,5 @@
             WronglyOrderedWays.class, // ID 1001 .. 1099
             UnclosedWays.class, // ID 1101 .. 1199
+            TagChecker.class, // ID 1201 .. 1299
             UnconnectedWays.class, // ID 1301 .. 1399
     };
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/PreferenceEditor.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/PreferenceEditor.java	(revision 12768)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/PreferenceEditor.java	(revision 12777)
@@ -102,8 +102,10 @@
 		StringBuilder tests = new StringBuilder();
 		StringBuilder testsBeforeUpload = new StringBuilder();
+		Boolean res = false;
 
 		for (Test test : allTests)
 		{
-			test.ok();
+			if(test.ok())
+			    res = false;
 			String name = test.getClass().getSimpleName();
 			tests.append( ',' ).append( name ).append( '=' ).append( test.enabled );
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/Test.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/Test.java	(revision 12768)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/Test.java	(revision 12777)
@@ -155,8 +155,9 @@
 	 * Called when the used submits the preferences
 	 */
-	public void ok() 
+	public boolean ok()
 	{
 		enabled = checkEnabled.isSelected();
 		testBeforeUpload = checkBeforeUpload.isSelected();
+		return false;
 	}
 	
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 12768)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java	(revision 12777)
@@ -81,4 +81,5 @@
 	public static final String PREF_CHECK_COMPLEX = PREFIX + ".checkComplex";
 	public static final String PREF_CHECK_FIXMES = PREFIX + ".checkFixmes";
+	public static final String PREF_CHECK_PAINT = PREFIX + ".paint";
 
 	public static final String PREF_SOURCES = PREFIX + ".sources";
@@ -86,8 +87,9 @@
 	public static final String PREF_USE_SPELL_FILE = PREFIX + ".usespellfile";
 
-	public static final String PREF_CHECK_KEYS_BEFORE_UPLOAD = PREFIX + ".checkKeysBeforeUpload";
-	public static final String PREF_CHECK_VALUES_BEFORE_UPLOAD = PREFIX + ".checkValuesBeforeUpload";
-	public static final String PREF_CHECK_COMPLEX_BEFORE_UPLOAD = PREFIX + ".checkComplexBeforeUpload";
-	public static final String PREF_CHECK_FIXMES_BEFORE_UPLOAD = PREFIX + ".checkFixmesBeforeUpload";
+	public static final String PREF_CHECK_KEYS_BEFORE_UPLOAD = PREF_CHECK_KEYS + "BeforeUpload";
+	public static final String PREF_CHECK_VALUES_BEFORE_UPLOAD = PREF_CHECK_VALUES + "BeforeUpload";
+	public static final String PREF_CHECK_COMPLEX_BEFORE_UPLOAD = PREF_CHECK_COMPLEX + "BeforeUpload";
+	public static final String PREF_CHECK_FIXMES_BEFORE_UPLOAD = PREF_CHECK_FIXMES + "BeforeUpload";
+	public static final String PREF_CHECK_PAINT_BEFORE_UPLOAD = PREF_CHECK_PAINT + "BeforeUpload";
 
 	protected boolean checkKeys = false;
@@ -95,4 +97,5 @@
 	protected boolean checkComplex = false;
 	protected boolean checkFixmes = false;
+	protected boolean checkPaint = false;
 
 	protected JCheckBox prefCheckKeys;
@@ -100,4 +103,5 @@
 	protected JCheckBox prefCheckComplex;
 	protected JCheckBox prefCheckFixmes;
+	protected JCheckBox prefCheckPaint;
 
 	protected JCheckBox prefCheckKeysBeforeUpload;
@@ -105,4 +109,5 @@
 	protected JCheckBox prefCheckComplexBeforeUpload;
 	protected JCheckBox prefCheckFixmesBeforeUpload;
+	protected JCheckBox prefCheckPaintBeforeUpload;
 
 	protected JCheckBox prefUseDataFile;
@@ -120,4 +125,5 @@
 	protected static int INVALID_KEY_SPACE = 1205;
 	protected static int INVALID_HTML      = 1206;
+	protected static int PAINT             = 1207;
 	/** 1250 and up is used by tagcheck */
 
@@ -278,4 +284,11 @@
 
 	@Override
+	public void visit(Relation n)
+	{
+		checkPrimitive(n);
+	}
+
+
+	@Override
 	public void visit(Way w)
 	{
@@ -305,4 +318,15 @@
 			}
 		}
+		if(checkPaint && p.errors != null)
+		{
+			for(String s: p.errors)
+			{
+				/* passing translated text also to original string, as we already
+				translated the stuff before. Makes the ignore file language dependend. */
+				errors.add( new TestError(this, Severity.WARNING, tr("Painting problem"),
+				s, s, PAINT, p) );
+				withErrors.add(p, "P");
+			}
+		}
 
 		Map<String, String> props = (p.keys == null) ? Collections.<String, String>emptyMap() : p.keys;
@@ -383,4 +407,8 @@
 		if( isBeforeUpload )
 			checkFixmes = checkFixmes && Main.pref.getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true);
+
+		checkPaint = Main.pref.getBoolean(PREF_CHECK_PAINT, true);
+		if( isBeforeUpload )
+			checkPaint = checkPaint && Main.pref.getBoolean(PREF_CHECK_PAINT_BEFORE_UPLOAD, true);
 	}
 
@@ -520,4 +548,12 @@
 		testPanel.add(prefCheckFixmesBeforeUpload, a);
 
+		prefCheckPaint = new JCheckBox(tr("Check for paint notes."), Main.pref.getBoolean(PREF_CHECK_PAINT, true));
+		prefCheckPaint.setToolTipText(tr("Check if map paining found data errors."));
+		testPanel.add(prefCheckPaint, GBC.std().insets(20,0,0,0));
+
+		prefCheckPaintBeforeUpload = new JCheckBox();
+		prefCheckPaintBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_PAINT_BEFORE_UPLOAD, true));
+		testPanel.add(prefCheckPaintBeforeUpload, a);
+
 		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)."));
@@ -540,5 +576,5 @@
 
 	@Override
-	public void ok()
+	public boolean ok()
 	{
 		enabled = prefCheckKeys.isSelected() || prefCheckValues.isSelected() || prefCheckComplex.isSelected() || prefCheckFixmes.isSelected();
@@ -550,8 +586,10 @@
 		Main.pref.put(PREF_CHECK_KEYS, prefCheckKeys.isSelected());
 		Main.pref.put(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected());
+		Main.pref.put(PREF_CHECK_PAINT, prefCheckPaint.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_CHECK_PAINT_BEFORE_UPLOAD, prefCheckPaintBeforeUpload.isSelected());
 		Main.pref.put(PREF_USE_DATA_FILE, prefUseDataFile.isSelected());
 		Main.pref.put(PREF_USE_SPELL_FILE, prefUseSpellFile.isSelected());
@@ -566,5 +604,5 @@
 		if(sources.length() == 0)
 			sources = null;
-		Main.pref.put(PREF_SOURCES, sources );
+		return Main.pref.put(PREF_SOURCES, sources);
 	}
 
Index: applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/AgregatePrimitivesVisitor.java
===================================================================
--- applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/AgregatePrimitivesVisitor.java	(revision 12768)
+++ applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/AgregatePrimitivesVisitor.java	(revision 12777)
@@ -3,5 +3,5 @@
 import java.util.Collection;
 import java.util.Comparator;
-import java.util.TreeSet;
+import java.util.LinkedList;
 
 import org.openstreetmap.josm.data.osm.*;
@@ -25,5 +25,5 @@
 	public AgregatePrimitivesVisitor() 
 	{
-		aggregatedData = new TreeSet<OsmPrimitive>( new PrimitiveComparator());
+		aggregatedData = new LinkedList<OsmPrimitive>();
 	}
 
@@ -45,16 +45,19 @@
 	public void visit(Node n) 
 	{
-		aggregatedData.add(n);
+		if(!aggregatedData.contains(n))
+			aggregatedData.add(n);
 	}
 
 	public void visit(Way w) 
 	{
-		aggregatedData.add(w);
-		for (Node n : w.nodes)
-			visit(n);
+		if(!aggregatedData.contains(w))
+		{
+			aggregatedData.add(w);
+			for (Node n : w.nodes)
+				visit(n);
+		}
 	}
 
 	public void visit(Relation r) {
-		// Relations can be cyclic so don't visit them twice.
 		if (!aggregatedData.contains(r)) {
 			aggregatedData.add(r);
@@ -64,25 +67,3 @@
 		}
 	}
-
-	/**
-	 * A comparator that orders nodes first, ways last.
-	 * 
-	 * @author frsantos
-	 */
-	class PrimitiveComparator implements Comparator<OsmPrimitive>
-	{
-		public int compare(OsmPrimitive o1, OsmPrimitive o2) 
-		{
-			if( o1 instanceof Node)
-			{
-				return o2 instanceof Node ? o1.hashCode() - o2.hashCode() : -1;
-			}
-			else if( o1 instanceof Way)
-			{
-				return o2 instanceof Way ? o1.hashCode() - o2.hashCode() : 1;
-			} else {
-				return o1.hashCode() - o2.hashCode();
-			}
-		}
-	}
 }
