Index: src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(revision 17702)
+++ src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(working copy)
@@ -3,13 +3,19 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.Rectangle;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.swing.JLabel;
 import javax.swing.SwingConstants;
@@ -38,7 +44,17 @@
 
     private final transient PluginPreferencesModel model;
 
+    /** Whether the plugin list has been built up already in the UI */
+    private boolean pluginListInitialized = false;
+
     /**
+     * A map from the plugin information to the UI components that are used to display that information.
+     *
+     * Used to selectively hide filtered elements.
+     */
+    private final Map<PluginInformation, List<Component>> componentsForPlugin = new HashMap<>();
+
+    /**
      * Constructs a new {@code PluginListPanel} with a default model.
      */
     public PluginListPanel() {
@@ -104,6 +120,9 @@
                         tr("The filter returned no results."))
                 + "</html>"
         );
+        List<Component> components = new ArrayList<>(1);
+        components.add(hint);
+        componentsForPlugin.put(null, components);
         add(hint, gbc);
     }
 
@@ -121,6 +140,7 @@
 
         int row = -1;
         for (final PluginInformation pi : displayedPlugins) {
+            List<Component> components = new ArrayList<>(3);
             boolean selected = model.isSelectedPlugin(pi.getName());
             String remoteversion = formatPluginRemoteVersion(pi);
             String localversion = formatPluginLocalVersion(model.getPluginInformation(pi.getName()));
@@ -141,10 +161,12 @@
             gbc.insets = new Insets(5, 5, 0, 5);
             gbc.weighty = 0.0;
             gbc.weightx = 0.0;
+            components.add(cbPlugin);
             add(cbPlugin, gbc);
 
             gbc.gridx = 1;
             gbc.weightx = 1.0;
+            components.add(lblPlugin);
             add(lblPlugin, gbc);
 
             HtmlPanel description = new HtmlPanel();
@@ -156,8 +178,12 @@
             gbc.gridy = ++row;
             gbc.insets = new Insets(3, 25, 5, 5);
             gbc.weighty = 1.0;
+            components.add(description);
             add(description, gbc);
+            componentsForPlugin.put(pi, components);
         }
+
+        pluginListInitialized = true;
     }
 
     /**
@@ -166,18 +192,36 @@
     public void refreshView() {
         final Rectangle visibleRect = getVisibleRect();
         List<PluginInformation> displayedPlugins = model.getDisplayedPlugins();
-        removeAll();
 
         if (displayedPlugins.isEmpty()) {
+            hidePluginsNotInList(new ArrayList<>());
             displayEmptyPluginListInformation();
+        } else if (!pluginListInitialized) {
+            removeAll();
+            displayPluginList(displayedPlugins);
         } else {
-            displayPluginList(displayedPlugins);
+            hidePluginsNotInList(displayedPlugins);
         }
         revalidate();
         repaint();
         SwingUtilities.invokeLater(() -> scrollRectToVisible(visibleRect));
     }
 
+    private void hidePluginsNotInList(List<PluginInformation> displayedPlugins) {
+        Set<PluginInformation> displayedPluginsSet = new HashSet<>(displayedPlugins);
+        componentsForPlugin.forEach((pi, components) -> {
+            if (displayedPluginsSet.contains(pi)) {
+                for (Component component : components) {
+                    component.setVisible(true);
+                }
+            } else {
+                for (Component component : components) {
+                    component.setVisible(false);
+                }
+            }
+        });
+    }
+
     @Override
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
         return visibleRect.height / 4;
