Index: src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14821)
+++ src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(working copy)
@@ -18,6 +18,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.swing.AbstractAction;
+import javax.swing.Action;
 import javax.swing.JComponent;
 import javax.swing.JOptionPane;
 import javax.swing.JPopupMenu;
@@ -125,23 +126,7 @@
         selectButton.setEnabled(false);
         buttons.add(selectButton);
 
-        lookupButton = new SideButton(new AbstractAction() {
-            {
-                putValue(NAME, tr("Lookup"));
-                putValue(SHORT_DESCRIPTION, tr("Looks up the selected primitives in the error list."));
-                new ImageProvider("dialogs", "search").getResource().attachImageIcon(this, true);
-            }
-
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
-                if (ds == null) {
-                    return;
-                }
-                tree.selectRelatedErrors(ds.getSelected());
-            }
-        });
-
+        lookupButton = new SideButton(new LookupAction());
         buttons.add(lookupButton);
 
         buttons.add(new SideButton(validateAction));
@@ -180,6 +165,47 @@
         createLayout(tree, true, buttons);
     }
 
+    /**
+     * The action to lookup the selection in the error tree.
+     */
+     class LookupAction extends AbstractAction implements DataSelectionListener {
+
+        LookupAction() {
+            putValue(NAME, tr("Lookup"));
+            putValue(SHORT_DESCRIPTION, tr("Looks up the selected primitives in the error list."));
+            new ImageProvider("dialogs", "search").getResource().attachImageIcon(this, true);
+            SelectionEventManager.getInstance().addSelectionListener(this);
+            updateEnabledState();
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            if (ds == null) {
+                return;
+            }
+            tree.selectRelatedErrors(ds.getSelected());
+        }
+
+        protected void updateEnabledState() {
+            boolean found = false;
+            for (TestError e : tree.getErrors()) {
+                for (OsmPrimitive p : e.getPrimitives()) {
+                    if (p.isSelected()) {
+                        found = true;
+                        break;
+                    }
+                }
+            }
+            setEnabled(found);
+        }
+
+        @Override
+        public void selectionChanged(SelectionChangeEvent event) {
+            updateEnabledState();
+        }
+    }
+
     @Override
     public void showNotify() {
         SelectionEventManager.getInstance().addSelectionListener(this);
@@ -606,4 +632,13 @@
     private static void invalidateValidatorLayers() {
         MainApplication.getLayerManager().getLayersOfType(ValidatorLayer.class).forEach(ValidatorLayer::invalidate);
     }
+
+    @Override
+    public void destroy() {
+        if (lookupButton != null && lookupButton.getAction() instanceof DataSelectionListener) {
+            Action a = lookupButton.getAction();
+            SelectionEventManager.getInstance().removeSelectionListener((DataSelectionListener) a);
+        }
+        super.destroy();
+    }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 14821)
+++ src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(working copy)
@@ -348,7 +348,7 @@
      * @param primitives collection of primitives
      */
     public void selectRelatedErrors(final Collection<OsmPrimitive> primitives) {
-        final Collection<TreePath> paths = new ArrayList<>();
+        final List<TreePath> paths = new ArrayList<>();
         walkAndSelectRelatedErrors(new TreePath(getRoot()), new HashSet<>(primitives)::contains, paths);
         getSelectionModel().clearSelection();
         for (TreePath path : paths) {
@@ -355,6 +355,10 @@
             expandPath(path);
             getSelectionModel().addSelectionPath(path);
         }
+        // make sure that first path is visible
+        if (!paths.isEmpty()) {
+            scrollPathToVisible(paths.get(0));
+        }
     }
 
     private void walkAndSelectRelatedErrors(final TreePath p, final Predicate<OsmPrimitive> isRelevant, final Collection<TreePath> paths) {
