Index: /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 16996)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 16997)
@@ -1490,4 +1490,7 @@
             return null;
         }
+        if (resizeMode == ImageResizeMode.BOUNDED) {
+            resizeMode = ImageResizeMode.BOUNDED_UPSCALE;
+        }
         return resizeMode.createBufferedImage(dim, new Dimension((int) sourceWidth, (int) sourceHeight), g -> {
             try {
Index: /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 16996)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 16997)
@@ -33,8 +33,17 @@
         @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 = Math.min(dim.width, icon.width);
-            final int maxHeight = Math.min(dim.height, icon.height);
+            final int maxWidth = dim.width;
+            final int maxHeight = dim.height;
             final Dimension spec;
             if (maxWidth == -1 || maxHeight == -1) {
Index: /trunk/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java	(revision 16996)
+++ /trunk/test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java	(revision 16997)
@@ -185,6 +185,6 @@
         ImageResource resource = new ImageProvider("presets/misc/housenumber_small").getResource();
         testImage(8, 6, "housenumber_small-BOUNDED-08x08", resource.getImageIconBounded(new Dimension(8, 8)));
-        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)));
+        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)));
     }
 
@@ -261,6 +261,7 @@
         GuiSizesHelper.setPixelDensity(guiScale);
         Point hotSpot = new Point();
-        final UnaryOperator<Dimension> bestCursorSizeFunction = dim -> dim;
+        UnaryOperator<Dimension> bestCursorSizeFunction = dim -> dim;
         Image image = ImageProvider.getCursorImage("normal", "selection", bestCursorSizeFunction, hotSpot);
+        bestCursorSizeFunction = dim -> new Dimension((int) (dim.width * guiScale), (int) (dim.height * guiScale));
         assertCursorDimensionsCorrect(new Point.Double(3.0, 2.0), image, bestCursorSizeFunction, hotSpot);
         assertImageEquals("cursor", getReferenceFile("cursor-normal-selection-" + Math.round(guiScale * 10)),
