diff --git a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
index 1d53b34..84a0f0a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
@@ -76,6 +76,8 @@
     private SideButton ignoreButton;
     /** The select button */
     private SideButton selectButton;
+    /** The lookup button */
+    private SideButton lookupButton;
 
     private final JPopupMenu popupMenu = new JPopupMenu();
     private final transient PopupMenuHandler popupMenuHandler = new PopupMenuHandler(popupMenu);
@@ -114,6 +116,25 @@ public void actionPerformed(ActionEvent e) {
         selectButton.setEnabled(false);
         buttons.add(selectButton);
 
+        lookupButton = new SideButton(new AbstractAction(tr("Lookup")) {
+            {
+                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));
 
         fixButton = new SideButton(new AbstractAction() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java b/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
index 676488b..686c5af 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
@@ -6,6 +6,7 @@
 import java.awt.event.KeyListener;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.Enumeration;
@@ -34,6 +35,9 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 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;
 
 /**
  * A panel that displays the error tree. The selection manager
@@ -342,6 +346,37 @@ public void setErrors(List<TestError> newerrors) {
     }
 
     /**
+     * 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(Collection<OsmPrimitive> primitives) {
+        final Collection<TreePath> paths = new ArrayList<>();
+        walkAndSelectRelatedErrors(new TreePath(getRoot()), Predicates.inCollection(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)) {
+                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
      */
