Index: src/org/openstreetmap/josm/actions/AboutAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AboutAction.java	(revision 10394)
+++ src/org/openstreetmap/josm/actions/AboutAction.java	(working copy)
@@ -102,7 +102,7 @@
         // Intermediate panel to allow proper optionPane resizing
         JPanel panel = new JPanel(new GridBagLayout());
         panel.setPreferredSize(new Dimension(890, 300));
-        panel.add(new JLabel("", new ImageProvider("logo.svg").setSize(ImageProvider.ImageSizes.ABOUT_LOGO).get(),
+        panel.add(new JLabel("", ImageProvider.get("logo.svg", ImageProvider.ImageSizes.ABOUT_LOGO),
                 JLabel.CENTER), GBC.std().insets(0, 5, 0, 0));
         panel.add(about, GBC.std().fill());
 
Index: src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java	(revision 10394)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java	(working copy)
@@ -69,7 +69,7 @@
         Main.map.selectMapMode(Main.map.mapModeSelect);
 
         NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Create new note"), tr("Create note"));
-        dialog.showNoteDialog(tr("Enter a detailed comment to create a note"), NotesDialog.ICON_NEW);
+        dialog.showNoteDialog(tr("Enter a detailed comment to create a note"), ImageProvider.get("dialogs/notes", "note_new"));
 
         if (dialog.getValue() != 1) {
             Main.debug("User aborted note creation");
Index: src/org/openstreetmap/josm/gui/SideButton.java
===================================================================
--- src/org/openstreetmap/josm/gui/SideButton.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/SideButton.java	(working copy)
@@ -55,11 +55,9 @@
      * @since 2710
      */
     public SideButton(Action action, boolean usename) {
-        super(action);
+        this(action);
         if (!usename) {
             setText(null);
-            fixIcon(action);
-            doStyle();
         }
     }
 
@@ -71,8 +69,7 @@
      */
     public SideButton(Action action, String imagename) {
         super(action);
-        ImageProvider prov = new ImageProvider("dialogs", imagename);
-        setIcon(prov.setSize(ImageProvider.ImageSizes.SIDEBUTTON).get());
+        setIcon(ImageProvider.get("dialogs", imagename, ImageProvider.ImageSizes.SIDEBUTTON));
         doStyle();
     }
 
Index: src/org/openstreetmap/josm/gui/SplashScreen.java
===================================================================
--- src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/SplashScreen.java	(working copy)
@@ -67,7 +67,7 @@
         contentPane.add(innerContentPane);
 
         // Add the logo
-        JLabel logo = new JLabel(new ImageProvider("logo.svg").setSize(ImageProvider.ImageSizes.SPLASH_LOGO).get());
+        JLabel logo = new JLabel(ImageProvider.get("logo.svg", ImageProvider.ImageSizes.SPLASH_LOGO));
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridheight = 2;
         gbc.insets = new Insets(0, 0, 0, 70);
Index: src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(working copy)
@@ -5,7 +5,6 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -56,26 +55,6 @@
  */
 public class NotesDialog extends ToggleDialog implements LayerChangeListener {
 
-    /** Small icon size for use in graphics calculations */
-    public static final int ICON_SMALL_SIZE = 16;
-    /** 24x24 icon for unresolved notes */
-    public static final ImageIcon ICON_OPEN = ImageProvider.get("dialogs/notes", "note_open");
-    /** 16x16 icon for unresolved notes */
-    public static final ImageIcon ICON_OPEN_SMALL =
-            new ImageIcon(ICON_OPEN.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** 24x24 icon for resolved notes */
-    public static final ImageIcon ICON_CLOSED = ImageProvider.get("dialogs/notes", "note_closed");
-    /** 16x16 icon for resolved notes */
-    public static final ImageIcon ICON_CLOSED_SMALL =
-            new ImageIcon(ICON_CLOSED.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** 24x24 icon for new notes */
-    public static final ImageIcon ICON_NEW = ImageProvider.get("dialogs/notes", "note_new");
-    /** 16x16 icon for new notes */
-    public static final ImageIcon ICON_NEW_SMALL =
-            new ImageIcon(ICON_NEW.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** Icon for note comments */
-    public static final ImageIcon ICON_COMMENT = ImageProvider.get("dialogs/notes", "note_comment");
-
     private NoteTableModel model;
     private JList<Note> displayList;
     private final AddCommentAction addCommentAction;
@@ -256,11 +235,11 @@
                 }
                 ImageIcon icon;
                 if (note.getId() < 0) {
-                    icon = ICON_NEW_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_new", ImageProvider.ImageSizes.SMALLICON);
                 } else if (note.getState() == State.CLOSED) {
-                    icon = ICON_CLOSED_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_closed", ImageProvider.ImageSizes.SMALLICON);
                 } else {
-                    icon = ICON_OPEN_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
                 }
                 jlabel.setIcon(icon);
             }
@@ -312,7 +291,7 @@
         AddCommentAction() {
             putValue(SHORT_DESCRIPTION, tr("Add comment"));
             putValue(NAME, tr("Comment"));
-            putValue(SMALL_ICON, ICON_COMMENT);
+            putValue(SMALL_ICON, ImageProvider.get("dialogs/notes", "note_comment"));
         }
 
         @Override
@@ -326,7 +305,7 @@
                 return;
             }
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Comment on note"), tr("Add comment"));
-            dialog.showNoteDialog(tr("Add comment to note:"), NotesDialog.ICON_COMMENT);
+            dialog.showNoteDialog(tr("Add comment to note:"), ImageProvider.get("dialogs/notes", "note_comment"));
             if (dialog.getValue() != 1) {
                 return;
             }
@@ -344,13 +323,13 @@
         CloseAction() {
             putValue(SHORT_DESCRIPTION, tr("Close note"));
             putValue(NAME, tr("Close"));
-            putValue(SMALL_ICON, ICON_CLOSED);
+            putValue(SMALL_ICON, ImageProvider.get("dialogs/notes", "note_closed"));
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Close note"), tr("Close note"));
-            dialog.showNoteDialog(tr("Close note with message:"), NotesDialog.ICON_CLOSED);
+            dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed"));
             if (dialog.getValue() != 1) {
                 return;
             }
@@ -369,7 +348,7 @@
         NewAction() {
             putValue(SHORT_DESCRIPTION, tr("Create a new note"));
             putValue(NAME, tr("Create"));
-            putValue(SMALL_ICON, ICON_NEW);
+            putValue(SMALL_ICON, ImageProvider.get("dialogs/notes", "note_new"));
         }
 
         @Override
@@ -389,13 +368,13 @@
         ReopenAction() {
             putValue(SHORT_DESCRIPTION, tr("Reopen note"));
             putValue(NAME, tr("Reopen"));
-            putValue(SMALL_ICON, ICON_OPEN);
+            putValue(SMALL_ICON, ImageProvider.get("dialogs/notes", "note_open"));
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Reopen note"), tr("Reopen note"));
-            dialog.showNoteDialog(tr("Reopen note with message:"), NotesDialog.ICON_OPEN);
+            dialog.showNoteDialog(tr("Reopen note with message:"), ImageProvider.get("dialogs/notes", "note_open"));
             if (dialog.getValue() != 1) {
                 return;
             }
Index: src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(working copy)
@@ -506,7 +506,7 @@
             add(lblMinimized);
 
             // scale down the dialog icon
-            ImageIcon icon = new ImageProvider("dialogs", iconName).setSize(ImageProvider.ImageSizes.SMALLICON).get();
+            ImageIcon icon = ImageProvider.get("dialogs", iconName, ImageProvider.ImageSizes.SMALLICON);
             lblTitle = new JLabel("", icon, JLabel.TRAILING);
             lblTitle.setIconTextGap(8);
 
@@ -544,7 +544,7 @@
 
             // show the pref button if applicable
             if (preferenceClass != null) {
-                JButton pref = new JButton(new ImageProvider("preference").setSize(ImageProvider.ImageSizes.SMALLICON).get());
+                JButton pref = new JButton(ImageProvider.get("preference", ImageProvider.ImageSizes.SMALLICON));
                 pref.setToolTipText(tr("Open preferences for this panel"));
                 pref.setBorder(BorderFactory.createEmptyBorder());
                 pref.addActionListener(
Index: src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(working copy)
@@ -32,7 +32,7 @@
     public RecentlyOpenedFilesMenu() {
         super(tr("Open Recent"));
         setToolTipText(tr("List of recently opened files"));
-        setIcon(new ImageProvider("openrecent").setSize(ImageProvider.ImageSizes.MENU).get());
+        setIcon(ImageProvider.get("openrecent", ImageProvider.ImageSizes.MENU));
         putClientProperty("help", ht("/Action/OpenRecent"));
 
         // build dynamically
Index: src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(working copy)
@@ -385,13 +385,10 @@
         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 BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
-        private final transient Image upldDis = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
+        private final transient Image saveDis = new ImageProvider("save").setDisabled(true).get().getImage();
+        private final transient Image upldDis = new ImageProvider("upload").setDisabled(true).get().getImage();
 
         SaveAndProceedAction() {
-            // get disabled versions of icons
-            new JLabel(ImageProvider.get("save")).getDisabledIcon().paintIcon(new JPanel(), saveDis.getGraphics(), 0, 0);
-            new JLabel(ImageProvider.get("upload")).getDisabledIcon().paintIcon(new JPanel(), upldDis.getGraphics(), 0, 0);
             initForSaveAndExit();
         }
 
Index: src/org/openstreetmap/josm/gui/layer/NoteLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(working copy)
@@ -36,10 +36,12 @@
 import org.openstreetmap.josm.gui.io.AbstractIOTask;
 import org.openstreetmap.josm.gui.io.UploadNoteLayerTask;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.gui.util.GuiSizesHelper;
 import org.openstreetmap.josm.io.NoteExporter;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.XmlWriter;
 import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -106,16 +108,19 @@
 
     @Override
     public void paint(Graphics2D g, MapView mv, Bounds box) {
+        final int iconHeight = GuiSizesHelper.getSizeDpiAdjusted( ImageProvider.ImageSizes.SMALLICON.getVirtualHeight() );
+        final int iconWidth  = GuiSizesHelper.getSizeDpiAdjusted( ImageProvider.ImageSizes.SMALLICON.getVirtualWidth() );
+
         for (Note note : noteData.getNotes()) {
             Point p = mv.getPoint(note.getLatLon());
 
             ImageIcon icon;
             if (note.getId() < 0) {
-                icon = NotesDialog.ICON_NEW_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_new", ImageProvider.ImageSizes.SMALLICON);
             } else if (note.getState() == State.CLOSED) {
-                icon = NotesDialog.ICON_CLOSED_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_closed", ImageProvider.ImageSizes.SMALLICON);
             } else {
-                icon = NotesDialog.ICON_OPEN_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
             }
             int width = icon.getIconWidth();
             int height = icon.getIconHeight();
@@ -150,11 +155,11 @@
             Point p = mv.getPoint(noteData.getSelectedNote().getLatLon());
 
             g.setColor(ColorHelper.html2color(Main.pref.get("color.selected")));
-            g.drawRect(p.x - (NotesDialog.ICON_SMALL_SIZE / 2), p.y - NotesDialog.ICON_SMALL_SIZE,
-                    NotesDialog.ICON_SMALL_SIZE - 1, NotesDialog.ICON_SMALL_SIZE - 1);
+            g.drawRect(p.x - (iconWidth / 2), p.y - iconHeight,
+                    iconWidth - 1, iconHeight - 1);
 
-            int tx = p.x + (NotesDialog.ICON_SMALL_SIZE / 2) + 5;
-            int ty = p.y - NotesDialog.ICON_SMALL_SIZE - 1;
+            int tx = p.x + (iconWidth / 2) + 5;
+            int ty = p.y - iconHeight - 1;
             g.translate(tx, ty);
 
             //Carried over from the OSB plugin. Not entirely sure why it is needed
@@ -179,7 +184,7 @@
 
     @Override
     public Icon getIcon() {
-        return NotesDialog.ICON_OPEN_SMALL;
+        return ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
     }
 
     @Override
@@ -242,11 +247,12 @@
         Point clickPoint = e.getPoint();
         double snapDistance = 10;
         double minDistance = Double.MAX_VALUE;
+        final int iconHeight = GuiSizesHelper.getSizeDpiAdjusted( ImageProvider.ImageSizes.SMALLICON.getVirtualHeight() );
         Note closestNote = null;
         for (Note note : noteData.getNotes()) {
             Point notePoint = Main.map.mapView.getPoint(note.getLatLon());
             //move the note point to the center of the icon where users are most likely to click when selecting
-            notePoint.setLocation(notePoint.getX(), notePoint.getY() - NotesDialog.ICON_SMALL_SIZE / 2);
+            notePoint.setLocation(notePoint.getX(), notePoint.getY() - iconHeight / 2);
             double dist = clickPoint.distanceSq(notePoint);
             if (minDistance > dist && clickPoint.distance(notePoint) < snapDistance) {
                 minDistance = dist;
Index: src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java	(working copy)
@@ -85,7 +85,7 @@
      */
     public MapPaintMenu() {
         super(tr("Map Paint Styles"));
-        setIcon(new ImageProvider("dialogs", "mapstyle").setSize(ImageProvider.ImageSizes.MENU).get());
+        setIcon(ImageProvider.get("dialogs", "mapstyle", ImageProvider.ImageSizes.MENU));
         MapPaintStyles.addMapPaintSylesUpdateListener(this);
         putClientProperty("help", ht("/Dialog/MapPaint"));
     }
Index: src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(working copy)
@@ -511,7 +511,7 @@
                     ImageIcon icon = null;
 
                     if (iconName != null && !iconName.isEmpty()) {
-                        icon = new ImageProvider("preferences", iconName).setSize(ImageProvider.ImageSizes.SETTINGS_TAB).get();
+                        icon = ImageProvider.get("preferences", iconName, ImageProvider.ImageSizes.SETTINGS_TAB);
                     }
                     if (settingsInitialized.contains(tps)) {
                         // If it has been initialized, add corresponding tab(s)
Index: src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java	(revision 10394)
+++ src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java	(working copy)
@@ -179,7 +179,7 @@
             JMenuItem mi = new JMenuItem(action);
             mi.setText(label);
             if (iconName != null && Main.pref.getBoolean("text.popupmenu.useicons", true)) {
-                ImageIcon icon = new ImageProvider(iconName).setSize(ImageProvider.ImageSizes.SMALLICON).get();
+                ImageIcon icon = ImageProvider.get(iconName, ImageProvider.ImageSizes.SMALLICON);
                 if (icon != null) {
                     mi.setIcon(icon);
                 }
Index: src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 10394)
+++ src/org/openstreetmap/josm/tools/ImageProvider.java	(working copy)
@@ -53,7 +53,10 @@
 import javax.imageio.ImageReader;
 import javax.imageio.metadata.IIOMetadata;
 import javax.imageio.stream.ImageInputStream;
+import javax.swing.Icon;
 import javax.swing.ImageIcon;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
 import javax.xml.bind.DatatypeConverter;
 
 import org.openstreetmap.josm.Main;
@@ -271,6 +274,8 @@
     protected Collection<ClassLoader> additionalClassLoaders;
     /** ordered list of overlay images */
     protected List<ImageOverlay> overlayInfo;
+    /** <code>true</code> if icon must be grayed out */
+    protected boolean isDisabled = false;
 
     private static SVGUniverse svgUniverse;
 
@@ -600,17 +605,47 @@
     }
 
     /**
+     * Set, if image must be filtered to grayscale so it will look like disabled icon.
+     *
+     * @param disabled true, if image must be grayed out for disabled state
+     * @return the current object, for convenience
+     */
+    public ImageProvider setDisabled(boolean disabled) {
+        this.isDisabled = disabled;
+        return this;
+    }
+
+    public Boolean getDisabled() {
+        return this.isDisabled;
+    }
+
+    /**
      * Execute the image request and scale result.
      * @return the requested image or null if the request failed
      */
     public ImageIcon get() {
         ImageResource ir = getResource();
-        if (ir == null)
+        ImageIcon icon;
+
+        if (ir == null) {
             return null;
+        }
         if (virtualMaxWidth != -1 || virtualMaxHeight != -1)
-            return ir.getImageIconBounded(new Dimension(virtualMaxWidth, virtualMaxHeight));
+            icon = ir.getImageIconBounded(new Dimension(virtualMaxWidth, virtualMaxHeight));
         else
-            return ir.getImageIcon(new Dimension(virtualWidth, virtualHeight));
+            icon = ir.getImageIcon(new Dimension(virtualWidth, virtualHeight));
+
+        if (isDisabled) {
+            //Use default Swing functionality to make icon look disabled by applying grayscaling filter.
+            Icon disabledIcon = UIManager.getLookAndFeel().getDisabledIcon(null, icon);
+
+            //Convert Icon to ImageIcon with BufferedImage inside
+            Image disabledImage = new BufferedImage(disabledIcon.getIconWidth(), disabledIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
+            disabledIcon.paintIcon(new JPanel(), disabledImage.getGraphics(), 0, 0);
+            icon = new ImageIcon(disabledImage);
+        }
+
+        return icon;
     }
 
     /**
@@ -706,6 +741,19 @@
     }
 
     /**
+     * Load an image from directory with a given file name and size.
+     *
+     * @param subdir subdirectory the image lies in
+     * @param name The icon name (base name with or without '.png' or '.svg' extension)
+     * @param size Target icon size
+     * @return The requested Image.
+     * @throws RuntimeException if the image cannot be located
+     */
+    public static ImageIcon get(String subdir, String name, ImageSizes size) {
+        return new ImageProvider(subdir, name).setSize(size).get();
+    }
+
+    /**
      * Load an empty image with a given size.
      *
      * @param size Target icon size
@@ -730,6 +778,18 @@
     }
 
     /**
+     * Load an image with a given file name and size.
+     *
+     * @param name The icon name (base name with or without '.png' or '.svg' extension)
+     * @param size Target icon size
+     * @return the requested image or null if the request failed
+     * @see #get(String, String)
+     */
+    public static ImageIcon get(String name, ImageSizes size) {
+        return new ImageProvider(name).setSize(size).get();
+    }
+
+    /**
      * Load an image with a given file name, but do not throw an exception
      * when the image cannot be found.
      *
