Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 19564)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 19565)
@@ -1692,22 +1692,27 @@
     public static JPanel getInfoPanel() {
         JPanel pluginTab = new JPanel(new GridBagLayout());
-        for (final PluginInformation info : getPlugins()) {
-            String name = info.name
-            + (!Utils.isEmpty(info.localversion) ? " Version: " + info.localversion : "");
-            pluginTab.add(new JLabel(name), GBC.std());
-            pluginTab.add(Box.createHorizontalGlue(), GBC.std().fill(GridBagConstraints.HORIZONTAL));
-            pluginTab.add(new JButton(new PluginInformationAction(info)), GBC.eol());
-
-            JosmTextArea description = new JosmTextArea(info.description == null ? tr("no description available")
-                    : info.description);
-            description.setEditable(false);
-            description.setFont(new JLabel().getFont().deriveFont(Font.ITALIC));
-            description.setLineWrap(true);
-            description.setWrapStyleWord(true);
-            description.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
-            description.setBackground(UIManager.getColor("Panel.background"));
-            description.setCaretPosition(0);
-
-            pluginTab.add(description, GBC.eop().fill(GridBagConstraints.HORIZONTAL));
+        final List<PluginInformation> plugins = getPlugins();
+        if (plugins.isEmpty()) {
+            pluginTab.add(new JLabel(tr("No plugins installed")), GBC.eol());
+        } else {
+            for (final PluginInformation info : plugins) {
+                String name = info.name
+                + (!Utils.isEmpty(info.localversion) ? " Version: " + info.localversion : "");
+                pluginTab.add(new JLabel(name), GBC.std());
+                pluginTab.add(Box.createHorizontalGlue(), GBC.std().fill(GridBagConstraints.HORIZONTAL));
+                pluginTab.add(new JButton(new PluginInformationAction(info)), GBC.eol());
+
+                JosmTextArea description = new JosmTextArea(info.description == null ? tr("no description available")
+                        : info.description);
+                description.setEditable(false);
+                description.setFont(new JLabel().getFont().deriveFont(Font.ITALIC));
+                description.setLineWrap(true);
+                description.setWrapStyleWord(true);
+                description.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
+                description.setBackground(UIManager.getColor("Panel.background"));
+                description.setCaretPosition(0);
+
+                pluginTab.add(description, GBC.eop().fill(GridBagConstraints.HORIZONTAL));
+            }
         }
         return pluginTab;
Index: trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 19564)
+++ trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 19565)
@@ -14,5 +14,7 @@
 import java.util.stream.Stream;
 
+import javax.swing.JLabel;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 
@@ -174,3 +176,21 @@
         assertEquals("Plugin information", invocationLogEntry[2]);
     }
+
+    /**
+     * Unit test of {@link PluginHandler#getInfoPanel}.
+     */
+    @Test
+    void testGetInfoPanel() {
+        JPanel panel = PluginHandler.getInfoPanel();
+        assertNotNull(panel);
+
+        assertTrue(PluginHandler.getPlugins().isEmpty());
+
+        // if no plugins are loaded in the test environment, the panel should show "No plugins installed"
+        boolean found = Arrays.stream(panel.getComponents())
+            .filter(JLabel.class::isInstance)
+            .map(JLabel.class::cast)
+            .anyMatch(l -> l.getText().equals("No plugins installed"));
+        assertTrue(found, "Should find 'No plugins installed' label");
+    }
 }
