Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 8681)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 8682)
@@ -77,4 +77,6 @@
     /** The select button */
     private SideButton selectButton;
+    /** The lookup button */
+    private SideButton lookupButton;
 
     private final JPopupMenu popupMenu = new JPopupMenu();
@@ -114,4 +116,23 @@
         selectButton.setEnabled(false);
         buttons.add(selectButton);
+
+        lookupButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, tr("Lookup"));
+                putValue(SHORT_DESCRIPTION, tr("Looks up the the selected primitives in the error list."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                final DataSet ds = Main.main.getCurrentDataSet();
+                if (ds == null) {
+                    return;
+                }
+                tree.selectRelatedErrors(ds.getSelected());
+            }
+        });
+
+        buttons.add(lookupButton);
 
         buttons.add(new SideButton(Main.main.validator.validateAction));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 8681)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 8682)
@@ -7,4 +7,5 @@
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumMap;
@@ -35,4 +36,7 @@
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.MultiMap;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Predicates;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -343,4 +347,36 @@
 
     /**
+     * Selects all errors related to the specified {@code primitives}, i.e. where {@link TestError#getPrimitives()}
+     * returns a primitive present in {@code primitives}.
+     */
+    public void selectRelatedErrors(final Collection<OsmPrimitive> primitives) {
+        final Collection<TreePath> paths = new ArrayList<>();
+        walkAndSelectRelatedErrors(new TreePath(getRoot()), Predicates.inCollection(new HashSet<>(primitives)), paths);
+        getSelectionModel().clearSelection();
+        for (TreePath path : paths) {
+            expandPath(path);
+            getSelectionModel().addSelectionPath(path);
+        }
+    }
+
+    private void walkAndSelectRelatedErrors(final TreePath p, final Predicate<OsmPrimitive> isRelevant, final Collection<TreePath> paths) {
+        final int count = getModel().getChildCount(p.getLastPathComponent());
+        for (int i = 0; i < count; i++) {
+            final Object child = getModel().getChild(p.getLastPathComponent(), i);
+            if (getModel().isLeaf(child) && child instanceof DefaultMutableTreeNode
+                    && ((DefaultMutableTreeNode) child).getUserObject() instanceof TestError) {
+                final TestError error = (TestError) ((DefaultMutableTreeNode) child).getUserObject();
+                if (error.getPrimitives() != null) {
+                    if (Utils.exists(error.getPrimitives(), isRelevant)) {
+                        paths.add(p.pathByAddingChild(child));
+                    }
+                }
+            } else {
+                walkAndSelectRelatedErrors(p.pathByAddingChild(child), isRelevant, paths);
+            }
+        }
+    }
+
+    /**
      * Returns the filter list
      * @return the list of primitives used for filtering
