Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 19656)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 19657)
@@ -1337,5 +1337,5 @@
                 }
                 final ImageSizes size = ImageSizes.TABLE;
-                setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getImageIconBounded(size.getImageDimension()));
+                setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getPaddedIcon(size.getImageDimension()));
             }
             return this;
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 19656)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 19657)
@@ -291,6 +291,6 @@
                 if (result != null) {
                     // Pre-render off EDT to avoid flooding the event queue with expensive SVG rendering
-                    ImageIcon small = result.getImageIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
-                    ImageIcon large = result.getImageIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
+                    ImageIcon small = result.getPaddedIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
+                    ImageIcon large = result.getPaddedIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
                     GuiHelper.runInEDT(() -> {
                         try {
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 19656)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 19657)
@@ -5,4 +5,5 @@
 import static org.openstreetmap.josm.tools.I18n.trc;
 
+import java.awt.Dimension;
 import java.io.File;
 import java.util.Arrays;
@@ -29,4 +30,6 @@
 import org.openstreetmap.josm.gui.util.LruCache;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
+import org.openstreetmap.josm.tools.ImageResource;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -151,14 +154,13 @@
      * @param iconName the icon name
      * @param zipIcons zip file where the image is located
-     * @param maxSize maximum image size (or null)
-     * @return the requested image or null if the request failed
+     * @param maxSize maximum image size (or null for the default small icon size)
+     * @return the requested image, centered in a square of {@code maxSize}, or null if the request failed
      */
     public static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
         final Collection<String> s = TaggingPresets.ICON_SOURCES.get();
-        ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
-        if (maxSize != null && maxSize > 0) {
-            imgProv.setMaxSize(maxSize);
-        }
-        return imgProv.get();
+        final int size = (maxSize != null && maxSize > 0) ? maxSize : ImageSizes.SMALLICON.getVirtualWidth();
+        ImageResource resource = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true)
+                .getResource();
+        return resource == null ? null : resource.getPaddedIcon(new Dimension(size, size));
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 19656)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 19657)
@@ -6,4 +6,5 @@
 import java.awt.Component;
 import java.awt.Font;
+import java.awt.image.BufferedImage;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -14,7 +15,10 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JList;
@@ -143,5 +147,12 @@
                 l.setFont(l.getFont().deriveFont(Font.ITALIC + Font.BOLD));
             }
-            l.setIcon(value.getIcon());
+            Icon icon = value.getIcon();
+            if (icon == null && value.cms != null) {
+                // use a blank icon if other entries have one, so that all texts line up
+                icon = value.cms.presetListEntries.stream().map(PresetListEntry::getIcon).filter(Objects::nonNull).findFirst()
+                        .map(i -> new ImageIcon(new BufferedImage(i.getIconWidth(), i.getIconHeight(), BufferedImage.TYPE_INT_ARGB)))
+                        .orElse(null);
+            }
+            l.setIcon(icon);
             l.setToolTipText(value.getToolTipText(key));
             return l;
Index: /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 19656)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 19657)
@@ -95,6 +95,7 @@
             renderer.accept(g);
         } else if (sourceIcon != null) {
-            sourceIcon = sourceIcon.getScaledInstance(real.width, real.height, Image.SCALE_SMOOTH);
-            g.drawImage(sourceIcon, 0, 0, null);
+            final Dimension scaled = (this == PADDED) ? AUTO.computeDimension(real, icon) : real;
+            sourceIcon = sourceIcon.getScaledInstance(scaled.width, scaled.height, Image.SCALE_SMOOTH);
+            g.drawImage(sourceIcon, (real.width - scaled.width) / 2, (real.height - scaled.height) / 2, null);
         } else {
             throw new IllegalArgumentException("renderer or sourceIcon");
Index: /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java	(revision 19656)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java	(revision 19657)
@@ -7,4 +7,6 @@
 import java.awt.Color;
 
+import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JPanel;
 
@@ -17,4 +19,5 @@
 import org.openstreetmap.josm.testutils.annotations.I18n;
 import org.openstreetmap.josm.testutils.annotations.Main;
+import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 
 /**
@@ -124,4 +127,24 @@
     }
 
+    /**
+     * Entry icons are centered in a square and entries without an icon get a blank one, so that the texts line up.
+     */
+    @Test
+    void testIconAlignment() {
+        final Combo combo = getInstance();
+        combo.key = "highway";
+        PresetListEntry trunk = new PresetListEntry("trunk", combo);
+        trunk.icon = "presets/transport/way/way_trunk.svg";
+        combo.addListEntry(trunk);
+        combo.addListEntry(new PresetListEntry("busway", combo));
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false));
+        JList<PresetListEntry> list = new JList<>();
+        for (PresetListEntry entry : combo.presetListEntries) {
+            JLabel label = (JLabel) combo.combobox.getRenderer().getListCellRendererComponent(list, entry, 0, false, false);
+            assertEquals(ImageSizes.SMALLICON.getAdjustedWidth(), label.getIcon().getIconWidth(), entry.value);
+            assertEquals(ImageSizes.SMALLICON.getAdjustedHeight(), label.getIcon().getIconHeight(), entry.value);
+        }
+    }
+
     @Test
     void testColor() {
Index: /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java	(revision 19656)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java	(revision 19657)
@@ -7,4 +7,5 @@
 
 import java.awt.Dimension;
+import java.awt.image.BufferedImage;
 
 import org.junit.jupiter.api.Test;
@@ -69,4 +70,20 @@
 
     /**
+     * Test method for {@link ImageResizeMode#createBufferedImage} using {@link ImageResizeMode#PADDED} on a raster image
+     */
+    @Test
+    void testCreateBufferedImagePaddedRaster() {
+        BufferedImage source = new BufferedImage(16, 4, BufferedImage.TYPE_INT_RGB); // opaque black
+        BufferedImage padded = ImageResizeMode.PADDED.createBufferedImage(new Dimension(32, 32), new Dimension(16, 4), null, source);
+        assertEquals(32, padded.getWidth());
+        assertEquals(32, padded.getHeight());
+        // aspect ratio is kept: a 32x8 bar centered vertically
+        assertEquals(0, padded.getRGB(16, 11) >>> 24);
+        assertEquals(0xff, padded.getRGB(16, 12) >>> 24);
+        assertEquals(0xff, padded.getRGB(16, 19) >>> 24);
+        assertEquals(0, padded.getRGB(16, 20) >>> 24);
+    }
+
+    /**
      * Test method for {@link ImageResizeMode#cacheKey}
      */
