Index: /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 15716)
@@ -395,8 +395,8 @@
         }
         return new ExtensionFileFilter(
-            Utils.join(",", extensionsPlusArchive),
+            String.join(",", extensionsPlusArchive),
             defaultExtension,
             description + (!extensionsForDescription.isEmpty()
-                ? (" (" + Utils.join(", ", extensionsForDescription) + ')')
+                ? (" (" + String.join(", ", extensionsForDescription) + ')')
                 : "")
             );
Index: /trunk/src/org/openstreetmap/josm/data/osm/BBox.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 15716)
@@ -3,5 +3,4 @@
 
 import java.awt.geom.Rectangle2D;
-import java.util.Arrays;
 import java.util.Objects;
 
@@ -10,5 +9,4 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -394,9 +392,9 @@
      */
     public String toStringCSV(String separator) {
-        return Utils.join(separator, Arrays.asList(
+        return String.join(separator,
                 LatLon.cDdFormatter.format(xmin),
                 LatLon.cDdFormatter.format(ymin),
                 LatLon.cDdFormatter.format(xmax),
-                LatLon.cDdFormatter.format(ymax)));
+                LatLon.cDdFormatter.format(ymax));
     }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java	(revision 15716)
@@ -23,5 +23,4 @@
 
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -710,5 +709,5 @@
             }
         }
-        return Utils.join(";", values);
+        return String.join(";", values);
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java	(revision 15716)
@@ -21,5 +21,4 @@
 import org.openstreetmap.josm.data.coor.conversion.LatLonParser;
 import org.openstreetmap.josm.tools.OptionParser;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -71,6 +70,6 @@
             }
         }
-        String fromStr = Utils.join(" ", projParamFrom);
-        String toStr = Utils.join(" ", projParamTo);
+        String fromStr = String.join(" ", projParamFrom);
+        String toStr = String.join(" ", projParamTo);
         try {
             run(fromStr, toStr, otherPositional);
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15716)
@@ -559,5 +559,5 @@
             } else {
                 /* I18N: {0} is the test error message and {1} is an alternative */
-                return tr("{0}, use {1} instead", getMessage(p), Utils.join(tr(" or "), alternatives));
+                return tr("{0}, use {1} instead", getMessage(p), String.join(tr(" or "), alternatives));
             }
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 15716)
@@ -5,5 +5,4 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.util.Arrays;
 import java.util.List;
 
@@ -26,5 +25,4 @@
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Pair;
-import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -256,8 +254,8 @@
      */
     private static String toStringCSV(String separator, ILatLon ll) {
-        return Utils.join(separator, Arrays.asList(
+        return String.join(separator,
                 DecimalDegreesCoordinateFormat.INSTANCE.latToString(ll),
                 DecimalDegreesCoordinateFormat.INSTANCE.lonToString(ll)
-        ));
+        );
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java	(revision 15716)
@@ -61,5 +61,5 @@
 
         pnl.add(new HtmlPanel(
-                Utils.join("<br/>", Arrays.asList(
+                String.join("<br/>",
                         tr("Enter the coordinates for the new node."),
                         tr("You can separate longitude and latitude with space, comma or semicolon."),
@@ -67,5 +67,5 @@
                         tr("For South and West cardinal directions you can use either negative numbers or S, W characters."),
                         tr("Coordinate value can be in one of three formats:")
-                      )) +
+                      ) +
                 Utils.joinAsHtmlUnorderedList(Arrays.asList(
                         tr("<i>degrees</i><tt>&deg;</tt>"),
@@ -73,9 +73,9 @@
                         tr("<i>degrees</i><tt>&deg;</tt> <i>minutes</i><tt>&#39;</tt> <i>seconds</i><tt>&quot</tt>")
                       )) +
-                Utils.join("<br/><br/>", Arrays.asList(
+                String.join("<br/><br/>",
                         tr("Symbols <tt>&deg;</tt>, <tt>&#39;</tt>, <tt>&prime;</tt>, <tt>&quot;</tt>, <tt>&Prime;</tt> are optional."),
                         tr("You can also use the syntax <tt>lat=\"...\" lon=\"...\"</tt> or <tt>lat=''...'' lon=''...''</tt>."),
                         tr("Some examples:")
-                      )) +
+                      ) +
                 "<table><tr><td>" +
                 Utils.joinAsHtmlUnorderedList(Arrays.asList(
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 15716)
@@ -854,5 +854,5 @@
                     lines.add(sc.getKeyText() + ' ' + tr("to add first suggestion without closing the dialog"))
             );
-            final JLabel helpLabel = new JLabel("<html>" + Utils.join("<br>", lines) + "</html>");
+            final JLabel helpLabel = new JLabel("<html>" + String.join("<br>", lines) + "</html>");
             helpLabel.setFont(helpLabel.getFont().deriveFont(Font.PLAIN));
             contentPane.add(helpLabel, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 5, 5, 5));
Index: /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 15716)
@@ -324,5 +324,5 @@
         Collection<String> nativeProjections = getNativeProjections();
         if (nativeProjections != null) {
-            content.add(Arrays.asList(tr("Native projections"), Utils.join(", ", getNativeProjections())));
+            content.add(Arrays.asList(tr("Native projections"), String.join(", ", getNativeProjections())));
         }
         EastNorth offset = getDisplaySettings().getDisplacement();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 15716)
@@ -34,5 +34,4 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -182,5 +181,5 @@
         Logging.info(tr("Reprojecting layer {0} from {1} to {2}. For best image quality and performance,"
                 + " switch to one of the supported projections: {3}",
-                getName(), proj.toCode(), ProjectionRegistry.getProjection().toCode(), Utils.join(", ", getNativeProjections())));
+                getName(), proj.toCode(), ProjectionRegistry.getProjection().toCode(), String.join(", ", getNativeProjections())));
         return proj;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(revision 15716)
@@ -318,9 +318,9 @@
      * @param args arguments. First one is used as separator
      * @return assembled string
-     * @see Utils#join
+     * @see String#join
      */
     @NullableArguments
     public static String join(String... args) { // NO_UCD (unused code)
-        return Utils.join(args[0], Arrays.asList(args).subList(1, args.length));
+        return String.join(args[0], Arrays.asList(args).subList(1, args.length));
     }
 
@@ -330,8 +330,8 @@
      * @param values collection of objects
      * @return assembled string
-     * @see Utils#join
+     * @see String#join
      */
     public static String join_list(final String separator, final List<String> values) { // NO_UCD (unused code)
-        return Utils.join(separator, values);
+        return String.join(separator, values);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 15716)
@@ -1111,5 +1111,5 @@
                         tr("Ignore warning and install style anyway"));
                     dlg.setContent("<html>" + tr("Some entries have unmet dependencies:") +
-                            "<br>" + Utils.join("<br>", messages) + "</html>");
+                            "<br>" + String.join("<br>", messages) + "</html>");
                     dlg.setIcon(JOptionPane.WARNING_MESSAGE);
                     if (dlg.showDialog().getValue() != 2)
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 15716)
@@ -17,5 +17,4 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -65,5 +64,4 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -506,8 +504,8 @@
             JCheckBox deleteNotInList = new JCheckBox(tr("Disable all other plugins"));
 
-            JLabel helpLabel = new JLabel("<html>" + Utils.join("<br/>", Arrays.asList(
+            JLabel helpLabel = new JLabel("<html>" + String.join("<br/>",
                     tr("Enter a list of plugins you want to download."),
                     tr("You should add one plugin id per line, version information is ignored."),
-                    tr("You can copy+paste the list of a status report here."))) + "</html>");
+                    tr("You can copy+paste the list of a status report here.")) + "</html>");
 
             if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(GuiHelper.getFrameForComponent(getTabPane()),
@@ -559,5 +557,5 @@
 
         private boolean confirmIgnoreNotFound(List<String> notFound) {
-            String list = "<ul><li>" + Utils.join("</li><li>", notFound) + "</li></ul>";
+            String list = "<ul><li>" + String.join("</li><li>", notFound) + "</li></ul>";
             String message = "<html>" + tr("The following plugins were not found. Continue anyway?") + list + "</html>";
             return JOptionPane.showConfirmDialog(GuiHelper.getFrameForComponent(getTabPane()),
Index: /trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 15716)
@@ -383,5 +383,5 @@
                 sb.append('&');
             }
-            sb.append("changesets=").append(Utils.join(",", changesetIds));
+            sb.append("changesets=").append(changesetIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
         }
         return sb.toString();
Index: /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 15716)
@@ -91,5 +91,5 @@
         try {
             cachedFile = new CachedFile(source);
-            cachedFile.setParam(Utils.join(",", ImageryInfo.getActiveIds()));
+            cachedFile.setParam(String.join(",", ImageryInfo.getActiveIds()));
             cachedFile.setFastFail(fastFail);
             try (BufferedReader in = cachedFile
Index: /trunk/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/imagery/WMSImagery.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/io/imagery/WMSImagery.java	(revision 15716)
@@ -352,7 +352,7 @@
                 + "FORMAT=" + format + ((imageFormatHasTransparency(format) && transparent) ? "&TRANSPARENT=TRUE" : "")
                 + "&VERSION=" + this.version + "&" + SERVICE_WMS + "&REQUEST=GetMap&LAYERS="
-                + selectedLayers.stream().collect(Collectors.joining(","))
+                + String.join(",", selectedLayers)
                 + "&STYLES="
-                + (selectedStyles != null ? Utils.join(",", selectedStyles) : "")
+                + (selectedStyles != null ? String.join(",", selectedStyles) : "")
                 + "&"
                 + (belowWMS130() ? "SRS" : "CRS")
Index: /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 15716)
@@ -145,7 +145,7 @@
     protected String downloadPluginList(String site, final ProgressMonitor monitor) {
         /* replace %<x> with empty string or x=plugins (separated with comma) */
-        String pl = Utils.join(",", Config.getPref().getList("plugins"));
+        String pl = String.join(",", Config.getPref().getList("plugins"));
         String printsite = site.replaceAll("%<(.*)>", "");
-        if (pl != null && !pl.isEmpty()) {
+        if (!pl.isEmpty()) {
             site = site.replaceAll("%<(.*)>", "$1"+pl);
         } else {
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 15716)
@@ -489,10 +489,10 @@
                 }
                 w.append('\n');
+                w.append("sequence.fallback=");
                 String fallback = props.getProperty("sequence.fallback");
                 if (fallback != null) {
-                    w.append("sequence.fallback=" + fallback + ',' + Utils.join(",", allCharSubsets) + '\n');
-                } else {
-                    w.append("sequence.fallback=" + Utils.join(",", allCharSubsets) + '\n');
+                    w.append(fallback).append(",");
                 }
+                w.append(String.join(",", allCharSubsets)).append("\n");
             }
             Utils.updateSystemProperty("sun.awt.fontconfig", fontconfigFile.toString());
Index: /trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 15715)
+++ /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 15716)
@@ -904,5 +904,5 @@
             throws IOException, ExecutionException, InterruptedException {
         if (Logging.isDebugEnabled()) {
-            Logging.debug(join(" ", command));
+            Logging.debug(String.join(" ", command));
         }
         Path out = Files.createTempFile("josm_exec_", ".txt");
@@ -1119,5 +1119,5 @@
             return null;
         } else {
-            return join("\n", limit(Arrays.asList(s.split("\\n")), maxLines, "..."));
+            return String.join("\n", limit(Arrays.asList(s.split("\\n")), maxLines, "..."));
         }
     }
Index: /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java	(revision 15715)
+++ /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java	(revision 15716)
@@ -32,4 +32,5 @@
 import java.util.regex.Pattern;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -42,7 +43,4 @@
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.PlatformManager;
-import org.openstreetmap.josm.tools.Utils;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -323,5 +321,5 @@
             }
         } catch (IOException e) {
-            System.err.println("Error: Running external command failed: " + e + "\nCommand was: "+Utils.join(" ", args));
+            System.err.println("Error: Running external command failed: " + e + "\nCommand was: " + String.join(" ", args));
             return null;
         }
@@ -341,5 +339,5 @@
             return new EastNorth(Double.parseDouble(es), Double.parseDouble(ns));
         } catch (NumberFormatException nfe) {
-            System.err.println("Error: Cannot parse cs2cs output: '" + es + "', '" + ns + "'" + "\nCommand was: "+Utils.join(" ", args));
+            System.err.println("Error: Cannot parse cs2cs output: '" + es + "', '" + ns + "'" + "\nCommand was: " + String.join(" ", args));
             return null;
         }
Index: /trunk/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java	(revision 15715)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java	(revision 15716)
@@ -55,5 +55,5 @@
                 "Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit."));
         CustomConfigurator.exportPreferencesKeysToFile(tmp.getAbsolutePath(), false, "lorem_ipsum");
-        String xml = Utils.join("\n", Files.readAllLines(tmp.toPath(), StandardCharsets.UTF_8));
+        String xml = String.join("\n", Files.readAllLines(tmp.toPath(), StandardCharsets.UTF_8));
         assertTrue(xml.contains("<preferences operation=\"replace\">"));
         for (String entry : Config.getPref().getList("lorem_ipsum")) {
@@ -63,5 +63,5 @@
         Config.getPref().putList("test", Arrays.asList("11111111", "2222222", "333333333"));
         CustomConfigurator.exportPreferencesKeysByPatternToFile(tmp.getAbsolutePath(), true, "test");
-        xml = Utils.join("\n", Files.readAllLines(tmp.toPath(), StandardCharsets.UTF_8));
+        xml = String.join("\n", Files.readAllLines(tmp.toPath(), StandardCharsets.UTF_8));
         assertTrue(xml.contains("<preferences operation=\"append\">"));
         for (String entry : Config.getPref().getList("test")) {
