diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
index 963b42bab..c921a2217 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
@@ -189,7 +189,11 @@ private Image getImage() {
                     ImageIcon noIcon = MapPaintStyles.getNoIconIcon(source);
                     img = noIcon == null ? null : noIcon.getImage();
                 } else {
-                    img = rescale(result.getImageIcon(new Dimension(width, height)).getImage());
+                    img = result.getImageIcon(new Dimension(width, height)).getImage();
+                    if (img != null && mustRescale(img)) {
+                        // Scale down large images to 16x16 pixels if no size is explicitly specified
+                        img = result.getImageIconBounded(ImageProvider.ImageSizes.MAP.getImageDimension()).getImage();
+                    }
                 }
                 if (temporary) {
                     disabledImgCache = null;
@@ -300,21 +304,6 @@ public BoxProvider getBoxProvider() {
         return new MapImageBoxProvider();
     }
 
-    /**
-     * Rescale excessively large images.
-     * @param image the unscaled image
-     * @return The scaled down version to 16x16 pixels if the image height and width exceeds 48 pixels and no size has been explicitly specified
-     */
-    private Image rescale(Image image) {
-        if (image == null) return null;
-        // Scale down large (.svg) images to 16x16 pixels if no size is explicitly specified
-        if (mustRescale(image)) {
-            return ImageProvider.createBoundedImage(image, 16);
-        } else {
-            return image;
-        }
-    }
-
     private boolean mustRescale(Image image) {
         return autoRescale && width == -1 && image.getWidth(null) > MAX_SIZE
              && height == -1 && image.getHeight(null) > MAX_SIZE;
diff --git a/src/org/openstreetmap/josm/tools/ImageProvider.java b/src/org/openstreetmap/josm/tools/ImageProvider.java
index 29a55dbe6..67d424bcd 100644
--- a/src/org/openstreetmap/josm/tools/ImageProvider.java
+++ b/src/org/openstreetmap/josm/tools/ImageProvider.java
@@ -660,7 +660,7 @@ public ImageIcon get() {
             Logging.trace("get {0} from {1}", this, Thread.currentThread());
         }
         if (virtualMaxWidth != -1 || virtualMaxHeight != -1)
-            return ir.getImageIcon(new Dimension(virtualMaxWidth, virtualMaxHeight), multiResolution, ImageResizeMode.BOUNDED);
+            return ir.getImageIcon(new Dimension(virtualMaxWidth, virtualMaxHeight), multiResolution, null);
         else
             return ir.getImageIcon(new Dimension(virtualWidth, virtualHeight), multiResolution, ImageResizeMode.AUTO);
     }
@@ -1489,9 +1489,6 @@ static BufferedImage createImageFromSvg(SVGDiagram svg, Dimension dim, ImageResi
             Logging.error("createImageFromSvg: {0} {1} sourceWidth={2} sourceHeight={3}", svg.getXMLBase(), dim, sourceWidth, sourceHeight);
             return null;
         }
-        if (resizeMode == ImageResizeMode.BOUNDED) {
-            resizeMode = ImageResizeMode.BOUNDED_UPSCALE;
-        }
         return resizeMode.createBufferedImage(dim, new Dimension((int) sourceWidth, (int) sourceHeight), g -> {
             try {
                 synchronized (getSvgUniverse()) {
diff --git a/src/org/openstreetmap/josm/tools/ImageResizeMode.java b/src/org/openstreetmap/josm/tools/ImageResizeMode.java
index 2ea8d1e68..d1bcabc2a 100644
--- a/src/org/openstreetmap/josm/tools/ImageResizeMode.java
+++ b/src/org/openstreetmap/josm/tools/ImageResizeMode.java
@@ -13,6 +13,9 @@
  */
 enum ImageResizeMode {
 
+    /**
+     * Calculate proportional dimensions that best fit into the target width and height, retain aspect ratio
+     */
     AUTO {
         @Override
         Dimension computeDimension(Dimension dim, Dimension icon) {
@@ -24,40 +27,31 @@ Dimension computeDimension(Dimension dim, Dimension icon) {
                 return new Dimension(Math.max(1, icon.width * dim.height / icon.height), dim.height);
             } else if (dim.height == -1) {
                 return new Dimension(dim.width, Math.max(1, icon.height * dim.width / icon.width));
+            } else if (icon.getWidth() / dim.getWidth() > icon.getHeight() / dim.getHeight()) {
+                return computeDimension(new Dimension(dim.width, -1), icon);
             } else {
-                return dim;
+                return computeDimension(new Dimension(-1, dim.height), icon);
             }
         }
     },
 
+    /**
+     * Calculate dimensions for the largest image that fit within the bounding box, retain aspect ratio
+     */
     BOUNDED {
-        @Override
-        Dimension computeDimension(Dimension dim, Dimension icon) {
-            final int maxWidth = Math.min(dim.width, icon.width);
-            final int maxHeight = Math.min(dim.height, icon.height);
-            return BOUNDED_UPSCALE.computeDimension(new Dimension(maxWidth, maxHeight), icon);
-        }
-    },
-
-    BOUNDED_UPSCALE {
         @Override
         Dimension computeDimension(Dimension dim, Dimension icon) {
             CheckParameterUtil.ensureThat((dim.width > 0 || dim.width == -1) && (dim.height > 0 || dim.height == -1),
                     () -> dim + " is invalid");
-            final int maxWidth = dim.width;
-            final int maxHeight = dim.height;
-            final Dimension spec;
-            if (maxWidth == -1 || maxHeight == -1) {
-                spec = dim;
-            } else if (icon.getWidth() / maxWidth > icon.getHeight() / maxHeight) {
-                spec = new Dimension(maxWidth, -1);
-            } else {
-                spec = new Dimension(-1, maxHeight);
-            }
-            return AUTO.computeDimension(spec, icon);
+            final int maxWidth = Math.min(dim.width, icon.width);
+            final int maxHeight = Math.min(dim.height, icon.height);
+            return AUTO.computeDimension(new Dimension(maxWidth, maxHeight), icon);
         }
     },
 
+    /**
+     * Position an appropriately scaled image within the bounding box, retain aspect ratio
+     */
     PADDED {
         @Override
         Dimension computeDimension(Dimension dim, Dimension icon) {
diff --git a/src/org/openstreetmap/josm/tools/ImageResource.java b/src/org/openstreetmap/josm/tools/ImageResource.java
index 59d9834d1..f710b7f30 100644
--- a/src/org/openstreetmap/josm/tools/ImageResource.java
+++ b/src/org/openstreetmap/josm/tools/ImageResource.java
@@ -101,11 +101,11 @@ public ImageResource setDisabled(boolean disabled) {
      */
     public void attachImageIcon(AbstractAction a) {
         Dimension iconDimension = ImageProvider.ImageSizes.SMALLICON.getImageDimension();
-        ImageIcon icon = getImageIconBounded(iconDimension);
+        ImageIcon icon = getImageIcon(iconDimension);
         a.putValue(Action.SMALL_ICON, icon);
 
         iconDimension = ImageProvider.ImageSizes.LARGEICON.getImageDimension();
-        icon = getImageIconBounded(iconDimension);
+        icon = getImageIcon(iconDimension);
         a.putValue(Action.LARGE_ICON_KEY, icon);
     }
 
@@ -140,7 +140,7 @@ public ImageIcon getImageIcon() {
      * @see #getImageIconBounded(java.awt.Dimension)
      */
     public ImageIcon getImageIcon(Dimension dim) {
-        return getImageIcon(dim, true, ImageResizeMode.AUTO);
+        return getImageIcon(dim, true, null);
     }
 
     /**
@@ -174,6 +174,12 @@ ImageIcon getImageIconAlreadyScaled(Dimension dim, boolean multiResolution, bool
         CheckParameterUtil.ensureThat((dim.width > 0 || dim.width == -1) && (dim.height > 0 || dim.height == -1),
                 () -> dim + " is invalid");
 
+        if (resizeMode == null && svg != null) {
+            // upscale SVG icons
+            resizeMode = ImageResizeMode.AUTO;
+        } else if (resizeMode == null) {
+            resizeMode = ImageResizeMode.BOUNDED;
+        }
         final int cacheKey = resizeMode.cacheKey(dim);
         BufferedImage img = imgCache.get(cacheKey);
         if (img == null) {
diff --git a/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java b/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
index e4b0bd20e..a318f11c2 100644
--- a/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
+++ b/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
@@ -170,9 +170,9 @@ public void testImageIcon() throws IOException {
         ImageResource resource = new ImageProvider("presets/misc/housenumber_small").getResource();
         testImage(12, 9, "housenumber_small-AUTO-null", resource.getImageIcon());
         testImage(12, 9, "housenumber_small-AUTO-default", resource.getImageIcon(ImageResource.DEFAULT_DIMENSION));
-        testImage(8, 8, "housenumber_small-AUTO-08x08", resource.getImageIcon(new Dimension(8, 8)));
-        testImage(16, 16, "housenumber_small-AUTO-16x16", resource.getImageIcon(new Dimension(16, 16)));
-        testImage(24, 24, "housenumber_small-AUTO-24x24", resource.getImageIcon(new Dimension(24, 24)));
+        testImage(8, 6, "housenumber_small-AUTO-08x08", resource.getImageIcon(new Dimension(8, 8)));
+        testImage(16, 12, "housenumber_small-AUTO-16x16", resource.getImageIcon(new Dimension(16, 16)));
+        testImage(24, 18, "housenumber_small-AUTO-24x24", resource.getImageIcon(new Dimension(24, 24)));
         testImage(36, 27, "housenumber_small-AUTO-36x27", resource.getImageIcon(new Dimension(36, 27)));
     }
 
@@ -184,8 +184,8 @@ public void testImageIcon() throws IOException {
     public void testImageIconBounded() throws IOException {
         ImageResource resource = new ImageProvider("presets/misc/housenumber_small").getResource();
         testImage(8, 6, "housenumber_small-BOUNDED-08x08", resource.getImageIconBounded(new Dimension(8, 8)));
-        testImage(16, 12, "housenumber_small-BOUNDED-16x16", resource.getImageIconBounded(new Dimension(16, 16)));
-        testImage(24, 18, "housenumber_small-BOUNDED-24x24", resource.getImageIconBounded(new Dimension(24, 24)));
+        testImage(12, 9, "housenumber_small-BOUNDED-16x16", resource.getImageIconBounded(new Dimension(16, 16)));
+        testImage(12, 9, "housenumber_small-BOUNDED-24x24", resource.getImageIconBounded(new Dimension(24, 24)));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java b/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
index 2f014281c..9b606ce16 100644
--- a/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
@@ -39,7 +39,7 @@ public void testComputeDimensionAuto() {
         assertEquals(new Dimension(64, 48), ImageResizeMode.AUTO.computeDimension(new Dimension(64, 48), image));
         assertEquals(new Dimension(32, 24), ImageResizeMode.AUTO.computeDimension(new Dimension(32, -1), image));
         assertEquals(new Dimension(21, 16), ImageResizeMode.AUTO.computeDimension(new Dimension(-1, 16), image));
-        assertEquals(new Dimension(24, 32), ImageResizeMode.AUTO.computeDimension(new Dimension(24, 32), image));
+        assertEquals(new Dimension(24, 18), ImageResizeMode.AUTO.computeDimension(new Dimension(24, 32), image));
     }
 
     /**
