Index: src/org/openstreetmap/josm/gui/MainFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainFrame.java	(revision 10504)
+++ src/org/openstreetmap/josm/gui/MainFrame.java	(working copy)
@@ -90,15 +90,15 @@
 
         setJMenuBar(menu);
         geometry.applySafe(this);
-        List<Image> l = new LinkedList<>();
-        l.add(ImageProvider.get("logo_16x16x32").getImage());
-        l.add(ImageProvider.get("logo_16x16x8").getImage());
-        l.add(ImageProvider.get("logo_32x32x32").getImage());
-        l.add(ImageProvider.get("logo_32x32x8").getImage());
-        l.add(ImageProvider.get("logo_48x48x32").getImage());
-        l.add(ImageProvider.get("logo_48x48x8").getImage());
-        l.add(ImageProvider.get("logo").getImage());
-        setIconImages(l);
+        List<Image> appIcons = new LinkedList<>();
+        appIcons.add(new ImageProvider("logo_16x16x32").getSourceImage());
+        appIcons.add(new ImageProvider("logo_16x16x8").getSourceImage());
+        appIcons.add(new ImageProvider("logo_32x32x32").getSourceImage());
+        appIcons.add(new ImageProvider("logo_32x32x8").getSourceImage());
+        appIcons.add(new ImageProvider("logo_48x48x32").getSourceImage());
+        appIcons.add(new ImageProvider("logo_48x48x8").getSourceImage());
+        appIcons.add(new ImageProvider("logo").getSourceImage());
+        setIconImages(appIcons);
         addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosing(final WindowEvent arg0) {
Index: src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 10504)
+++ src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(working copy)
@@ -7,15 +7,12 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.Graphics2D;
 import java.awt.GraphicsEnvironment;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-import java.awt.image.BufferedImage;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.List;
@@ -27,7 +24,6 @@
 
 import javax.swing.AbstractAction;
 import javax.swing.DefaultListCellRenderer;
-import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
@@ -51,8 +47,10 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.EmptyImageProvider;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageOverlay;
 import org.openstreetmap.josm.tools.UserCancelException;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
@@ -379,12 +377,9 @@
     }
 
     final class SaveAndProceedAction extends AbstractAction implements PropertyChangeListener {
-        private static final int ICON_SIZE = 24;
         private static final String BASE_ICON = "BASE_ICON";
-        private final transient Image save = ImageProvider.get("save").getImage();
-        private final transient Image upld = ImageProvider.get("upload").getImage();
-        private final transient Image saveDis = new ImageProvider("save").setDisabled(true).get().getImage();
-        private final transient Image upldDis = new ImageProvider("upload").setDisabled(true).get().getImage();
+        private final transient ImageProvider saveImage = new ImageProvider("save");
+        private final transient ImageProvider uploadImage = new ImageProvider("upload");
 
         SaveAndProceedAction() {
             initForSaveAndExit();
@@ -393,7 +388,7 @@
         public void initForSaveAndExit() {
             putValue(NAME, tr("Perform actions before exiting"));
             putValue(SHORT_DESCRIPTION, tr("Exit JOSM with saving. Unsaved changes are uploaded and/or saved."));
-            putValue(BASE_ICON, ImageProvider.get("exit"));
+            putValue(BASE_ICON, new ImageProvider("exit"));
             redrawIcon();
         }
 
@@ -400,20 +395,26 @@
         public void initForSaveAndDelete() {
             putValue(NAME, tr("Perform actions before deleting"));
             putValue(SHORT_DESCRIPTION, tr("Save/Upload layers before deleting. Unsaved changes are not lost."));
-            putValue(BASE_ICON, ImageProvider.get("dialogs", "delete"));
+            putValue(BASE_ICON, new ImageProvider("dialogs", "delete"));
             redrawIcon();
         }
 
         public void redrawIcon() {
-            Image base = ((ImageIcon) getValue(BASE_ICON)).getImage();
-            BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
-            Graphics2D g = newIco.createGraphics();
+            ImageProvider firstIcon = uploadImage.setDisabled( model.getLayersToUpload().isEmpty() );
+            ImageProvider secondIcon = saveImage.setDisabled( model.getLayersToSave().isEmpty() );
+            ImageProvider thirdIcon = (ImageProvider)getValue(BASE_ICON);
+
+            int iconWidth = ImageProvider.ImageSizes.LARGEICON.getVirtualWidth() * 3;
+            int iconHeight = ImageProvider.ImageSizes.LARGEICON.getVirtualHeight();
+            final ImageProvider imageProvider = new EmptyImageProvider(iconWidth, iconHeight);
+
             // CHECKSTYLE.OFF: SingleSpaceSeparator
-            g.drawImage(model.getLayersToUpload().isEmpty() ? upldDis : upld, ICON_SIZE*0, 0, ICON_SIZE, ICON_SIZE, null);
-            g.drawImage(model.getLayersToSave().isEmpty()   ? saveDis : save, ICON_SIZE*1, 0, ICON_SIZE, ICON_SIZE, null);
-            g.drawImage(base,                                                 ICON_SIZE*2, 0, ICON_SIZE, ICON_SIZE, null);
+            imageProvider.addOverlay(new ImageOverlay(firstIcon,  0,     0, 1f/3f, 1));
+            imageProvider.addOverlay(new ImageOverlay(secondIcon, 1f/3f, 0, 2f/3f, 1));
+            imageProvider.addOverlay(new ImageOverlay(thirdIcon,  2f/3f, 0,     1, 1));
             // CHECKSTYLE.ON: SingleSpaceSeparator
-            putValue(SMALL_ICON, new ImageIcon(newIco));
+
+            putValue(SMALL_ICON, imageProvider.get());
         }
 
         @Override
Index: src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 10504)
+++ src/org/openstreetmap/josm/tools/ImageProvider.java	(working copy)
@@ -680,6 +680,19 @@
     }
 
     /**
+     * Get source image without processing (no scaling, no disabling, no layering).
+     * SVG source is raseterized without scaling.
+     *
+     * @return original image or rasterized SVG
+     */
+    public Image getSourceImage() {
+        final ImageResource imageResource = getResource();
+        if(imageResource == null) return null;
+
+        return imageResource.getSourceImage();
+    }
+
+    /**
      * Load the image in a background thread.
      *
      * This method returns immediately and runs the image request
@@ -783,6 +796,17 @@
     }
 
     /**
+     * Create an empty image with a given size.
+     *
+     * @param width target image width
+     * @param height target image height
+     * @return The requested Image.
+     */
+    public static Image getEmptyImage(int width, int height) {
+        return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+    }
+
+    /**
      * Load an image with a given file name, but do not throw an exception
      * when the image cannot be found.
      *
Index: src/org/openstreetmap/josm/tools/ImageResource.java
===================================================================
--- src/org/openstreetmap/josm/tools/ImageResource.java	(revision 10504)
+++ src/org/openstreetmap/josm/tools/ImageResource.java	(working copy)
@@ -60,28 +60,9 @@
      */
     public ImageResource(Image img) {
         CheckParameterUtil.ensureParameterNotNull(img);
-        baseImage = scaleBaseImageIfNeeded(img);
+        baseImage = img;
     }
 
-    /** Scale image according to screen DPI if needed.
-     *
-     * @param img an image loaded from file (it's width and height are virtual pixels)
-     * @return original img if virtual size is the same as real size or new image resized to real pixels
-     */
-    private static Image scaleBaseImageIfNeeded(Image img) {
-        int imgWidth = img.getWidth(null);
-        int imgHeight = img.getHeight(null);
-        int realWidth = GuiSizesHelper.getSizeDpiAdjusted(imgWidth);
-        int realHeight = GuiSizesHelper.getSizeDpiAdjusted(imgHeight);
-        if (realWidth != -1 && realHeight != -1 && imgWidth != realWidth && imgHeight != realHeight) {
-            Image realImage = img.getScaledInstance(realWidth, realHeight, Image.SCALE_SMOOTH);
-            BufferedImage bimg = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_INT_ARGB);
-            bimg.getGraphics().drawImage(realImage, 0, 0, null);
-            return bimg;
-        }
-        return img;
-    }
-
     /**
      * Constructs a new {@code ImageResource} from SVG data.
      * @param svg SVG data
@@ -152,6 +133,23 @@
     }
 
     /**
+     * Get source image without processing (no scaling, no disabling, no layering).
+     * SVG source is raseterized without scaling.
+     *
+     * @return base image or rasterized base SVG
+     */
+    public Image getSourceImage() {
+        if (baseImage != null) {
+            return baseImage;
+        }
+        if(svg != null) {
+            Dimension sourceDimension = new Dimension((int) svg.getWidth(), (int) svg.getHeight());
+            return ImageProvider.createImageFromSvg(svg, sourceDimension);
+        }
+        throw new IllegalArgumentException("Empty image data");
+    }
+
+    /**
      * Get an ImageIcon object for the image of this resource
      * @param  dim The requested dimensions. Use (-1,-1) for the original size and (width, -1)
      *         to set the width, but otherwise scale the image proportionally.
