Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginInstallation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginInstallation.java	(revision 13799)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginInstallation.java	(revision 13799)
@@ -0,0 +1,15 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.plugin;
+
+/**
+ * Plugin installation status, used to filter plugin preferences model.
+ * @since 13799
+ */
+public enum PluginInstallation {
+    /** Plugins installed and loaded **/
+    INSTALLED,
+    /** Plugins not loaded **/
+    AVAILABLE,
+    /** All plugins **/
+    ALL
+}
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(revision 13431)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(revision 13799)
@@ -100,5 +100,7 @@
         hint.setText(
                 "<html>"
-                + tr("Please click on <strong>Download list</strong> to download and display a list of available plugins.")
+                + (model.getAvailablePlugins().isEmpty() ?
+                        tr("Please click on <strong>Download list</strong> to download and display a list of available plugins.") :
+                        tr("The filter returned no results."))
                 + "</html>"
         );
@@ -107,11 +109,9 @@
 
     /**
-     * Refreshes the list.
+     * Displays a list of plugins.
+     * @param displayedPlugins list of plugins
+     * @since 13799
      */
-    public void refreshView() {
-        final Rectangle visibleRect = getVisibleRect();
-        List<PluginInformation> displayedPlugins = model.getDisplayedPlugins();
-        removeAll();
-
+    public void displayPluginList(List<PluginInformation> displayedPlugins) {
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridx = 0;
@@ -119,9 +119,4 @@
         gbc.fill = GridBagConstraints.HORIZONTAL;
         gbc.weightx = 1.0;
-
-        if (displayedPlugins.isEmpty()) {
-            displayEmptyPluginListInformation();
-            return;
-        }
 
         int row = -1;
@@ -164,4 +159,19 @@
             add(description, gbc);
         }
+    }
+
+    /**
+     * Refreshes the list.
+     */
+    public void refreshView() {
+        final Rectangle visibleRect = getVisibleRect();
+        List<PluginInformation> displayedPlugins = model.getDisplayedPlugins();
+        removeAll();
+
+        if (displayedPlugins.isEmpty()) {
+            displayEmptyPluginListInformation();
+        } else {
+            displayPluginList(displayedPlugins);
+        }
         revalidate();
         repaint();
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 13431)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 13799)
@@ -27,4 +27,5 @@
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
@@ -34,4 +35,5 @@
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
@@ -177,4 +179,16 @@
         gc.weightx = 0.0;
         gc.insets = new Insets(0, 0, 0, 3);
+        pnl.add(GBC.glue(0, 0));
+
+        gc.weightx = 1.0;
+        ButtonGroup bg = new ButtonGroup();
+        JPanel radios = new JPanel();
+        addRadioButton(bg, radios, new JRadioButton(tr("All"), true), gc, PluginInstallation.ALL);
+        addRadioButton(bg, radios, new JRadioButton(tr("Installed")), gc, PluginInstallation.INSTALLED);
+        addRadioButton(bg, radios, new JRadioButton(tr("Available")), gc, PluginInstallation.AVAILABLE);
+        pnl.add(radios, gc);
+
+        gc.gridx = 0;
+        gc.weightx = 0.0;
         pnl.add(new JLabel(tr("Search:")), gc);
 
@@ -187,4 +201,13 @@
         tfFilter.getDocument().addDocumentListener(new SearchFieldAdapter());
         return pnl;
+    }
+
+    private void addRadioButton(ButtonGroup bg, JPanel pnl, JRadioButton rb, GridBagConstraints gc, PluginInstallation value) {
+        bg.add(rb);
+        pnl.add(rb, gc);
+        rb.addActionListener(e -> {
+            model.filterDisplayedPlugins(value);
+            pnlPluginPreferences.refreshView();
+        });
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 13431)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 13799)
@@ -29,4 +29,5 @@
     private final Set<String> currentActivePlugins;
     private final List<PluginInformation> availablePlugins = new ArrayList<>();
+    private PluginInstallation filterStatus;
     private String filterExpression;
     private final List<PluginInformation> displayedPlugins = new ArrayList<>();
@@ -44,5 +45,30 @@
 
     /**
-     * Filters the list of displayed plugins.
+     * Filters the list of displayed plugins by installation status.
+     * @param status The filter used against installation status
+     * @since 13799
+     */
+    public void filterDisplayedPlugins(PluginInstallation status) {
+        if (status == null) {
+            displayedPlugins.clear();
+            displayedPlugins.addAll(availablePlugins);
+            this.filterStatus = null;
+            return;
+        }
+        displayedPlugins.clear();
+        for (PluginInformation pi: availablePlugins) {
+            boolean installed = currentActivePlugins.contains(pi.getName());
+            if (PluginInstallation.ALL == status
+            || (PluginInstallation.INSTALLED == status && installed)
+            || (PluginInstallation.AVAILABLE == status && !installed)) {
+                displayedPlugins.add(pi);
+            }
+        }
+        filterStatus = status;
+        fireStateChanged();
+    }
+
+    /**
+     * Filters the list of displayed plugins by text.
      * @param filter The filter used against plugin name, description or version
      */
@@ -78,4 +104,5 @@
     protected final void availablePluginsModified() {
         sort();
+        filterDisplayedPlugins(filterStatus);
         filterDisplayedPlugins(filterExpression);
         Set<String> activePlugins = new HashSet<>();
