Index: /trunk/resources/images/presets/transport/rocket.svg
===================================================================
--- /trunk/resources/images/presets/transport/rocket.svg	(revision 17679)
+++ /trunk/resources/images/presets/transport/rocket.svg	(revision 17679)
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36">
+    <path fill="#A0041E" d="M1 17l8-7 16 1 1 16-7 8s.001-5.999-6-12-12-6-12-6z"/>
+    <path fill="#FFAC33" d="M.973 35s-.036-7.979 2.985-11S15 21.187 15 21.187 14.999 29 11.999 32c-3 3-11.026 3-11.026 3z"/>
+    <circle fill="#FFCC4D" cx="8.999" cy="27" r="4"/>
+    <path fill="#55ACEE" d="M35.999 0s-10 0-22 10c-6 5-6 14-4 16s11 2 16-4c10-12 10-22 10-22z"/>
+    <path d="M26.999 5c-1.623 0-3.013.971-3.641 2.36.502-.227 1.055-.36 1.641-.36 2.209 0 4 1.791 4 4 0 .586-.133 1.139-.359 1.64 1.389-.627 2.359-2.017 2.359-3.64 0-2.209-1.791-4-4-4z"/>
+    <path fill="#A0041E" d="M8 28s0-4 1-5 13.001-10.999 14-10-9.001 13-10.001 14S8 28 8 28z"/>
+</svg>
Index: /trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 17679)
@@ -139,5 +139,5 @@
             }
             // Add WebStart package details if run from JNLP
-            if (Utils.isRunningJavaWebStart()) {
+            if (Utils.isRunningWebStart()) {
                 String webStartDetails = platform.getWebStartPackageDetails();
                 if (webStartDetails != null) {
Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 17679)
@@ -342,34 +342,11 @@
     }
 
-    /**
-     * Asks user to update its version of Java.
-     * @param updVersion target update version
-     * @param url download URL
-     * @param major true for a migration towards a major version of Java (8:9), false otherwise
-     * @param eolDate the EOL/expiration date
-     * @since 12270
-     */
-    public static void askUpdateJava(String updVersion, String url, String eolDate, boolean major) {
-        ExtendedDialog ed = new ExtendedDialog(
-                mainFrame,
-                tr("Outdated Java version"),
-                tr("OK"), tr("Update Java"), tr("Cancel"));
+    private static void askUpdate(String title, String update, String property, String icon, StringBuilder content, String url) {
+        ExtendedDialog ed = new ExtendedDialog(mainFrame, title, tr("OK"), update, tr("Cancel"));
         // Check if the dialog has not already been permanently hidden by user
-        if (!ed.toggleEnable("askUpdateJava"+updVersion).toggleCheckState()) {
-            ed.setButtonIcons("ok", "java", "cancel").setCancelButton(3);
+        if (!ed.toggleEnable(property).toggleCheckState()) {
+            ed.setButtonIcons("ok", icon, "cancel").setCancelButton(3);
             ed.setMinimumSize(new Dimension(480, 300));
             ed.setIcon(JOptionPane.WARNING_MESSAGE);
-            StringBuilder content = new StringBuilder(tr("You are running version {0} of Java.",
-                    "<b>"+getSystemProperty("java.version")+"</b>")).append("<br><br>");
-            if ("Sun Microsystems Inc.".equals(getSystemProperty("java.vendor")) && !PlatformManager.getPlatform().isOpenJDK()) {
-                content.append("<b>").append(tr("This version is no longer supported by {0} since {1} and is not recommended for use.",
-                        "Oracle", eolDate)).append("</b><br><br>");
-            }
-            content.append("<b>")
-                   .append(major ?
-                        tr("JOSM will soon stop working with this version; we highly recommend you to update to Java {0}.", updVersion) :
-                        tr("You may face critical Java bugs; we highly recommend you to update to Java {0}.", updVersion))
-                   .append("</b><br><br>")
-                   .append(tr("Would you like to update now ?"));
             ed.setContent(content.toString());
 
@@ -382,4 +359,46 @@
             }
         }
+    }
+
+    /**
+     * Asks user to update its version of Java.
+     * @param updVersion target update version
+     * @param url download URL
+     * @param major true for a migration towards a major version of Java (8:11), false otherwise
+     * @param eolDate the EOL/expiration date
+     * @since 12270
+     */
+    public static void askUpdateJava(String updVersion, String url, String eolDate, boolean major) {
+        StringBuilder content = new StringBuilder(tr("You are running version {0} of Java.",
+                "<b>"+getSystemProperty("java.version")+"</b>")).append("<br><br>");
+        if ("Sun Microsystems Inc.".equals(getSystemProperty("java.vendor")) && !PlatformManager.getPlatform().isOpenJDK()) {
+            content.append("<b>").append(tr("This version is no longer supported by {0} since {1} and is not recommended for use.",
+                    "Oracle", eolDate)).append("</b><br><br>");
+        }
+        content.append("<b>")
+               .append(major ?
+                    tr("JOSM will soon stop working with this version; we highly recommend you to update to Java {0}.", updVersion) :
+                    tr("You may face critical Java bugs; we highly recommend you to update to Java {0}.", updVersion))
+               .append("</b><br><br>")
+               .append(tr("Would you like to update now ?"));
+        askUpdate(tr("Outdated Java version"), tr("Update Java"), "askUpdateJava"+updVersion, "java", content, url);
+    }
+
+    /**
+     * Asks user to migrate to OpenWebStart
+     * @param url download URL
+     * @since 17679
+     */
+    public static void askMigrateWebStart(String url) {
+        // CHECKSTYLE.OFF: LineLength
+        StringBuilder content = new StringBuilder(tr("You are running an <b>Oracle</b> implementation of Java WebStart."))
+                .append("<br><br>")
+                .append(tr("It was for years the recommended way to use JOSM. Oracle removed WebStart from Java 11,<br>but the open source community reimplemented the Java Web Start technology as a new product: <b>OpenWebStart</b>"))
+                .append("<br><br>")
+                .append(tr("OpenWebStart is now considered mature enough by JOSM developers to ask everyone to move away from an Oracle implementation,<br>allowing you to benefit from a recent version of Java, and allowing JOSM developers to move forward by planning the Java {0} migration.", "11"))
+                .append("<br><br>")
+                .append(tr("Would you like to <b>download OpenWebStart now</b>? (Please do!)"));
+        askUpdate(tr("Outdated Java WebStart version"), tr("Update to OpenWebStart"), "askUpdateWebStart", "presets/transport/rocket", content, url);
+        // CHECKSTYLE.ON: LineLength
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/MainInitialization.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 17679)
@@ -72,5 +72,5 @@
             new InitializationTask(tr("Starting file watcher"), FileWatcher.getDefaultInstance()::start),
             new InitializationTask(tr("Executing platform startup hook"),
-                    () -> PlatformManager.getPlatform().startupHook(MainApplication::askUpdateJava)),
+                    () -> PlatformManager.getPlatform().startupHook(MainApplication::askUpdateJava, MainApplication::askMigrateWebStart)),
             new InitializationTask(tr("Building main menu"), application::initializeMainWindow),
             new InitializationTask(tr("Updating user interface"), () -> {
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHook.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 17679)
@@ -85,8 +85,9 @@
       * Reason: On OSX we need to register some callbacks with the
       * OS, so we'll receive events from the system menu.
-     * @param callback Java expiration callback, providing GUI feedback
-     * @since 12270 (signature)
-      */
-    default void startupHook(JavaExpirationCallback callback) {
+      * @param javaCallback Java expiration callback, providing GUI feedback
+      * @param webStartCallback WebStart migration callback, providing GUI feedback
+      * @since 17679 (signature)
+      */
+    default void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback) {
         // Do nothing
     }
@@ -262,4 +263,17 @@
          */
         void askUpdateJava(String updVersion, String url, String eolDate, boolean major);
+    }
+
+    /**
+     * Called when Oracle Java WebStart is detected at startup.
+     * @since 17679
+     */
+    @FunctionalInterface
+    interface WebStartMigrationCallback {
+        /**
+         * Asks user to migrate to OpenWebStart.
+         * @param url download URL
+         */
+        void askMigrateWebStart(String url);
     }
 
@@ -285,4 +299,15 @@
 
     /**
+     * Checks if we run Oracle Web Start, proposes to user to migrate to OpenWebStart.
+     * @param callback WebStart migration callback
+     * @since 17679
+     */
+    default void checkWebStartMigration(WebStartMigrationCallback callback) {
+        if (Utils.isRunningJavaWebStart()) {
+            callback.askMigrateWebStart(Config.getPref().get("openwebstart.download.url", "https://openwebstart.com/download/"));
+        }
+    }
+
+    /**
      * Called when interfacing with native OS functions. Currently only used with macOS.
      * The callback must perform all GUI-related tasks associated to an OS request.
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 17679)
@@ -60,5 +60,5 @@
 
     @Override
-    public void startupHook(JavaExpirationCallback callback) {
+    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback) {
         // Here we register callbacks for the menu entries in the system menu and file opening through double-click
         // https://openjdk.java.net/jeps/272
@@ -98,5 +98,6 @@
             Logging.warn("Failed to register with macOS: " + ex);
         }
-        checkExpiredJava(callback);
+        checkExpiredJava(javaCallback);
+        checkWebStartMigration(webStartCallback);
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 17679)
@@ -61,4 +61,9 @@
             }
         }
+    }
+
+    @Override
+    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback) {
+        checkWebStartMigration(webStartCallback);
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 17679)
@@ -154,6 +154,7 @@
 
     @Override
-    public void startupHook(JavaExpirationCallback callback) {
-        checkExpiredJava(callback);
+    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback) {
+        checkExpiredJava(javaCallback);
+        checkWebStartMigration(webStartCallback);
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 17678)
+++ /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 17679)
@@ -67,6 +67,7 @@
 import java.util.zip.ZipFile;
 
+import org.openstreetmap.josm.spi.preferences.Config;
+
 import com.kitfox.svg.xml.XMLParseUtil;
-import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -1720,9 +1721,9 @@
 
     /**
-     * Determines whether JOSM has been started via Java Web Start.
-     * @return true if JOSM has been started via Java Web Start
-     * @since 15740
-     */
-    public static boolean isRunningJavaWebStart() {
+     * Determines whether JOSM has been started via Web Start (JNLP).
+     * @return true if JOSM has been started via Web Start (JNLP)
+     * @since 17679
+     */
+    public static boolean isRunningWebStart() {
         try {
             // See http://stackoverflow.com/a/16200769/2257172
@@ -1731,4 +1732,22 @@
             return false;
         }
+    }
+
+    /**
+     * Determines whether JOSM has been started via Oracle Java Web Start.
+     * @return true if JOSM has been started via Oracle Java Web Start
+     * @since 15740
+     */
+    public static boolean isRunningJavaWebStart() {
+        return isRunningWebStart() && Package.getPackage("com.sun.javaws") != null;
+    }
+
+    /**
+     * Determines whether JOSM has been started via Open Web Start (IcedTea-Web).
+     * @return true if JOSM has been started via Open Web Start (IcedTea-Web)
+     * @since 17679
+     */
+    public static boolean isRunningOpenWebStart() {
+        return isRunningWebStart() && Package.getPackage("net.adoptopenjdk.icedteaweb") != null;
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java	(revision 17678)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java	(revision 17679)
@@ -37,5 +37,5 @@
     @Test
     void testStartupHook() {
-        hook.startupHook((a, b, c, d) -> System.out.println("callback"));
+        hook.startupHook((a, b, c, d) -> System.out.println("java callback"), u -> System.out.println("webstart callback"));
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java	(revision 17678)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java	(revision 17679)
@@ -55,5 +55,5 @@
     @Test
     void testStartupHook() {
-        hook.startupHook((a, b, c, d) -> System.out.println("callback"));
+        hook.startupHook((a, b, c, d) -> System.out.println("java callback"), u -> System.out.println("webstart callback"));
     }
 
