Index: trunk/src/org/openstreetmap/josm/actions/AboutAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AboutAction.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/actions/AboutAction.java	(revision 14480)
@@ -163,5 +163,5 @@
      */
     private void setTextFromResourceFile(JTextArea ta, String filePath) {
-        InputStream is = getClass().getResourceAsStream(filePath);
+        InputStream is = Utils.getResourceAsStream(getClass(), filePath);
         if (is == null) {
             displayErrorMessage(ta, tr("Failed to locate resource ''{0}''.", filePath));
Index: trunk/src/org/openstreetmap/josm/data/Version.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Version.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/data/Version.java	(revision 14480)
@@ -6,6 +6,4 @@
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
-import java.nio.file.InvalidPathException;
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -107,5 +105,5 @@
      */
     public void init() {
-        try (InputStream stream = openRevisionStream("/REVISION")) {
+        try (InputStream stream = Utils.getResourceAsStream(getClass(), "/REVISION")) {
             if (stream == null) {
                 Logging.warn(tr("The revision file ''/REVISION'' is missing."));
@@ -120,17 +118,4 @@
     }
 
-    private static InputStream openRevisionStream(String path) throws IOException {
-        try {
-            return Version.class.getResourceAsStream(path);
-        } catch (InvalidPathException e) {
-            Logging.error("Cannot open {0}: {1}", path, e.getMessage());
-            URL betterUrl = Utils.betterJarUrl(Version.class.getResource(path));
-            if (betterUrl != null) {
-                return betterUrl.openStream();
-            }
-            return null;
-        }
-    }
-
     /**
      * Replies the version string. Either the SVN revision "1234" (as string) or the
Index: trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 14480)
@@ -176,5 +176,9 @@
             URL u = GettingStarted.class.getResource(im);
             if (u != null) {
-                m.appendReplacement(sb, Matcher.quoteReplacement("src=\"" + u + '\"'));
+                try {
+                    m.appendReplacement(sb, Matcher.quoteReplacement("src=\"" + Utils.betterJarUrl(u, u) + '\"'));
+                } catch (IOException e) {
+                    Logging.error(e);
+                }
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/MainInitialization.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 14480)
@@ -33,4 +33,5 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OpenBrowser;
@@ -140,4 +141,5 @@
                 // hooks for the jmapviewer component
                 FeatureAdapter.registerBrowserAdapter(OpenBrowser::displayUrl);
+                FeatureAdapter.registerImageAdapter(ImageProvider::read);
                 FeatureAdapter.registerTranslationAdapter(I18n::tr);
                 FeatureAdapter.registerLoggingAdapter(name -> Logging.getLogger());
Index: trunk/src/org/openstreetmap/josm/io/CachedFile.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 14480)
@@ -227,20 +227,7 @@
             if (name != null && name.startsWith("resource://")) {
                 String resourceName = name.substring("resource:/".length());
-                InputStream is = null;
-                try {
-                    is = getClass().getResourceAsStream(resourceName);
-                } catch (InvalidPathException e) {
-                    Logging.error("Cannot open {0}: {1}", resourceName, e.getMessage());
-                    Logging.trace(e);
-                }
+                InputStream is = Utils.getResourceAsStream(getClass(), resourceName);
                 if (is == null) {
-                    URL resource = getClass().getResource(resourceName);
-                    if (resource != null) {
-                        // More robust way to open stream
-                        is = Utils.openStream(resource);
-                    }
-                    if (is == null) {
-                        throw new IOException(tr("Failed to open input stream for resource ''{0}''", name));
-                    }
+                    throw new IOException(tr("Failed to open input stream for resource ''{0}''", name));
                 }
                 return is;
Index: trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 14480)
@@ -422,5 +422,6 @@
         String name = pluginName;
         name = name.replaceAll("[-. ]", "");
-        try (InputStream manifestStream = PluginInformation.class.getResourceAsStream("/org/openstreetmap/josm/plugins/"+name+"/MANIFEST.MF")) {
+        try (InputStream manifestStream = Utils.getResourceAsStream(
+                PluginInformation.class, "/org/openstreetmap/josm/plugins/"+name+"/MANIFEST.MF")) {
             if (manifestStream != null) {
                 return new PluginInformation(manifestStream, pluginName, null);
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 14479)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 14480)
@@ -1871,4 +1871,16 @@
      */
     public static URL betterJarUrl(URL jarUrl) throws IOException {
+        return betterJarUrl(jarUrl, null);
+    }
+
+    /**
+     * Tries to build a better JAR URL if we find it concerned by a JDK bug.
+     * @param jarUrl jar URL to test
+     * @param defaultUrl default URL to return
+     * @return potentially a better URL that won't provoke a JDK bug, or {@code defaultUrl}
+     * @throws IOException if an I/O error occurs
+     * @since 14480
+     */
+    public static URL betterJarUrl(URL jarUrl, URL defaultUrl) throws IOException {
         // Workaround to https://bugs.openjdk.java.net/browse/JDK-4523159
         String urlPath = jarUrl.getPath().replace("%20", " ");
@@ -1888,5 +1900,29 @@
             return new URL(jarUrl.getProtocol() + ':' + jarCopy.toUri().toURL().toExternalForm() + urlPath.substring(index));
         }
-        return null;
+        return defaultUrl;
+    }
+
+    /**
+     * Finds a resource with a given name, with robustness to known JDK bugs.
+     * @param klass class on which {@link Class#getResourceAsStream} will be called
+     * @param path name of the desired resource
+     * @return  A {@link java.io.InputStream} object or {@code null} if no resource with this name is found
+     * @since 14480
+     */
+    public static InputStream getResourceAsStream(Class<?> klass, String path) {
+        try {
+            return klass.getResourceAsStream(path);
+        } catch (InvalidPathException e) {
+            Logging.error("Cannot open {0}: {1}", path, e.getMessage());
+            try {
+                URL betterUrl = betterJarUrl(klass.getResource(path));
+                if (betterUrl != null) {
+                    return betterUrl.openStream();
+                }
+            } catch (IOException ex) {
+                Logging.error(ex);
+            }
+            return null;
+        }
     }
 }
