Index: trunk/src/org/openstreetmap/josm/gui/SideButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/SideButton.java	(revision 18098)
+++ trunk/src/org/openstreetmap/josm/gui/SideButton.java	(revision 18099)
@@ -36,5 +36,5 @@
     public SideButton(Action action) {
         super(action);
-        ImageResource icon = (ImageResource) action.getValue("ImageResource");
+        ImageResource icon = ImageResource.getAttachedImageResource(action);
         if (icon != null) {
             setIcon(icon.getImageIconBounded(
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 18098)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 18099)
@@ -12,5 +12,4 @@
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.WindowAdapter;
@@ -55,4 +54,6 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
+import org.openstreetmap.josm.tools.ImageResource;
 import org.openstreetmap.josm.tools.InputMapUtils;
 import org.openstreetmap.josm.tools.Logging;
@@ -451,10 +452,6 @@
 
     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 = getImage("save", false);
-        private final transient Image upld = getImage("upload", false);
-        private final transient Image saveDis = getImage("save", true);
-        private final transient Image upldDis = getImage("upload", true);
+
+        private ImageResource actionImg = null;
 
         SaveAndProceedAction() {
@@ -462,7 +459,6 @@
         }
 
-        Image getImage(String name, boolean disabled) {
-            ImageIcon img = new ImageProvider(name).setDisabled(disabled).setOptional(true).get();
-            return img != null ? img.getImage() : null;
+        ImageResource getImage(String name, boolean disabled) {
+            return new ImageProvider(name).setDisabled(disabled).setOptional(true).getResource();
         }
 
@@ -472,15 +468,15 @@
                     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.getIfAvailable("exit"));
+                    actionImg = new ImageProvider("exit").getResource();
                     break;
                 case RESTART:
                     putValue(NAME, tr("Perform actions before restarting"));
                     putValue(SHORT_DESCRIPTION, tr("Restart JOSM with saving. Unsaved changes are uploaded and/or saved."));
-                    putValue(BASE_ICON, ImageProvider.getIfAvailable("restart"));
+                    actionImg = new ImageProvider("restart").getResource();
                     break;
                 case DELETE:
                     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.getIfAvailable("dialogs", "delete"));
+                    actionImg = new ImageProvider("dialogs", "delete").getResource();
                     break;
             }
@@ -489,15 +485,24 @@
 
         public void redrawIcon() {
-            ImageIcon base = ((ImageIcon) getValue(BASE_ICON));
-            BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
+            ImageResource uploadImg = model.getLayersToUpload().isEmpty() ? getImage("upload", true) : getImage("upload", false);
+            ImageResource saveImg = model.getLayersToSave().isEmpty() ? getImage("save", true) : getImage("save", false);
+            attachImageIcon(SMALL_ICON, ImageSizes.SMALLICON, uploadImg, saveImg, actionImg);
+            attachImageIcon(LARGE_ICON_KEY, ImageSizes.LARGEICON, uploadImg, saveImg, actionImg);
+        }
+
+        private void attachImageIcon(String key, ImageSizes size, ImageResource uploadImg, ImageResource saveImg, ImageResource actionImg) {
+            Dimension dim = size.getImageDimension();
+            BufferedImage newIco = new BufferedImage((int) dim.getWidth()*3, (int) dim.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
             Graphics2D g = newIco.createGraphics();
-            // 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);
-            if (base != null) {
-                g.drawImage(base.getImage(),                                  ICON_SIZE*2, 0, ICON_SIZE, ICON_SIZE, null);
-            }
-            // CHECKSTYLE.ON: SingleSpaceSeparator
-            putValue(SMALL_ICON, new ImageIcon(newIco));
+            drawImageIcon(g, 0, dim, uploadImg);
+            drawImageIcon(g, 1, dim, saveImg);
+            drawImageIcon(g, 2, dim, actionImg);
+            putValue(key, new ImageIcon(newIco));
+        }
+
+        private void drawImageIcon(Graphics2D g, int index, Dimension dim, ImageResource img) {
+            if (img != null) {
+                g.drawImage(img.getImageIcon(dim).getImage(), (int) dim.getWidth()*index, 0, (int) dim.getWidth(), (int) dim.getHeight(), null);
+            }
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 18098)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 18099)
@@ -221,6 +221,11 @@
     }
 
+    /**
+     * Returns the {@link ImageResource} attached to this preset, if any.
+     * @return the {@code ImageResource} attached to this preset, or {@code null}
+     * @since 16060
+     */
     public final ImageResource getImageResource() {
-        return (ImageResource) getValue("ImageResource");
+        return ImageResource.getAttachedImageResource(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/ImageResource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageResource.java	(revision 18098)
+++ trunk/src/org/openstreetmap/josm/tools/ImageResource.java	(revision 18099)
@@ -15,4 +15,6 @@
 import javax.swing.JPanel;
 import javax.swing.UIManager;
+
+import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 
 import com.kitfox.svg.SVGDiagram;
@@ -101,11 +103,6 @@
      */
     public void attachImageIcon(AbstractAction a) {
-        Dimension iconDimension = ImageProvider.ImageSizes.SMALLICON.getImageDimension();
-        ImageIcon icon = getImageIcon(iconDimension);
-        a.putValue(Action.SMALL_ICON, icon);
-
-        iconDimension = ImageProvider.ImageSizes.LARGEICON.getImageDimension();
-        icon = getImageIcon(iconDimension);
-        a.putValue(Action.LARGE_ICON_KEY, icon);
+        a.putValue(Action.SMALL_ICON, getImageIcon(ImageSizes.SMALLICON.getImageDimension()));
+        a.putValue(Action.LARGE_ICON_KEY, getImageIcon(ImageSizes.LARGEICON.getImageDimension()));
     }
 
@@ -121,4 +118,14 @@
             a.putValue("ImageResource", this);
         }
+    }
+
+    /**
+     * Returns the {@code ImageResource} attached to the given action, if any.
+     * @param a action
+     * @return the {@code ImageResource} attached to the given action, or {@code null}
+     * @since 18099
+     */
+    public static ImageResource getAttachedImageResource(Action a) {
+        return (ImageResource) a.getValue("ImageResource");
     }
 
