Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java	(revision 34759)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java	(revision 34760)
@@ -3,13 +3,19 @@
 
 import java.awt.Desktop;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
 import java.text.MessageFormat;
+import java.util.Objects;
 import java.util.logging.Logger;
+
+import javax.imageio.ImageIO;
 
 public final class FeatureAdapter {
 
     private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter();
+    private static ImageAdapter imageAdapter = new DefaultImageAdapter();
     private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter();
     private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter();
@@ -32,18 +38,30 @@
     }
 
+    public interface ImageAdapter {
+        BufferedImage read(URL input, boolean readMetadata, boolean enforceTransparency) throws IOException;
+    }
+
     public static void registerBrowserAdapter(BrowserAdapter browserAdapter) {
-        FeatureAdapter.browserAdapter = browserAdapter;
+        FeatureAdapter.browserAdapter = Objects.requireNonNull(browserAdapter);
+    }
+
+    public static void registerImageAdapter(ImageAdapter imageAdapter) {
+        FeatureAdapter.imageAdapter = Objects.requireNonNull(imageAdapter);
     }
 
     public static void registerTranslationAdapter(TranslationAdapter translationAdapter) {
-        FeatureAdapter.translationAdapter = translationAdapter;
+        FeatureAdapter.translationAdapter = Objects.requireNonNull(translationAdapter);
     }
 
     public static void registerLoggingAdapter(LoggingAdapter loggingAdapter) {
-        FeatureAdapter.loggingAdapter = loggingAdapter;
+        FeatureAdapter.loggingAdapter = Objects.requireNonNull(loggingAdapter);
     }
 
     public static void openLink(String url) {
         browserAdapter.openLink(url);
+    }
+
+    public static BufferedImage readImage(URL url) throws IOException {
+        return imageAdapter.read(url, false, false);
     }
 
@@ -73,4 +91,11 @@
     }
 
+    public static class DefaultImageAdapter implements ImageAdapter {
+        @Override
+        public BufferedImage read(URL input, boolean readMetadata, boolean enforceTransparency) throws IOException {
+            return ImageIO.read(input);
+        }
+    }
+
     public static class DefaultTranslationAdapter implements TranslationAdapter {
         @Override
Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java	(revision 34759)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java	(revision 34760)
@@ -8,4 +8,5 @@
 import java.awt.Point;
 import java.awt.event.MouseEvent;
+import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -164,7 +165,6 @@
         add(zoomSlider);
         int size = 18;
-        URL url = JMapViewer.class.getResource("images/plus.png");
-        if (url != null) {
-            ImageIcon icon = new ImageIcon(url);
+        ImageIcon icon = getImageIcon("images/plus.png");
+        if (icon != null) {
             zoomInButton = new JButton(icon);
         } else {
@@ -177,7 +177,6 @@
         zoomInButton.setFocusable(false);
         add(zoomInButton);
-        url = JMapViewer.class.getResource("images/minus.png");
-        if (url != null) {
-            ImageIcon icon = new ImageIcon(url);
+        icon = getImageIcon("images/minus.png");
+        if (icon != null) {
             zoomOutButton = new JButton(icon);
         } else {
@@ -190,4 +189,16 @@
         zoomOutButton.setFocusable(false);
         add(zoomOutButton);
+    }
+
+    private static ImageIcon getImageIcon(String name) {
+        URL url = JMapViewer.class.getResource(name);
+        if (url != null) {
+            try {
+                return new ImageIcon(FeatureAdapter.readImage(url));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
     }
 
Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java	(revision 34759)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java	(revision 34760)
@@ -82,5 +82,5 @@
     private static BufferedImage loadImage(String path) {
         try {
-            return ImageIO.read(JMapViewer.class.getResourceAsStream(path));
+            return FeatureAdapter.readImage(JMapViewer.class.getResource(path));
         } catch (IOException | IllegalArgumentException ex) {
             ex.printStackTrace();
Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java	(revision 34759)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java	(revision 34760)
@@ -4,5 +4,4 @@
 import java.awt.Image;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -18,5 +17,4 @@
 import java.util.regex.Pattern;
 
-import javax.imageio.ImageIO;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -29,4 +27,5 @@
 
 import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.FeatureAdapter;
 import org.openstreetmap.gui.jmapviewer.JMapViewer;
 import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
@@ -191,7 +190,7 @@
     public Image getAttributionImage() {
         try {
-            final InputStream imageResource = JMapViewer.class.getResourceAsStream("images/bing_maps.png");
+            final URL imageResource = JMapViewer.class.getResource("images/bing_maps.png");
             if (imageResource != null) {
-                return ImageIO.read(imageResource);
+                return FeatureAdapter.readImage(imageResource);
             } else {
                 // Some Linux distributions (like Debian) will remove Bing logo from sources, so get it at runtime
@@ -204,5 +203,5 @@
                 if (brandLogoUri != null && !brandLogoUri.isEmpty()) {
                     System.out.println("Reading Bing logo from "+brandLogoUri);
-                    return ImageIO.read(new URL(brandLogoUri));
+                    return FeatureAdapter.readImage(new URL(brandLogoUri));
                 }
             }
