Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ErrorTreePanel.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ErrorTreePanel.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ErrorTreePanel.java	(revision 11530)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.plugins.validator;
 
+import java.awt.event.MouseEvent;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -7,9 +8,7 @@
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
-import java.util.Map;
 import java.util.Map.Entry;
-
-import java.awt.event.MouseEvent;
 
 import javax.swing.JTree;
@@ -20,4 +19,5 @@
 import javax.swing.tree.TreeSelectionModel;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.plugins.validator.util.Bag;
 import org.openstreetmap.josm.plugins.validator.util.MultipleNameVisitor;
@@ -31,310 +31,297 @@
  */
 
-public class ErrorTreePanel extends JTree
-{
-	/** Serializable ID */
-	private static final long serialVersionUID = 2952292777351992696L;
-
-	/**
-	 * The validation data.
-	 */
-	protected DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
-
-	/** The list of errors shown in the tree */
-	private List<TestError> errors;
-	/**
-	 * Constructor
-	 * @param errors The list of errors
-	 */
-	public ErrorTreePanel(List<TestError> errors)
-	{
-		ToolTipManager.sharedInstance().registerComponent(this);
-		this.setModel(treeModel);
-		this.setRootVisible(false);
-		this.setShowsRootHandles(true);
-		this.expandRow(0);
-		this.setVisibleRowCount(8);
-		this.setCellRenderer(new ErrorTreeRenderer());
-		this.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
-		setErrorList(errors);
-	}
-
-	public String getToolTipText(MouseEvent e) {
-		String res = null;
-		TreePath path = getPathForLocation(e.getX(), e.getY());
-		if (path != null)
-		{
-			DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
-			Object nodeInfo = node.getUserObject();
-
-			if (nodeInfo instanceof TestError)
-			{
-				TestError error = (TestError)nodeInfo;
-				MultipleNameVisitor v = new MultipleNameVisitor();
-				v.visit(error.getPrimitives());
-				res = "<html>" + v.getText() + "<br>" + error.getMessage();
-				String d = error.getDescription();
-				if(d != null)
-					res += "<br>" + d;
-				res += "</html>";
-			}
-			else
-				res = node.toString();
-		}
-		return res;
-	}
-
-	/** Constructor */
-	public ErrorTreePanel()
-	{
-		this(null);
-	}
-
-	@Override
-	public void setVisible(boolean v)
-	{
-		if (v)
-			buildTree();
-		else 
-			treeModel.setRoot(new DefaultMutableTreeNode());
-		super.setVisible(v);
-	}
-
-	/**
-	 * Builds the errors tree
-	 */
-	public void buildTree()
-	{
-		DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
-
-		if( errors == null || errors.isEmpty() )
-		{
-			treeModel.setRoot(rootNode);
-			return;
-		}
-
-		// Remember the currently expanded rows
-		Set<Object> oldSelectedRows = new HashSet<Object>();
-		Enumeration<TreePath> expanded = getExpandedDescendants( new TreePath(getRoot()) );
-		if( expanded != null )
-		{
-			while( expanded.hasMoreElements() )
-			{
-				TreePath path = expanded.nextElement();
-				DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); 
-				Object userObject = node.getUserObject();
-				if( userObject instanceof Severity )
-					oldSelectedRows.add(userObject);
-				else if (userObject instanceof String)
-				{
-					String msg = (String)userObject;
-					msg = msg.substring(0, msg.lastIndexOf(" ("));
-					oldSelectedRows.add(msg);
-				}
-			}
-		}
-
-		Map<Severity, Bag<String, TestError>> errorTree
-		= new HashMap<Severity, Bag<String, TestError>>();
-		Map<Severity, HashMap<String, Bag<String, TestError>>> errorTreeDeep
-		= new HashMap<Severity, HashMap<String, Bag<String, TestError>>>();
-		for(Severity s : Severity.values())
-		{
-			errorTree.put(s, new Bag<String, TestError>(20));
-			errorTreeDeep.put(s, new HashMap<String, Bag<String, TestError>>());
-		}
-
-		for(TestError e : errors)
-		{
-			if(e.getIgnored())
-				continue;
-			Severity s = e.getSeverity();
-			String d = e.getDescription();
-			String m = e.getMessage();
-			if(d != null)
-			{
-				Bag<String, TestError> b = errorTreeDeep.get(s).get(m);
-				if(b == null)
-				{
-					b = new Bag<String, TestError>(20);
-					errorTreeDeep.get(s).put(m, b);
-				}
-				b.add(d, e);
-			}
-			else
-				errorTree.get(s).add(m, e);
-		}
-
-		List<TreePath> expandedPaths = new ArrayList<TreePath>();
-		for(Severity s : Severity.values())
-		{
-			Bag<String, TestError> severityErrors = errorTree.get(s);
-			Map<String, Bag<String, TestError>> severityErrorsDeep = errorTreeDeep.get(s);
-			if(severityErrors.isEmpty() && severityErrorsDeep.isEmpty())
-				continue;
-
-			// Severity node
-			DefaultMutableTreeNode severityNode = new DefaultMutableTreeNode(s);
-			rootNode.add(severityNode);
-
-			if( oldSelectedRows.contains(s))
-				expandedPaths.add( new TreePath( new Object[] {rootNode, severityNode} ) );
-
-			for(Entry<String, List<TestError>> msgErrors : severityErrors.entrySet()  )
-			{
-				// Message node
-				List<TestError> errors = msgErrors.getValue();
-				String msg = msgErrors.getKey() + " (" + errors.size() + ")";
-				DefaultMutableTreeNode messageNode = new DefaultMutableTreeNode(msg);
-				severityNode.add(messageNode);
-
-				if( oldSelectedRows.contains(msgErrors.getKey()))
-				{
-					 expandedPaths.add( new TreePath( new Object[]
-					 {rootNode, severityNode, messageNode} ) );
-				}
-
-				for (TestError error : errors) 
-				{
-					// Error node
-					DefaultMutableTreeNode errorNode = new DefaultMutableTreeNode(error);
-					messageNode.add(errorNode);
-				}
-			}
-			for(Entry<String, Bag <String, TestError>> bag : severityErrorsDeep.entrySet())
-			{
-				// Group node
-				Bag <String, TestError> errorlist = bag.getValue();
-				DefaultMutableTreeNode groupNode = null;
-				if(errorlist.size() > 1)
-				{
-					String nmsg = bag.getKey() + " (" + errorlist.size() + ")";
-					groupNode = new DefaultMutableTreeNode(nmsg);
-					severityNode.add(groupNode);
-					if( oldSelectedRows.contains(bag.getKey()))
-					{
-						 expandedPaths.add( new TreePath( new Object[]
-						 {rootNode, severityNode, groupNode} ) );
-					}
-				}
-
-				for(Entry<String, List<TestError>> msgErrors : errorlist.entrySet())
-				{
-					// Message node
-					List<TestError> errors = msgErrors.getValue();
-					String msg;
-					if(groupNode != null)
-						msg = msgErrors.getKey() + " (" + errors.size() + ")";
-					else
-						msg = msgErrors.getKey() + " - " + bag.getKey() + " (" + errors.size() + ")";
-					DefaultMutableTreeNode messageNode = new DefaultMutableTreeNode(msg);
-					if(groupNode != null)
-						groupNode.add(messageNode);
-					else
-						severityNode.add(messageNode);
-
-					if( oldSelectedRows.contains(msgErrors.getKey()))
-					{
-						if(groupNode != null)
-						{
-							expandedPaths.add(new TreePath(new Object[]
-							{rootNode, severityNode, groupNode, messageNode}));
-						}
-						else
-						{
-							expandedPaths.add(new TreePath(new Object[]
-							{rootNode, severityNode, messageNode}));
-						}
-					}
-
-					for (TestError error : errors) 
-					{
-						// Error node
-						DefaultMutableTreeNode errorNode = new DefaultMutableTreeNode(error);
-						messageNode.add(errorNode);
-					}
-				}
-			}
-		}
-
-		treeModel.setRoot(rootNode);
-		for( TreePath path : expandedPaths)
-		{
-			this.expandPath(path);
-		}
-	}
-
-	/**
-	 * Sets the errors list used by a data layer
-	 * @param errors The error list that is used by a data layer
-	 */
-	public void setErrorList(List<TestError> errors)
-	{
-		this.errors = errors;
-		if( isVisible() )
-			buildTree();
-	}
-
-	/**
-	 * Clears the current error list and adds these errors to it
-	 * @param errors The validation errors
-	 */
-	public void setErrors(List<TestError> newerrors)
-	{
-		if(errors == null)
-			return;
-		errors.clear();
-		for(TestError error : newerrors)
-		{
-			if(!error.getIgnored())
-				errors.add(error);
-		}
-		if( isVisible() )
-			buildTree();
-	}
-
-	/**
-	 * Returns the errors of the tree
-	 * @return  the errors of the tree
-	 */
-	public List<TestError> getErrors()
-	{
-		return errors != null ? errors : Collections.<TestError>emptyList();
-	}
-
-	/**
-	 * Updates the current errors list
-	 * @param errors The validation errors
-	 */
-	public void resetErrors()
-	{
-		List<TestError> e = new ArrayList<TestError>(errors);
-		setErrors(e);
-	}
-
-	/**
-	 * Expands all tree
-	 */
-	@SuppressWarnings("unchecked")
-	public void expandAll()
-	{
-		DefaultMutableTreeNode root = getRoot();
-
-		int row = 0;
-		Enumeration<DefaultMutableTreeNode> children = root.breadthFirstEnumeration();
-		while( children.hasMoreElements() )
-		{
-			children.nextElement();
-			expandRow(row++);
-		}
-	}
-
-	/**
-	 * Returns the root node model.
-	 * @return The root node model
-	 */
-	public DefaultMutableTreeNode getRoot()
-	{
-		return (DefaultMutableTreeNode) treeModel.getRoot();
-	}
+public class ErrorTreePanel extends JTree {
+    /** Serializable ID */
+    private static final long serialVersionUID = 2952292777351992696L;
+
+    /**
+     * The validation data.
+     */
+    protected DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
+
+    /** The list of errors shown in the tree */
+    private List<TestError> errors;
+
+    /**
+     * If {@link #filter} is not <code>null</code> only errors are displayed 
+     * that refer to one of the primitives in the filter.  
+     */
+    private Set<OsmPrimitive> filter = null;
+
+    /**
+     * Constructor
+     * @param errors The list of errors
+     */
+    public ErrorTreePanel(List<TestError> errors) {
+        ToolTipManager.sharedInstance().registerComponent(this);
+        this.setModel(treeModel);
+        this.setRootVisible(false);
+        this.setShowsRootHandles(true);
+        this.expandRow(0);
+        this.setVisibleRowCount(8);
+        this.setCellRenderer(new ErrorTreeRenderer());
+        this.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
+        setErrorList(errors);
+    }
+
+    public String getToolTipText(MouseEvent e) {
+        String res = null;
+        TreePath path = getPathForLocation(e.getX(), e.getY());
+        if (path != null) {
+            DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
+            Object nodeInfo = node.getUserObject();
+
+            if (nodeInfo instanceof TestError) {
+                TestError error = (TestError) nodeInfo;
+                MultipleNameVisitor v = new MultipleNameVisitor();
+                v.visit(error.getPrimitives());
+                res = "<html>" + v.getText() + "<br>" + error.getMessage();
+                String d = error.getDescription();
+                if (d != null)
+                    res += "<br>" + d;
+                res += "</html>";
+            } else
+                res = node.toString();
+        }
+        return res;
+    }
+
+    /** Constructor */
+    public ErrorTreePanel() {
+        this(null);
+    }
+
+    @Override
+    public void setVisible(boolean v) {
+        if (v)
+            buildTree();
+        else
+            treeModel.setRoot(new DefaultMutableTreeNode());
+        super.setVisible(v);
+    }
+
+    /**
+     * Builds the errors tree
+     */
+    public void buildTree() {
+        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
+
+        if (errors == null || errors.isEmpty()) {
+            treeModel.setRoot(rootNode);
+            return;
+        }
+
+        // Remember the currently expanded rows
+        Set<Object> oldSelectedRows = new HashSet<Object>();
+        Enumeration<TreePath> expanded = getExpandedDescendants(new TreePath(getRoot()));
+        if (expanded != null) {
+            while (expanded.hasMoreElements()) {
+                TreePath path = expanded.nextElement();
+                DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
+                Object userObject = node.getUserObject();
+                if (userObject instanceof Severity)
+                    oldSelectedRows.add(userObject);
+                else if (userObject instanceof String) {
+                    String msg = (String) userObject;
+                    msg = msg.substring(0, msg.lastIndexOf(" ("));
+                    oldSelectedRows.add(msg);
+                }
+            }
+        }
+
+        Map<Severity, Bag<String, TestError>> errorTree = new HashMap<Severity, Bag<String, TestError>>();
+        Map<Severity, HashMap<String, Bag<String, TestError>>> errorTreeDeep = new HashMap<Severity, HashMap<String, Bag<String, TestError>>>();
+        for (Severity s : Severity.values()) {
+            errorTree.put(s, new Bag<String, TestError>(20));
+            errorTreeDeep.put(s, new HashMap<String, Bag<String, TestError>>());
+        }
+
+        for (TestError e : errors) {
+            if (e.getIgnored())
+                continue;
+            Severity s = e.getSeverity();
+            String d = e.getDescription();
+            String m = e.getMessage();
+            if (filter != null) {
+                boolean found = false;
+                for (OsmPrimitive p : e.getPrimitives()) {
+                    if (filter.contains(p)) {
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found)
+                    continue;
+            }
+            if (d != null) {
+                Bag<String, TestError> b = errorTreeDeep.get(s).get(m);
+                if (b == null) {
+                    b = new Bag<String, TestError>(20);
+                    errorTreeDeep.get(s).put(m, b);
+                }
+                b.add(d, e);
+            } else
+                errorTree.get(s).add(m, e);
+        }
+
+        List<TreePath> expandedPaths = new ArrayList<TreePath>();
+        for (Severity s : Severity.values()) {
+            Bag<String, TestError> severityErrors = errorTree.get(s);
+            Map<String, Bag<String, TestError>> severityErrorsDeep = errorTreeDeep.get(s);
+            if (severityErrors.isEmpty() && severityErrorsDeep.isEmpty())
+                continue;
+
+            // Severity node
+            DefaultMutableTreeNode severityNode = new DefaultMutableTreeNode(s);
+            rootNode.add(severityNode);
+
+            if (oldSelectedRows.contains(s))
+                expandedPaths.add(new TreePath(new Object[] { rootNode, severityNode }));
+
+            for (Entry<String, List<TestError>> msgErrors : severityErrors.entrySet()) {
+                // Message node
+                List<TestError> errors = msgErrors.getValue();
+                String msg = msgErrors.getKey() + " (" + errors.size() + ")";
+                DefaultMutableTreeNode messageNode = new DefaultMutableTreeNode(msg);
+                severityNode.add(messageNode);
+
+                if (oldSelectedRows.contains(msgErrors.getKey())) {
+                    expandedPaths.add(new TreePath(new Object[] { rootNode, severityNode, messageNode }));
+                }
+
+                for (TestError error : errors) {
+                    // Error node
+                    DefaultMutableTreeNode errorNode = new DefaultMutableTreeNode(error);
+                    messageNode.add(errorNode);
+                }
+            }
+            for (Entry<String, Bag<String, TestError>> bag : severityErrorsDeep.entrySet()) {
+                // Group node
+                Bag<String, TestError> errorlist = bag.getValue();
+                DefaultMutableTreeNode groupNode = null;
+                if (errorlist.size() > 1) {
+                    String nmsg = bag.getKey() + " (" + errorlist.size() + ")";
+                    groupNode = new DefaultMutableTreeNode(nmsg);
+                    severityNode.add(groupNode);
+                    if (oldSelectedRows.contains(bag.getKey())) {
+                        expandedPaths.add(new TreePath(new Object[] { rootNode, severityNode, groupNode }));
+                    }
+                }
+
+                for (Entry<String, List<TestError>> msgErrors : errorlist.entrySet()) {
+                    // Message node
+                    List<TestError> errors = msgErrors.getValue();
+                    String msg;
+                    if (groupNode != null)
+                        msg = msgErrors.getKey() + " (" + errors.size() + ")";
+                    else
+                        msg = msgErrors.getKey() + " - " + bag.getKey() + " (" + errors.size() + ")";
+                    DefaultMutableTreeNode messageNode = new DefaultMutableTreeNode(msg);
+                    if (groupNode != null)
+                        groupNode.add(messageNode);
+                    else
+                        severityNode.add(messageNode);
+
+                    if (oldSelectedRows.contains(msgErrors.getKey())) {
+                        if (groupNode != null) {
+                            expandedPaths.add(new TreePath(new Object[] { rootNode, severityNode, groupNode,
+                                    messageNode }));
+                        } else {
+                            expandedPaths.add(new TreePath(new Object[] { rootNode, severityNode, messageNode }));
+                        }
+                    }
+
+                    for (TestError error : errors) {
+                        // Error node
+                        DefaultMutableTreeNode errorNode = new DefaultMutableTreeNode(error);
+                        messageNode.add(errorNode);
+                    }
+                }
+            }
+        }
+
+        treeModel.setRoot(rootNode);
+        for (TreePath path : expandedPaths) {
+            this.expandPath(path);
+        }
+    }
+
+    /**
+     * Sets the errors list used by a data layer
+     * @param errors The error list that is used by a data layer
+     */
+    public void setErrorList(List<TestError> errors) {
+        this.errors = errors;
+        if (isVisible())
+            buildTree();
+    }
+
+    /**
+     * Clears the current error list and adds these errors to it
+     * @param errors The validation errors
+     */
+    public void setErrors(List<TestError> newerrors) {
+        if (errors == null)
+            return;
+        errors.clear();
+        for (TestError error : newerrors) {
+            if (!error.getIgnored())
+                errors.add(error);
+        }
+        if (isVisible())
+            buildTree();
+    }
+
+    /**
+     * Returns the errors of the tree
+     * @return  the errors of the tree
+     */
+    public List<TestError> getErrors() {
+        return errors != null ? errors : Collections.<TestError> emptyList();
+    }
+
+    public Set<OsmPrimitive> getFilter() {
+        return filter;
+    }
+
+    public void setFilter(Set<OsmPrimitive> filter) {
+        if (filter != null && filter.size() == 0)
+            this.filter = null;
+        else
+            this.filter = filter;
+        if (isVisible())
+            buildTree();
+    }
+
+    /**
+     * Updates the current errors list
+     * @param errors The validation errors
+     */
+    public void resetErrors() {
+        List<TestError> e = new ArrayList<TestError>(errors);
+        setErrors(e);
+    }
+
+    /**
+     * Expands all tree
+     */
+    @SuppressWarnings("unchecked")
+    public void expandAll() {
+        DefaultMutableTreeNode root = getRoot();
+
+        int row = 0;
+        Enumeration<DefaultMutableTreeNode> children = root.breadthFirstEnumeration();
+        while (children.hasMoreElements()) {
+            children.nextElement();
+            expandRow(row++);
+        }
+    }
+
+    /**
+     * Returns the root node model.
+     * @return The root node model
+     */
+    public DefaultMutableTreeNode getRoot() {
+        return (DefaultMutableTreeNode) treeModel.getRoot();
+    }
 }
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/PreferenceEditor.java	(revision 11530)
@@ -5,8 +5,10 @@
 import java.awt.GridBagLayout;
 import java.util.Collection;
-import java.util.Map;
-import java.util.regex.Pattern;
 
-import javax.swing.*;
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
 
 import org.openstreetmap.josm.Main;
@@ -43,4 +45,10 @@
 	/** The preferences key for enabled tests before upload*/
 	public static final String PREF_TESTS_BEFORE_UPLOAD = PREFIX + ".testsBeforeUpload";
+
+	/**
+	 * The preferences key for enabling the permanent filtering
+	 * of the displayed errors in the tree regarding the current selection 
+	 */
+    public static final String PREF_FILTER_BY_SELECTION = PREFIX + ".selectionFilter";
 
 	private JCheckBox prefUseIgnore;
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/Test.java	(revision 11530)
@@ -1,6 +1,4 @@
 package org.openstreetmap.josm.plugins.validator;
 
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -11,5 +9,8 @@
 
 import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.data.osm.*;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.tools.GBC;
@@ -78,5 +79,5 @@
 	 * @throws Exception When cannot initialize the test
 	 */ 
-	public static void initialize(@SuppressWarnings("unused") OSMValidatorPlugin plugin) throws Exception {}
+	public static void initialize(OSMValidatorPlugin plugin) throws Exception {}
 	
 	/**
@@ -138,5 +139,5 @@
 	 * @param testPanel The panel to add any preferences component
 	 */
-	public void addGui(@SuppressWarnings("unused") JPanel testPanel) 
+	public void addGui(JPanel testPanel) 
 	{
 		checkEnabled = new JCheckBox(name, enabled);
@@ -166,5 +167,5 @@
 	 * @return The command to fix the error
 	 */
-	public Command fixError(@SuppressWarnings("unused") TestError testError)
+	public Command fixError(TestError testError)
 	{
 		return null;
@@ -177,5 +178,5 @@
 	 * @return true if the error can be fixed
 	 */
-	public boolean isFixable(@SuppressWarnings("unused") TestError testError)
+	public boolean isFixable(TestError testError)
 	{
 		return false;
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateAction.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateAction.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateAction.java	(revision 11530)
@@ -83,5 +83,5 @@
         }
 
-        List<TestError> errors = new ArrayList<TestError>();
+        List<TestError> errors = new ArrayList<TestError>(200);
         for (Test test : tests) {
             test.setPartialSelection(lastSelection != null);
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateUploadHook.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateUploadHook.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidateUploadHook.java	(revision 11530)
@@ -4,6 +4,6 @@
 
 import java.awt.GridBagLayout;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.ArrayList;
 import java.util.List;
 
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.UploadAction.UploadHook;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.plugins.validator.util.AgregatePrimitivesVisitor;
@@ -110,5 +111,5 @@
 			plugin.validationDialog.tree.setErrors(errors);
 			plugin.validationDialog.setVisible(true);
-			Main.ds.fireSelectionChanged(Main.ds.getSelected());
+			DataSet.fireSelectionChanged(Main.ds.getSelected());
 		}
 		return res == JOptionPane.YES_OPTION;
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ValidatorDialog.java	(revision 11530)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -43,5 +44,5 @@
  * @author frsantos
  */
-public class ValidatorDialog extends ToggleDialog implements ActionListener {
+public class ValidatorDialog extends ToggleDialog implements ActionListener, SelectionChangedListener {
     private OSMValidatorPlugin plugin;
 
@@ -108,4 +109,5 @@
         }
         add(buttonPanel, BorderLayout.SOUTH);
+        DataSet.selListeners.add(this);
     }
 
@@ -428,3 +430,12 @@
         }
     }
+
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        if (!Main.pref.getBoolean(PreferenceEditor.PREF_FILTER_BY_SELECTION, false))
+            return;
+        if (newSelection == null || newSelection.size() == 0)
+            tree.setFilter(null);
+        HashSet<OsmPrimitive> filter = new HashSet<OsmPrimitive>(newSelection);
+        tree.setFilter(filter);
+    }
 }
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java	(revision 11530)
@@ -5,9 +5,17 @@
 import java.awt.geom.Line2D;
 import java.awt.geom.Point2D;
-import java.util.*;
-
-import org.openstreetmap.josm.data.osm.*;
-import org.openstreetmap.josm.plugins.validator.*;
-import org.openstreetmap.josm.plugins.validator.util.Bag;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WaySegment;
+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.util.Util;
 
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java	(revision 11530)
@@ -3,15 +3,15 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.DeleteCommand;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+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.Severity;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.DeleteCommand;
-import org.openstreetmap.josm.command.ChangeCommand;
-import java.util.Collections;
-import java.util.Arrays;
 
 public class DuplicatedWayNodes extends Test {
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java	(revision 11530)
@@ -3,17 +3,19 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.Node;
 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;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.tools.Pair;
 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.util.Bag;
+import org.openstreetmap.josm.tools.Pair;
 
 /**
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java	(revision 11530)
@@ -4,15 +4,13 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
 import java.io.BufferedReader;
-import java.io.InputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.InputStreamReader;
-import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-import java.lang.IllegalStateException;
-import java.net.URL;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -33,7 +31,8 @@
 import javax.swing.JList;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.JPanel;
-
+
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -47,5 +46,4 @@
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.io.MirroredInputStream;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.validator.OSMValidatorPlugin;
 import org.openstreetmap.josm.plugins.validator.PreferenceEditor;
@@ -53,11 +51,8 @@
 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.Entities;
 import org.openstreetmap.josm.plugins.validator.util.Util;
-import org.openstreetmap.josm.plugins.validator.util.Entities;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.XmlObjectParser;
-import org.xml.sax.SAXException;
 
 /**
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/WronglyOrderedWays.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/WronglyOrderedWays.java	(revision 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/WronglyOrderedWays.java	(revision 11530)
@@ -3,6 +3,6 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.geom.Point2D;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -12,5 +12,4 @@
 import org.openstreetmap.josm.plugins.validator.TestError;
 import org.openstreetmap.josm.plugins.validator.util.Bag;
-import org.openstreetmap.josm.plugins.validator.util.Util;
 
 /**
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 11529)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/util/Util.java	(revision 11530)
@@ -1,20 +1,16 @@
 package org.openstreetmap.josm.plugins.validator.util;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Insets;
-import java.awt.event.ActionListener;
 import java.awt.geom.Point2D;
-import java.util.*;
-
-import javax.swing.JButton;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.plugins.*;
-import org.openstreetmap.josm.plugins.validator.PreferenceEditor;
-import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.plugins.PluginInformation;
 
 /**
