Index: trunk/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java	(revision 17228)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java	(revision 17229)
@@ -149,4 +149,12 @@
     }
 
+    /**
+     * Determines whether this tab may be hidden (since it does not contain any relevant content)
+     * @return whether this tab may be hidden
+     */
+    protected boolean canBeHidden() {
+        return false;
+    }
+
     @Override
     public String getHelpContext() {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 17228)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 17229)
@@ -20,4 +20,5 @@
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.OptionalInt;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -318,10 +319,13 @@
     }
 
-    private void selectTabBy(Predicate<TabPreferenceSetting> predicate) {
-        IntStream.range(0, getTabCount())
+    private OptionalInt indexOfTab(Predicate<TabPreferenceSetting> predicate) {
+        return IntStream.range(0, getTabCount())
                 .filter(i -> getComponentAt(i) instanceof PreferenceTab
                         && predicate.test(((PreferenceTab) getComponentAt(i)).getTabPreferenceSetting()))
-                .findFirst()
-                .ifPresent(this::setSelectedIndex);
+                .findFirst();
+    }
+
+    private void selectTabBy(Predicate<TabPreferenceSetting> predicate) {
+        indexOfTab(predicate).ifPresent(this::setSelectedIndex);
     }
 
@@ -537,4 +541,15 @@
                 Logging.warn("Ignoring preferences "+setting);
             }
+        }
+        // Hide empty TabPreferenceSetting (only present for plugins)
+        for (DefaultTabPreferenceSetting tps : Utils.filteredCollection(settings, DefaultTabPreferenceSetting.class)) {
+            if (!tps.canBeHidden() || Utils.filteredCollection(settings, SubPreferenceSetting.class).stream()
+                    .anyMatch(s -> s.getTabPreferenceSetting(this) == tps)) {
+                continue;
+            }
+            indexOfTab(tps::equals).ifPresent(index -> {
+                remove(index);
+                Logging.debug("{0}: hiding empty {1}", getClass().getSimpleName(), tps);
+            });
         }
         if (sel != null) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java	(revision 17228)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java	(revision 17229)
@@ -48,3 +48,8 @@
         return HelpUtil.ht("/Preferences/Display");
     }
+
+    @Override
+    protected boolean canBeHidden() {
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java	(revision 17228)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java	(revision 17229)
@@ -47,3 +47,8 @@
         return HelpUtil.ht("/Preferences/Map");
     }
+
+    @Override
+    protected boolean canBeHidden() {
+        return true;
+    }
 }
