Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 19103)
@@ -102,5 +102,7 @@
 
     private final GpxTrackChangeListener proxy = e -> invalidate();
-    private boolean modified, updating, initializing;
+    private boolean modified;
+    private boolean updating;
+    private boolean initializing;
     private boolean suppressedInvalidate;
 
@@ -109,5 +111,5 @@
      * @see #getTracks()
      */
-    public final Collection<IGpxTrack> tracks = new ListeningCollection<IGpxTrack>(privateTracks, this::invalidate) {
+    public final Collection<IGpxTrack> tracks = new ListeningCollection<>(privateTracks, this::invalidate) {
 
         @Override
@@ -418,6 +420,6 @@
                 OptionalLong i1 = getTrackFirstWaypointMin(t1);
                 OptionalLong i2 = getTrackFirstWaypointMin(t2);
-                boolean i1absent = !i1.isPresent();
-                boolean i2absent = !i2.isPresent();
+                boolean i1absent = i1.isEmpty();
+                boolean i2absent = i2.isEmpty();
                 if (i1absent && i2absent) {
                     return 0;
@@ -537,5 +539,5 @@
                     HashMap<String, Object> attrs = new HashMap<>(trk.getAttributes());
                     ensureUniqueName(attrs, counts, srcLayerName);
-                    return new GpxTrack(Arrays.asList(seg), attrs);
+                    return new GpxTrack(Collections.singletonList(seg), attrs);
                 }))
             .collect(Collectors.toCollection(ArrayList<GpxTrack>::new));
@@ -548,5 +550,5 @@
      * Split tracks into layers, the result is one layer for each track.
      * If this layer currently has only one GpxTrack this is a no-operation.
-     *
+     * <p>
      * The new GpxLayers are added to the LayerManager, the original GpxLayer
      * is untouched as to preserve potential route or wpt parts.
@@ -1258,5 +1260,6 @@
      */
     public static class XMLNamespace {
-        private final String uri, prefix;
+        private final String uri;
+        private final String prefix;
         private String location;
 
Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java	(revision 19103)
@@ -229,5 +229,5 @@
         stream(prefix, key)
         .collect(Collectors.toList()) //needs to be collected to avoid concurrent modification
-        .forEach(e -> super.remove(e));
+        .forEach(super::remove);
     }
 
@@ -240,5 +240,5 @@
         .filter(e -> Objects.equals(prefix, e.getPrefix()))
         .collect(Collectors.toList()) //needs to be collected to avoid concurrent modification
-        .forEach(e -> super.remove(e));
+        .forEach(super::remove);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 19103)
@@ -80,5 +80,5 @@
          */
         @Override
-        public final String getTypeString() {
+        public String getTypeString() {
             return typeString;
         }
@@ -143,5 +143,5 @@
          */
         @Override
-        public final String getCategoryString() {
+        public String getCategoryString() {
             return category;
         }
@@ -152,5 +152,5 @@
          */
         @Override
-        public final String getDescription() {
+        public String getDescription() {
             return description;
         }
@@ -163,5 +163,5 @@
          */
         @Override
-        public final ImageIcon getIcon(ImageSizes size) {
+        public ImageIcon getIcon(ImageSizes size) {
             return iconCache
                     .computeIfAbsent(size, x -> Collections.synchronizedMap(new EnumMap<>(ImageryCategory.class)))
Index: trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 19103)
@@ -70,5 +70,5 @@
      */
     public static ThreadPoolExecutor getNewThreadPoolExecutor(String nameFormat, int workers) {
-        return getNewThreadPoolExecutor(nameFormat, workers, HOST_LIMIT.get().intValue());
+        return getNewThreadPoolExecutor(nameFormat, workers, HOST_LIMIT.get());
     }
 
@@ -97,5 +97,5 @@
      */
     public static ThreadPoolExecutor getNewThreadPoolExecutor(String name) {
-        return getNewThreadPoolExecutor(name, THREAD_LIMIT.get().intValue());
+        return getNewThreadPoolExecutor(name, THREAD_LIMIT.get());
     }
 
Index: trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/MVTTile.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/MVTTile.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/MVTTile.java	(revision 19103)
@@ -56,11 +56,9 @@
             for (ProtobufRecord protoBufRecord : protobufRecords) {
                 if (protoBufRecord.getField() == Layer.LAYER_FIELD) {
-                    try (ProtobufParser tParser = new ProtobufParser(protoBufRecord.getBytes())) {
+                    try (protoBufRecord; // Cleanup bytes
+                         ProtobufParser tParser = new ProtobufParser(protoBufRecord.getBytes())) {
                         this.layers.add(new Layer(tParser.allRecords()));
                     } catch (IOException e) {
                         Logging.error(e);
-                    } finally {
-                        // Cleanup bytes
-                        protoBufRecord.close();
                     }
                 }
Index: trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/style/Layers.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/style/Layers.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/style/Layers.java	(revision 19103)
@@ -59,4 +59,5 @@
     }
 
+    private static final String DEFAULT_COLOR = "#000000";
     private static final char SEMI_COLON = ';';
     private static final Pattern CURLY_BRACES = Pattern.compile("(\\{(.*?)})");
@@ -186,5 +187,5 @@
         // line-blur, default 0 (px)
         // line-color, default #000000, disabled by line-pattern
-        final String color = paintObject.getString("line-color", "#000000");
+        final String color = paintObject.getString("line-color", DEFAULT_COLOR);
         sb.append(StyleKeys.COLOR).append(':').append(color).append(SEMI_COLON);
         // line-opacity, default 1 (0-1)
@@ -210,8 +211,8 @@
         if (paintObject.containsKey("line-dasharray")) {
             final JsonArray dashArray = paintObject.getJsonArray("line-dasharray");
-            sb.append(StyleKeys.DASHES).append(':');
-            sb.append(dashArray.stream().filter(JsonNumber.class::isInstance).map(JsonNumber.class::cast)
-              .map(JsonNumber::toString).collect(Collectors.joining(",")));
-            sb.append(SEMI_COLON);
+            sb.append(StyleKeys.DASHES).append(':')
+                .append(dashArray.stream().filter(JsonNumber.class::isInstance).map(JsonNumber.class::cast)
+                    .map(JsonNumber::toString).collect(Collectors.joining(",")))
+                .append(SEMI_COLON);
         }
         // line-gap-width
@@ -235,5 +236,5 @@
           // circle-blur
           // circle-color
-          .append("symbol-fill-color:").append(paintObject.getString("circle-color", "#000000")).append(SEMI_COLON);
+          .append("symbol-fill-color:").append(paintObject.getString("circle-color", DEFAULT_COLOR)).append(SEMI_COLON);
         // circle-opacity
         final JsonNumber fillOpacity = paintObject.getJsonNumber("circle-opacity");
@@ -246,5 +247,5 @@
           // circle-sort-key
           // circle-stroke-color
-          .append("symbol-stroke-color:").append(paintObject.getString("circle-stroke-color", "#000000")).append(SEMI_COLON);
+          .append("symbol-stroke-color:").append(paintObject.getString("circle-stroke-color", DEFAULT_COLOR)).append(SEMI_COLON);
         // circle-stroke-opacity
         final JsonNumber strokeOpacity = paintObject.getJsonNumber("circle-stroke-opacity");
@@ -277,5 +278,5 @@
             }
             Matcher matcher = CURLY_BRACES.matcher(layoutObject.getString("icon-image"));
-            StringBuffer stringBuffer = new StringBuffer();
+            StringBuilder stringBuffer = new StringBuilder();
             int previousMatch;
             if (matcher.lookingAt()) {
@@ -299,5 +300,5 @@
                 stringBuffer.append('"');
             }
-            StringBuffer tail = new StringBuffer();
+            StringBuilder tail = new StringBuilder();
             matcher.appendTail(tail);
             if (tail.length() > 0) {
@@ -375,7 +376,7 @@
                         .orElseGet(() -> fontMatches.stream().filter(font -> font.getFamily().equals(fontString)).findAny().orElse(null))));
                     if (setFont != null) {
-                        sb.append(StyleKeys.FONT_FAMILY).append(':').append('"').append(setFont.getFamily()).append('"').append(SEMI_COLON);
-                        sb.append(StyleKeys.FONT_WEIGHT).append(':').append(setFont.isBold() ? "bold" : "normal").append(SEMI_COLON);
-                        sb.append(StyleKeys.FONT_STYLE).append(':').append(setFont.isItalic() ? "italic" : "normal").append(SEMI_COLON);
+                        sb.append(StyleKeys.FONT_FAMILY).append(':').append('"').append(setFont.getFamily()).append('"').append(SEMI_COLON)
+                            .append(StyleKeys.FONT_WEIGHT).append(':').append(setFont.isBold() ? "bold" : "normal").append(SEMI_COLON)
+                            .append(StyleKeys.FONT_STYLE).append(':').append(setFont.isItalic() ? "italic" : "normal").append(SEMI_COLON);
                         break;
                     }
@@ -439,5 +440,5 @@
           // fill-antialias
           // fill-color
-          .append(StyleKeys.FILL_COLOR).append(':').append(paintObject.getString(StyleKeys.FILL_COLOR, "#000000")).append(SEMI_COLON);
+          .append(StyleKeys.FILL_COLOR).append(':').append(paintObject.getString(StyleKeys.FILL_COLOR, DEFAULT_COLOR)).append(SEMI_COLON);
         // fill-opacity
         final JsonNumber opacity = paintObject.getJsonNumber(StyleKeys.FILL_OPACITY);
@@ -445,5 +446,5 @@
           // fill-outline-color
           .append(StyleKeys.COLOR).append(':').append(paintObject.getString("fill-outline-color",
-          paintObject.getString("fill-color", "#000000"))).append(SEMI_COLON);
+          paintObject.getString("fill-color", DEFAULT_COLOR))).append(SEMI_COLON);
         // fill-pattern
         // fill-sort-key
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmData.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmData.java	(revision 19103)
@@ -283,5 +283,5 @@
      */
     default void clearHighlightedVirtualNodes() {
-        setHighlightedVirtualNodes(new ArrayList<WaySegment>());
+        setHighlightedVirtualNodes(new ArrayList<>());
     }
 
@@ -290,5 +290,5 @@
      */
     default void clearHighlightedWaySegments() {
-        setHighlightedWaySegments(new ArrayList<WaySegment>());
+        setHighlightedWaySegments(new ArrayList<>());
     }
 
@@ -327,5 +327,5 @@
      * Replies an unmodifiable collection of primitives currently selected
      * in this dataset, except deleted ones. May be empty, but not null.
-     *
+     * <p>
      * When iterating through the set it is ordered by the order in which the primitives were added to the selection.
      *
@@ -339,5 +339,5 @@
      * Replies an unmodifiable collection of primitives currently selected
      * in this dataset, including deleted ones. May be empty, but not null.
-     *
+     * <p>
      * When iterating through the set it is ordered by the order in which the primitives were added to the selection.
      *
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 19103)
@@ -397,22 +397,4 @@
 
     /**
-     * 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", /* ICON */"presets/transport/rocket", content, url);
-        // CHECKSTYLE.ON: LineLength
-    }
-
-    /**
      * Tells the user that a sanity check failed
      * @param title The title of the message to show
Index: trunk/src/org/openstreetmap/josm/gui/MainInitialization.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/MainInitialization.java	(revision 19103)
@@ -72,6 +72,5 @@
             new InitializationTask(tr("Starting file watcher"), FileWatcher.getDefaultInstance()::start),
             new InitializationTask(tr("Executing platform startup hook"),
-                    () -> PlatformManager.getPlatform().startupHook(MainApplication::askUpdateJava,
-                            MainApplication::askMigrateWebStart, MainApplication::sanityCheckFailed)),
+                    () -> PlatformManager.getPlatform().startupHook(MainApplication::askUpdateJava, MainApplication::sanityCheckFailed)),
             new InitializationTask(tr("Building main menu"), application::initializeMainWindow),
             new InitializationTask(tr("Updating user interface"), () -> {
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 19103)
@@ -79,7 +79,7 @@
     /**
      * used by {@link ChooseTrackVisibilityAction} to determine which tracks to show/hide
-     *
+     * <p>
      * Call {@link #invalidate()} after each change!
-     *
+     * <p>
      * TODO: Make it private, make it respond to track changes.
      */
@@ -146,5 +146,5 @@
         if (data == null)
             return null;
-        Color[] c = data.getTracks().stream().map(t -> t.getColor()).distinct().toArray(Color[]::new);
+        Color[] c = data.getTracks().stream().map(IGpxTrack::getColor).distinct().toArray(Color[]::new);
         return c.length == 1 ? c[0] : null; //only return if exactly one distinct color present
     }
@@ -210,4 +210,5 @@
 
         if (!data.getTracks().isEmpty()) {
+            String tdSep = "</td><td>";
             info.append("<table><thead align='center'><tr><td colspan='5'>")
                 .append(trn("{0} track, {1} track segments", "{0} tracks, {1} track segments",
@@ -215,23 +216,23 @@
                         data.getTrackSegsCount(), data.getTrackSegsCount()))
                 .append("</td></tr><tr align='center'><td>").append(tr("Name"))
-                .append("</td><td>").append(tr("Description"))
-                .append("</td><td>").append(tr("Timespan"))
-                .append("</td><td>").append(tr("Length"))
-                .append("</td><td>").append(tr("Number of<br/>Segments"))
-                .append("</td><td>").append(tr("URL"))
+                .append(tdSep).append(tr("Description"))
+                .append(tdSep).append(tr("Timespan"))
+                .append(tdSep).append(tr("Length"))
+                .append(tdSep).append(tr("Number of<br/>Segments"))
+                .append(tdSep).append(tr("URL"))
                 .append("</td></tr></thead>");
 
             for (IGpxTrack trk : data.getTracks()) {
-                info.append("<tr><td>");
-                info.append(trk.getAttributes().getOrDefault(GpxConstants.GPX_NAME, ""));
-                info.append("</td><td>");
-                info.append(trk.getAttributes().getOrDefault(GpxConstants.GPX_DESC, ""));
-                info.append("</td><td>");
-                info.append(getTimespanForTrack(trk));
-                info.append("</td><td>");
-                info.append(SystemOfMeasurement.getSystemOfMeasurement().getDistText(trk.length()));
-                info.append("</td><td>");
-                info.append(trk.getSegments().size());
-                info.append("</td><td>");
+                info.append("<tr><td>")
+                    .append(trk.getAttributes().getOrDefault(GpxConstants.GPX_NAME, ""))
+                    .append(tdSep)
+                    .append(trk.getAttributes().getOrDefault(GpxConstants.GPX_DESC, ""))
+                    .append(tdSep)
+                    .append(getTimespanForTrack(trk))
+                    .append(tdSep)
+                    .append(SystemOfMeasurement.getSystemOfMeasurement().getDistText(trk.length()))
+                    .append(tdSep)
+                    .append(trk.getSegments().size())
+                    .append(tdSep);
                 if (trk.getAttributes().containsKey("url")) {
                     info.append(trk.get("url"));
@@ -287,5 +288,5 @@
         if (isExpertMode && expert.stream().anyMatch(Action::isEnabled)) {
             entries.add(SeparatorLayerAction.INSTANCE);
-            expert.stream().filter(Action::isEnabled).forEach(entries::add);
+            entries.addAll(expert.stream().filter(Action::isEnabled).collect(Collectors.toList()));
         }
 
@@ -621,16 +622,14 @@
 
     private void jumpToNext(List<IGpxTrackSegment> segments) {
-        if (segments.isEmpty()) {
-            return;
-        } else if (currentSegment == null) {
+        if (!segments.isEmpty() && currentSegment == null) {
             currentSegment = segments.get(0);
             MainApplication.getMap().mapView.zoomTo(currentSegment.getBounds());
-        } else {
+        } else if (!segments.isEmpty()) {
             try {
                 int index = segments.indexOf(currentSegment);
                 currentSegment = segments.listIterator(index + 1).next();
                 MainApplication.getMap().mapView.zoomTo(currentSegment.getBounds());
-            } catch (IndexOutOfBoundsException | NoSuchElementException ignore) {
-                Logging.trace(ignore);
+            } catch (IndexOutOfBoundsException | NoSuchElementException exception) {
+                Logging.trace(exception);
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java	(revision 19103)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 
@@ -40,9 +41,9 @@
         super(new GridBagLayout());
         minZoomLvl = new JSpinner(new SpinnerNumberModel(
-                Utils.clamp(TMSLayer.PROP_MIN_ZOOM_LVL.get().intValue(), TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM),
+                Utils.clamp(TMSLayer.PROP_MIN_ZOOM_LVL.get(), TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM),
                 TMSLayer.MIN_ZOOM,
                 TMSLayer.MAX_ZOOM, 1));
         maxZoomLvl = new JSpinner(new SpinnerNumberModel(
-                Utils.clamp(TMSLayer.PROP_MAX_ZOOM_LVL.get().intValue(), TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM),
+                Utils.clamp(TMSLayer.PROP_MAX_ZOOM_LVL.get(), TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM),
                 TMSLayer.MIN_ZOOM,
                 TMSLayer.MAX_ZOOM, 1));
@@ -55,9 +56,9 @@
         add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
         add(GBC.glue(5, 0), GBC.std());
-        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
+        add(autozoomActive, GBC.eol().fill(GridBagConstraints.HORIZONTAL));
 
         add(new JLabel(tr("Autoload tiles by default: ")), GBC.std());
         add(GBC.glue(5, 0), GBC.std());
-        add(autoloadTiles, GBC.eol().fill(GBC.HORIZONTAL));
+        add(autoloadTiles, GBC.eol().fill(GridBagConstraints.HORIZONTAL));
 
         add(new JLabel(tr("Min. zoom level: ")), GBC.std());
@@ -71,5 +72,5 @@
         add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
         add(GBC.glue(5, 0), GBC.std());
-        add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
+        add(addToSlippyMapChosser, GBC.eol().fill(GridBagConstraints.HORIZONTAL));
 
         add(new JLabel(tr("Maximum concurrent downloads: ")), GBC.std());
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java	(revision 19103)
@@ -107,4 +107,9 @@
     }
 
+    /**
+     * A {@link LinkedHashSet} with the ability to get the "last" object.
+     * Note that this is unnecessary in Java 21 (see JEP 431).
+     * @param <E> The object type in the set
+     */
     static class HashSetWithLast<E> extends LinkedHashSet<E> {
         private static final long serialVersionUID = 1L;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 19103)
@@ -11,5 +11,5 @@
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 
@@ -104,7 +104,5 @@
         addEntry(PresetListEntry.ENTRY_EMPTY);
 
-        usage.map.forEach((value, count) -> {
-            addEntry(new PresetListEntry(value, this));
-        });
+        usage.map.forEach((value, count) -> addEntry(new PresetListEntry(value, this)));
 
         combobox = new JosmComboBox<>(dropDownModel);
@@ -125,5 +123,5 @@
 
         autoCompModel = new AutoCompComboBoxModel<>(Comparator.<AutoCompletionItem>naturalOrder());
-        getAllForKeys(Arrays.asList(key)).forEach(autoCompModel::addElement);
+        getAllForKeys(Collections.singletonList(key)).forEach(autoCompModel::addElement);
         getDisplayValues().forEach(s -> autoCompModel.addElement(new AutoCompletionItem(s, AutoCompletionPriority.IS_IN_STANDARD)));
 
@@ -131,5 +129,5 @@
         tf.setModel(autoCompModel);
 
-        if (TaggingPresetItem.DISPLAY_KEYS_AS_HINT.get()) {
+        if (Boolean.TRUE.equals(TaggingPresetItem.DISPLAY_KEYS_AS_HINT.get())) {
             combobox.setHint(key);
         }
@@ -218,5 +216,5 @@
         if (sel instanceof String) {
             // free edit.  If the free edit corresponds to a known entry, use that entry.  This is
-            // to avoid that we write a display_value to the tag's value, eg. if the user did an
+            // to avoid that we write a display_value to the tag's value, e.g. if the user did an
             // undo.
             PresetListEntry selItem = dropDownModel.find((String) sel);
Index: trunk/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java	(revision 19103)
@@ -79,5 +79,5 @@
                 id = 0;
                 try {
-                    if (value.matches("http.*/changeset/[0-9]+")) {
+                    if (value.matches("http.*/changeset/\\d+")) {
                         // full URL given, extract id
                         value = value.substring(value.lastIndexOf('/') + 1);
Index: trunk/src/org/openstreetmap/josm/gui/widgets/EditableList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/EditableList.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/EditableList.java	(revision 19103)
@@ -34,5 +34,5 @@
      * The list items
      */
-    public final JList<String> sourcesList = new JList<>(new DefaultListModel<String>());
+    public final JList<String> sourcesList = new JList<>(new DefaultListModel<>());
     /**
      * The add button
Index: trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBoxModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBoxModel.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBoxModel.java	(revision 19103)
@@ -31,5 +31,5 @@
      */
     public void addAllStrings(List<String> strings) {
-        strings.forEach(s -> addElement(s));
+        strings.forEach(this::addElement);
     }
 
@@ -41,5 +41,5 @@
     public List<String> asStringList() {
         List<String> list = new ArrayList<>(getSize());
-        this.forEach(item -> list.add(item));
+        this.forEach(list::add);
         return list;
     }
Index: trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 19103)
@@ -67,5 +67,5 @@
      */
     public JosmComboBox() {
-        super(new JosmComboBoxModel<E>());
+        super(new JosmComboBoxModel<>());
         init();
     }
@@ -85,7 +85,7 @@
      * @deprecated use {@link #setPrototypeDisplayValue} instead.
      */
-    @Deprecated
+    @Deprecated(since = "18221", forRemoval = true)
     public JosmComboBox(E prototypeDisplayValue) {
-        super(new JosmComboBoxModel<E>());
+        super(new JosmComboBoxModel<>());
         setPrototypeDisplayValue(prototypeDisplayValue);
         init();
@@ -111,5 +111,5 @@
      * @deprecated use {@link #setPrototypeDisplayValue} instead.
      */
-    @Deprecated
+    @Deprecated(since = "18221", forRemoval = true)
     public JosmComboBox(JosmComboBoxModel<E> aModel, E prototypeDisplayValue) {
         super(aModel);
@@ -126,5 +126,5 @@
      */
     public JosmComboBox(E[] items) {
-        super(new JosmComboBoxModel<E>());
+        super(new JosmComboBoxModel<>());
         init();
         for (E elem : items) {
@@ -206,5 +206,5 @@
     /**
      * Selects an item and/or sets text
-     *
+     * <p>
      * Selects the item whose {@code toString()} equals {@code text}. If an item could not be found,
      * selects nothing and sets the text anyway.
@@ -234,14 +234,14 @@
      * Sets the hint to display when no text has been entered.
      *
-     * @param hint the hint to set
+     * @param newHint the hint to set
      * @return the old hint
      * @since 18221
      */
-    public String setHint(String hint) {
-        String old = hint;
-        this.hint = hint;
+    public String setHint(String newHint) {
+        String old = this.hint;
+        this.hint = newHint;
         JosmTextField tf = getEditorComponent();
         if (tf != null)
-            tf.setHint(hint);
+            tf.setHint(newHint);
         return old;
     }
@@ -288,5 +288,5 @@
      * <p>
      * Set this to -1 to get the default behaviour back.
-     *
+     * <p>
      * See also: #6157
      *
@@ -310,5 +310,5 @@
     public JList getList() {
         Object popup = getUI().getAccessibleChild(this, 0);
-        if (popup != null && popup instanceof javax.swing.plaf.basic.ComboPopup) {
+        if (popup instanceof javax.swing.plaf.basic.ComboPopup) {
             return ((javax.swing.plaf.basic.ComboPopup) popup).getList();
         }
@@ -421,5 +421,6 @@
             int rowCount = Math.min(configMaximumRowCount, getItemCount());
             ListCellRenderer<? super E> r = jList.getCellRenderer();  // must take this from list, not combo: flatlaf bug
-            int i, h = 0;
+            int i;
+            int h = 0;
             for (i = 0; i < rowCount; ++i) {
                 Component c = r.getListCellRendererComponent(jList, getModel().getElementAt(i), i, false, false);
Index: trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBoxModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBoxModel.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBoxModel.java	(revision 19103)
@@ -50,5 +50,5 @@
     /**
      * Returns the index of the specified element
-     *
+     * <p>
      * Note: This is not part of the {@link javax.swing.ComboBoxModel} interface but is defined in
      * {@link javax.swing.DefaultComboBoxModel}.
@@ -184,5 +184,5 @@
     public void addAllElements(Collection<E> elems) {
         int index0 = elements.size();
-        elems.forEach(e -> doAddElement(e));
+        elems.forEach(this::doAddElement);
         int index1 = elements.size() - 1;
         if (index0 <= index1)
@@ -269,7 +269,7 @@
 
         /** A {@link Function} that builds an {@code <E>} from a {@code String}. */
-        private Function<String, E> readE;
+        private final Function<String, E> readE;
         /** A {@code Function} that serializes {@code <E>} to a {@code String}. */
-        private Function<E, String> writeE;
+        private final Function<E, String> writeE;
 
         /**
Index: trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java	(revision 19103)
@@ -77,5 +77,5 @@
      * Create a MultiSplitLayout with a default model with a single
      * Leaf node named "default".
-     *
+     * <p>
      * #see setModel
      */
@@ -86,5 +86,5 @@
     /**
      * Create a MultiSplitLayout with the specified model.
-     *
+     * <p>
      * #see setModel
      * @param model model
@@ -127,5 +127,5 @@
 
     private void firePCS(String propertyName, Object oldValue, Object newValue) {
-        if (!(oldValue != null && newValue != null && oldValue.equals(newValue))) {
+        if (!(oldValue != null && oldValue.equals(newValue))) {
             pcs.firePropertyChange(propertyName, oldValue, newValue);
         }
@@ -149,14 +149,14 @@
      * property is a Leaf named "default".
      *
-     * @param model the root of the tree of Split, Leaf, and Divider node
+     * @param newModel the root of the tree of Split, Leaf, and Divider node
      * @throws IllegalArgumentException if model is a Divider or null
      * @see #getModel
      */
-    public void setModel(Node model) {
-        if ((model == null) || (model instanceof Divider))
+    public void setModel(Node newModel) {
+        if ((newModel == null) || (newModel instanceof Divider))
             throw new IllegalArgumentException("invalid model");
-        Node oldModel = model;
-        this.model = model;
-        firePCS("model", oldModel, model);
+        Node oldModel = this.model;
+        this.model = newModel;
+        firePCS("model", oldModel, newModel);
     }
 
@@ -270,6 +270,6 @@
             return preferredComponentSize(root);
         else if (root instanceof Divider) {
-            int dividerSize = getDividerSize();
-            return new Dimension(dividerSize, dividerSize);
+            int currentDividerSize = getDividerSize();
+            return new Dimension(currentDividerSize, currentDividerSize);
         } else {
             Split split = (Split) root;
@@ -299,6 +299,6 @@
             return (child != null) ? child.getMinimumSize() : new Dimension(0, 0);
         } else if (root instanceof Divider) {
-            int dividerSize = getDividerSize();
-            return new Dimension(dividerSize, dividerSize);
+            int currentDividerSize = getDividerSize();
+            return new Dimension(currentDividerSize, currentDividerSize);
         } else {
             Split split = (Split) root;
@@ -611,5 +611,5 @@
             Iterator<Node> splitChildren = split.getChildren().iterator();
             Rectangle childBounds;
-            int dividerSize = getDividerSize();
+            int currentDividerSize = getDividerSize();
 
             /* Layout the Split's child Nodes' along the X axis.  The bounds
@@ -647,5 +647,5 @@
                     if (getFloatingDividers() && (dividerChild != null)) {
                         double dividerX = childBounds.getMaxX();
-                        Rectangle dividerBounds = boundsWithXandWidth(bounds, dividerX, dividerSize);
+                        Rectangle dividerBounds = boundsWithXandWidth(bounds, dividerX, currentDividerSize);
                         dividerChild.setBounds(dividerBounds);
                     }
@@ -680,5 +680,5 @@
                     if (getFloatingDividers() && (dividerChild != null)) {
                         double dividerY = childBounds.getMaxY();
-                        Rectangle dividerBounds = boundsWithYandHeight(bounds, dividerY, dividerSize);
+                        Rectangle dividerBounds = boundsWithYandHeight(bounds, dividerY, currentDividerSize);
                         dividerChild.setBounds(dividerBounds);
                     }
@@ -854,5 +854,5 @@
         /**
          * Returns the Split parent of this Node, or null.
-         *
+         * <p>
          * This method isn't called getParent(), in order to avoid problems
          * with recursive object creation when using XmlDecoder.
@@ -868,5 +868,5 @@
          * Set the value of this Node's parent property.  The default
          * value of this property is null.
-         *
+         * <p>
          * This method isn't called setParent(), in order to avoid problems
          * with recursive object creation when using XmlEncoder.
@@ -936,8 +936,8 @@
 
         private Node siblingAtOffset(int offset) {
-            Split parent = getParent();
-            if (parent == null)
+            Split currentParent = getParent();
+            if (currentParent == null)
                 return null;
-            List<Node> siblings = parent.getChildren();
+            List<Node> siblings = currentParent.getChildren();
             int index = siblings.indexOf(this);
             if (index == -1)
@@ -1050,7 +1050,7 @@
          */
         public final Node lastWeightedChild() {
-            List<Node> children = getChildren();
+            List<Node> currentChildren = getChildren();
             Node weightedChild = null;
-            for (Node child : children) {
+            for (Node child : currentChildren) {
                 if (child.getWeight() > 0.0) {
                     weightedChild = child;
@@ -1063,11 +1063,9 @@
         public String toString() {
             int nChildren = getChildren().size();
-            StringBuilder sb = new StringBuilder("MultiSplitLayout.Split");
-            sb.append(isRowLayout() ? " ROW [" : " COLUMN [")
-              .append(nChildren)
-              .append((nChildren == 1) ? " child" : " children")
-              .append("] ")
-              .append(getBounds());
-            return sb.toString();
+            return "MultiSplitLayout.Split" + (isRowLayout() ? " ROW [" : " COLUMN [") +
+                    nChildren +
+                    ((nChildren == 1) ? " child" : " children") +
+                    "] " +
+                    getBounds();
         }
     }
Index: trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 19103)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.io;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -31,4 +32,7 @@
  */
 public class ChangesetQuery {
+    private static final String ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL =
+            marktr("Unexpected value for ''{0}'' in changeset query url, got {1}");
+    private static final String DISPLAY_NAME = "display_name";
 
     /**
@@ -102,5 +106,5 @@
     /**
      * Restricts the query to changesets owned by the user with user name <code>username</code>.
-     *
+     * <p>
      * Caveat: for historical reasons the username might not be unique! It is recommended to use
      * {@link #forUser(int)} to restrict the query to a specific user.
@@ -226,5 +230,5 @@
             throw new IllegalArgumentException(tr("Illegal latitude value for parameter ''{0}'', got {1}", "minLat", minLat));
         if (!LatLon.isValidLat(maxLat))
-            throw new IllegalArgumentException(tr("Illegal longitude value for parameter ''{0}'', got {1}", "maxLat", maxLat));
+            throw new IllegalArgumentException(tr("Illegal latitude value for parameter ''{0}'', got {1}", "maxLat", maxLat));
 
         return inBbox(new LatLon(minLon, minLat), new LatLon(maxLon, maxLat));
@@ -356,6 +360,6 @@
                 sb.append('&');
             }
-            sb.append("time=").append(closedAfter);
-            sb.append(',').append(createdBefore);
+            sb.append("time=").append(closedAfter)
+                    .append(',').append(createdBefore);
         } else if (closedAfter != null) {
             if (sb.length() > 0) {
@@ -369,5 +373,5 @@
                 sb.append('&');
             }
-            sb.append("open=").append(Boolean.toString(open));
+            sb.append("open=").append(open);
         } else if (closed != null) {
             if (sb.length() > 0) {
@@ -433,15 +437,12 @@
         protected int parseUid(String value) throws ChangesetQueryUrlException {
             if (Utils.isStripEmpty(value))
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value));
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, "uid", value));
             int id;
             try {
                 id = Integer.parseInt(value);
                 if (id <= 0)
-                    throw new ChangesetQueryUrlException(
-                            tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value));
+                    throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, "uid", value));
             } catch (NumberFormatException e) {
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value), e);
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, "uid", value), e);
             }
             return id;
@@ -450,6 +451,5 @@
         protected boolean parseBoolean(String value, String parameter) throws ChangesetQueryUrlException {
             if (Utils.isStripEmpty(value))
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value));
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, parameter, value));
             switch (value) {
             case "true":
@@ -458,6 +458,5 @@
                 return false;
             default:
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value));
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, parameter, value));
             }
         }
@@ -465,11 +464,9 @@
         protected Instant parseDate(String value, String parameter) throws ChangesetQueryUrlException {
             if (Utils.isStripEmpty(value))
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value));
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, parameter, value));
             try {
                 return DateUtils.parseInstant(value);
             } catch (UncheckedParseException e) {
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value), e);
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, parameter, value), e);
             }
         }
@@ -478,16 +475,14 @@
             String[] dates = value.split(",", -1);
             if (dates.length == 0 || dates.length > 2)
-                throw new ChangesetQueryUrlException(
-                        tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "time", value));
+                throw new ChangesetQueryUrlException(tr(ERROR_UNEXPECTED_VALUE_CHANGESET_QUERY_URL, "time", value));
             if (dates.length == 1)
                 return new Instant[]{parseDate(dates[0], "time")};
-            else if (dates.length == 2)
-                return new Instant[]{parseDate(dates[0], "time"), parseDate(dates[1], "time")};
-            return new Instant[]{};
+            // This will always have length 2, due to the (dates.length == 0 || dates.length > 2) check above.
+            return new Instant[]{parseDate(dates[0], "time"), parseDate(dates[1], "time")};
         }
 
         protected Collection<Long> parseLongs(String value) {
             if (Utils.isEmpty(value)) {
-                return Collections.<Long>emptySet();
+                return Collections.emptySet();
             } else {
                 return Stream.of(value.split(",", -1)).map(Long::valueOf).collect(Collectors.toSet());
@@ -502,14 +497,14 @@
                 switch (k) {
                 case "uid":
-                    if (queryParams.containsKey("display_name"))
+                    if (queryParams.containsKey(DISPLAY_NAME))
                         throw new ChangesetQueryUrlException(
                                 tr("Cannot create a changeset query including both the query parameters ''uid'' and ''display_name''"));
                     csQuery.forUser(parseUid(queryParams.get("uid")));
                     break;
-                case "display_name":
+                case DISPLAY_NAME:
                     if (queryParams.containsKey("uid"))
                         throw new ChangesetQueryUrlException(
                                 tr("Cannot create a changeset query including both the query parameters ''uid'' and ''display_name''"));
-                    csQuery.forUser(queryParams.get("display_name"));
+                    csQuery.forUser(queryParams.get(DISPLAY_NAME));
                     break;
                 case "open":
@@ -566,8 +561,8 @@
         /**
          * Parses the changeset query given as URL query parameters and replies a {@link ChangesetQuery}.
-         *
-         * <code>query</code> is the query part of a API url for querying changesets,
+         * <p>
+         * <code>query</code> is the query part of an API url for querying changesets,
          * see <a href="http://wiki.openstreetmap.org/wiki/API_v0.6#Query:_GET_.2Fapi.2F0.6.2Fchangesets">OSM API</a>.
-         *
+         * <p>
          * Example for a query string:<br>
          * <pre>
Index: trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 19103)
@@ -2,7 +2,9 @@
 package org.openstreetmap.josm.io.session;
 
+import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.io.UncheckedIOException;
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
@@ -12,4 +14,5 @@
 import org.openstreetmap.josm.io.OsmWriter;
 import org.openstreetmap.josm.io.OsmWriterFactory;
+import org.openstreetmap.josm.tools.JosmRuntimeException;
 
 /**
@@ -40,9 +43,12 @@
     public static void exportData(DataSet data, OutputStream out) {
         Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
-        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
         data.getReadLock().lock();
-        try {
+        try (OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion())) {
             w.write(data);
             w.flush();
+        } catch (IOException e) {
+            // Catch needed since XmlWriter (parent of OsmWriter) has IOException in the method signature.
+            // It doesn't actually throw though. In other words, we should never hit this.
+            throw new UncheckedIOException(e);
         } finally {
             data.getReadLock().unlock();
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 19103)
@@ -6,5 +6,5 @@
 import java.awt.GraphicsEnvironment;
 import java.awt.Toolkit;
-import java.awt.event.KeyEvent;
+import java.awt.event.InputEvent;
 import java.io.BufferedReader;
 import java.io.File;
@@ -39,5 +39,5 @@
      * Visitor to construct a PlatformHook from a given {@link Platform} object.
      */
-    PlatformVisitor<PlatformHook> CONSTRUCT_FROM_PLATFORM = new PlatformVisitor<PlatformHook>() {
+    PlatformVisitor<PlatformHook> CONSTRUCT_FROM_PLATFORM = new PlatformVisitor<>() {
         @Override
         public PlatformHook visitUnixoid() {
@@ -65,5 +65,5 @@
       * The preStartupHook will be called extremely early. It is
       * guaranteed to be called before the GUI setup has started.
-      *
+      * <p>
       * Reason: On OSX we need to inform the Swing libraries
       * that we want to be integrated with the OS before we setup our GUI.
@@ -84,20 +84,19 @@
 
     /**
-      * The startupHook will be called early, but after the GUI
-      * setup has started.
-      *
-      * Reason: On OSX we need to register some callbacks with the
-      * OS, so we'll receive events from the system menu.
-      * @param javaCallback Java expiration callback, providing GUI feedback
-      * @param webStartCallback WebStart migration callback, providing GUI feedback
-      * @since 18985
-      */
-    default void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback,
-            SanityCheckCallback sanityCheckCallback) {
+     * The startupHook will be called early, but after the GUI
+     * setup has started.
+     * <p>
+     * Reason: On OSX we need to register some callbacks with the
+     * OS, so we'll receive events from the system menu.
+     * @param javaCallback Java expiration callback, providing GUI feedback
+     * @param sanityCheckCallback Sanity check callback, providing GUI feedback
+     * @since 18985
+     */
+    default void startupHook(JavaExpirationCallback javaCallback, SanityCheckCallback sanityCheckCallback) {
         startupSanityChecks(sanityCheckCallback);
     }
 
     /**
-      * The openURL hook will be used to open an URL in the
+      * The openURL hook will be used to open a URL in the
       * default web browser.
      * @param url The URL to open
@@ -111,15 +110,15 @@
       * from the config, but before any shortcuts are read from
       * it or registered from within the application.
-      *
+      * <p>
       * Please note that you are not allowed to register any
       * shortcuts from this hook, but only "systemCuts"!
-      *
+      * <p>
       * BTW: SystemCuts should be named "system:&lt;whatever&gt;",
       * and it'd be best if you'd recycle the names already used
-      * by the Windows and OSX hooks. Especially the later has
+      * by the Windows and OSX hooks. Especially the latter has
       * really many of them.
-      *
+      * <p>
       * You should also register any and all shortcuts that the
-      * operation system handles itself to block JOSM from trying
+      * operating system handles itself to block JOSM from trying
       * to use them---as that would just not work. Call setAutomatic
       * on them to prevent the keyboard preferences from allowing the
@@ -260,5 +259,5 @@
     default int getMenuShortcutKeyMaskEx() {
         // To remove when switching to Java 10+, and use Toolkit.getMenuShortcutKeyMaskEx instead
-        return KeyEvent.CTRL_DOWN_MASK;
+        return InputEvent.CTRL_DOWN_MASK;
     }
 
@@ -277,17 +276,4 @@
          */
         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);
     }
 
@@ -379,14 +365,7 @@
 
     /**
-     * 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/"));
-        }
-    }
-
+     * Check startup preconditions
+     * @param sanityCheckCallback The callback to inform the user about failed checks
+     */
     default void startupSanityChecks(SanityCheckCallback sanityCheckCallback) {
         final String arch = System.getProperty("os.arch");
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 19103)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.tools;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.Utils.getSystemProperty;
@@ -7,14 +8,13 @@
 import java.awt.Desktop;
 import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
 import java.awt.Image;
 import java.awt.Window;
+import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
+import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.security.KeyStoreException;
@@ -24,5 +24,4 @@
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
-import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
@@ -39,5 +38,5 @@
  * @since 1023
  */
-public class PlatformHookOsx implements PlatformHook, InvocationHandler {
+public class PlatformHookOsx implements PlatformHook {
 
     private String oSBuildNumber;
@@ -69,26 +68,14 @@
 
     @Override
-    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback,
-            SanityCheckCallback sanityCheckCallback) {
+    public void startupHook(JavaExpirationCallback javaCallback, SanityCheckCallback sanityCheckCallback) {
         // Here we register callbacks for the menu entries in the system menu and file opening through double-click
         // https://openjdk.java.net/jeps/272
         // https://bugs.openjdk.java.net/browse/JDK-8048731
         // https://cr.openjdk.java.net/~azvegint/jdk/9/8143227/10/jdk/
-        // This method must be cleaned up after we switch to Java 9
         try {
             Class<?> eawtApplication = Class.forName("com.apple.eawt.Application");
-            Class<?> quitHandler = findHandlerClass("QuitHandler");
-            Class<?> aboutHandler = findHandlerClass("AboutHandler");
-            Class<?> openFilesHandler = findHandlerClass("OpenFilesHandler");
-            Class<?> preferencesHandler = findHandlerClass("PreferencesHandler");
-            Object proxy = Proxy.newProxyInstance(PlatformHookOsx.class.getClassLoader(), new Class<?>[] {
-                quitHandler, aboutHandler, openFilesHandler, preferencesHandler}, this);
-            Object appli = eawtApplication.getConstructor((Class[]) null).newInstance((Object[]) null);
-            if (Utils.getJavaVersion() < 9) {
-                setHandlers(eawtApplication, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, appli);
-                // this method has been deprecated, but without replacement. To remove with Java 9 migration
-                eawtApplication.getDeclaredMethod("setEnabledPreferencesMenu", boolean.class).invoke(appli, Boolean.TRUE);
-            } else if (!GraphicsEnvironment.isHeadless()) {
-                setHandlers(Desktop.class, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, Desktop.getDesktop());
+            Object appli = eawtApplication.getConstructor((Class<?>[]) null).newInstance((Object[]) null);
+            if (!GraphicsEnvironment.isHeadless()) {
+                setHandlers();
             }
             // setup the dock icon. It is automatically set with application bundle and Web start but we need
@@ -107,6 +94,5 @@
         warnSoonToBeUnsupportedJava(javaCallback);
         checkExpiredJava(javaCallback);
-        checkWebStartMigration(webStartCallback);
-        PlatformHook.super.startupHook(javaCallback, webStartCallback, sanityCheckCallback);
+        PlatformHook.super.startupHook(javaCallback, sanityCheckCallback);
     }
 
@@ -122,44 +108,29 @@
     @Override
     public int getMenuShortcutKeyMaskEx() {
-        return KeyEvent.META_DOWN_MASK;
+        return InputEvent.META_DOWN_MASK;
     }
 
     /**
      * Registers Apple handlers.
-     * @param appClass application class
-     * @param quitHandler quit handler class
-     * @param aboutHandler about handler class
-     * @param openFilesHandler open file handler class
-     * @param preferencesHandler preferences handler class
-     * @param proxy proxy
-     * @param appInstance application instance (instance of {@code appClass})
-     * @throws IllegalAccessException in case of reflection error
-     * @throws InvocationTargetException in case of reflection error
-     * @throws NoSuchMethodException if any {@code set*Handler} method cannot be found
+     *
      */
-    protected void setHandlers(Class<?> appClass, Class<?> quitHandler, Class<?> aboutHandler,
-            Class<?> openFilesHandler, Class<?> preferencesHandler, Object proxy, Object appInstance)
-                    throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
-        appClass.getDeclaredMethod("setQuitHandler", quitHandler).invoke(appInstance, proxy);
-        appClass.getDeclaredMethod("setAboutHandler", aboutHandler).invoke(appInstance, proxy);
-        appClass.getDeclaredMethod("setOpenFileHandler", openFilesHandler).invoke(appInstance, proxy);
-        appClass.getDeclaredMethod("setPreferencesHandler", preferencesHandler).invoke(appInstance, proxy);
-    }
-
-    /**
-     * Find Apple handler class in {@code com.apple.eawt} or {@code java.awt.desktop} packages.
-     * @param className simple class name
-     * @return class
-     * @throws ClassNotFoundException if the handler class cannot be found
-     */
-    protected Class<?> findHandlerClass(String className) throws ClassNotFoundException {
-        try {
-            // Java 8 handlers
-            return Class.forName("com.apple.eawt."+className);
-        } catch (ClassNotFoundException e) {
-            Logging.trace(e);
-            // Java 9 handlers
-            return Class.forName("java.awt.desktop."+className);
-        }
+    protected void setHandlers() {
+        Desktop.getDesktop().setQuitHandler((event, response) -> {
+            boolean closed = osCallback.handleQuitRequest();
+            if (response != null) {
+                if (closed) {
+                    response.performQuit();
+                } else {
+                    response.cancelQuit();
+                }
+            }
+        });
+        Desktop.getDesktop().setAboutHandler(event -> osCallback.handleAbout());
+        Desktop.getDesktop().setOpenFileHandler(event -> {
+            if (event != null) {
+                osCallback.openFiles(event.getFiles());
+            }
+        });
+        Desktop.getDesktop().setPreferencesHandler(event -> osCallback.handlePreferences());
     }
 
@@ -186,189 +157,153 @@
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-        if (Logging.isDebugEnabled()) {
-            Logging.debug("macOS handler: {0} - {1}", method.getName(), Arrays.toString(args));
-        }
-        switch (method.getName()) {
-        case "openFiles":
-            if (args[0] != null) {
-                try {
-                    Object oFiles = args[0].getClass().getMethod("getFiles").invoke(args[0]);
-                    if (oFiles instanceof List) {
-                        osCallback.openFiles((List<File>) oFiles);
-                    }
-                } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
-                    Logging.warn("Failed to access open files event: " + ex);
-                }
-            }
-            break;
-        case "handleQuitRequestWith":
-            boolean closed = osCallback.handleQuitRequest();
-            if (args[1] != null) {
-                try {
-                    args[1].getClass().getDeclaredMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
-                } catch (IllegalAccessException e) {
-                    Logging.debug(e);
-                    // with Java 9, module java.desktop does not export com.apple.eawt, use new Desktop API instead
-                    Class.forName("java.awt.desktop.QuitResponse").getMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
-                }
-            }
-            break;
-        case "handleAbout":
-            osCallback.handleAbout();
-            break;
-        case "handlePreferences":
-            osCallback.handlePreferences();
-            break;
-        default:
-            Logging.warn("macOS unsupported method: "+method.getName());
-        }
-        return null;
-    }
-
     @Override
     public void openUrl(String url) throws IOException {
-        Runtime.getRuntime().exec(new String[]{"open", url});
-    }
-
-    @Override
+        try {
+            Desktop.getDesktop().browse(Utils.urlToURI(url));
+        } catch (HeadlessException | URISyntaxException e) {
+            Logging.log(Logging.LEVEL_WARN, "Desktop class failed. Platform dependent fall back for open url in browser.", e);
+            Runtime.getRuntime().exec(new String[]{"open", url});
+        }
+    }
+
+    @Override
+    @SuppressWarnings("squid:S103") // NOSONAR LineLength
     public void initSystemShortcuts() {
+        final String reserved = marktr("reserved");
         // CHECKSTYLE.OFF: LineLength
-        auto(Shortcut.registerSystemShortcut("apple-reserved-01", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK)); // Show or hide the Spotlight search field (when multiple languages are installed, may rotate through enabled script systems).
-        auto(Shortcut.registerSystemShortcut("apple-reserved-02", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Apple reserved.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-03", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show the Spotlight search results window (when multiple languages are installed, may rotate through keyboard layouts and input methods within a script).
-        auto(Shortcut.registerSystemShortcut("apple-reserved-04", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); //  | Apple reserved.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-05", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK)); // Navigate through controls in a reverse direction. See "Keyboard Focus and Navigation."
-        auto(Shortcut.registerSystemShortcut("apple-reserved-06", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK)); // Move forward to the next most recently used application in a list of open applications.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-07", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move backward through a list of open applications (sorted by recent use).
-        auto(Shortcut.registerSystemShortcut("apple-reserved-08", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the next grouping of controls in a dialog or the next table (when Tab moves to the next cell). See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-09", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous grouping of controls. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-10", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK)); // Open Front Row.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-11", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Open the Force Quit dialog.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-12", tr("reserved"), KeyEvent.VK_F1, KeyEvent.CTRL_DOWN_MASK)); // Toggle full keyboard access on or off. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-13", tr("reserved"), KeyEvent.VK_F2, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the menu bar. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-14", tr("reserved"), KeyEvent.VK_F3, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the Dock. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-15", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the active (or next) window. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-16", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previously active window. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-17", tr("reserved"), KeyEvent.VK_F5, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the toolbar. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-18", tr("reserved"), KeyEvent.VK_F5, KeyEvent.META_DOWN_MASK)); // Turn VoiceOver on or off. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-19", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the first (or next) panel. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-20", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous panel. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-21", tr("reserved"), KeyEvent.VK_F7, KeyEvent.CTRL_DOWN_MASK)); // Temporarily override the current keyboard access mode in windows and dialogs. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-01", tr(reserved), KeyEvent.VK_SPACE, InputEvent.META_DOWN_MASK)); // Show or hide the Spotlight search field (when multiple languages are installed, may rotate through enabled script systems).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-02", tr(reserved), KeyEvent.VK_SPACE, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Apple reserved.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-03", tr(reserved), KeyEvent.VK_SPACE, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Show the Spotlight search results window (when multiple languages are installed, may rotate through keyboard layouts and input methods within a script).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-04", tr(reserved), KeyEvent.VK_SPACE, InputEvent.META_DOWN_MASK | InputEvent.CTRL_DOWN_MASK)); //  | Apple reserved.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-05", tr(reserved), KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK)); // Navigate through controls in a reverse direction. See "Keyboard Focus and Navigation."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-06", tr(reserved), KeyEvent.VK_TAB, InputEvent.META_DOWN_MASK)); // Move forward to the next most recently used application in a list of open applications.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-07", tr(reserved), KeyEvent.VK_TAB, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Move backward through a list of open applications (sorted by recent use).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-08", tr(reserved), KeyEvent.VK_TAB, InputEvent.CTRL_DOWN_MASK)); // Move focus to the next grouping of controls in a dialog or the next table (when Tab moves to the next cell). See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-09", tr(reserved), KeyEvent.VK_TAB, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Move focus to the previous grouping of controls. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-10", tr(reserved), KeyEvent.VK_ESCAPE, InputEvent.META_DOWN_MASK)); // Open Front Row.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-11", tr(reserved), KeyEvent.VK_ESCAPE, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Open the Force Quit dialog.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-12", tr(reserved), KeyEvent.VK_F1, InputEvent.CTRL_DOWN_MASK)); // Toggle full keyboard access on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-13", tr(reserved), KeyEvent.VK_F2, InputEvent.CTRL_DOWN_MASK)); // Move focus to the menu bar. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-14", tr(reserved), KeyEvent.VK_F3, InputEvent.CTRL_DOWN_MASK)); // Move focus to the Dock. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-15", tr(reserved), KeyEvent.VK_F4, InputEvent.CTRL_DOWN_MASK)); // Move focus to the active (or next) window. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-16", tr(reserved), KeyEvent.VK_F4, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Move focus to the previously active window. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-17", tr(reserved), KeyEvent.VK_F5, InputEvent.CTRL_DOWN_MASK)); // Move focus to the toolbar. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-18", tr(reserved), KeyEvent.VK_F5, InputEvent.META_DOWN_MASK)); // Turn VoiceOver on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-19", tr(reserved), KeyEvent.VK_F6, InputEvent.CTRL_DOWN_MASK)); // Move focus to the first (or next) panel. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-20", tr(reserved), KeyEvent.VK_F6, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Move focus to the previous panel. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-21", tr(reserved), KeyEvent.VK_F7, InputEvent.CTRL_DOWN_MASK)); // Temporarily override the current keyboard access mode in windows and dialogs. See Accessibility Overview.
         //auto(Shortcut.registerSystemShortcut("apple-reserved-22", tr("reserved"), KeyEvent.VK_F9, 0)); // Tile or untile all open windows.
         //auto(Shortcut.registerSystemShortcut("apple-reserved-23", tr("reserved"), KeyEvent.VK_F10, 0)); // Tile or untile all open windows in the currently active application.
         //auto(Shortcut.registerSystemShortcut("apple-reserved-24", tr("reserved"), KeyEvent.VK_F11, 0)); // Hide or show all open windows.
         //auto(Shortcut.registerSystemShortcut("apple-reserved-25", tr("reserved"), KeyEvent.VK_F12, 0)); // Hide or display Dashboard.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-26", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK)); // Activate the next open window in the frontmost application. See "Window Layering."
-        auto(Shortcut.registerSystemShortcut("apple-reserved-27", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Activate the previous open window in the frontmost application. See "Window Layering."
-        auto(Shortcut.registerSystemShortcut("apple-reserved-28", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Move focus to the window drawer.
-        //auto(Shortcut.registerSystemShortcut("apple-reserved-29", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK)); // Decrease the size of the selected item (equivalent to the Smaller command). See "The Format Menu."
-        auto(Shortcut.registerSystemShortcut("apple-reserved-30", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom out when screen zooming is on. See Accessibility Overview.
-
-        //Shortcut.registerSystemShortcut("system:align-left", tr("reserved"), KeyEvent.VK_OPEN_BRACKET, KeyEvent.META_DOWN_MASK); // Left-align a selection (equivalent to the Align Left command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:align-right",tr("reserved"), KeyEvent.VK_CLOSE_BRACKET, KeyEvent.META_DOWN_MASK); // Right-align a selection (equivalent to the Align Right command). See "The Format Menu."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-26", tr(reserved), KeyEvent.VK_DEAD_GRAVE, InputEvent.META_DOWN_MASK)); // Activate the next open window in the frontmost application. See "Window Layering."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-27", tr(reserved), KeyEvent.VK_DEAD_GRAVE, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Activate the previous open window in the frontmost application. See "Window Layering."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-28", tr(reserved), KeyEvent.VK_DEAD_GRAVE, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Move focus to the window drawer.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-29", tr(reserved), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK)); // Decrease the size of the selected item (equivalent to the Smaller command). See "The Format Menu."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-30", tr(reserved), KeyEvent.VK_MINUS, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Zoom out when screen zooming is on. See Accessibility Overview.
+
+        //Shortcut.registerSystemShortcut("system:align-left", tr(reserved), KeyEvent.VK_OPEN_BRACKET, KeyEvent.META_DOWN_MASK); // Left-align a selection (equivalent to the Align Left command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:align-right",tr(reserved), KeyEvent.VK_CLOSE_BRACKET, KeyEvent.META_DOWN_MASK); // Right-align a selection (equivalent to the Align Right command). See "The Format Menu."
         // I found no KeyEvent for |
-        //Shortcut.registerSystemCut("system:align-center", tr("reserved"), '|', KeyEvent.META_DOWN_MASK); // Center-align a selection (equivalent to the Align Center command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:spelling", tr("reserved"), KeyEvent.VK_COLON, KeyEvent.META_DOWN_MASK); // Display the Spelling window (equivalent to the Spelling command). See "The Edit Menu."
-        //Shortcut.registerSystemShortcut("system:spellcheck", tr("reserved"), KeyEvent.VK_SEMICOLON, KeyEvent.META_DOWN_MASK); // Find misspelled words in the document (equivalent to the Check Spelling command). See "The Edit Menu."
-        auto(Shortcut.registerSystemShortcut("system:preferences", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK)); // Open the application's preferences window (equivalent to the Preferences command). See "The Application Menu."
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-31", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Decrease screen contrast. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-32", tr("reserved"), KeyEvent.VK_PERIOD, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Increase screen contrast. See Accessibility Overview.
+        //Shortcut.registerSystemCut("system:align-center", tr(reserved), '|', KeyEvent.META_DOWN_MASK); // Center-align a selection (equivalent to the Align Center command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:spelling", tr(reserved), KeyEvent.VK_COLON, KeyEvent.META_DOWN_MASK); // Display the Spelling window (equivalent to the Spelling command). See "The Edit Menu."
+        //Shortcut.registerSystemShortcut("system:spellcheck", tr(reserved), KeyEvent.VK_SEMICOLON, KeyEvent.META_DOWN_MASK); // Find misspelled words in the document (equivalent to the Check Spelling command). See "The Edit Menu."
+        auto(Shortcut.registerSystemShortcut("system:preferences", tr(reserved), KeyEvent.VK_COMMA, InputEvent.META_DOWN_MASK)); // Open the application's preferences window (equivalent to the Preferences command). See "The Application Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-31", tr(reserved), KeyEvent.VK_COMMA, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Decrease screen contrast. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-32", tr(reserved), KeyEvent.VK_PERIOD, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Increase screen contrast. See Accessibility Overview.
 
         // I found no KeyEvent for ?
-        //auto(Shortcut.registerSystemCut("system:help", tr("reserved"), '?', KeyEvent.META_DOWN_MASK)); // Open the application's help in Help Viewer. See "The Help Menu."
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-33", tr("reserved"), KeyEvent.VK_SLASH, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn font smoothing on or off.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-34", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Increase the size of the selected item (equivalent to the Bigger command). See "The Format Menu."
-        auto(Shortcut.registerSystemShortcut("apple-reserved-35", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom in when screen zooming is on. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-36", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture the screen to a file.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-37", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture the screen to the Clipboard.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-38", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture a selection to a file.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-39", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture a selection to the Clipboard.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-40", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn screen zooming on or off. See Accessibility Overview.
-        auto(Shortcut.registerSystemShortcut("apple-reserved-41", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Invert the screen colors. See Accessibility Overview.
-
-        Shortcut.registerSystemShortcut("system:selectall", tr("reserved"), KeyEvent.VK_A, KeyEvent.META_DOWN_MASK); // Highlight every item in a document or window, or all characters in a text field (equivalent to the Select All command). See "The Edit Menu."
-        //Shortcut.registerSystemShortcut("system:bold", tr("reserved"), KeyEvent.VK_B, KeyEvent.META_DOWN_MASK); // Boldface the selected text or toggle boldfaced text on and off (equivalent to the Bold command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:copy", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK); // Duplicate the selected data and store on the Clipboard (equivalent to the Copy command). See "The Edit Menu."
-        //Shortcut.registerSystemShortcut("system:colors", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Colors window (equivalent to the Show Colors command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:copystyle", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Copy the style of the selected text (equivalent to the Copy Style command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:copyformat", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Copy the formatting settings of the selected item and store on the Clipboard (equivalent to the Copy Ruler command). See "The Format Menu."
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-42", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show or hide the Dock. See "The Dock."
-
-        Shortcut.registerSystemShortcut("system:dictionarylookup", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Display the definition of the selected word in the Dictionary application.
-        //Shortcut.registerSystemShortcut("system:findselected", tr("reserved"), KeyEvent.VK_E, KeyEvent.META_DOWN_MASK); // Use the selection for a find operation. See "Find Windows."
-        Shortcut.registerSystemShortcut("system:find", tr("reserved"), KeyEvent.VK_F, KeyEvent.META_DOWN_MASK); // Open a Find window (equivalent to the Find command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:search", tr("reserved"), KeyEvent.VK_F, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Jump to the search field control. See "Search Fields."
-        //Shortcut.registerSystemShortcut("system:findnext", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK); // Find the next occurrence of the selection (equivalent to the Find Next command). See "The Edit Menu."
-        //Shortcut.registerSystemShortcut("system:findprev", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Find the previous occurrence of the selection (equivalent to the Find Previous command). See "The Edit Menu."
-        auto(Shortcut.registerSystemShortcut("system:hide", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK)); // Hide the windows of the currently running application (equivalent to the Hide ApplicationName command). See "The Application Menu."
-        auto(Shortcut.registerSystemShortcut("system:hideothers", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Hide the windows of all other running applications (equivalent to the Hide Others command). See "The Application Menu."
+        //auto(Shortcut.registerSystemCut("system:help", tr(reserved), '?', KeyEvent.META_DOWN_MASK)); // Open the application's help in Help Viewer. See "The Help Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-33", tr(reserved), KeyEvent.VK_SLASH, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Turn font smoothing on or off.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-34", tr(reserved), KeyEvent.VK_EQUALS, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Increase the size of the selected item (equivalent to the Bigger command). See "The Format Menu."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-35", tr(reserved), KeyEvent.VK_EQUALS, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Zoom in when screen zooming is on. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-36", tr(reserved), KeyEvent.VK_3, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Capture the screen to a file.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-37", tr(reserved), KeyEvent.VK_3, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK)); // Capture the screen to the Clipboard.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-38", tr(reserved), KeyEvent.VK_4, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Capture a selection to a file.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-39", tr(reserved), KeyEvent.VK_4, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK)); // Capture a selection to the Clipboard.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-40", tr(reserved), KeyEvent.VK_8, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Turn screen zooming on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-41", tr(reserved), KeyEvent.VK_8, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK)); // Invert the screen colors. See Accessibility Overview.
+
+        Shortcut.registerSystemShortcut("system:selectall", tr(reserved), KeyEvent.VK_A, InputEvent.META_DOWN_MASK); // Highlight every item in a document or window, or all characters in a text field (equivalent to the Select All command). See "The Edit Menu."
+        //Shortcut.registerSystemShortcut("system:bold", tr(reserved), KeyEvent.VK_B, KeyEvent.META_DOWN_MASK); // Boldface the selected text or toggle boldfaced text on and off (equivalent to the Bold command). See "The Edit Menu."
+        Shortcut.registerSystemShortcut("system:copy", tr(reserved), KeyEvent.VK_C, InputEvent.META_DOWN_MASK); // Duplicate the selected data and store on the Clipboard (equivalent to the Copy command). See "The Edit Menu."
+        //Shortcut.registerSystemShortcut("system:colors", tr(reserved), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Colors window (equivalent to the Show Colors command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:copystyle", tr(reserved), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Copy the style of the selected text (equivalent to the Copy Style command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:copyformat", tr(reserved), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Copy the formatting settings of the selected item and store on the Clipboard (equivalent to the Copy Ruler command). See "The Format Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-42", tr(reserved), KeyEvent.VK_D, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Show or hide the Dock. See "The Dock."
+
+        Shortcut.registerSystemShortcut("system:dictionarylookup", tr(reserved), KeyEvent.VK_D, InputEvent.META_DOWN_MASK | InputEvent.CTRL_DOWN_MASK); // Display the definition of the selected word in the Dictionary application.
+        //Shortcut.registerSystemShortcut("system:findselected", tr(reserved), KeyEvent.VK_E, KeyEvent.META_DOWN_MASK); // Use the selection for a find operation. See "Find Windows."
+        Shortcut.registerSystemShortcut("system:find", tr(reserved), KeyEvent.VK_F, InputEvent.META_DOWN_MASK); // Open a Find window (equivalent to the Find command). See "The Edit Menu."
+        Shortcut.registerSystemShortcut("system:search", tr(reserved), KeyEvent.VK_F, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK); // Jump to the search field control. See "Search Fields."
+        //Shortcut.registerSystemShortcut("system:findnext", tr(reserved), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK); // Find the next occurrence of the selection (equivalent to the Find Next command). See "The Edit Menu."
+        //Shortcut.registerSystemShortcut("system:findprev", tr(reserved), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Find the previous occurrence of the selection (equivalent to the Find Previous command). See "The Edit Menu."
+        auto(Shortcut.registerSystemShortcut("system:hide", tr(reserved), KeyEvent.VK_H, InputEvent.META_DOWN_MASK)); // Hide the windows of the currently running application (equivalent to the Hide ApplicationName command). See "The Application Menu."
+        auto(Shortcut.registerSystemShortcut("system:hideothers", tr(reserved), KeyEvent.VK_H, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Hide the windows of all other running applications (equivalent to the Hide Others command). See "The Application Menu."
         // What about applications that have italic text AND info windows?
-        //Shortcut.registerSystemCut("system:italic", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Italicize the selected text or toggle italic text on or off (equivalent to the Italic command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:info", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Display an Info window. See "Inspector Windows."
-        //Shortcut.registerSystemShortcut("system:inspector", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Display an inspector window. See "Inspector Windows."
-        //Shortcut.registerSystemShortcut("system:toselection", tr("reserved"), KeyEvent.VK_J, KeyEvent.META_DOWN_MASK); // Scroll to a selection.
-        //Shortcut.registerSystemShortcut("system:minimize", tr("reserved"), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK); // Minimize the active window to the Dock (equivalent to the Minimize command). See "The Window Menu."
-        //Shortcut.registerSystemShortcut("system:minimizeall", tr("reserved"), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Minimize all windows of the active application to the Dock (equivalent to the Minimize All command). See "The Window Menu."
-        Shortcut.registerSystemShortcut("system:new", tr("reserved"), KeyEvent.VK_N, KeyEvent.META_DOWN_MASK); // Open a new document (equivalent to the New command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:open", tr("reserved"), KeyEvent.VK_O, KeyEvent.META_DOWN_MASK); // Display a dialog for choosing a document to open (equivalent to the Open command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:print", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK); // Display the Print dialog (equivalent to the Print command). See "The File Menu."
-        //Shortcut.registerSystemShortcut("system:printsetup", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display a dialog for specifying printing parameters (equivalent to the Page Setup command). See "The File Menu."
-        auto(Shortcut.registerSystemShortcut("system:menuexit", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK)); // Quit the application (equivalent to the Quit command). See "The Application Menu."
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-43", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Log out the current user (equivalent to the Log Out command).
-        auto(Shortcut.registerSystemShortcut("apple-reserved-44", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Log out the current user without confirmation.
-
-        Shortcut.registerSystemShortcut("system:save", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK); // Save the active document (equivalent to the Save command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:saveas", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Save dialog (equivalent to the Save As command). See "The File Menu."
-        //Shortcut.registerSystemShortcut("system:fonts", tr("reserved"), KeyEvent.VK_T, KeyEvent.META_DOWN_MASK); // Display the Fonts window (equivalent to the Show Fonts command). See "The Format Menu."
-        Shortcut.registerSystemShortcut("system:toggletoolbar", tr("reserved"), KeyEvent.VK_T, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Show or hide a toolbar (equivalent to the Show/Hide Toolbar command). See "The View Menu" and "Toolbars."
-        //Shortcut.registerSystemShortcut("system:underline", tr("reserved"), KeyEvent.VK_U, KeyEvent.META_DOWN_MASK); // Underline the selected text or turn underlining on or off (equivalent to the Underline command). See "The Format Menu."
-        Shortcut.registerSystemShortcut("system:paste", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK); // Insert the Clipboard contents at the insertion point (equivalent to the Paste command). See "The File Menu."
-        //Shortcut.registerSystemShortcut("system:pastestyle", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of one object to the selected object (equivalent to the Paste Style command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:pastemwithoutstyle", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of the surrounding text to the inserted object (equivalent to the Paste and Match Style command). See "The Edit Menu."
-        //Shortcut.registerSystemShortcut("system:pasteformatting", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Apply formatting settings to the selected object (equivalent to the Paste Ruler command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:closewindow", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK); // Close the active window (equivalent to the Close command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:closefile", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Close a file and its associated windows (equivalent to the Close File command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:closeallwindows", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Close all windows in the application (equivalent to the Close All command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:cut", tr("reserved"), KeyEvent.VK_X, KeyEvent.META_DOWN_MASK); // Remove the selection and store on the Clipboard (equivalent to the Cut command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:undo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK); // Reverse the effect of the user's previous operation (equivalent to the Undo command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:redo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Reverse the effect of the last Undo command (equivalent to the Redo command). See "The Edit Menu."
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-45", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of Roman script.
-        //auto(Shortcut.registerSystemCut("apple-reserved-46", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the next semantic unit, typically the end of the current line.
-        //auto(Shortcut.registerSystemCut("apple-reserved-47", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the right.
-        //auto(Shortcut.registerSystemCut("apple-reserved-48", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current word, then to the end of the next word.
-
-        Shortcut.registerSystemShortcut("system:movefocusright", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
-
-        auto(Shortcut.registerSystemShortcut("apple-reserved-49", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of system script.
-        //auto(Shortcut.registerSystemCut("apple-reserved-50", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the previous semantic unit, typically the beginning of the current line.
-        //auto(Shortcut.registerSystemCut("apple-reserved-51", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the left.
-        //auto(Shortcut.registerSystemCut("apple-reserved-52", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current word, then to the beginning of the previous word.
-
-        Shortcut.registerSystemShortcut("system:movefocusleft", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
-
-        //auto(Shortcut.registerSystemCut("apple-reserved-53", tr("reserved"), KeyEvent.VK_UP, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection upward in the next semantic unit, typically the beginning of the document.
-        //auto(Shortcut.registerSystemCut("apple-reserved-54", tr("reserved"), KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line above, to the nearest character boundary at the same horizontal location.
-        //auto(Shortcut.registerSystemCut("apple-reserved-55", tr("reserved"), KeyEvent.VK_UP, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current paragraph, then to the beginning of the next paragraph.
-
-        Shortcut.registerSystemShortcut("system:movefocusup", tr("reserved"), KeyEvent.VK_UP, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
-
-        //auto(Shortcut.registerSystemCut("apple-reserved-56", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection downward in the next semantic unit, typically the end of the document.
-        //auto(Shortcut.registerSystemCut("apple-reserved-57", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line below, to the nearest character boundary at the same horizontal location.
-        //auto(Shortcut.registerSystemCut("apple-reserved-58", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current paragraph, then to the end of the next paragraph (include the blank line between paragraphs in cut, copy, and paste operations).
-
-        Shortcut.registerSystemShortcut("system:movefocusdown", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
-
-        auto(Shortcut.registerSystemShortcut("system:about", tr("reserved"), 0, -1)); // About
-
-        //Shortcut.registerSystemShortcut("view:zoomin", tr("reserved"), KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK); // Zoom in
-        //Shortcut.registerSystemShortcut("view:zoomout", tr("reserved"), KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK); // Zoom out
+        //Shortcut.registerSystemCut("system:italic", tr(reserved), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Italicize the selected text or toggle italic text on or off (equivalent to the Italic command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:info", tr(reserved), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Display an Info window. See "Inspector Windows."
+        //Shortcut.registerSystemShortcut("system:inspector", tr(reserved), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Display an inspector window. See "Inspector Windows."
+        //Shortcut.registerSystemShortcut("system:toselection", tr(reserved), KeyEvent.VK_J, KeyEvent.META_DOWN_MASK); // Scroll to a selection.
+        //Shortcut.registerSystemShortcut("system:minimize", tr(reserved), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK); // Minimize the active window to the Dock (equivalent to the Minimize command). See "The Window Menu."
+        //Shortcut.registerSystemShortcut("system:minimizeall", tr(reserved), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Minimize all windows of the active application to the Dock (equivalent to the Minimize All command). See "The Window Menu."
+        Shortcut.registerSystemShortcut("system:new", tr(reserved), KeyEvent.VK_N, InputEvent.META_DOWN_MASK); // Open a new document (equivalent to the New command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:open", tr(reserved), KeyEvent.VK_O, InputEvent.META_DOWN_MASK); // Display a dialog for choosing a document to open (equivalent to the Open command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:print", tr(reserved), KeyEvent.VK_P, InputEvent.META_DOWN_MASK); // Display the Print dialog (equivalent to the Print command). See "The File Menu."
+        //Shortcut.registerSystemShortcut("system:printsetup", tr(reserved), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display a dialog for specifying printing parameters (equivalent to the Page Setup command). See "The File Menu."
+        auto(Shortcut.registerSystemShortcut("system:menuexit", tr(reserved), KeyEvent.VK_Q, InputEvent.META_DOWN_MASK)); // Quit the application (equivalent to the Quit command). See "The Application Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-43", tr(reserved), KeyEvent.VK_Q, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); // Log out the current user (equivalent to the Log Out command).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-44", tr(reserved), KeyEvent.VK_Q, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); // Log out the current user without confirmation.
+
+        Shortcut.registerSystemShortcut("system:save", tr(reserved), KeyEvent.VK_S, InputEvent.META_DOWN_MASK); // Save the active document (equivalent to the Save command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:saveas", tr(reserved), KeyEvent.VK_S, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK); // Display the Save dialog (equivalent to the Save As command). See "The File Menu."
+        //Shortcut.registerSystemShortcut("system:fonts", tr(reserved), KeyEvent.VK_T, KeyEvent.META_DOWN_MASK); // Display the Fonts window (equivalent to the Show Fonts command). See "The Format Menu."
+        Shortcut.registerSystemShortcut("system:toggletoolbar", tr(reserved), KeyEvent.VK_T, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK); // Show or hide a toolbar (equivalent to the Show/Hide Toolbar command). See "The View Menu" and "Toolbars."
+        //Shortcut.registerSystemShortcut("system:underline", tr(reserved), KeyEvent.VK_U, KeyEvent.META_DOWN_MASK); // Underline the selected text or turn underlining on or off (equivalent to the Underline command). See "The Format Menu."
+        Shortcut.registerSystemShortcut("system:paste", tr(reserved), KeyEvent.VK_V, InputEvent.META_DOWN_MASK); // Insert the Clipboard contents at the insertion point (equivalent to the Paste command). See "The File Menu."
+        //Shortcut.registerSystemShortcut("system:pastestyle", tr(reserved), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of one object to the selected object (equivalent to the Paste Style command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:pastemwithoutstyle", tr(reserved), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of the surrounding text to the inserted object (equivalent to the Paste and Match Style command). See "The Edit Menu."
+        //Shortcut.registerSystemShortcut("system:pasteformatting", tr(reserved), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Apply formatting settings to the selected object (equivalent to the Paste Ruler command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:closewindow", tr(reserved), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK); // Close the active window (equivalent to the Close command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:closefile", tr(reserved), KeyEvent.VK_W, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK); // Close a file and its associated windows (equivalent to the Close File command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:closeallwindows", tr(reserved), KeyEvent.VK_W, InputEvent.META_DOWN_MASK | InputEvent.ALT_DOWN_MASK); // Close all windows in the application (equivalent to the Close All command). See "The File Menu."
+        Shortcut.registerSystemShortcut("system:cut", tr(reserved), KeyEvent.VK_X, InputEvent.META_DOWN_MASK); // Remove the selection and store on the Clipboard (equivalent to the Cut command). See "The Edit Menu."
+        Shortcut.registerSystemShortcut("system:undo", tr(reserved), KeyEvent.VK_Z, InputEvent.META_DOWN_MASK); // Reverse the effect of the user's previous operation (equivalent to the Undo command). See "The Edit Menu."
+        Shortcut.registerSystemShortcut("system:redo", tr(reserved), KeyEvent.VK_Z, InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK); // Reverse the effect of the last Undo command (equivalent to the Redo command). See "The Edit Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-45", tr(reserved), KeyEvent.VK_RIGHT, InputEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of Roman script.
+        //auto(Shortcut.registerSystemCut("apple-reserved-46", tr(reserved), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the next semantic unit, typically the end of the current line.
+        //auto(Shortcut.registerSystemCut("apple-reserved-47", tr(reserved), KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the right.
+        //auto(Shortcut.registerSystemCut("apple-reserved-48", tr(reserved), KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current word, then to the end of the next word.
+
+        Shortcut.registerSystemShortcut("system:movefocusright", tr(reserved), KeyEvent.VK_RIGHT, InputEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-49", tr(reserved), KeyEvent.VK_LEFT, InputEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of system script.
+        //auto(Shortcut.registerSystemCut("apple-reserved-50", tr(reserved), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the previous semantic unit, typically the beginning of the current line.
+        //auto(Shortcut.registerSystemCut("apple-reserved-51", tr(reserved), KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the left.
+        //auto(Shortcut.registerSystemCut("apple-reserved-52", tr(reserved), KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current word, then to the beginning of the previous word.
+
+        Shortcut.registerSystemShortcut("system:movefocusleft", tr(reserved), KeyEvent.VK_LEFT, InputEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
+
+        //auto(Shortcut.registerSystemCut("apple-reserved-53", tr(reserved), KeyEvent.VK_UP, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection upward in the next semantic unit, typically the beginning of the document.
+        //auto(Shortcut.registerSystemCut("apple-reserved-54", tr(reserved), KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line above, to the nearest character boundary at the same horizontal location.
+        //auto(Shortcut.registerSystemCut("apple-reserved-55", tr(reserved), KeyEvent.VK_UP, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current paragraph, then to the beginning of the next paragraph.
+
+        Shortcut.registerSystemShortcut("system:movefocusup", tr(reserved), KeyEvent.VK_UP, InputEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
+
+        //auto(Shortcut.registerSystemCut("apple-reserved-56", tr(reserved), KeyEvent.VK_DOWN, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection downward in the next semantic unit, typically the end of the document.
+        //auto(Shortcut.registerSystemCut("apple-reserved-57", tr(reserved), KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line below, to the nearest character boundary at the same horizontal location.
+        //auto(Shortcut.registerSystemCut("apple-reserved-58", tr(reserved), KeyEvent.VK_DOWN, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current paragraph, then to the end of the next paragraph (include the blank line between paragraphs in cut, copy, and paste operations).
+
+        Shortcut.registerSystemShortcut("system:movefocusdown", tr(reserved), KeyEvent.VK_DOWN, InputEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
+
+        auto(Shortcut.registerSystemShortcut("system:about", tr(reserved), 0, -1)); // About
+
+        //Shortcut.registerSystemShortcut("view:zoomin", tr(reserved), KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK); // Zoom in
+        //Shortcut.registerSystemShortcut("view:zoomout", tr(reserved), KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK); // Zoom out
         // CHECKSTYLE.ON: LineLength
     }
@@ -380,4 +315,8 @@
     }
 
+    private static String getHome() {
+        return getSystemProperty("user.home");
+    }
+
     @Override
     public String getDefaultStyle() {
@@ -399,9 +338,10 @@
         StringBuilder sb = new StringBuilder();
         try {
-            sb.append(exec("sw_vers", "-productName"))
+            String swVers = "sw_vers";
+            sb.append(exec(swVers, "-productName"))
               .append(' ')
-              .append(exec("sw_vers", "-productVersion"))
+              .append(exec(swVers, "-productVersion"))
               .append(" (")
-              .append(exec("sw_vers", "-buildVersion"))
+              .append(exec(swVers, "-buildVersion"))
               .append(')');
         } catch (IOException e) {
@@ -421,5 +361,5 @@
     @Override
     public File getDefaultCacheDirectory() {
-        return new File(getSystemProperty("user.home")+"/Library/Caches",
+        return new File(getHome() + "/Library/Caches",
                 Preferences.getJOSMDirectoryBaseName());
     }
@@ -427,5 +367,5 @@
     @Override
     public File getDefaultPrefDirectory() {
-        return new File(getSystemProperty("user.home")+"/Library/Preferences",
+        return new File(getHome() + "/Library/Preferences",
                 Preferences.getJOSMDirectoryBaseName());
     }
@@ -433,5 +373,5 @@
     @Override
     public File getDefaultUserDataDirectory() {
-        return new File(getSystemProperty("user.home")+"/Library",
+        return new File(getHome() + "/Library",
                 Preferences.getJOSMDirectoryBaseName());
     }
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 19103)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.tools;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.Utils.getSystemEnv;
@@ -7,4 +8,5 @@
 
 import java.awt.Desktop;
+import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.io.BufferedReader;
@@ -29,4 +31,6 @@
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.data.Preferences;
@@ -51,21 +55,14 @@
         // See #12022, #16666 - Disable GNOME ATK Java wrapper as it causes a lot of serious trouble
         if (isDebianOrUbuntu()) {
-            if (Utils.getJavaVersion() >= 9) {
-                // TODO: find a way to disable ATK wrapper on Java >= 9
-                // We should probably be able to do that by embedding a no-op AccessibilityProvider in our jar
-                // so that it is loaded by ServiceLoader without error
-                // But this require to compile at least one class with Java 9
-            } else {
-                // Java 8 does a simple Class.newInstance() from system classloader
-                Utils.updateSystemProperty("javax.accessibility.assistive_technologies", "java.lang.Object");
-            }
-        }
-    }
-
-    @Override
-    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback,
-            SanityCheckCallback sanityCheckCallback) {
-        checkWebStartMigration(webStartCallback);
-        PlatformHook.super.startupHook(javaCallback, webStartCallback, sanityCheckCallback);
+            // TODO: find a way to disable ATK wrapper on Java >= 9
+            // We should probably be able to do that by embedding a no-op AccessibilityProvider in our jar
+            // so that it is loaded by ServiceLoader without error
+            // But this require to compile at least one class with Java 9
+        }
+    }
+
+    @Override
+    public void startupHook(JavaExpirationCallback javaCallback, SanityCheckCallback sanityCheckCallback) {
+        PlatformHook.super.startupHook(javaCallback, sanityCheckCallback);
     }
 
@@ -91,14 +88,16 @@
 
     @Override
+    @SuppressWarnings("squid:S103") // NOSONAR LineLength
     public void initSystemShortcuts() {
+        final String reserved = marktr("reserved");
         // CHECKSTYLE.OFF: LineLength
         // TODO: Insert system shortcuts here. See Windows and especially OSX to see how to.
         for (int i = KeyEvent.VK_F1; i <= KeyEvent.VK_F12; ++i) {
-            Shortcut.registerSystemShortcut("screen:toogle"+i, tr("reserved"), i, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)
+            Shortcut.registerSystemShortcut("screen:toggle"+i, tr(reserved), i, InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)
                 .setAutomatic();
         }
-        Shortcut.registerSystemShortcut("system:reset", tr("reserved"), KeyEvent.VK_DELETE, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)
+        Shortcut.registerSystemShortcut("system:reset", tr(reserved), KeyEvent.VK_DELETE, InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)
             .setAutomatic();
-        Shortcut.registerSystemShortcut("system:resetX", tr("reserved"), KeyEvent.VK_BACK_SPACE, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)
+        Shortcut.registerSystemShortcut("system:resetX", tr(reserved), KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)
             .setAutomatic();
         // CHECKSTYLE.ON: LineLength
@@ -175,5 +174,5 @@
     /**
      * Get the Java package name including detailed version.
-     *
+     * <p>
      * Some Java bugs are specific to a certain security update, so in addition
      * to the Java version, we also need the exact package version.
@@ -183,14 +182,11 @@
     public String getJavaPackageDetails() {
         String home = getSystemProperty("java.home");
-        if (home.contains("java-8-openjdk") || home.contains("java-1.8.0-openjdk")) {
-            return getPackageDetails("openjdk-8-jre", "java-1_8_0-openjdk", "java-1.8.0-openjdk");
-        } else if (home.contains("java-9-openjdk") || home.contains("java-1.9.0-openjdk")) {
-            return getPackageDetails("openjdk-9-jre", "java-1_9_0-openjdk", "java-1.9.0-openjdk", "java-9-openjdk");
-        } else if (home.contains("java-10-openjdk")) {
-            return getPackageDetails("openjdk-10-jre", "java-10-openjdk");
-        } else if (home.contains("java-11-openjdk")) {
-            return getPackageDetails("openjdk-11-jre", "java-11-openjdk");
-        } else if (home.contains("java-17-openjdk")) {
-            return getPackageDetails("openjdk-17-jre", "java-17-openjdk");
+        if (home == null) {
+            return null;
+        }
+        Matcher matcher = Pattern.compile("java-(\\d+)-openjdk").matcher(home);
+        if (matcher.find()) {
+            String version = matcher.group(1);
+            return getPackageDetails("openjdk-" + version + "-jre", "java-" + version + "-openjdk");
         } else if (home.contains("java-openjdk")) {
             return getPackageDetails("java-openjdk");
@@ -205,8 +201,8 @@
     /**
      * Get the Web Start package name including detailed version.
-     *
+     * <p>
      * OpenJDK packages are shipped with icedtea-web package,
      * but its version generally does not match main java package version.
-     *
+     * <p>
      * Simply return {@code null} if there's no separate package for Java WebStart.
      *
@@ -222,8 +218,8 @@
     /**
      * Get the Gnome ATK wrapper package name including detailed version.
-     *
+     * <p>
      * Debian and Ubuntu derivatives come with a pre-enabled accessibility software
      * completely buggy that makes Swing crash in a lot of different ways.
-     *
+     * <p>
      * Simply return {@code null} if it's not found.
      *
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 19102)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 19103)
@@ -26,4 +26,5 @@
 import static java.awt.event.KeyEvent.VK_Y;
 import static java.awt.event.KeyEvent.VK_Z;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.Utils.getSystemEnv;
@@ -93,5 +94,5 @@
     /**
      * Simple data class to hold information about a font.
-     *
+     * <p>
      * Used for fontconfig.properties files.
      */
@@ -154,10 +155,8 @@
 
     @Override
-    public void startupHook(JavaExpirationCallback javaCallback, WebStartMigrationCallback webStartCallback,
-            SanityCheckCallback sanityCheckCallback) {
+    public void startupHook(JavaExpirationCallback javaCallback, SanityCheckCallback sanityCheckCallback) {
         warnSoonToBeUnsupportedJava(javaCallback);
         checkExpiredJava(javaCallback);
-        checkWebStartMigration(webStartCallback);
-        PlatformHook.super.startupHook(javaCallback, webStartCallback, sanityCheckCallback);
+        PlatformHook.super.startupHook(javaCallback, sanityCheckCallback);
     }
 
@@ -181,8 +180,10 @@
 
     @Override
+    @SuppressWarnings("squid:S103") // NOSONAR LineLength
     public void initSystemShortcuts() {
+        final String reserved = marktr("reserved");
         // CHECKSTYLE.OFF: LineLength
-        //Shortcut.registerSystemCut("system:menuexit", tr("reserved"), VK_Q, CTRL_DOWN_MASK);
-        Shortcut.registerSystemShortcut("system:duplicate", tr("reserved"), VK_D, CTRL_DOWN_MASK); // not really system, but to avoid odd results
+        //Shortcut.registerSystemCut("system:menuexit", tr(reserved), VK_Q, CTRL_DOWN_MASK);
+        Shortcut.registerSystemShortcut("system:duplicate", tr(reserved), VK_D, CTRL_DOWN_MASK); // not really system, but to avoid odd results
 
         // Windows 7 shortcuts: http://windows.microsoft.com/en-US/windows7/Keyboard-shortcuts
@@ -191,62 +192,62 @@
 
         // Don't know why Ctrl-Alt-Del isn't even listed on official Microsoft support page
-        Shortcut.registerSystemShortcut("system:reset", tr("reserved"), VK_DELETE, CTRL_DOWN_MASK | ALT_DOWN_MASK).setAutomatic();
+        Shortcut.registerSystemShortcut("system:reset", tr(reserved), VK_DELETE, CTRL_DOWN_MASK | ALT_DOWN_MASK).setAutomatic();
 
         // Ease of Access keyboard shortcuts
-        Shortcut.registerSystemShortcut("microsoft-reserved-01", tr("reserved"), VK_PRINTSCREEN, ALT_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Turn High Contrast on or off
-        Shortcut.registerSystemShortcut("microsoft-reserved-02", tr("reserved"), VK_NUM_LOCK, ALT_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Turn Mouse Keys on or off
-        //Shortcut.registerSystemCut("microsoft-reserved-03", tr("reserved"), VK_U, );// Open the Ease of Access Center (TODO: Windows-U, how to handle it in Java ?)
+        Shortcut.registerSystemShortcut("microsoft-reserved-01", tr(reserved), VK_PRINTSCREEN, ALT_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Turn High Contrast on or off
+        Shortcut.registerSystemShortcut("microsoft-reserved-02", tr(reserved), VK_NUM_LOCK, ALT_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Turn Mouse Keys on or off
+        //Shortcut.registerSystemCut("microsoft-reserved-03", tr(reserved), VK_U, );// Open the Ease of Access Center (TODO: Windows-U, how to handle it in Java ?)
 
         // General keyboard shortcuts
-        //Shortcut.registerSystemShortcut("system:help", tr("reserved"), VK_F1, 0);                            // Display Help
-        Shortcut.registerSystemShortcut("system:copy", tr("reserved"), VK_C, CTRL_DOWN_MASK);                // Copy the selected item
-        Shortcut.registerSystemShortcut("system:cut", tr("reserved"), VK_X, CTRL_DOWN_MASK);                 // Cut the selected item
-        Shortcut.registerSystemShortcut("system:paste", tr("reserved"), VK_V, CTRL_DOWN_MASK);               // Paste the selected item
-        Shortcut.registerSystemShortcut("system:undo", tr("reserved"), VK_Z, CTRL_DOWN_MASK);                // Undo an action
-        Shortcut.registerSystemShortcut("system:redo", tr("reserved"), VK_Y, CTRL_DOWN_MASK);                // Redo an action
-        //Shortcut.registerSystemCut("microsoft-reserved-10", tr("reserved"), VK_DELETE, 0);                  // Delete the selected item and move it to the Recycle Bin
-        //Shortcut.registerSystemCut("microsoft-reserved-11", tr("reserved"), VK_DELETE, SHIFT_DOWN_MASK);    // Delete the selected item without moving it to the Recycle Bin first
-        //Shortcut.registerSystemCut("system:rename", tr("reserved"), VK_F2, 0);                          // Rename the selected item
-        Shortcut.registerSystemShortcut("system:movefocusright", tr("reserved"), VK_RIGHT, CTRL_DOWN_MASK);  // Move the cursor to the beginning of the next word
-        Shortcut.registerSystemShortcut("system:movefocusleft", tr("reserved"), VK_LEFT, CTRL_DOWN_MASK);    // Move the cursor to the beginning of the previous word
-        Shortcut.registerSystemShortcut("system:movefocusdown", tr("reserved"), VK_DOWN, CTRL_DOWN_MASK);    // Move the cursor to the beginning of the next paragraph
-        Shortcut.registerSystemShortcut("system:movefocusup", tr("reserved"), VK_UP, CTRL_DOWN_MASK);        // Move the cursor to the beginning of the previous paragraph
-        //Shortcut.registerSystemCut("microsoft-reserved-17", tr("reserved"), VK_RIGHT, CTRL_DOWN_MASK | SHIFT_DOWN_MASK); // Select a block of text
-        //Shortcut.registerSystemCut("microsoft-reserved-18", tr("reserved"), VK_LEFT, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);  // Select a block of text
-        //Shortcut.registerSystemCut("microsoft-reserved-19", tr("reserved"), VK_DOWN, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);  // Select a block of text
-        //Shortcut.registerSystemCut("microsoft-reserved-20", tr("reserved"), VK_UP, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);    // Select a block of text
-        //Shortcut.registerSystemCut("microsoft-reserved-21", tr("reserved"), VK_RIGHT, SHIFT_DOWN_MASK); // Select more than one item in a window or on the desktop, or select text within a document
-        //Shortcut.registerSystemCut("microsoft-reserved-22", tr("reserved"), VK_LEFT, SHIFT_DOWN_MASK);  // Select more than one item in a window or on the desktop, or select text within a document
-        //Shortcut.registerSystemCut("microsoft-reserved-23", tr("reserved"), VK_DOWN, SHIFT_DOWN_MASK);  // Select more than one item in a window or on the desktop, or select text within a document
-        //Shortcut.registerSystemCut("microsoft-reserved-24", tr("reserved"), VK_UP, SHIFT_DOWN_MASK);    // Select more than one item in a window or on the desktop, or select text within a document
-        //Shortcut.registerSystemCut("microsoft-reserved-25", tr("reserved"), VK_RIGHT+, CTRL_DOWN_MASK); // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
-        //Shortcut.registerSystemCut("microsoft-reserved-26", tr("reserved"), VK_LEFT+, CTRL_DOWN_MASK);  // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
-        //Shortcut.registerSystemCut("microsoft-reserved-27", tr("reserved"), VK_DOWN+, CTRL_DOWN_MASK);  // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
-        //Shortcut.registerSystemCut("microsoft-reserved-28", tr("reserved"), VK_UP+, CTRL_DOWN_MASK);    // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
-        Shortcut.registerSystemShortcut("system:selectall", tr("reserved"), VK_A, CTRL_DOWN_MASK);           // Select all items in a document or window
-        //Shortcut.registerSystemCut("system:search", tr("reserved"), VK_F3, 0);                          // Search for a file or folder
-        Shortcut.registerSystemShortcut("microsoft-reserved-31", tr("reserved"), VK_ENTER, ALT_DOWN_MASK).setAutomatic();   // Display properties for the selected item
-        Shortcut.registerSystemShortcut("system:exit", tr("reserved"), VK_F4, ALT_DOWN_MASK).setAutomatic(); // Close the active item, or exit the active program
-        Shortcut.registerSystemShortcut("microsoft-reserved-33", tr("reserved"), VK_SPACE, ALT_DOWN_MASK).setAutomatic();   // Open the shortcut menu for the active window
-        //Shortcut.registerSystemCut("microsoft-reserved-34", tr("reserved"), VK_F4, CTRL_DOWN_MASK);     // Close the active document (in programs that allow you to have multiple documents open simultaneously)
-        Shortcut.registerSystemShortcut("microsoft-reserved-35", tr("reserved"), VK_TAB, ALT_DOWN_MASK).setAutomatic();     // Switch between open items
-        Shortcut.registerSystemShortcut("microsoft-reserved-36", tr("reserved"), VK_TAB, CTRL_DOWN_MASK | ALT_DOWN_MASK).setAutomatic(); // Use the arrow keys to switch between open items
-        //Shortcut.registerSystemCut("microsoft-reserved-37", tr("reserved"), VK_TAB, ); // Cycle through programs on the taskbar by using Aero Flip 3-D (TODO: Windows-Tab, how to handle it in Java ?)
-        //Shortcut.registerSystemCut("microsoft-reserved-38", tr("reserved"), VK_TAB, CTRL_DOWN_MASK | ); // Use the arrow keys to cycle through programs on the taskbar by using Aero Flip 3-D (TODO: Ctrl-Windows-Tab, how to handle it in Java ?)
-        Shortcut.registerSystemShortcut("microsoft-reserved-39", tr("reserved"), VK_ESCAPE, ALT_DOWN_MASK).setAutomatic();  // Cycle through items in the order in which they were opened
-        //Shortcut.registerSystemCut("microsoft-reserved-40", tr("reserved"), VK_F6, 0);                  // Cycle through screen elements in a window or on the desktop
-        //Shortcut.registerSystemCut("microsoft-reserved-41", tr("reserved"), VK_F4, 0);                  // Display the address bar list in Windows Explorer
-        Shortcut.registerSystemShortcut("microsoft-reserved-42", tr("reserved"), VK_F10, SHIFT_DOWN_MASK);   // Display the shortcut menu for the selected item
-        Shortcut.registerSystemShortcut("microsoft-reserved-43", tr("reserved"), VK_ESCAPE, CTRL_DOWN_MASK).setAutomatic(); // Open the Start menu
-        //Shortcut.registerSystemShortcut("microsoft-reserved-44", tr("reserved"), VK_F10, 0);                 // Activate the menu bar in the active program
-        //Shortcut.registerSystemCut("microsoft-reserved-45", tr("reserved"), VK_RIGHT, 0);               // Open the next menu to the right, or open a submenu
-        //Shortcut.registerSystemCut("microsoft-reserved-46", tr("reserved"), VK_LEFT, 0);                // Open the next menu to the left, or close a submenu
-        //Shortcut.registerSystemCut("microsoft-reserved-47", tr("reserved"), VK_F5, 0);                  // Refresh the active window
-        //Shortcut.registerSystemCut("microsoft-reserved-48", tr("reserved"), VK_UP, ALT_DOWN_MASK);      // View the folder one level up in Windows Explorer
-        //Shortcut.registerSystemCut("microsoft-reserved-49", tr("reserved"), VK_ESCAPE, 0);              // Cancel the current task
-        Shortcut.registerSystemShortcut("microsoft-reserved-50", tr("reserved"), VK_ESCAPE, CTRL_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Open Task Manager
-        Shortcut.registerSystemShortcut("microsoft-reserved-51", tr("reserved"), VK_SHIFT, ALT_DOWN_MASK).setAutomatic();   // Switch the input language when multiple input languages are enabled
-        Shortcut.registerSystemShortcut("microsoft-reserved-52", tr("reserved"), VK_SHIFT, CTRL_DOWN_MASK).setAutomatic();  // Switch the keyboard layout when multiple keyboard layouts are enabled
-        //Shortcut.registerSystemCut("microsoft-reserved-53", tr("reserved"), ); // Change the reading direction of text in right-to-left reading languages (TODO: unclear)
+        //Shortcut.registerSystemShortcut("system:help", tr(reserved), VK_F1, 0);                            // Display Help
+        Shortcut.registerSystemShortcut("system:copy", tr(reserved), VK_C, CTRL_DOWN_MASK);                // Copy the selected item
+        Shortcut.registerSystemShortcut("system:cut", tr(reserved), VK_X, CTRL_DOWN_MASK);                 // Cut the selected item
+        Shortcut.registerSystemShortcut("system:paste", tr(reserved), VK_V, CTRL_DOWN_MASK);               // Paste the selected item
+        Shortcut.registerSystemShortcut("system:undo", tr(reserved), VK_Z, CTRL_DOWN_MASK);                // Undo an action
+        Shortcut.registerSystemShortcut("system:redo", tr(reserved), VK_Y, CTRL_DOWN_MASK);                // Redo an action
+        //Shortcut.registerSystemCut("microsoft-reserved-10", tr(reserved), VK_DELETE, 0);                  // Delete the selected item and move it to the Recycle Bin
+        //Shortcut.registerSystemCut("microsoft-reserved-11", tr(reserved), VK_DELETE, SHIFT_DOWN_MASK);    // Delete the selected item without moving it to the Recycle Bin first
+        //Shortcut.registerSystemCut("system:rename", tr(reserved), VK_F2, 0);                          // Rename the selected item
+        Shortcut.registerSystemShortcut("system:movefocusright", tr(reserved), VK_RIGHT, CTRL_DOWN_MASK);  // Move the cursor to the beginning of the next word
+        Shortcut.registerSystemShortcut("system:movefocusleft", tr(reserved), VK_LEFT, CTRL_DOWN_MASK);    // Move the cursor to the beginning of the previous word
+        Shortcut.registerSystemShortcut("system:movefocusdown", tr(reserved), VK_DOWN, CTRL_DOWN_MASK);    // Move the cursor to the beginning of the next paragraph
+        Shortcut.registerSystemShortcut("system:movefocusup", tr(reserved), VK_UP, CTRL_DOWN_MASK);        // Move the cursor to the beginning of the previous paragraph
+        //Shortcut.registerSystemCut("microsoft-reserved-17", tr(reserved), VK_RIGHT, CTRL_DOWN_MASK | SHIFT_DOWN_MASK); // Select a block of text
+        //Shortcut.registerSystemCut("microsoft-reserved-18", tr(reserved), VK_LEFT, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);  // Select a block of text
+        //Shortcut.registerSystemCut("microsoft-reserved-19", tr(reserved), VK_DOWN, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);  // Select a block of text
+        //Shortcut.registerSystemCut("microsoft-reserved-20", tr(reserved), VK_UP, CTRL_DOWN_MASK | SHIFT_DOWN_MASK);    // Select a block of text
+        //Shortcut.registerSystemCut("microsoft-reserved-21", tr(reserved), VK_RIGHT, SHIFT_DOWN_MASK); // Select more than one item in a window or on the desktop, or select text within a document
+        //Shortcut.registerSystemCut("microsoft-reserved-22", tr(reserved), VK_LEFT, SHIFT_DOWN_MASK);  // Select more than one item in a window or on the desktop, or select text within a document
+        //Shortcut.registerSystemCut("microsoft-reserved-23", tr(reserved), VK_DOWN, SHIFT_DOWN_MASK);  // Select more than one item in a window or on the desktop, or select text within a document
+        //Shortcut.registerSystemCut("microsoft-reserved-24", tr(reserved), VK_UP, SHIFT_DOWN_MASK);    // Select more than one item in a window or on the desktop, or select text within a document
+        //Shortcut.registerSystemCut("microsoft-reserved-25", tr(reserved), VK_RIGHT+, CTRL_DOWN_MASK); // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
+        //Shortcut.registerSystemCut("microsoft-reserved-26", tr(reserved), VK_LEFT+, CTRL_DOWN_MASK);  // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
+        //Shortcut.registerSystemCut("microsoft-reserved-27", tr(reserved), VK_DOWN+, CTRL_DOWN_MASK);  // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
+        //Shortcut.registerSystemCut("microsoft-reserved-28", tr(reserved), VK_UP+, CTRL_DOWN_MASK);    // Select multiple individual items in a window or on the desktop (TODO: ctrl+arrow+spacebar, how to handle it in Java ?)
+        Shortcut.registerSystemShortcut("system:selectall", tr(reserved), VK_A, CTRL_DOWN_MASK);           // Select all items in a document or window
+        //Shortcut.registerSystemCut("system:search", tr(reserved), VK_F3, 0);                          // Search for a file or folder
+        Shortcut.registerSystemShortcut("microsoft-reserved-31", tr(reserved), VK_ENTER, ALT_DOWN_MASK).setAutomatic();   // Display properties for the selected item
+        Shortcut.registerSystemShortcut("system:exit", tr(reserved), VK_F4, ALT_DOWN_MASK).setAutomatic(); // Close the active item, or exit the active program
+        Shortcut.registerSystemShortcut("microsoft-reserved-33", tr(reserved), VK_SPACE, ALT_DOWN_MASK).setAutomatic();   // Open the shortcut menu for the active window
+        //Shortcut.registerSystemCut("microsoft-reserved-34", tr(reserved), VK_F4, CTRL_DOWN_MASK);     // Close the active document (in programs that allow you to have multiple documents open simultaneously)
+        Shortcut.registerSystemShortcut("microsoft-reserved-35", tr(reserved), VK_TAB, ALT_DOWN_MASK).setAutomatic();     // Switch between open items
+        Shortcut.registerSystemShortcut("microsoft-reserved-36", tr(reserved), VK_TAB, CTRL_DOWN_MASK | ALT_DOWN_MASK).setAutomatic(); // Use the arrow keys to switch between open items
+        //Shortcut.registerSystemCut("microsoft-reserved-37", tr(reserved), VK_TAB, ); // Cycle through programs on the taskbar by using Aero Flip 3-D (TODO: Windows-Tab, how to handle it in Java ?)
+        //Shortcut.registerSystemCut("microsoft-reserved-38", tr(reserved), VK_TAB, CTRL_DOWN_MASK | ); // Use the arrow keys to cycle through programs on the taskbar by using Aero Flip 3-D (TODO: Ctrl-Windows-Tab, how to handle it in Java ?)
+        Shortcut.registerSystemShortcut("microsoft-reserved-39", tr(reserved), VK_ESCAPE, ALT_DOWN_MASK).setAutomatic();  // Cycle through items in the order in which they were opened
+        //Shortcut.registerSystemCut("microsoft-reserved-40", tr(reserved), VK_F6, 0);                  // Cycle through screen elements in a window or on the desktop
+        //Shortcut.registerSystemCut("microsoft-reserved-41", tr(reserved), VK_F4, 0);                  // Display the address bar list in Windows Explorer
+        Shortcut.registerSystemShortcut("microsoft-reserved-42", tr(reserved), VK_F10, SHIFT_DOWN_MASK);   // Display the shortcut menu for the selected item
+        Shortcut.registerSystemShortcut("microsoft-reserved-43", tr(reserved), VK_ESCAPE, CTRL_DOWN_MASK).setAutomatic(); // Open the Start menu
+        //Shortcut.registerSystemShortcut("microsoft-reserved-44", tr(reserved), VK_F10, 0);                 // Activate the menu bar in the active program
+        //Shortcut.registerSystemCut("microsoft-reserved-45", tr(reserved), VK_RIGHT, 0);               // Open the next menu to the right, or open a submenu
+        //Shortcut.registerSystemCut("microsoft-reserved-46", tr(reserved), VK_LEFT, 0);                // Open the next menu to the left, or close a submenu
+        //Shortcut.registerSystemCut("microsoft-reserved-47", tr(reserved), VK_F5, 0);                  // Refresh the active window
+        //Shortcut.registerSystemCut("microsoft-reserved-48", tr(reserved), VK_UP, ALT_DOWN_MASK);      // View the folder one level up in Windows Explorer
+        //Shortcut.registerSystemCut("microsoft-reserved-49", tr(reserved), VK_ESCAPE, 0);              // Cancel the current task
+        Shortcut.registerSystemShortcut("microsoft-reserved-50", tr(reserved), VK_ESCAPE, CTRL_DOWN_MASK | SHIFT_DOWN_MASK).setAutomatic(); // Open Task Manager
+        Shortcut.registerSystemShortcut("microsoft-reserved-51", tr(reserved), VK_SHIFT, ALT_DOWN_MASK).setAutomatic();   // Switch the input language when multiple input languages are enabled
+        Shortcut.registerSystemShortcut("microsoft-reserved-52", tr(reserved), VK_SHIFT, CTRL_DOWN_MASK).setAutomatic();  // Switch the keyboard layout when multiple keyboard layouts are enabled
+        //Shortcut.registerSystemCut("microsoft-reserved-53", tr(reserved), ); // Change the reading direction of text in right-to-left reading languages (TODO: unclear)
         // CHECKSTYLE.ON: LineLength
     }
