Index: /applications/editors/josm/plugins/build-common.xml
===================================================================
--- /applications/editors/josm/plugins/build-common.xml	(revision 36172)
+++ /applications/editors/josm/plugins/build-common.xml	(revision 36173)
@@ -133,5 +133,6 @@
             <compilerarg value="-Xlint:deprecation"/>
             <compilerarg value="-Xlint:unchecked"/>
-            <compilerarg value="-Xplugin:ErrorProne -Xep:StringSplitter:OFF -Xep:ReferenceEquality:OFF -Xep:InsecureCryptoUsage:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:JdkObsolete:OFF -Xep:EqualsHashCode:OFF -Xep:JavaUtilDate:OFF -Xep:DoNotCallSuggester:OFF -Xep:BanSerializableRead:OFF -Xep:RestrictedApiChecker:OFF"/>
+            <compilerarg value="-Xplugin:ErrorProne -Xep:StringSplitter:OFF -Xep:ReferenceEquality:OFF -Xep:InsecureCryptoUsage:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:JdkObsolete:OFF -Xep:EqualsHashCode:OFF -Xep:JavaUtilDate:OFF -Xep:DoNotCallSuggester:OFF -Xep:BanSerializableRead:OFF -Xep:RestrictedApiChecker:OFF" unless:set="isJava11"/>
+            <compilerarg value="-Xplugin:ErrorProne -Xep:StringSplitter:OFF -Xep:ReferenceEquality:OFF -Xep:InsecureCryptoUsage:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:JdkObsolete:OFF -Xep:EqualsHashCode:OFF -Xep:JavaUtilDate:OFF -Xep:DoNotCallSuggester:OFF -Xep:BanSerializableRead:OFF" if:set="isJava11"/>
             <compilerarg line="-Xmaxwarns 1000"/>
             <classpath refid="plugin.classpath"/>
@@ -739,4 +740,5 @@
     </target>
     <target name="resolve-tools" depends="init-ivy" description="Resolves tools using Apache Ivy">
+        <ivy:settings file="${josm.ivysettings}"/>
         <ivy:resolve file="${core.tools.ivy}"/>
         <ivy:cachepath file="${core.tools.ivy}" pathid="errorprone.classpath" conf="errorprone"/>
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java	(revision 36173)
@@ -104,5 +104,5 @@
             loadModules();
             // Add menu in EDT
-            GuiHelper.runInEDT(() -> buildMenu());
+            GuiHelper.runInEDT(this::buildMenu);
         }).start();
 
@@ -117,5 +117,5 @@
     }
 
-    private JMenu getModuleMenu(Module module) {
+    private static JMenu getModuleMenu(Module module) {
         String moduleName = module.getDisplayedName();
         if (moduleName == null || moduleName.isEmpty()) {
@@ -141,6 +141,8 @@
                     JMenu endMenu = null;
                     if (cat != null) {
-                        if ((endMenu = catMenus.get(cat)) == null) {
-                            catMenus.put(cat, endMenu = new JMenu(cat.getName()));
+                        endMenu = catMenus.get(cat);
+                        if (endMenu == null) {
+                            endMenu = new JMenu(cat.getName());
+                            catMenus.put(cat, endMenu);
                             setMenuItemIcon(cat.getIcon(), endMenu);
                             moduleMenu.add(endMenu);
@@ -183,5 +185,5 @@
     }
 
-    private void setMenuItemIcon(ImageIcon icon, JMenuItem menuItem) {
+    private static void setMenuItemIcon(ImageIcon icon, JMenuItem menuItem) {
         if (icon != null) {
             if (icon.getIconHeight() != 16 || icon.getIconWidth() != 16) {
@@ -195,5 +197,6 @@
     public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
         if (newFrame != null) {
-            newFrame.addToggleDialog(dialog = new OdDialog());
+            dialog = new OdDialog();
+            newFrame.addToggleDialog(dialog);
         } else {
             dialog = null;
@@ -206,5 +209,5 @@
     }
 
-    private void loadModules() {
+    private static void loadModules() {
         MainFrame parent = MainApplication.getMainFrame();
         List<ModuleInformation> modulesToLoad = ModuleHandler.buildListOfModulesToLoad(parent);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 36173)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.plugins.opendata.core;
 
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -14,5 +15,5 @@
      * Encodings
      */
-    public static final String UTF8 = "UTF-8";
+    public static final String UTF8 = StandardCharsets.UTF_8.name();
     public static final String ISO8859_15 = "ISO-8859-15";
     public static final String CP850 = "Cp850";
@@ -50,5 +51,5 @@
     public static final String PREF_MODULES = "opendata.modules";
     public static final String PREF_MODULES_SITES = "opendata.modules.sites";
-    public static final String OSM_SITE = "https://svn.openstreetmap.org/applications/editors/josm/plugins/opendata/";
+    public static final String OSM_SITE = "https://josm.openstreetmap.de/browser/osm/applications/editors/josm/plugins/opendata";
     public static final String[] DEFAULT_MODULE_SITES = {OSM_SITE + "modules.txt%<?modules=>"};
 
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java	(revision 36173)
@@ -4,4 +4,5 @@
 import java.awt.event.ActionEvent;
 import java.net.URL;
+import java.util.Locale;
 
 import javax.swing.Action;
@@ -21,5 +22,5 @@
         CheckParameterUtil.ensureParameterNotNull(url, "url");
         putValue(Action.NAME, name);
-        putValue("toolbar", ("opendata_download_"+module.getDisplayedName()+"_"+name).toLowerCase().replace(" ", "_"));
+        putValue("toolbar", ("opendata_download_"+module.getDisplayedName()+"_"+name).toLowerCase(Locale.ROOT).replace(" ", "_"));
         this.url = url;
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java	(revision 36173)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.Module;
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
+import org.openstreetmap.josm.tools.Logging;
 
 public class DownloadDataTask extends DownloadOsmTask {
@@ -46,7 +47,7 @@
         this.handler = null;
         for (Module module : ModuleHandler.moduleList) {
-            for (AbstractDataSetHandler handler : module.getNewlyInstanciatedHandlers()) {
-                if (handler.acceptsUrl(url)) {
-                    this.handler = handler;
+            for (AbstractDataSetHandler moduleHandler : module.getNewlyInstanciatedHandlers()) {
+                if (moduleHandler.acceptsUrl(url)) {
+                    this.handler = moduleHandler;
                     return true;
                 }
@@ -113,4 +114,5 @@
             return new AskLicenseAgreementDialog(license).showDialog().getValue() == 1;
         } catch (IOException e) {
+            Logging.debug(e);
             JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("License URL not available: {0}", license.toString()));
             return false;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 36173)
@@ -19,5 +19,5 @@
 public class OpenLinkAction extends JosmAction {
 
-    private URL url;
+    private final URL url;
 
     public OpenLinkAction(URL url, String icon24Name, String title, String description) {
@@ -35,4 +35,5 @@
             try {
                 Logging.error(e1.getLocalizedMessage());
+                Logging.debug(e1);
                 int index = e1.getIndex();
                 if (index > -1) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 36173)
@@ -7,4 +7,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -88,5 +89,5 @@
     }
 
-    private boolean acceptsFilename(String filename, String[] expected, String ... extensions) {
+    private static boolean acceptsFilename(String filename, String[] expected, String ... extensions) {
         if (filename != null) {
             for (String expectedName : expected) {
@@ -102,69 +103,69 @@
     }
 
-    protected final boolean acceptsCsvFilename(String filename, String... expected) {
+    protected static boolean acceptsCsvFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.CSV_EXT);
     }
 
-    protected final boolean acceptsXlsFilename(String filename, String... expected) {
+    protected static boolean acceptsXlsFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.XLS_EXT);
     }
 
-    protected final boolean acceptsOdsFilename(String filename, String... expected) {
+    protected static boolean acceptsOdsFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.ODS_EXT);
     }
 
-    protected final boolean acceptsShpFilename(String filename, String... expected) {
+    protected static boolean acceptsShpFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.SHP_EXT);
     }
 
-    protected final boolean acceptsMifFilename(String filename, String... expected) {
+    protected static boolean acceptsMifFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.MIF_EXT);
     }
 
-    protected final boolean acceptsMifTabFilename(String filename, String... expected) {
+    protected static boolean acceptsMifTabFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.MIF_EXT, OdConstants.TAB_EXT);
     }
 
-    protected final boolean acceptsShpMifFilename(String filename, String... expected) {
+    protected static boolean acceptsShpMifFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.SHP_EXT, OdConstants.MIF_EXT);
     }
 
-    protected final boolean acceptsKmlFilename(String filename, String... expected) {
+    protected static boolean acceptsKmlFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.KML_EXT);
     }
 
-    protected final boolean acceptsKmzFilename(String filename, String... expected) {
+    protected static boolean acceptsKmzFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.KMZ_EXT);
     }
 
-    protected final boolean acceptsKmzShpFilename(String filename, String... expected) {
+    protected static boolean acceptsKmzShpFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.KMZ_EXT, OdConstants.SHP_EXT);
     }
 
-    protected final boolean acceptsKmzTabFilename(String filename, String... expected) {
+    protected static boolean acceptsKmzTabFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.KMZ_EXT, OdConstants.TAB_EXT);
     }
 
-    protected final boolean acceptsZipFilename(String filename, String... expected) {
+    protected static boolean acceptsZipFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.ZIP_EXT);
     }
 
-    protected final boolean accepts7ZipFilename(String filename, String... expected) {
+    protected static boolean accepts7ZipFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.SEVENZIP_EXT);
     }
 
-    protected final boolean acceptsCsvKmzFilename(String filename, String... expected) {
+    protected static boolean acceptsCsvKmzFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.KMZ_EXT);
     }
 
-    protected final boolean acceptsCsvKmzTabFilename(String filename, String... expected) {
+    protected static boolean acceptsCsvKmzTabFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.KMZ_EXT, OdConstants.TAB_EXT);
     }
 
-    protected final boolean acceptsCsvXlsFilename(String filename, String... expected) {
+    protected static boolean acceptsCsvXlsFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.XLS_EXT);
     }
 
-    protected final boolean acceptsGpkgFilename(String filename, String... expected) {
+    protected static boolean acceptsGpkgFilename(String filename, String... expected) {
         return acceptsFilename(filename, expected, OdConstants.GEOPACKAGE_EXT);
     }
@@ -238,5 +239,5 @@
 
     public List<Pair<String, URL>> getDataURLs() {
-        return null;
+        return Collections.emptyList();
     }
 
@@ -315,25 +316,25 @@
     }
 
-    protected final void replace(IPrimitive p, String dataKey, String osmKey) {
+    protected static void replace(IPrimitive p, String dataKey, String osmKey) {
         addOrReplace(p, dataKey, osmKey, null, null, null, true);
     }
 
-    protected final void replace(IPrimitive p, String dataKey, String osmKey, ValueReplacer replacer) {
+    protected static void replace(IPrimitive p, String dataKey, String osmKey, ValueReplacer replacer) {
         addOrReplace(p, dataKey, osmKey, null, null, replacer, true);
     }
 
-    protected final void replace(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues) {
+    protected static void replace(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues) {
         addOrReplace(p, dataKey, osmKey, dataValues, osmValues, null, true);
     }
 
-    protected final void add(IPrimitive p, String dataKey, String osmKey, ValueReplacer replacer) {
+    protected static void add(IPrimitive p, String dataKey, String osmKey, ValueReplacer replacer) {
         addOrReplace(p, dataKey, osmKey, null, null, replacer, false);
     }
 
-    protected final void add(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues) {
+    protected static void add(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues) {
         addOrReplace(p, dataKey, osmKey, dataValues, osmValues, null, false);
     }
 
-    private void addOrReplace(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues,
+    private static void addOrReplace(IPrimitive p, String dataKey, String osmKey, String[] dataValues, String[] osmValues,
             ValueReplacer replacer, boolean replace) {
         String value = p.get(dataKey);
@@ -358,5 +359,5 @@
     }
 
-    private void doAddReplace(IPrimitive p, String dataKey, String osmKey, String osmValue, boolean replace) {
+    private static void doAddReplace(IPrimitive p, String dataKey, String osmKey, String osmValue, boolean replace) {
         if (replace) {
             p.remove(dataKey);
@@ -436,6 +437,6 @@
 
     public boolean acceptsUrl(String url) {
-        URL dataURL = getDataURL();
-        if (dataURL != null && url.equals(dataURL.toString())) {
+        URL currentDataUrl = getDataURL();
+        if (currentDataUrl != null && url.equals(currentDataUrl.toString())) {
             return true;
         }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java	(revision 36173)
@@ -26,7 +26,7 @@
  * Data set updater.
  */
-public abstract class DataSetUpdater {
+public interface DataSetUpdater {
 
-    public static final void updateDataSet(DataSet dataSet, AbstractDataSetHandler handler, File associatedFile) {
+    static void updateDataSet(DataSet dataSet, AbstractDataSetHandler handler, File associatedFile) {
         if (dataSet != null) {
             if (handler != null) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianGmlHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianGmlHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianGmlHandler.java	(revision 36173)
@@ -18,35 +18,35 @@
         if (crsName != null && crsName.startsWith("AUT")) {
             // CHECKSTYLE.OFF: LineLength
-            if (crsName.equalsIgnoreCase("AUT-GK28")) {             // Gauß-Krüger, Meridianstreifen M28
+            if ("AUT-GK28".equalsIgnoreCase(crsName)) {             // Gauß-Krüger, Meridianstreifen M28
                 return CRS.decode("EPSG:31281");
 
-            } else if (crsName.equalsIgnoreCase("AUT-GK31")) {      // Gauß-Krüger, Meridianstreifen M31
+            } else if ("AUT-GK31".equalsIgnoreCase(crsName)) {      // Gauß-Krüger, Meridianstreifen M31
                 return CRS.decode("EPSG:31282");
 
-            } else if (crsName.equalsIgnoreCase("AUT-GK34")) {      // Gauß-Krüger, Meridianstreifen M34
+            } else if ("AUT-GK34".equalsIgnoreCase(crsName)) {      // Gauß-Krüger, Meridianstreifen M34
                 return CRS.decode("EPSG:31283");
 
-            } else if (crsName.equalsIgnoreCase("AUT-GK28-5")) {    // Gauß-Krüger, Meridianstreifen M28, ohne 5 Mio. im Hochwert
+            } else if ("AUT-GK28-5".equalsIgnoreCase(crsName)) {    // Gauß-Krüger, Meridianstreifen M28, ohne 5 Mio. im Hochwert
                 return CRS.decode("EPSG:31251");
 
-            } else if (crsName.equalsIgnoreCase("AUT-GK31-5")) {    // Gauß-Krüger, Meridianstreifen M31, ohne 5 Mio. im Hochwert
+            } else if ("AUT-GK31-5".equalsIgnoreCase(crsName)) {    // Gauß-Krüger, Meridianstreifen M31, ohne 5 Mio. im Hochwert
                 return CRS.decode("EPSG:31252");
 
-            } else if (crsName.equalsIgnoreCase("AUT-GK34-5")) {    // Gauß-Krüger, Meridianstreifen M34, ohne 5 Mio. im Hochwert
+            } else if ("AUT-GK34-5".equalsIgnoreCase(crsName)) {    // Gauß-Krüger, Meridianstreifen M34, ohne 5 Mio. im Hochwert
                 return CRS.decode("EPSG:31253");
 
-            } else if (crsName.equalsIgnoreCase("AUT-BM28")) {      // Bundesmeldenetz, Meridianstreifen M28
+            } else if ("AUT-BM28".equalsIgnoreCase(crsName)) {      // Bundesmeldenetz, Meridianstreifen M28
                 return CRS.decode("EPSG:31288");
 
-            } else if (crsName.equalsIgnoreCase("AUT-BM31")) {      // Bundesmeldenetz, Meridianstreifen M31
+            } else if ("AUT-BM31".equalsIgnoreCase(crsName)) {      // Bundesmeldenetz, Meridianstreifen M31
                 return CRS.decode("EPSG:31289");
 
-            } else if (crsName.equalsIgnoreCase("AUT-BM34")) {      // Bundesmeldenetz, Meridianstreifen M34
+            } else if ("AUT-BM34".equalsIgnoreCase(crsName)) {      // Bundesmeldenetz, Meridianstreifen M34
                 return CRS.decode("EPSG:31290");
 
-            } else if (crsName.equalsIgnoreCase("AUT-LM")) {        // Lambertsche Kegelprojektion (geogr. Breite des Koo.Ursprungs = 47°30')
+            } else if ("AUT-LM".equalsIgnoreCase(crsName)) {        // Lambertsche Kegelprojektion (geogr. Breite des Koo.Ursprungs = 47°30')
                 return CRS.decode("EPSG:31287");
 
-            } else if (crsName.equalsIgnoreCase("AUT-LL-BESSEL")) { // Geographische Koordinaten auf dem Bessel-Ellipsoid, Längenzählung nach Greenwich
+            } else if ("AUT-LL-BESSEL".equalsIgnoreCase(crsName)) { // Geographische Koordinaten auf dem Bessel-Ellipsoid, Längenzählung nach Greenwich
                 // See http://josebatiz.com/granvision/Almap/Install/Data1/_B5694C166D6A4B5390B1E547C6A1FAF6
                 // FIXME
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java	(revision 36173)
@@ -87,5 +87,5 @@
     public URL getNationalPortalURL() {
         try {
-            String nationalPortalPath = "";
+            String nationalPortalPath;
             String lang = Config.getPref().get("language");
             if (lang == null || lang.isEmpty()) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/AskLicenseAgreementDialog.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/AskLicenseAgreementDialog.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/AskLicenseAgreementDialog.java	(revision 36173)
@@ -14,8 +14,7 @@
         super(license, MainApplication.getMainFrame(), tr("License Agreement"), new String[] {tr("Accept"), "", tr("Refuse")});
 
-        setToolTipTexts(new String[] {
-                tr("I understand and accept these terms and conditions"),
+        setToolTipTexts(tr("I understand and accept these terms and conditions"),
                 tr("View the full text of this license"),
-                tr("I refuse these terms and conditions. Cancel download.")});
+                tr("I refuse these terms and conditions. Cancel download."));
     }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java	(revision 36173)
@@ -11,5 +11,5 @@
 public final class ChooserLauncher implements Runnable {
 
-    private Projection proj = null;
+    private Projection proj;
     private final ProgressMonitor progressMonitor;
 
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModuleListPanel.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModuleListPanel.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModuleListPanel.java	(revision 36173)
@@ -7,6 +7,4 @@
 import java.awt.GridBagLayout;
 import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.util.List;
 
@@ -14,7 +12,5 @@
 import javax.swing.JLabel;
 import javax.swing.SwingConstants;
-import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkEvent.EventType;
-import javax.swing.event.HyperlinkListener;
 
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -28,5 +24,5 @@
  */
 public class ModuleListPanel extends VerticallyScrollablePanel {
-    private ModulePreferencesModel model;
+    private final ModulePreferencesModel model;
 
     public ModuleListPanel() {
@@ -42,5 +38,5 @@
     protected String formatModuleRemoteVersion(ModuleInformation pi) {
         StringBuilder sb = new StringBuilder();
-        if (pi.version == null || pi.version.trim().equals("")) {
+        if (pi.version == null || pi.version.trim().isEmpty()) {
             sb.append(tr("unknown"));
         } else {
@@ -52,5 +48,5 @@
     protected String formatModuleLocalVersion(ModuleInformation pi) {
         if (pi == null) return tr("unknown");
-        if (pi.localversion == null || pi.localversion.trim().equals(""))
+        if (pi.localversion == null || pi.localversion.trim().isEmpty())
             return tr("unknown");
         return pi.localversion;
@@ -106,10 +102,5 @@
             cbModule.setSelected(selected);
             cbModule.setToolTipText(formatCheckboxTooltipText(pi));
-            cbModule.addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    model.setModuleSelected(pi.getName(), cbModule.isSelected());
-                }
-            });
+            cbModule.addActionListener(e -> model.setModuleSelected(pi.getName(), cbModule.isSelected()));
             JLabel lblModule = new JLabel(
                     tr("{0}: Version {1} (local: {2})", pi.getName(), remoteversion, localversion),
@@ -130,10 +121,7 @@
             HtmlPanel description = new HtmlPanel();
             description.setText(pi.getDescriptionAsHtml());
-            description.getEditorPane().addHyperlinkListener(new HyperlinkListener() {
-                @Override
-                public void hyperlinkUpdate(HyperlinkEvent e) {
-                    if (e.getEventType() == EventType.ACTIVATED) {
-                        OpenBrowser.displayUrl(e.getURL().toString());
-                    }
+            description.getEditorPane().addHyperlinkListener(e -> {
+                if (e.getEventType() == EventType.ACTIVATED) {
+                    OpenBrowser.displayUrl(e.getURL().toString());
                 }
             });
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java	(revision 36173)
@@ -159,9 +159,4 @@
     @Override
     public void addGui(final PreferenceTabbedPane gui) {
-        GridBagConstraints gc = new GridBagConstraints();
-        gc.weightx = 1.0;
-        gc.weighty = 1.0;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.fill = GridBagConstraints.BOTH;
         OdPreferenceSetting settings = gui.getSetting(OdPreferenceSetting.class);
         settings.tabPane.addTab(tr("Modules"), buildModuleListPanel());
@@ -209,5 +204,5 @@
      */
     public List<ModuleInformation> getModulesScheduledForUpdateOrDownload() {
-        return model != null ? model.getModulesScheduledForUpdateOrDownload() : null;
+        return model.getModulesScheduledForUpdateOrDownload();
     }
 
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java	(revision 36173)
@@ -6,9 +6,9 @@
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
 import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.Logging;
 
 public class ModulePreferencesModel extends ChangeNotifier {
@@ -24,5 +25,5 @@
     private final ArrayList<ModuleInformation> displayedModules = new ArrayList<>();
     private final HashMap<ModuleInformation, Boolean> selectedModulesMap = new HashMap<>();
-    private Set<String> pendingDownloads = new HashSet<>();
+    private final Set<String> pendingDownloads = new HashSet<>();
     private String filterExpression;
     private final Set<String> currentActiveModules;
@@ -62,8 +63,6 @@
         Set<String> activeModules = new HashSet<>(getModules(Collections.emptyList()));
         for (ModuleInformation pi: availableModules) {
-            if (selectedModulesMap.get(pi) == null) {
-                if (activeModules.contains(pi.name)) {
-                    selectedModulesMap.put(pi, true);
-                }
+            if (selectedModulesMap.get(pi) == null && activeModules.contains(pi.name)) {
+                selectedModulesMap.put(pi, true);
             }
         }
@@ -95,8 +94,6 @@
         Set<String> activeModules = new HashSet<>(getModules(Collections.emptyList()));
         for (ModuleInformation pi: availableModules) {
-            if (selectedModulesMap.get(pi) == null) {
-                if (activeModules.contains(pi.name)) {
-                    selectedModulesMap.put(pi, true);
-                }
+            if (selectedModulesMap.get(pi) == null && activeModules.contains(pi.name)) {
+                selectedModulesMap.put(pi, true);
             }
         }
@@ -115,5 +112,5 @@
                 continue;
             }
-            if (selectedModulesMap.get(pi)) {
+            if (Boolean.TRUE.equals(selectedModulesMap.get(pi))) {
                 ret.add(pi);
             }
@@ -125,5 +122,5 @@
      * Replies the list of selected module information objects
      *
-     * @return the list of selected module information objects
+     * @return the set of selected module information objects
      */
     public Set<String> getSelectedModuleNames() {
@@ -139,21 +136,15 @@
      */
     protected void sort() {
-        Collections.sort(
-                availableModules,
-                new Comparator<ModuleInformation>() {
-                    @Override
-                    public int compare(ModuleInformation o1, ModuleInformation o2) {
-                        String n1 = o1.getName() == null ? "" : o1.getName().toLowerCase();
-                        String n2 = o2.getName() == null ? "" : o2.getName().toLowerCase();
-                        return n1.compareTo(n2);
-                    }
-                }
-                );
-    }
-
-    /**
-     * Replies the list of module informations to display
-     *
-     * @return the list of module informations to display
+        availableModules.sort((o1, o2) -> {
+            String n1 = o1.getName() == null ? "" : o1.getName().toLowerCase(Locale.ROOT);
+            String n2 = o2.getName() == null ? "" : o2.getName().toLowerCase(Locale.ROOT);
+            return n1.compareTo(n2);
+        });
+    }
+
+    /**
+     * Replies the list of module information to display
+     *
+     * @return the list of module information to display
      */
     public List<ModuleInformation> getDisplayedModules() {
@@ -225,5 +216,5 @@
     }
 
-    /**
+    /*
      * Initializes the model from preferences
      */
@@ -257,5 +248,5 @@
     }
 
-    /**
+    /*
      * Replies the set of modules which have been added by the user to
      * the set of activated modules.
@@ -275,5 +266,5 @@
     }*/
 
-    /**
+    /*
      * Replies the set of modules which have been removed by the user from
      * the set of activated modules.
@@ -294,5 +285,5 @@
     }*/
 
-    /**
+    /*
      * Replies the set of module names which have been added by the user to
      * the set of activated modules.
@@ -350,5 +341,5 @@
                 oldinfo.localversion = newinfo.version;
             } catch (ModuleException e) {
-                e.printStackTrace();
+                Logging.debug(e);
             }
         }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java	(revision 36173)
@@ -58,5 +58,5 @@
      * @return the collection of module site URLs from where module lists can be downloaded
      */
-    public static final Collection<String> getModuleSites() {
+    public static Collection<String> getModuleSites() {
         return Config.getPref().getList(OdConstants.PREF_MODULES_SITES, Arrays.asList(OdConstants.DEFAULT_MODULE_SITES));
     }
@@ -153,10 +153,5 @@
         //
         final Runnable continuation = () -> {
-            boolean requiresRestart = false;
-            if (task != null && !task.isCanceled()) {
-                if (!task.getDownloadedModules().isEmpty()) {
-                    requiresRestart = true;
-                }
-            }
+            boolean requiresRestart = task != null && !task.isCanceled() && !task.getDownloadedModules().isEmpty();
 
             // build the messages. We only display one message, including the status
@@ -200,5 +195,5 @@
         }
 
-        return task == null ? result : false;
+        return task == null && result;
     }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java	(revision 36173)
@@ -7,5 +7,4 @@
 import java.awt.Dimension;
 import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
@@ -44,13 +43,13 @@
      */
     private JPanel projSubPrefPanel;
-    private JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
+    private final JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
 
     private JLabel projectionCodeLabel;
     private Component projectionCodeGlue;
-    private JLabel projectionCode = new JLabel();
+    private final JLabel projectionCode = new JLabel();
     private JLabel projectionNameLabel;
     private Component projectionNameGlue;
-    private JLabel projectionName = new JLabel();
-    private JLabel bounds = new JLabel();
+    private final JLabel projectionName = new JLabel();
+    private final JLabel bounds = new JLabel();
 
     /**
@@ -77,4 +76,8 @@
 
     public void addGui() {
+        projectionCodeLabel = new JLabel(tr("Projection code"));
+        projectionCodeGlue = GBC.glue(5, 0);
+        projectionNameLabel = new JLabel(tr("Projection name"));
+        projectionNameGlue = GBC.glue(5, 0);
         projPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
         projPanel.setLayout(new GridBagLayout());
@@ -82,9 +85,9 @@
         projPanel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
-        projPanel.add(projectionCodeLabel = new JLabel(tr("Projection code")), GBC.std().insets(25, 5, 0, 5));
-        projPanel.add(projectionCodeGlue = GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionCodeLabel, GBC.std().insets(25, 5, 0, 5));
+        projPanel.add(projectionCodeGlue, GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionCode, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
-        projPanel.add(projectionNameLabel = new JLabel(tr("Projection name")), GBC.std().insets(25, 5, 0, 5));
-        projPanel.add(projectionNameGlue = GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionNameLabel, GBC.std().insets(25, 5, 0, 5));
+        projPanel.add(projectionNameGlue, GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionName, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
         projPanel.add(new JLabel(tr("Bounds")), GBC.std().insets(25, 5, 0, 5));
@@ -94,10 +97,7 @@
 
         selectedProjectionChanged((ProjectionChoice) projectionCombo.getSelectedItem());
-        projectionCombo.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
-                selectedProjectionChanged(pc);
-            }
+        projectionCombo.addActionListener(e -> {
+            ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
+            selectedProjectionChanged(pc);
         });
         setContent(projPanel);
@@ -110,10 +110,5 @@
             return;
 
-        final ActionListener listener = new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                updateMeta(pc);
-            }
-        };
+        final ActionListener listener = e -> updateMeta(pc);
 
         // Replace old panel with new one
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/LambertCC9ZonesProjectionPatterns.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/LambertCC9ZonesProjectionPatterns.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/LambertCC9ZonesProjectionPatterns.java	(revision 36173)
@@ -14,5 +14,5 @@
     static {
         for (int i = 0; i < lambertCC9Zones.length; i++) {
-            lambertCC9Zones[i] = Projections.getProjectionByCode("EPSG:"+Integer.toString(3942+i));
+            lambertCC9Zones[i] = Projections.getProjectionByCode("EPSG:" + (3942 + i));
         }
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java	(revision 36173)
@@ -86,9 +86,9 @@
     private final Map<String, OsmPrimitive> tridentObjects = new HashMap<>();
 
-    public static final boolean acceptsXmlNeptuneFile(File file) {
+    public static boolean acceptsXmlNeptuneFile(File file) {
         return acceptsXmlNeptuneFile(file, null);
     }
 
-    public static final boolean acceptsXmlNeptuneFile(File file, URL schemaURL) {
+    public static boolean acceptsXmlNeptuneFile(File file, URL schemaURL) {
 
         if (schemaURL == null) {
@@ -105,10 +105,8 @@
                 Logging.info(xmlFile.getSystemId() + " is valid");
                 return true;
-            } catch (SAXException e) {
+            } catch (SAXException | IOException e) {
                 Logging.error(xmlFile.getSystemId() + " is NOT valid");
                 Logging.error("Reason: " + e.getLocalizedMessage());
-            } catch (IOException e) {
-                Logging.error(xmlFile.getSystemId() + " is NOT valid");
-                Logging.error("Reason: " + e.getLocalizedMessage());
+                Logging.debug(e);
             }
         } catch (IOException e) {
@@ -123,5 +121,5 @@
     }
 
-    protected static final <T> T unmarshal(Class<T> docClass, InputStream inputStream) throws JAXBException {
+    protected static <T> T unmarshal(Class<T> docClass, InputStream inputStream) throws JAXBException {
         String packageName = docClass.getPackage().getName();
         JAXBContext jc = JAXBContext.newInstance(packageName, NeptuneReader.class.getClassLoader());
@@ -215,5 +213,5 @@
     }
 
-    protected final <T extends TridentObjectType> T findTridentObject(List<T> list, String id) {
+    protected static <T extends TridentObjectType> T findTridentObject(List<T> list, String id) {
         for (T object : list) {
             if (object.getObjectId().equals(id)) {
@@ -343,5 +341,5 @@
                     Logging.warn("Cannot find StopPoint: "+grandchildId);
                 } else {
-                    if (grandchild.getLongLatType().equals(LongLatTypeType.WGS_84)) {
+                    if (grandchild.getLongLatType() == LongLatTypeType.WGS_84) {
                         Node platform = createPlatform(grandchild);
                         stopArea.addMember(new RelationMember(OSM_PLATFORM, platform));
@@ -358,5 +356,5 @@
         if (areaCentroid == null) {
             Logging.warn("Cannot find AreaCentroid: "+centroidId);
-        } else if (!areaCentroid.getLongLatType().equals(LongLatTypeType.WGS_84)) {
+        } else if (areaCentroid.getLongLatType() != LongLatTypeType.WGS_84) {
             Logging.warn("Unsupported long/lat type: "+areaCentroid.getLongLatType());
         } else {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java	(revision 36173)
@@ -5,9 +5,13 @@
 
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
+import javax.xml.stream.XMLStreamException;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -16,4 +20,5 @@
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.GeoJSONReader;
+import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmServerReader;
 import org.openstreetmap.josm.io.OsmTransferException;
@@ -121,9 +126,9 @@
     }
 
-    private Class<? extends AbstractReader> findReaderByExtension(String filename) {
-        filename = filename.replace("\"", "").toLowerCase();
-        for (String ext : FILE_AND_ARCHIVE_READERS.keySet()) {
-            if (filename.endsWith("."+ext)) {
-                return FILE_AND_ARCHIVE_READERS.get(ext);
+    private static Class<? extends AbstractReader> findReaderByExtension(String filename) {
+        filename = filename.replace("\"", "").toLowerCase(Locale.ROOT);
+        for (Map.Entry<String, Class<? extends AbstractReader>> entry : FILE_AND_ARCHIVE_READERS.entrySet()) {
+            if (filename.endsWith("."+entry.getKey())) {
+                return entry.getValue();
             }
         }
@@ -142,5 +147,5 @@
     public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
         InputStream in = null;
-        ProgressMonitor instance = null;
+        ProgressMonitor instance;
         try {
             in = getInputStreamRaw(url, progressMonitor);
@@ -176,5 +181,5 @@
                 return GeoJSONReader.parseDataSet(in, instance);
             } else if (readerClass.equals(MifReader.class)) {
-                return MifReader.parseDataSet(in, null, handler, instance);
+                return MifReader.parseDataSet(in, null, handler);
             } else if (readerClass.equals(ShpReader.class)) {
                 return ShpReader.parseDataSet(in, null, handler, instance);
@@ -192,7 +197,5 @@
                 throw new IllegalArgumentException("Unsupported reader class: "+readerClass.getName());
             }
-        } catch (OsmTransferException e) {
-            throw e;
-        } catch (Exception e) {
+        } catch (IOException | XMLStreamException | IllegalDataException e) {
             if (cancel)
                 return null;
@@ -205,5 +208,5 @@
                     in.close();
                 }
-            } catch (Exception e) {
+            } catch (IOException e) {
                 Logging.trace(e);
             }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OverpassApi.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OverpassApi.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OverpassApi.java	(revision 36173)
@@ -43,5 +43,5 @@
     }
 
-    public static final StringBuilder union(CharSequence... queries) {
+    public static StringBuilder union(CharSequence... queries) {
         StringBuilder result = new StringBuilder("<union>\n");
         for (CharSequence query : queries) {
@@ -54,5 +54,5 @@
     }
 
-    public static final StringBuilder query(String bbox, OaQueryType type, CharSequence... conditions) {
+    public static StringBuilder query(String bbox, OaQueryType type, CharSequence... conditions) {
         StringBuilder result = new StringBuilder("<query type=\"").append(type).append("\" >\n");
         if (bbox != null) {
@@ -68,25 +68,25 @@
     }
 
-    public static final String recurse(OaRecurseType type, String into) {
+    public static String recurse(OaRecurseType type, String into) {
         return "<recurse type=\""+type+"\" into=\""+into+"\"/>\n";
     }
 
-    public static final String recurse(OaRecurseType... types) {
-        String result = "";
+    public static String recurse(OaRecurseType... types) {
+        StringBuilder result = new StringBuilder();
         for (OaRecurseType type : types) {
-            result += "<recurse type=\""+type+"\"/>\n";
+            result.append("<recurse type=\"").append(type).append("\"/>\n");
         }
-        return result;
+        return result.toString();
     }
 
-    public static final String print() {
+    public static String print() {
         return "<print mode=\"meta\"/>";
     }
 
-    public static final String hasKey(String key) {
+    public static String hasKey(String key) {
         return hasKey(key, null);
     }
 
-    public static final String hasKey(String key, String value) {
+    public static String hasKey(String key, String value) {
         return "<has-kv k=\""+key+"\" "+(value != null && !value.isEmpty() ? "v=\""+value+"\"" : "")+" />";
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 36173)
@@ -52,5 +52,5 @@
     }
 
-    public static final Pattern getCoordinatePattern(String coor, String proj) {
+    public static Pattern getCoordinatePattern(String coor, String proj) {
         if (proj != null && !proj.isEmpty()) {
             return Pattern.compile("(?:.*(?:"+coor+").*(?:"+proj+").*)|(?:.*("+proj+").*(?:"+coor+").*)", Pattern.CASE_INSENSITIVE);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java	(revision 36173)
@@ -12,4 +12,5 @@
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
@@ -154,5 +155,5 @@
                     instance = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
                 }
-                final String lowerCaseName = f.getName().toLowerCase();
+                final String lowerCaseName = f.getName().toLowerCase(Locale.ROOT);
                 if (lowerCaseName.endsWith(OdConstants.CSV_EXT)) {
                     from = CsvReader.parseDataSet(in, handler, instance);
@@ -168,5 +169,5 @@
                     from = ShpReader.parseDataSet(in, f, handler, instance);
                 } else if (lowerCaseName.endsWith(OdConstants.MIF_EXT)) {
-                    from = MifReader.parseDataSet(in, f, handler, instance);
+                    from = MifReader.parseDataSet(in, f, handler);
                 } else if (lowerCaseName.endsWith(OdConstants.TAB_EXT)) {
                     from = TabReader.parseDataSet(in, f, handler, instance);
@@ -190,5 +191,5 @@
         // Test file name to see if it may contain useful data
         for (String ext : NetworkReader.FILE_READERS.keySet()) {
-            if (entryName.toLowerCase().endsWith("."+ext)) {
+            if (entryName.toLowerCase(Locale.ROOT).endsWith("."+ext)) {
                 candidates.add(file);
                 break;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/DefaultArchiveHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/DefaultArchiveHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/DefaultArchiveHandler.java	(revision 36173)
@@ -6,5 +6,5 @@
 public class DefaultArchiveHandler implements ArchiveHandler {
 
-    private boolean skipXsdValidation = false;
+    private boolean skipXsdValidation;
     
     @Override
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 36173)
@@ -27,6 +27,4 @@
     private final ZipInputStream zis;
 
-    private ZipEntry entry;
-
     public ZipReader(InputStream in, AbstractDataSetHandler handler, boolean promptUser) {
         super(handler, handler != null ? handler.getArchiveHandler() : null, promptUser);
@@ -46,4 +44,5 @@
     @Override
     protected void extractArchive(final File temp, final List<File> candidates) throws IOException, FileNotFoundException {
+        ZipEntry entry;
         while ((entry = zis.getNextEntry()) != null) {
             Logging.debug("Extracting {0}", entry.getName());
@@ -63,5 +62,5 @@
                 try (FileOutputStream fos = new FileOutputStream(file)) {
                     byte[] buffer = new byte[8192];
-                    int count = 0;
+                    int count;
                     while ((count = zis.read(buffer, 0, buffer.length)) > 0) {
                         fos.write(buffer, 0, count);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java	(revision 36173)
@@ -12,4 +12,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -51,7 +52,7 @@
     protected final File getDataFile(File headerFile, String extension) {
         String filename = headerFile.getName().substring(0, headerFile.getName().lastIndexOf('.'));
-        File dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toUpperCase());
+        File dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toUpperCase(Locale.ROOT));
         if (!dataFile.exists()) {
-            dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toLowerCase());
+            dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toLowerCase(Locale.ROOT));
         }
         return dataFile;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultGeographicHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultGeographicHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultGeographicHandler.java	(revision 36173)
@@ -10,6 +10,6 @@
 
     private boolean useNodeMap = true;
-    private boolean checkNodeProximity = false;
-    private boolean preferMultipolygonToSimpleWay = false;
+    private boolean checkNodeProximity;
+    private boolean preferMultipolygonToSimpleWay;
 
     @Override
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 36173)
@@ -18,8 +18,4 @@
 import java.util.TreeMap;
 
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.spi.JsonProvider;
 import javax.swing.JOptionPane;
 
@@ -69,4 +65,9 @@
 import org.openstreetmap.josm.tools.Utils;
 
+import jakarta.json.JsonArray;
+import jakarta.json.JsonObject;
+import jakarta.json.JsonReader;
+import jakarta.json.spi.JsonProvider;
+
 /**
  * Superclass of geographic format readers (currently GML, GPKG, and SHP).
@@ -181,14 +182,14 @@
         Way tempWay = new Way();
         if (ls != null) {
-            final List<Node> nodes = new ArrayList<>(ls.getNumPoints());
+            final List<Node> lsNodes = new ArrayList<>(ls.getNumPoints());
             // Build list of nodes
             for (int i = 0; i < ls.getNumPoints(); i++) {
                 try {
-                    nodes.add(createOrGetNode(ls.getPointN(i)));
+                    lsNodes.add(createOrGetNode(ls.getPointN(i)));
                 } catch (TransformException | IllegalArgumentException e) {
                     Logging.error("Exception for " + ls + ": " + e.getClass().getName() + ": " + e.getMessage());
                 }
             }
-            tempWay.setNodes(nodes);
+            tempWay.setNodes(lsNodes);
             // Find possible duplicated ways
             if (tempWay.getNodesCount() > 0) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsConverter.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsConverter.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsConverter.java	(revision 36173)
@@ -276,28 +276,24 @@
 
     private static void readNonGeometricAttributes(Feature feature, OsmPrimitive primitive) {
-        try {
-            Collection<Property> properties = feature.getProperties();
-            Map<String, String> tagMap = new LinkedHashMap<>(properties.size());
-            for (Property prop : properties) {
-                if (!(prop instanceof GeometryAttribute)) {
-                    Name name = prop.getName();
-                    Object value = prop.getValue();
-                    if (name != null && value != null) {
-                        String sName = name.toString();
-                        String sValue = value.toString();
-                        if (value instanceof Date) {
-                            sValue = new SimpleDateFormat("yyyy-MM-dd").format(value);
-                        }
-                        if (!sName.isEmpty() && !sValue.isEmpty()) {
-                            tagMap.put(sName, sValue);
-                            //primitive.put(sName, sValue);
-                        }
-                    }
-                }
-            }
-            primitive.putAll(tagMap);
-        } catch (Exception e) {
-            Logging.error(e);
-        }
+        Collection<Property> properties = feature.getProperties();
+        Map<String, String> tagMap = new LinkedHashMap<>(properties.size());
+        for (Property prop : properties) {
+            if (!(prop instanceof GeometryAttribute)) {
+                Name name = prop.getName();
+                Object value = prop.getValue();
+                if (name != null && value != null) {
+                    String sName = name.toString();
+                    String sValue = value.toString();
+                    if (value instanceof Date) {
+                        sValue = new SimpleDateFormat("yyyy-MM-dd").format(value);
+                    }
+                    if (!sName.isEmpty() && !sValue.isEmpty()) {
+                        tagMap.put(sName, sValue);
+                        //primitive.put(sName, sValue);
+                    }
+                }
+            }
+        }
+        primitive.putAll(tagMap);
     }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeotoolsHandler.java	(revision 36173)
@@ -51,5 +51,5 @@
         if (getCrsFor(sourceCRS.getName().getCode()) != null) {
             return CRS.findMathTransform(getCrsFor(sourceCRS.getName().getCode()), targetCRS, lenient);
-        } else if (sourceCRS instanceof AbstractDerivedCRS && sourceCRS.getName().getCode().equalsIgnoreCase("Lambert_Conformal_Conic")) {
+        } else if (sourceCRS instanceof AbstractDerivedCRS && "Lambert_Conformal_Conic".equalsIgnoreCase(sourceCRS.getName().getCode())) {
             List<MathTransform> result = new ArrayList<>();
             AbstractDerivedCRS crs = (AbstractDerivedCRS) sourceCRS;
@@ -93,4 +93,5 @@
                                         } catch (FactoryException e) {
                                             Logging.error(e.getMessage());
+                                            Logging.debug(e);
                                         }
                                     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java	(revision 36173)
@@ -4,5 +4,8 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
+
+import javax.xml.stream.XMLStreamException;
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
@@ -27,5 +30,5 @@
         try {
             return GmlReader.parseDataSet(in, handler, instance);
-        } catch (Exception e) {
+        } catch (IOException | XMLStreamException e) {
             throw new IllegalDataException(e);
         }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java	(revision 36173)
@@ -18,5 +18,4 @@
 import org.opengis.geometry.MismatchedDimensionException;
 import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.NoSuchAuthorityCodeException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.MathTransform;
@@ -55,5 +54,5 @@
     private final GmlHandler gmlHandler;
 
-    private XMLStreamReader parser;
+    private final XMLStreamReader parser;
 
     private int dim;
@@ -84,5 +83,6 @@
         try {
             return new GmlReader(parser, handler != null ? handler.getGmlHandler() : null).parseDoc(instance);
-        } catch (Exception e) {
+        } catch (XMLStreamException | GeoCrsException | FactoryException | GeoMathTransformException |
+                 TransformException e) {
             throw new IOException(e);
         }
@@ -110,5 +110,5 @@
     }
 
-    private void findCRS(String srs) throws NoSuchAuthorityCodeException, FactoryException {
+    private void findCRS(String srs) throws FactoryException {
         Logging.info("Finding CRS for "+srs);
         if (gmlHandler != null) {
@@ -150,5 +150,5 @@
     UserCancelException, GeoMathTransformException, MismatchedDimensionException, TransformException {
         Way way = null;
-        Node node = null;
+        Node node;
         Map<String, StringBuilder> tags = new HashMap<>();
         OsmPrimitive prim = null;
@@ -195,9 +195,5 @@
                 }
             } else if (event == XMLStreamConstants.CHARACTERS && key != null) {
-                StringBuilder sb = tags.get(key);
-                if (sb == null) {
-                    sb = new StringBuilder();
-                    tags.put(key, sb);
-                }
+                StringBuilder sb = tags.computeIfAbsent(key, k -> new StringBuilder());
                 sb.append(parser.getTextCharacters(), parser.getTextStart(), parser.getTextLength());
             }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java	(revision 36173)
@@ -4,5 +4,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
+import java.util.Locale;
+
+import javax.xml.stream.XMLStreamException;
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
@@ -30,10 +34,10 @@
             throws IllegalDataException {
         try {
-            if (file != null && file.getName().toLowerCase().endsWith(OdConstants.KML_EXT)) {
+            if (file != null && file.getName().toLowerCase(Locale.ROOT).endsWith(OdConstants.KML_EXT)) {
                 return KmlReader.parseDataSet(in, instance);
             } else {
                 return KmzReader.parseDataSet(in, instance);
             }
-        } catch (Exception e) {
+        } catch (IOException | XMLStreamException e) {
             throw new IllegalDataException(e);
         }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java	(revision 36173)
@@ -54,8 +54,8 @@
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
-    public static Pattern COLOR_PATTERN = Pattern.compile("\\p{XDigit}{8}");
-
-    private XMLStreamReader parser;
-    private Map<LatLon, Node> nodes = new HashMap<>();
+    public static final Pattern COLOR_PATTERN = Pattern.compile("\\p{XDigit}{8}");
+
+    private final XMLStreamReader parser;
+    private final Map<LatLon, Node> nodes = new HashMap<>();
 
     public KmlReader(XMLStreamReader parser) {
@@ -65,7 +65,8 @@
     public static DataSet parseDataSet(InputStream in, ProgressMonitor instance)
             throws IOException, XMLStreamException, FactoryConfigurationError {
-        InputStreamReader ir = UTFInputStreamReader.create(in);
-        XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(ir);
-        return new KmlReader(parser).parseDoc();
+        try (InputStreamReader ir = UTFInputStreamReader.create(in)) {
+            XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(ir);
+            return new KmlReader(parser).parseDoc();
+        }
     }
 
@@ -80,8 +81,6 @@
         while (parser.hasNext()) {
             int event = parser.next();
-            if (event == XMLStreamConstants.START_ELEMENT) {
-                if (parser.getLocalName().equals(KML_PLACEMARK)) {
-                    parsePlaceMark(ds);
-                }
+            if (event == XMLStreamConstants.START_ELEMENT && parser.getLocalName().equals(KML_PLACEMARK)) {
+                parsePlaceMark(ds);
             }
         }
@@ -129,5 +128,6 @@
                     }
                 } else if (parser.getLocalName().equals(KML_POLYGON)) {
-                    ds.addPrimitive(relation = new Relation());
+                    relation = new Relation();
+                    ds.addPrimitive(relation);
                     relation.put("type", "multipolygon");
                     list.add(relation);
@@ -138,5 +138,6 @@
                 } else if (parser.getLocalName().equals(KML_LINEAR_RING)) {
                     if (relation != null) {
-                        ds.addPrimitive(way = new Way());
+                        way = new Way();
+                        ds.addPrimitive(way);
                         wayNodes = new ArrayList<>();
                         relation.addMember(new RelationMember(role, way));
@@ -147,10 +148,10 @@
                     list.add(way);
                 } else if (parser.getLocalName().equals(KML_COORDINATES)) {
-                    String[] tab = parser.getElementText().trim().split("\\s");
-                    for (int i = 0; i < tab.length; i++) {
-                        node = parseNode(ds, wayNodes, node, tab[i].split(","));
+                    String[] tab = parser.getElementText().trim().split("\\s", Pattern.UNICODE_CHARACTER_CLASS);
+                    for (String s : tab) {
+                        node = parseNode(ds, wayNodes, node, s.split(","));
                     }
                 } else if (parser.getLocalName().equals(KML_EXT_COORD)) {
-                    node = parseNode(ds, wayNodes, node, parser.getElementText().trim().split("\\s"));
+                    node = parseNode(ds, wayNodes, node, parser.getElementText().trim().split("\\s", Pattern.UNICODE_CHARACTER_CLASS));
                     if (node != null && when > 0) {
                         node.setRawTimestamp((int) when);
@@ -158,8 +159,6 @@
                 } else if (parser.getLocalName().equals(KML_WHEN)) {
                     when = DateUtils.tsFromString(parser.getElementText().trim());
-                } else if (parser.getLocalName().equals(KML_EXT_LANG)) {
-                    if (KML_NAME.equals(previousName)) {
-                        tags.put(KML_NAME, parser.getElementText());
-                    }
+                } else if (parser.getLocalName().equals(KML_EXT_LANG) && KML_NAME.equals(previousName)) {
+                    tags.put(KML_NAME, parser.getElementText());
                 }
                 previousName = parser.getLocalName();
@@ -179,7 +178,5 @@
         }
         for (OsmPrimitive p : list) {
-            for (String key : tags.keySet()) {
-                p.put(key, tags.get(key));
-            }
+            p.putAll(tags);
         }
     }
@@ -187,13 +184,13 @@
     private Node parseNode(DataSet ds, List<Node> wayNodes, Node node, String[] values) {
         if (values.length >= 2) {
-            LatLon ll = new LatLon(Double.valueOf(values[1]), Double.valueOf(values[0])).getRoundedToOsmPrecision();
-            node = nodes.get(ll);
-            if (node == null) {
-                ds.addPrimitive(node = new Node(ll));
-                nodes.put(ll, node);
-                if (values.length > 2 && !values[2].equals("0")) {
-                    node.put("ele", values[2]);
+            LatLon ll = new LatLon(Double.parseDouble(values[1]), Double.parseDouble(values[0])).getRoundedToOsmPrecision();
+            node = nodes.computeIfAbsent(ll, latLon -> {
+                Node tNode = new Node(latLon);
+                ds.addPrimitive(tNode);
+                if (values.length > 2 && !"0".equals(values[2])) {
+                    tNode.put("ele", values[2]);
                 }
-            }
+                return tNode;
+            });
             if (wayNodes != null) {
                 wayNodes.add(node);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java	(revision 36173)
@@ -6,4 +6,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Locale;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
@@ -15,15 +16,30 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.AbstractReader;
-import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.tools.Logging;
 
-public class KmzReader extends AbstractReader {
+/**
+ * Read kmz files
+ */
+public final class KmzReader extends AbstractReader {
 
-    private ZipInputStream zis;
+    private final ZipInputStream zis;
 
-    public KmzReader(ZipInputStream zis) {
+    /**
+     * Create a new {@link KmzReader}
+     * @param zis The stream to read
+     */
+    KmzReader(ZipInputStream zis) {
         this.zis = zis;
     }
 
+    /**
+     * Parse a dataset from a stream
+     * @param in The stream to read
+     * @param instance The progress monitor to update
+     * @return The dataset
+     * @throws IOException If there was an issue reading the stream
+     * @throws XMLStreamException If there was an issue with the XML
+     * @throws FactoryConfigurationError If there was an issue with creating the xml factory
+     */
     public static DataSet parseDataSet(InputStream in, ProgressMonitor instance)
             throws IOException, XMLStreamException, FactoryConfigurationError {
@@ -33,5 +49,5 @@
     @Override
     protected DataSet doParseDataSet(InputStream source,
-            ProgressMonitor progressMonitor) throws IllegalDataException {
+            ProgressMonitor progressMonitor) {
         return null;
     }
@@ -45,5 +61,5 @@
                 return null;
             }
-        } while (!entry.getName().toLowerCase().endsWith(".kml"));
+        } while (!entry.getName().toLowerCase(Locale.ROOT).endsWith(".kml"));
         long size = entry.getSize();
         byte[] buffer;
@@ -51,5 +67,5 @@
             buffer = new byte[(int) size];
             int off = 0;
-            int count = 0;
+            int count;
             while ((count = zis.read(buffer, off, (int) size)) > 0) {
                 off += count;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 36173)
@@ -16,4 +16,5 @@
 import java.nio.charset.Charset;
 import java.util.Arrays;
+import java.util.Locale;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -29,5 +30,4 @@
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
@@ -60,5 +60,4 @@
     private File file;
     private InputStream stream;
-    private Charset charset;
     private BufferedReader midReader;
 
@@ -71,20 +70,19 @@
     private Relation region;
     private Way polygon;
-    private Node node;
     private Way polyline;
 
     // CoordSys clause
     private String units;
-    private Double originLon;
-    private Double originLat;
-    private Double stdP1;
-    private Double stdP2;
-    private Double scaleFactor;
-    private Double falseEasting;
-    private Double falseNorthing;
-    private Double minx;
-    private Double miny;
-    private Double maxx;
-    private Double maxy;
+    private double originLon = Double.NaN;
+    private double originLat = Double.NaN;
+    private double stdP1 = Double.NaN;
+    private double stdP2 = Double.NaN;
+    private double scaleFactor = Double.NaN;
+    private double falseEasting = Double.NaN;
+    private double falseNorthing = Double.NaN;
+    private double minx = Double.NaN;
+    private double miny = Double.NaN;
+    private double maxx = Double.NaN;
+    private double maxy = Double.NaN;
 
     // Region clause
@@ -100,6 +98,6 @@
 
     public static DataSet parseDataSet(InputStream in, File file,
-            AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
-        return new MifReader(handler).parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
+            AbstractDataSetHandler handler) throws IOException {
+        return new MifReader(handler).parse(in, file, Charset.forName(OdConstants.ISO8859_15));
     }
 
@@ -108,10 +106,10 @@
     }
 
-    private void parseUnique(String[] words) {
+    private void parseUnique() {
         // TODO
         Logging.warn("TODO Unique: "+line);
     }
 
-    private void parseIndex(String[] words) {
+    private void parseIndex() {
         // TODO
         Logging.warn("TODO Index: "+line);
@@ -282,5 +280,5 @@
                         if (equals(originLat, 42.0+i) && equals(stdP1, 41.25+i) && equals(stdP2, 42.75+i)
                                 && equals(falseNorthing, (i+1)*1000000.0 + 200000.0)) {
-                            josmProj = Projections.getProjectionByCode("EPSG:"+Integer.toString(3942 + i)); // LambertCC9Zones
+                            josmProj = Projections.getProjectionByCode("EPSG:"+ (3942 + i)); // LambertCC9Zones
                         }
                     }
@@ -293,5 +291,5 @@
 
         // TODO: handle cases with Affine declaration
-        int index = parseAffineUnits(words);
+        int index = parseAffineUnits();
 
         // handle cases with Bounds declaration
@@ -307,5 +305,5 @@
     private void parseCoordSysSyntax2(String[] words) {
         // handle cases with Affine declaration
-        int index = parseAffineUnits(words);
+        int index = parseAffineUnits();
 
         units = words[index+1];
@@ -314,7 +312,7 @@
     }
 
-    private int parseAffineUnits(String[] words) {
+    private int parseAffineUnits() {
         // TODO: handle affine units
-        return 2+0;
+        return 2;
     }
 
@@ -322,8 +320,8 @@
         if (index < words.length && "Bounds".equals(words[index])) {
             // Useless parenthesis... "(minx, miny) (maxx, maxy)"
-            minx = Double.valueOf(words[index+1].substring(1));
-            miny = Double.valueOf(words[index+2].substring(0, words[index+2].length()-1));
-            maxx = Double.valueOf(words[index+3].substring(1));
-            maxy = Double.valueOf(words[index+4].substring(0, words[index+4].length()-1));
+            minx = Double.parseDouble(words[index+1].substring(1));
+            miny = Double.parseDouble(words[index+2].substring(0, words[index+2].length()-1));
+            maxx = Double.parseDouble(words[index+3].substring(1));
+            maxy = Double.parseDouble(words[index+4].substring(0, words[index+4].length()-1));
             if (Logging.isTraceEnabled()) {
                 Logging.trace(Arrays.toString(words) + " -> "+minx+","+miny+","+maxx+","+maxy);
@@ -336,5 +334,5 @@
             words[i] = words[i].replace(",", "");
         }
-        switch (words[1].toLowerCase()) {
+        switch (words[1].toLowerCase(Locale.ROOT)) {
         case "earth":
             parseCoordSysSyntax1(words);
@@ -369,5 +367,5 @@
     }
 
-    private void parseTransform(String[] words) {
+    private void parseTransform() {
         // TODO
         Logging.warn("TODO Transform: "+line);
@@ -380,5 +378,5 @@
     }
 
-    private void parseData(String[] words) {
+    private void parseData() {
         if (dataSet == null) {
             dataSet = new DataSet();
@@ -439,25 +437,25 @@
     }
 
-    private void parseArc(String[] words) {
+    private void parseArc() {
         // TODO
         Logging.warn("TODO Arc: "+line);
     }
 
-    private void parseText(String[] words) {
+    private void parseText() {
         // TODO
         Logging.warn("TODO Text: "+line);
     }
 
-    private void parseRect(String[] words) {
+    private void parseRect() {
         // TODO
         Logging.warn("TODO Rect: "+line);
     }
 
-    private void parseRoundRect(String[] words) {
+    private void parseRoundRect() {
         // TODO
         Logging.warn("TODO RoundRect: "+line);
     }
 
-    private void parseEllipse(String[] words) {
+    private void parseEllipse() {
         // TODO
         Logging.warn("TODO Ellipse: "+line);
@@ -466,12 +464,11 @@
     private void initializeReaders(InputStream in, File f, Charset cs, int bufSize) throws IOException {
         stream = in;
-        charset = cs;
         file = f;
         Reader isr;
         // Did you know ? new InputStreamReader(in, charset) has a non-configurable buffer of 8kb :(
         if (bufSize < 8192) {
-            isr = new InputStreamReaderUnbuffered(in, charset);
+            isr = new InputStreamReaderUnbuffered(in, cs);
         } else {
-            isr = new InputStreamReader(in, charset);
+            isr = new InputStreamReader(in, cs);
         }
         headerReader = new BufferedReader(isr, bufSize);
@@ -479,8 +476,8 @@
             midReader.close();
         }
-        midReader = getDataReader(file, ".mid", charset);
-    }
-
-    private DataSet parse(InputStream in, File file, ProgressMonitor instance, Charset cs) throws IOException {
+        midReader = getDataReader(file, ".mid", cs);
+    }
+
+    private DataSet parse(InputStream in, File file, Charset cs) throws IOException {
         try {
             try {
@@ -501,23 +498,23 @@
     @Override
     protected void parseHeaderLine(String[] words) throws IOException {
-        if (words[0].equalsIgnoreCase("Version")) {
+        if ("Version".equalsIgnoreCase(words[0])) {
             parseVersion(words);
-        } else if (words[0].equalsIgnoreCase("Charset")) {
+        } else if ("Charset".equalsIgnoreCase(words[0])) {
             // Reinitialize readers with an efficient buffer value now we know for sure the good charset
             initializeReaders(stream, file, parseCharset(words), 8192);
-        } else if (words[0].equalsIgnoreCase("Delimiter")) {
+        } else if ("Delimiter".equalsIgnoreCase(words[0])) {
             parseDelimiter(words);
-        } else if (words[0].equalsIgnoreCase("Unique")) {
-            parseUnique(words);
-        } else if (words[0].equalsIgnoreCase("Index")) {
-            parseIndex(words);
-        } else if (words[0].equalsIgnoreCase("CoordSys")) {
+        } else if ("Unique".equalsIgnoreCase(words[0])) {
+            parseUnique();
+        } else if ("Index".equalsIgnoreCase(words[0])) {
+            parseIndex();
+        } else if ("CoordSys".equalsIgnoreCase(words[0])) {
             parseCoordSys(words);
-        } else if (words[0].equalsIgnoreCase("Transform")) {
-            parseTransform(words);
-        } else if (words[0].equalsIgnoreCase("Columns")) {
+        } else if ("Transform".equalsIgnoreCase(words[0])) {
+            parseTransform();
+        } else if ("Columns".equalsIgnoreCase(words[0])) {
             parseColumns(words);
-        } else if (words[0].equalsIgnoreCase("Data")) {
-            parseData(words);
+        } else if ("Data".equalsIgnoreCase(words[0])) {
+            parseData();
         } else if (dataSet != null) {
             if (state == State.START_POLYGON) {
@@ -538,5 +535,5 @@
             } else if (state == State.READING_POINTS && numpts > 0) {
                 if (josmProj != null) {
-                    node = createNode(words[0], words[1]);
+                    Node node = createNode(words[0], words[1]);
                     if (polygon != null) {
                         polygon.addNode(node);
@@ -547,5 +544,5 @@
                 if (--numpts == 0) {
                     if (numpolygons > -1) {
-                        if (!polygon.isClosed()) {
+                        if (polygon != null && !polygon.isClosed()) {
                             polygon.addNode(polygon.firstNode());
                         }
@@ -565,33 +562,29 @@
                     }
                 }
-            } else if (words[0].equalsIgnoreCase("Point")) {
+            } else if ("Point".equalsIgnoreCase(words[0])) {
                 parsePoint(words);
-            } else if (words[0].equalsIgnoreCase("Line")) {
+            } else if ("Line".equalsIgnoreCase(words[0])) {
                 parseLine(words);
-            } else if (words[0].equalsIgnoreCase("PLine")) {
+            } else if ("PLine".equalsIgnoreCase(words[0])) {
                 parsePLine(words);
-            } else if (words[0].equalsIgnoreCase("Region")) {
+            } else if ("Region".equalsIgnoreCase(words[0])) {
                 parseRegion(words);
-            } else if (words[0].equalsIgnoreCase("Arc")) {
-                parseArc(words);
-            } else if (words[0].equalsIgnoreCase("Text")) {
-                parseText(words);
-            } else if (words[0].equalsIgnoreCase("Rect")) {
-                parseRect(words);
-            } else if (words[0].equalsIgnoreCase("RoundRect")) {
-                parseRoundRect(words);
-            } else if (words[0].equalsIgnoreCase("Ellipse")) {
-                parseEllipse(words);
-            } else if (words[0].equalsIgnoreCase("Pen")) {
-                // Do nothing
-            } else if (words[0].equalsIgnoreCase("Brush")) {
-                // Do nothing
-            } else if (words[0].equalsIgnoreCase("Center")) {
-                // Do nothing
-            } else if (words[0].equalsIgnoreCase("Symbol")) {
-                // Do nothing
-            } else if (words[0].equalsIgnoreCase("Font")) {
-                // Do nothing
-            } else if (!words[0].isEmpty()) {
+            } else if ("Arc".equalsIgnoreCase(words[0])) {
+                parseArc();
+            } else if ("Text".equalsIgnoreCase(words[0])) {
+                parseText();
+            } else if ("Rect".equalsIgnoreCase(words[0])) {
+                parseRect();
+            } else if ("RoundRect".equalsIgnoreCase(words[0])) {
+                parseRoundRect();
+            } else if ("Ellipse".equalsIgnoreCase(words[0])) {
+                parseEllipse();
+            } else if (!"Pen".equalsIgnoreCase(words[0])
+                    && !"Brush".equalsIgnoreCase(words[0])
+                    && !"Center".equalsIgnoreCase(words[0])
+                    && !"Symbol".equalsIgnoreCase(words[0])
+                    && !"Font".equalsIgnoreCase(words[0])
+                    && !words[0].isEmpty()) {
+                // Pen, Brush, Center, Symbol, and Font we currently ignore
                 Logging.warn("Line "+lineNum+". Unknown clause in data section: "+line);
             }
@@ -628,7 +621,7 @@
 
     private Node createNode(String x, String y) {
-        Node node = new Node(josmProj.eastNorth2latlon(new EastNorth(Double.parseDouble(x), Double.parseDouble(y))));
-        dataSet.addPrimitive(node);
-        return node;
+        Node newNode = new Node(josmProj.eastNorth2latlon(new EastNorth(Double.parseDouble(x), Double.parseDouble(y))));
+        dataSet.addPrimitive(newNode);
+        return newNode;
     }
 
@@ -639,5 +632,5 @@
      * @return {@code true} if {@code a} and {@code b} are equals
      */
-    public static boolean equals(Double a, Double b) {
+    public static boolean equals(double a, double b) {
         if (a == b) return true;
         // If the difference is less than epsilon, treat as equal.
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java	(revision 36173)
@@ -6,4 +6,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Locale;
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
@@ -31,6 +32,6 @@
             throws IllegalDataException {
         try {
-            if (file != null && file.getName().toLowerCase().endsWith(OdConstants.MIF_EXT)) {
-                return MifReader.parseDataSet(in, file, handler, instance);
+            if (file != null && file.getName().toLowerCase(Locale.ROOT).endsWith(OdConstants.MIF_EXT)) {
+                return MifReader.parseDataSet(in, file, handler);
             } else {
                 return TabReader.parseDataSet(in, file, handler, instance);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java	(revision 36173)
@@ -25,4 +25,5 @@
 import org.locationtech.jts.geom.Point;
 import org.opengis.geometry.MismatchedDimensionException;
+import org.opengis.referencing.FactoryException;
 import org.opengis.referencing.operation.TransformException;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -112,5 +113,5 @@
             Logging.error(e);
             throw e;
-        } catch (Exception e) {
+        } catch (FactoryException | GeoMathTransformException | TransformException | GeoCrsException e) {
             Logging.error(e);
             throw new IOException(e);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabFiles.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabFiles.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabFiles.java	(revision 36173)
@@ -5,9 +5,9 @@
 
 import java.io.File;
-import java.io.FilenameFilter;
 import java.lang.reflect.Field;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -57,5 +57,5 @@
     }
 
-    private String baseName(Object obj) {
+    private static String baseName(Object obj) {
         if (obj instanceof URL) {
             return toBase(((URL) obj).toExternalForm());
@@ -64,6 +64,6 @@
     }
 
-    private String toBase(String path) {
-        return path.substring(0, path.toLowerCase().lastIndexOf(".tab"));
+    private static String toBase(String path) {
+        return path.substring(0, path.toLowerCase(Locale.ROOT).lastIndexOf(".tab"));
     }
 
@@ -86,7 +86,7 @@
             String extensionWithPeriod = type.extensionWithPeriod;
             if (upperCase) {
-                extensionWithPeriod = extensionWithPeriod.toUpperCase();
+                extensionWithPeriod = extensionWithPeriod.toUpperCase(Locale.ROOT);
             } else {
-                extensionWithPeriod = extensionWithPeriod.toLowerCase();
+                extensionWithPeriod = extensionWithPeriod.toLowerCase(Locale.ROOT);
             }
 
@@ -97,5 +97,5 @@
             } catch (MalformedURLException e) {
                 // shouldn't happen because the starting url was constructable
-                throw new RuntimeException(e);
+                throw new JosmRuntimeException(e);
             }
             urls.put(type, newURL);
@@ -108,5 +108,5 @@
         if (isLocal()) {
             Set<Entry<ShpFileType, URL>> entries = urls.entrySet();
-            Map<ShpFileType, URL> toUpdate = new HashMap<>();
+            Map<ShpFileType, URL> toUpdate = new EnumMap<>(ShpFileType.class);
             for (Entry<ShpFileType, URL> entry : entries) {
                 if (!exists(entry.getKey())) {
@@ -121,10 +121,10 @@
     }
 
-    private URL findExistingFile(URL value) {
+    private static URL findExistingFile(URL value) {
         final File file = URLs.urlToFile(value);
         File directory = file.getParentFile();
         if (directory != null && directory.exists()) {
-            File[] files = directory.listFiles((FilenameFilter) (dir, name) -> file.getName().equalsIgnoreCase(name));
-            if (files.length > 0) {
+            File[] files = directory.listFiles((dir, name) -> file.getName().equalsIgnoreCase(name));
+            if (files != null && files.length > 0) {
                 try {
                     return files[0].toURI().toURL();
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java	(revision 36173)
@@ -84,4 +84,5 @@
         } catch (IOException e) {
             Logging.error(e.getMessage());
+            Logging.debug(e);
         }
         return ds;
@@ -90,17 +91,17 @@
     @Override
     protected void parseHeaderLine(String[] words) throws IOException {
-        if (words[0].equalsIgnoreCase("!table")) {
+        if ("!table".equalsIgnoreCase(words[0])) {
             // Do nothing
-        } else if (words[0].equalsIgnoreCase("!version")) {
+        } else if ("!version".equalsIgnoreCase(words[0])) {
             parseVersion(words);
-        } else if (words[0].equalsIgnoreCase("!charset")) {
+        } else if ("!charset".equalsIgnoreCase(words[0])) {
             parseCharset(words);
         } else if (numcolumns > 0) {
             parseField(words);
-        } else if (words[0].equalsIgnoreCase("Definition")) {
+        } else if ("Definition".equalsIgnoreCase(words[0])) {
             // Do nothing
-        } else if (words[0].equalsIgnoreCase("Type")) {
+        } else if ("Type".equalsIgnoreCase(words[0])) {
             parseType(words);
-        } else if (words[0].equalsIgnoreCase("Fields")) {
+        } else if ("Fields".equalsIgnoreCase(words[0])) {
             parseColumns(words);
         } else if (!line.isEmpty()) {
@@ -115,5 +116,5 @@
 
     private void parseType(String[] words) throws IllegalCharsetNameException, UnsupportedCharsetException {
-        if (words[1].equalsIgnoreCase("NATIVE") && words[2].equalsIgnoreCase("Charset")) {
+        if ("NATIVE".equalsIgnoreCase(words[1]) && "Charset".equalsIgnoreCase(words[2])) {
             datCharset = parseCharset(words, 3);
         } else {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java	(revision 36173)
@@ -7,9 +7,9 @@
 import java.io.InputStreamReader;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
@@ -30,5 +30,5 @@
     public CsvReader(CsvHandler handler, String defaultSep) {
         super(handler);
-        this.charset = handler != null && handler.getCharset() != null ? handler.getCharset() : Charset.forName(OdConstants.UTF8);
+        this.charset = handler != null && handler.getCharset() != null ? handler.getCharset() : StandardCharsets.UTF_8;
         this.sep = handler != null && handler.getSeparator() != null ? handler.getSeparator() : defaultSep;
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultCsvHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultCsvHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultCsvHandler.java	(revision 36173)
@@ -6,6 +6,6 @@
 public class DefaultCsvHandler extends DefaultSpreadSheetHandler implements CsvHandler {
 
-    private Charset charset = null;
-    private String separator = null;
+    private Charset charset;
+    private String separator;
     
     @Override
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/DefaultSpreadSheetHandler.java	(revision 36173)
@@ -14,5 +14,5 @@
     private int sheetNumber = -1;
     private int lineNumber = -1;
-    private boolean handlesProjection = false;
+    private boolean handlesProjection;
     
     private int xCol = -1;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java	(revision 36173)
@@ -25,5 +25,5 @@
     }
 
-    private InputSource getEntryInputSource(ZipInputStream zis) throws IOException {
+    private static InputSource getEntryInputSource(ZipInputStream zis) throws IOException {
         int n;
         final byte[] buffer = new byte[4096];
@@ -46,5 +46,5 @@
 
             while (!contentParsed && (entry = zis.getNextEntry()) != null) {
-                if (entry.getName().equals("content.xml")) {
+                if ("content.xml".equals(entry.getName())) {
                     rdr.setContentHandler(contentHandler);
                     Logging.info("Parsing content.xml");
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 36173)
@@ -36,5 +36,5 @@
     private static final NumberFormat formatUK = NumberFormat.getInstance(Locale.UK);
 
-    private static final String COOR = "(\\-?\\d+(?:[\\.,]\\d+)?)";
+    private static final String COOR = "(-?\\d+(?:[.,]\\d+)?)";
     // Lat/lon pattern with optional altitude and precision
     private static final Pattern LATLON_PATTERN = Pattern.compile(
@@ -43,5 +43,5 @@
     protected final SpreadSheetHandler handler;
 
-    public SpreadSheetReader(SpreadSheetHandler handler) {
+    protected SpreadSheetReader(SpreadSheetHandler handler) {
         this.handler = handler;
     }
@@ -68,5 +68,5 @@
 
     public static class CoordinateColumns {
-        public Projection proj = null;
+        public Projection proj;
         public int xCol = -1;
         public int yCol = -1;
@@ -81,7 +81,8 @@
     }
 
-    private CoordinateColumns addCoorColIfNeeded(List<CoordinateColumns> columns, CoordinateColumns col) {
+    private static CoordinateColumns addCoorColIfNeeded(List<CoordinateColumns> columns, CoordinateColumns col) {
         if (col == null || col.isOk()) {
-            columns.add(col = new CoordinateColumns());
+            col = new CoordinateColumns();
+            columns.add(col);
         }
         return col;
@@ -101,8 +102,5 @@
         for (int i = 0; i < header.length; i++) {
             for (ProjectionPatterns pp : OdConstants.PROJECTIONS) {
-                List<CoordinateColumns> columns = projColumns.get(pp);
-                if (columns == null) {
-                    projColumns.put(pp, columns = new ArrayList<>());
-                }
+                List<CoordinateColumns> columns = projColumns.computeIfAbsent(pp, k -> new ArrayList<>());
                 CoordinateColumns col = columns.isEmpty() ? null : columns.get(columns.size()-1);
                 if (pp.getXYPattern().matcher(header[i]).matches()) {
@@ -123,10 +121,10 @@
         final List<CoordinateColumns> columns = new ArrayList<>();
 
-        for (ProjectionPatterns pp : projColumns.keySet()) {
-            for (CoordinateColumns col : projColumns.get(pp)) {
+        for (Map.Entry<ProjectionPatterns, List<SpreadSheetReader.CoordinateColumns>> entry : projColumns.entrySet()) {
+            for (CoordinateColumns col : entry.getValue()) {
                 if (col.isOk()) {
                     columns.add(col);
                     if (col.proj == null) {
-                        col.proj = pp.getProjection(header[col.xCol], header[col.yCol]);
+                        col.proj = entry.getKey().getProjection(header[col.xCol], header[col.yCol]);
                     }
                 }
@@ -166,10 +164,10 @@
         }
 
-        String message = "";
+        StringBuilder message = new StringBuilder();
         for (CoordinateColumns c : columns) {
-            if (!message.isEmpty()) {
-                message += "; ";
-            }
-            message += c.proj + "("+header[c.xCol]+", "+header[c.yCol]+")";
+            if (message.length() != 0) {
+                message.append("; ");
+            }
+            message.append(c.proj).append('(').append(header[c.xCol]).append(", ").append(header[c.yCol]).append(')');
         }
 
@@ -229,9 +227,7 @@
                         }
                     }
-                    if (!coordinate) {
-                        if (!fields[i].isEmpty()) {
-                            for (Node n : nodes.values()) {
-                                n.put(header[i], fields[i]);
-                            }
+                    if (!coordinate && !fields[i].isEmpty()) {
+                        for (Node n : nodes.values()) {
+                            n.put(header[i], fields[i]);
                         }
                     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsReader.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsReader.java	(revision 36173)
@@ -22,5 +22,4 @@
 public class XlsReader extends SpreadSheetReader {
 
-    private Workbook wb;
     private Sheet sheet;
     private int rowIndex;
@@ -39,5 +38,5 @@
         Logging.info("Parsing XLS file");
         try {
-            wb = new HSSFWorkbook(new POIFSFileSystem(in));
+            Workbook wb = new HSSFWorkbook(new POIFSFileSystem(in));
             sheet = wb.getSheetAt(getSheetNumber());
             rowIndex = 0;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 36173)
@@ -6,4 +6,5 @@
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -120,8 +121,5 @@
     @Override
     public Action[] getMenuEntries() {
-        List<Action> result = new ArrayList<>();
-        for (Action entry : super.getMenuEntries()) {
-            result.add(entry);
-        }
+        List<Action> result = new ArrayList<>(Arrays.asList(super.getMenuEntries()));
         if (this.handler != null) {
             if (this.handler.getWikiURL() != null || this.handler.getLocalPortalURL() != null || this.handler.getNationalPortalURL() != null) {
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/License.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/License.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/License.java	(revision 36173)
@@ -5,5 +5,4 @@
 import java.net.URL;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
@@ -25,7 +24,7 @@
         // Find URL for current language
         String lang = OdUtils.getJosmLanguage();
-        for (String l : map.keySet()) {
-            if (lang.startsWith(l)) {
-                return map.get(l);
+        for (Map.Entry<String, URL> entry : map.entrySet()) {
+            if (lang.startsWith(entry.getKey())) {
+                return entry.getValue();
             }
         }
@@ -36,10 +35,7 @@
         }
         // If not found, return first non-null url
-        if (map.keySet().size() > 0) {
-            for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) {
-                url = map.get(it.next());
-                if (url != null) {
-                    return url;
-                }
+        if (!map.keySet().isEmpty()) {
+            for (URL entryUrl : map.values()) {
+                return entryUrl;
             }
         }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 36173)
@@ -7,6 +7,6 @@
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 
 import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
@@ -18,13 +18,16 @@
 import org.openstreetmap.josm.tools.Logging;
 
+/**
+ * A common {@link Module} base implementation
+ */
 public abstract class AbstractModule implements Module {
 
     protected final List<Class<? extends AbstractDataSetHandler>> handlers = new ArrayList<>();
 
-    private final List<AbstractDataSetHandler> instanciatedHandlers = new ArrayList<>();
+    private final List<AbstractDataSetHandler> instantiatedHandlers = new ArrayList<>();
 
     protected final ModuleInformation info;
 
-    public AbstractModule(ModuleInformation info) {
+    protected AbstractModule(ModuleInformation info) {
         this.info = info;
     }
@@ -48,5 +51,5 @@
     public SourceProvider getMapPaintStyleSourceProvider() {
         final List<SourceEntry> sources = new ArrayList<>();
-        for (AbstractDataSetHandler handler : getInstanciatedHandlers()) {
+        for (AbstractDataSetHandler handler : getInstantiatedHandlers()) {
             ExtendedSourceEntry src;
             if (handler != null && (src = handler.getMapPaintStyle()) != null) {
@@ -56,9 +59,10 @@
                         + src.url.replace(OdConstants.PROTO_RSRC, "").replace('/', File.separatorChar);
 
-                int n = 0;
+                int n;
                 byte[] buffer = new byte[4096];
                 try (InputStream in = getClass().getResourceAsStream(
                         src.url.substring(OdConstants.PROTO_RSRC.length()-1));
                      FileOutputStream out = new FileOutputStream(path)) {
+                    Objects.requireNonNull(in);
                     String dir = path.substring(0, path.lastIndexOf(File.separatorChar));
                     if (new File(dir).mkdirs() && Logging.isDebugEnabled()) {
@@ -72,14 +76,9 @@
                     sources.add(src);
                 } catch (IOException e) {
-                    Logging.error(e.getMessage());
+                    Logging.error(e);
                 }
             }
         }
-        return sources.isEmpty() ? null : new SourceProvider() {
-            @Override
-            public Collection<SourceEntry> getSources() {
-                return sources;
-            }
-        };
+        return sources.isEmpty() ? null : () -> sources;
     }
 
@@ -87,15 +86,10 @@
     public SourceProvider getPresetSourceProvider() {
         final List<SourceEntry> sources = new ArrayList<>();
-        for (AbstractDataSetHandler handler : getInstanciatedHandlers()) {
+        for (AbstractDataSetHandler handler : getInstantiatedHandlers()) {
             if (handler != null && handler.getTaggingPreset() != null) {
                 sources.add(handler.getTaggingPreset());
             }
         }
-        return sources.isEmpty() ? null : new SourceProvider() {
-            @Override
-            public Collection<SourceEntry> getSources() {
-                return sources;
-            }
-        };
+        return sources.isEmpty() ? null : () -> sources;
     }
 
@@ -115,9 +109,9 @@
     }
 
-    private List<AbstractDataSetHandler> getInstanciatedHandlers() {
-        if (instanciatedHandlers.isEmpty()) {
-            instanciatedHandlers.addAll(getNewlyInstanciatedHandlers());
+    private List<AbstractDataSetHandler> getInstantiatedHandlers() {
+        if (instantiatedHandlers.isEmpty()) {
+            instantiatedHandlers.addAll(getNewlyInstanciatedHandlers());
         }
-        return instanciatedHandlers;
+        return instantiatedHandlers;
     }
 }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleDownloadTask.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleDownloadTask.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleDownloadTask.java	(revision 36173)
@@ -37,5 +37,4 @@
     private final Collection<ModuleInformation> failed = new LinkedList<>();
     private final Collection<ModuleInformation> downloaded = new LinkedList<>();
-    //private Exception lastException;
     private boolean canceled;
     private HttpURLConnection downloadConnection;
@@ -134,10 +133,7 @@
     @Override protected void realRun() throws SAXException, IOException {
         File moduleDir = OdPlugin.getInstance().getModulesDirectory();
-        if (!moduleDir.exists()) {
-            if (!moduleDir.mkdirs()) {
-                //lastException = new ModuleDownloadException(tr("Failed to create module directory ''{0}''", moduleDir.toString()));
-                failed.addAll(toUpdate);
-                return;
-            }
+        if (!moduleDir.exists() && !moduleDir.mkdirs()) {
+            failed.addAll(toUpdate);
+            return;
         }
         getProgressMonitor().setTicksCount(toUpdate.size());
@@ -150,5 +146,5 @@
                 download(d, moduleFile);
             } catch (ModuleDownloadException e) {
-                e.printStackTrace();
+                Logging.error(e);
                 failed.add(d);
                 continue;
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java	(revision 36173)
@@ -11,5 +11,4 @@
 import java.awt.Insets;
 import java.io.File;
-import java.io.FilenameFilter;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -23,4 +22,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -76,4 +76,5 @@
             sources.add(ModuleHandler.class.getClassLoader());
         } catch (SecurityException ex) {
+            Logging.trace(ex);
             sources.add(ImageProvider.class.getClassLoader());
         }
@@ -103,5 +104,5 @@
         long tim = System.currentTimeMillis();
         long last = Config.getPref().getLong("opendata.modulemanager.lastupdate", 0);
-        Integer maxTime = Config.getPref().getInt("opendata.modulemanager.time-based-update.interval", 60);
+        int maxTime = Config.getPref().getInt("opendata.modulemanager.time-based-update.interval", 60);
         long d = (tim - last) / (24 * 60 * 60 * 1000L);
         if ((last <= 0) || (maxTime <= 0)) {
@@ -138,6 +139,6 @@
         //
         String policy = Config.getPref().get(togglePreferenceKey, "ask");
-        policy = policy.trim().toLowerCase();
-        if (policy.equals("never")) {
+        policy = policy.trim().toLowerCase(Locale.ROOT);
+        if ("never".equals(policy)) {
             if ("opendata.modulemanager.time-based-update.policy".equals(togglePreferenceKey)) {
                 Logging.info(tr("Skipping module update after elapsed update interval. Automatic update at startup is disabled."));
@@ -146,5 +147,5 @@
         }
 
-        if (policy.equals("always")) {
+        if ("always".equals(policy)) {
             if ("opendata.modulemanager.time-based-update.policy".equals(togglePreferenceKey)) {
                 Logging.info(tr("Running module update after elapsed update interval. Automatic update at startup is disabled."));
@@ -153,5 +154,5 @@
         }
 
-        if (!policy.equals("ask")) {
+        if (!"ask".equals(policy)) {
             Logging.warn(tr("Unexpected value ''{0}'' for preference ''{1}''. Assuming value ''ask''.", policy, togglePreferenceKey));
         }
@@ -252,11 +253,9 @@
             msg = null;
         } catch (ModuleException e) {
-            e.printStackTrace();
+            Logging.debug(e);
             if (e.getCause() instanceof ClassNotFoundException) {
                 msg = tr("<html>Could not load module {0} because the module<br>main class ''{1}'' was not found.<br>"
                         + "Delete from preferences?</html>", module.name, module.className);
             }
-        } catch (Exception e) {
-            Logging.error(e);
         }
         if (msg != null && confirmDisableModule(parent, msg, module.name)) {
@@ -307,5 +306,5 @@
      *
      * @param monitor the progress monitor. Defaults to {@link NullProgressMonitor#INSTANCE} if null.
-     * @return the list of locally available module information
+     * @return the map of locally available module information
      *
      */
@@ -320,7 +319,11 @@
             try {
                 future.get();
-            } catch (ExecutionException | InterruptedException e) {
+            } catch (ExecutionException e) {
                 Logging.error(e);
-                return null;
+                return Collections.emptyMap();
+            } catch (InterruptedException e) {
+                Logging.error(e);
+                Thread.currentThread().interrupt();
+                return Collections.emptyMap();
             }
             HashMap<String, ModuleInformation> ret = new HashMap<>();
@@ -363,9 +366,8 @@
      *
      * @param parent parent component
-     * @return the set of modules to load (as set of module names)
+     * @return the list of modules to load (as set of module names)
      */
     public static List<ModuleInformation> buildListOfModulesToLoad(Component parent) {
-        Set<String> modules = new HashSet<>();
-        modules.addAll(Config.getPref().getList(OdConstants.PREF_MODULES, new LinkedList<String>()));
+        Set<String> modules = new HashSet<>(Config.getPref().getList(OdConstants.PREF_MODULES, new LinkedList<>()));
         if (System.getProperty("josm."+OdConstants.PREF_MODULES) != null) {
             modules.addAll(Arrays.asList(System.getProperty("josm."+OdConstants.PREF_MODULES).split(",")));
@@ -387,5 +389,5 @@
 
     private static void alertFailedModuleUpdate(Component parent, Collection<ModuleInformation> modules) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder(150);
         sb.append("<html>");
         sb.append(trn(
@@ -447,9 +449,11 @@
             } catch (ExecutionException e) {
                 Logging.warn(tr("Warning: failed to download module information list"));
-                e.printStackTrace();
+                Logging.debug(e);
                 // don't abort in case of error, continue with downloading modules below
             } catch (InterruptedException e) {
                 Logging.warn(tr("Warning: failed to download module information list"));
-                e.printStackTrace();
+                Logging.debug(e);
+                Thread.currentThread().interrupt();
+                return Collections.emptyList();
                 // don't abort in case of error, continue with downloading modules below
             }
@@ -477,10 +481,11 @@
                     future.get();
                 } catch (ExecutionException e) {
-                    e.printStackTrace();
+                    Logging.debug(e);
                     alertFailedModuleUpdate(parent, modulesToUpdate);
                     return modules;
                 } catch (InterruptedException e) {
-                    e.printStackTrace();
+                    Logging.debug(e);
                     alertFailedModuleUpdate(parent, modulesToUpdate);
+                    Thread.currentThread().interrupt();
                     return modules;
                 }
@@ -540,46 +545,42 @@
      * Installs downloaded modules. Moves files with the suffix ".jar.new" to the corresponding
      * ".jar" files.
-     *
-     * If {@code dowarn} is true, this methods emits warning messages on the console if a downloaded
-     * but not yet installed module .jar can't be be installed. If {@code dowarn} is false, the
-     * installation of the respective module is sillently skipped.
-     *
-     * @param dowarn if true, warning messages are displayed; false otherwise
-     */
-    public static void installDownloadedModules(boolean dowarn) {
+     * <p>
+     * If {@code doWarn} is true, this method emits warning messages on the console if a downloaded
+     * but not yet installed module .jar can't be installed. If {@code doWarn} is false, the
+     * installation of the respective module is silently skipped.
+     *
+     * @param doWarn if true, warning messages are displayed; false otherwise
+     */
+    public static void installDownloadedModules(boolean doWarn) {
         File moduleDir = OdPlugin.getInstance().getModulesDirectory();
         if (!moduleDir.exists() || !moduleDir.isDirectory() || !moduleDir.canWrite())
             return;
 
-        final File[] files = moduleDir.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return name.endsWith(".jar.new");
-            } });
-
-        for (File updatedModule : files) {
-            final String filePath = updatedModule.getPath();
-            File module = new File(filePath.substring(0, filePath.length() - 4));
-            String moduleName = updatedModule.getName().substring(0, updatedModule.getName().length() - 8);
-            // CHECKSTYLE.OFF: LineLength
-            if (module.exists()) {
-                if (!module.delete() && dowarn) {
+        final File[] files = moduleDir.listFiles((dir, name) -> name.endsWith(".jar.new"));
+
+        if (files != null) {
+            for (File updatedModule : files) {
+                final String filePath = updatedModule.getPath();
+                File module = new File(filePath.substring(0, filePath.length() - 4));
+                String moduleName = updatedModule.getName().substring(0, updatedModule.getName().length() - 8);
+                if (module.exists() && !module.delete() && doWarn) {
                     Logging.warn(tr("Warning: failed to delete outdated module ''{0}''.", module.toString()));
-                    Logging.warn(tr("Warning: failed to install already downloaded module ''{0}''. Skipping installation. JOSM is still going to load the old module version.", moduleName));
+                    Logging.warn(tr("Warning: failed to install already downloaded module ''{0}''. Skipping installation." +
+                            "JOSM is still going to load the old module version.", moduleName));
                     continue;
                 }
-            }
-            if (!updatedModule.renameTo(module) && dowarn) {
-                Logging.warn(tr("Warning: failed to install module ''{0}'' from temporary download file ''{1}''. Renaming failed.", module.toString(), updatedModule.toString()));
-                Logging.warn(tr("Warning: failed to install already downloaded module ''{0}''. Skipping installation. JOSM is still going to load the old module version.", moduleName));
-            }
-            // CHECKSTYLE.ON: LineLength
-        }
-        return;
+                if (!updatedModule.renameTo(module) && doWarn) {
+                    Logging.warn(tr("Warning: failed to install module ''{0}'' from temporary download file ''{1}''. Renaming failed.",
+                            module.toString(), updatedModule.toString()));
+                    Logging.warn(tr("Warning: failed to install already downloaded module ''{0}''. Skipping installation." +
+                            "JOSM is still going to load the old module version.", moduleName));
+                }
+            }
+        }
     }
 
     private static class UpdateModulesMessagePanel extends JPanel {
         private JMultilineLabel lblMessage;
-        private JCheckBox cbDontShowAgain;
+        private JCheckBox cbDoNotShowAgain;
 
         protected void build() {
@@ -591,5 +592,6 @@
             gc.weighty = 1.0;
             gc.insets = new Insets(5, 5, 5, 5);
-            add(lblMessage = new JMultilineLabel(""), gc);
+            lblMessage = new JMultilineLabel("");
+            add(lblMessage, gc);
             lblMessage.setFont(lblMessage.getFont().deriveFont(Font.PLAIN));
 
@@ -597,7 +599,8 @@
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weighty = 0.0;
-            add(cbDontShowAgain = new JCheckBox(
-                    tr("Do not ask again and remember my decision (go to Preferences->Modules to change it later)")), gc);
-            cbDontShowAgain.setFont(cbDontShowAgain.getFont().deriveFont(Font.PLAIN));
+            cbDoNotShowAgain = new JCheckBox(
+                    tr("Do not ask again and remember my decision (go to Preferences->Modules to change it later)"));
+            add(cbDoNotShowAgain, gc);
+            cbDoNotShowAgain.setFont(cbDoNotShowAgain.getFont().deriveFont(Font.PLAIN));
         }
 
@@ -612,10 +615,10 @@
         public void initDontShowAgain(String preferencesKey) {
             String policy = Config.getPref().get(preferencesKey, "ask");
-            policy = policy.trim().toLowerCase();
-            cbDontShowAgain.setSelected(!policy.equals("ask"));
+            policy = policy.trim().toLowerCase(Locale.ROOT);
+            cbDoNotShowAgain.setSelected(!"ask".equals(policy));
         }
 
         public boolean isRememberDecision() {
-            return cbDontShowAgain.isSelected();
+            return cbDoNotShowAgain.isSelected();
         }
     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java	(revision 36173)
@@ -10,4 +10,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -16,4 +17,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.TreeMap;
@@ -38,13 +40,13 @@
  */
 public class ModuleInformation {
-    public File file = null;
-    public String name = null;
-    public String className = null;
-    public String link = null;
-    public String description = null;
-    public String author = null;
-    public String version = null;
-    public String localversion = null;
-    public String downloadlink = null;
+    public File file;
+    public String name;
+    public String className;
+    public String link;
+    public String description;
+    public String author;
+    public String version;
+    public String localversion;
+    public String downloadlink;
     public String iconPath;
     public ImageIcon icon;
@@ -52,5 +54,5 @@
     public final Map<String, String> attr = new TreeMap<>();
 
-    /**
+    /*
      * Creates a module information object by reading the module information from
      * the manifest in the module jar.
@@ -78,5 +80,5 @@
         try (
             FileInputStream fis = new FileInputStream(file);
-            JarInputStream jar = new JarInputStream(fis);
+            JarInputStream jar = new JarInputStream(fis)
         ) {
             Manifest manifest = jar.getManifest();
@@ -139,12 +141,11 @@
     }
 
-    @SuppressWarnings("unused")
     private void scanManifest(Manifest manifest) {
         String lang = LanguageInfo.getLanguageCodeManifest();
-        Attributes attr = manifest.getMainAttributes();
-        className = attr.getValue("Module-Class");
-        String s = attr.getValue(lang+"Module-Link");
+        Attributes manifestMainAttributes = manifest.getMainAttributes();
+        className = manifestMainAttributes.getValue("Module-Class");
+        String s = manifestMainAttributes.getValue(lang+"Module-Link");
         if (s == null) {
-            s = attr.getValue("Module-Link");
+            s = manifestMainAttributes.getValue("Module-Link");
         }
         if (s != null) {
@@ -157,7 +158,7 @@
         }
         link = s;
-        s = attr.getValue(lang+"Module-Description");
+        s = manifestMainAttributes.getValue(lang+"Module-Description");
         if (s == null) {
-            s = attr.getValue("Module-Description");
+            s = manifestMainAttributes.getValue("Module-Description");
             if (s != null) {
                 s = tr(s);
@@ -165,7 +166,7 @@
         }
         description = s;
-        version = attr.getValue("Module-Version");
-        author = attr.getValue("Author");
-        iconPath = attr.getValue("Module-Icon");
+        version = manifestMainAttributes.getValue("Module-Version");
+        author = manifestMainAttributes.getValue("Author");
+        iconPath = manifestMainAttributes.getValue("Module-Icon");
         if (iconPath != null && file != null) {
             // extract icon from the module jar file
@@ -180,5 +181,5 @@
         }
 
-        String classPath = attr.getValue(Attributes.Name.CLASS_PATH);
+        String classPath = manifestMainAttributes.getValue(Attributes.Name.CLASS_PATH);
         if (classPath != null) {
             for (String entry : classPath.split(" ")) {
@@ -193,6 +194,6 @@
             }
         }
-        for (Object o : attr.keySet()) {
-            this.attr.put(o.toString(), attr.getValue(o.toString()));
+        for (Object o : manifestMainAttributes.keySet()) {
+            this.attr.put(o.toString(), manifestMainAttributes.getValue(o.toString()));
         }
     }
@@ -205,5 +206,5 @@
      */
     public String getDescriptionAsHtml() {
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(32);
         sb.append("<html><body>");
         sb.append(description == null ? tr("no description available") : description);
@@ -212,5 +213,5 @@
         }
         if (downloadlink != null && !downloadlink.startsWith(OdConstants.OSM_SITE+"dist/")) {
-            sb.append("<p>&nbsp;</p><p>"+tr("<b>Module provided by an external source:</b> {0}", downloadlink)+"</p>");
+            sb.append("<p>&nbsp;</p><p>").append(tr("<b>Module provided by an external source:</b> {0}", downloadlink)).append("</p>");
         }
         sb.append("</body></html>");
@@ -228,5 +229,5 @@
         try {
             return klass.getConstructor(ModuleInformation.class).newInstance(this);
-        } catch (Exception t) {
+        } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException t) {
             throw new ModuleException(name, t);
         }
@@ -246,5 +247,5 @@
         try {
             return (Class<? extends Module>) Class.forName(className, true, classLoader);
-        } catch (Exception t) {
+        } catch (ClassNotFoundException t) {
             throw new ModuleException(name, t);
         }
@@ -282,11 +283,9 @@
         if (this.version == null && referenceVersion != null)
             return true;
-        if (this.version != null && !this.version.equals(referenceVersion))
-            return true;
-        return false;
-    }
-
-    /**
-     * Replies true if this this module should be updated/downloaded because either
+        return this.version != null && !this.version.equals(referenceVersion);
+    }
+
+    /**
+     * Replies true if this module should be updated/downloaded because either
      * it is not available locally (its local version is null) or its local version is
      * older than the available version on the server.
@@ -303,5 +302,5 @@
         if (filter == null) return true;
         if (value == null) return false;
-        return value.toLowerCase().contains(filter.toLowerCase());
+        return value.toLowerCase(Locale.ROOT).contains(filter.toLowerCase(Locale.ROOT));
     }
 
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleListParser.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleListParser.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleListParser.java	(revision 36173)
@@ -9,5 +9,5 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
 import java.util.LinkedList;
 import java.util.List;
@@ -15,5 +15,5 @@
 /**
  * A parser for the module list provided by an opendata Module Download Site.
- *
+ * <p>
  * See <a href="https://svn.openstreetmap.org/applications/editors/josm/plugins/opendata/modules.txt">OSM SVN</a>
  * for a sample of the document. The format is a custom format, kind of mix of CSV and RFC822 style
@@ -35,10 +35,8 @@
         try {
             return new ModuleInformation(
-                    new ByteArrayInputStream(manifest.getBytes("utf-8")),
+                    new ByteArrayInputStream(manifest.getBytes(StandardCharsets.UTF_8)),
                     name.substring(0, name.length() - 4),
                     url
                     );
-        } catch (UnsupportedEncodingException e) {
-            throw new ModuleListParseException(tr("Failed to create module information from manifest for module ''{0}''", name), e);
         } catch (ModuleException e) {
             throw new ModuleListParseException(tr("Failed to create module information from manifest for module ''{0}''", name), e);
@@ -48,5 +46,5 @@
     /**
      * Parses a module information document and replies a list of module information objects.
-     *
+     * <p>
      * See <a href="https://svn.openstreetmap.org/applications/editors/josm/plugins/opendata/modules.txt">OSM SVN</a>
      * for a sample of the document. The format is a custom format, kind of mix of CSV and RFC822 style
@@ -59,7 +57,7 @@
     public List<ModuleInformation> parse(InputStream in) throws ModuleListParseException {
         List<ModuleInformation> ret = new LinkedList<>();
-        BufferedReader r = null;
+        BufferedReader r;
         try {
-            r = new BufferedReader(new InputStreamReader(in, "utf-8"));
+            r = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
             String name = null;
             String url = null;
@@ -78,5 +76,5 @@
                     line = line.substring(1);
                     if (line.length() > 70) {
-                        manifest.append(line.substring(0, 70)).append("\n");
+                        manifest.append(line, 0, 70).append("\n");
                         line = " " + line.substring(70);
                     }
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadLocalModuleInformationTask.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadLocalModuleInformationTask.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadLocalModuleInformationTask.java	(revision 36173)
@@ -6,5 +6,4 @@
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -25,5 +24,5 @@
  * This is an asynchronous task for reading module information from the files
  * in the local module repositories.
- *
+ * <p>
  * It scans the files in the local modules repository (see {@link OdPlugin#getModulesDirectory()}
  * and extracts module information from three kind of files:
@@ -36,5 +35,5 @@
  */
 public class ReadLocalModuleInformationTask extends PleaseWaitRunnable {
-    private Map<String, ModuleInformation> availableModules;
+    private final Map<String, ModuleInformation> availableModules;
     private boolean canceled;
 
@@ -78,11 +77,6 @@
     protected void scanSiteCacheFiles(ProgressMonitor monitor, File modulesDirectory) {
         File[] siteCacheFiles = modulesDirectory.listFiles(
-                new FilenameFilter() {
-                    @Override
-                    public boolean accept(File dir, String name) {
-                        return name.matches("^([0-9]+-)?site.*\\.txt$");
-                    }
-                }
-                );
+                (dir, name) -> name.matches("^([0-9]+-)?site.*\\.txt$")
+        );
         if (siteCacheFiles == null || siteCacheFiles.length == 0)
             return;
@@ -96,5 +90,5 @@
             } catch (ModuleListParseException e) {
                 Logging.warn(tr("Warning: Failed to scan file ''{0}'' for module information. Skipping.", fname));
-                e.printStackTrace();
+                Logging.debug(e);
             }
             monitor.worked(1);
@@ -104,11 +98,6 @@
     protected void scanIconCacheFiles(ProgressMonitor monitor, File modulesDirectory) {
         File[] siteCacheFiles = modulesDirectory.listFiles(
-                new FilenameFilter() {
-                    @Override
-                    public boolean accept(File dir, String name) {
-                        return name.matches("^([0-9]+-)?site.*modules-icons\\.zip$");
-                    }
-                }
-                );
+                (dir, name) -> name.matches("^([0-9]+-)?site.*modules-icons\\.zip$")
+        );
         if (siteCacheFiles == null || siteCacheFiles.length == 0)
             return;
@@ -133,11 +122,6 @@
     protected void scanModuleFiles(ProgressMonitor monitor, File modulesDirectory) {
         File[] moduleFiles = modulesDirectory.listFiles(
-                new FilenameFilter() {
-                    @Override
-                    public boolean accept(File dir, String name) {
-                        return name.endsWith(".jar") || name.endsWith(".jar.new");
-                    }
-                }
-                );
+                (dir, name) -> name.endsWith(".jar") || name.endsWith(".jar.new")
+        );
         if (moduleFiles == null || moduleFiles.length == 0)
             return;
@@ -157,5 +141,5 @@
             } catch (ModuleException e) {
                 Logging.warn(tr("Warning: Failed to scan file ''{0}'' for module information. Skipping.", fname));
-                e.printStackTrace();
+                Logging.debug(e);
             }
             monitor.worked(1);
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java	(revision 36173)
@@ -7,6 +7,4 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
@@ -15,8 +13,9 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.Arrays;
 import java.util.Collection;
@@ -157,5 +156,5 @@
                 connection.setRequestProperty("Accept-Charset", "utf-8");
             }
-            try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
+            try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
                 String line;
                 while ((line = in.readLine()) != null) {
@@ -164,11 +163,7 @@
                 return sb.toString();
             }
-        } catch (MalformedURLException e) {
-            if (canceled) return null;
-            e.printStackTrace();
-            return null;
         } catch (IOException e) {
             if (canceled) return null;
-            e.printStackTrace();
+            Logging.debug(e);
             return null;
         } finally {
@@ -205,5 +200,5 @@
             try (
                     InputStream in = connection.getInputStream();
-                    OutputStream out = new FileOutputStream(destFile)
+                    OutputStream out = Files.newOutputStream(destFile.toPath())
                     ) {
                 byte[] buffer = new byte[8192];
@@ -212,11 +207,7 @@
                 }
             }
-        } catch (MalformedURLException e) {
-            if (canceled) return;
-            e.printStackTrace();
-            return;
         } catch (IOException e) {
             if (canceled) return;
-            e.printStackTrace();
+            Logging.debug(e);
             return;
         } finally {
@@ -249,13 +240,12 @@
         try {
             File moduleDir = OdPlugin.getInstance().getModulesDirectory();
-            if (!moduleDir.exists()) {
-                if (!moduleDir.mkdirs()) {
-                    Logging.warn(tr("Warning: failed to create module directory ''{0}''. Cannot cache module list from module site ''{1}''.",
-                            moduleDir.toString(), site));
-                }
+            if (!moduleDir.exists() && !moduleDir.mkdirs()) {
+                Logging.warn(tr("Warning: failed to create module directory ''{0}''. Cannot cache module list from module site ''{1}''.",
+                        moduleDir.toString(), site));
             }
             File cacheFile = createSiteCacheFile(moduleDir, site, CacheType.PLUGIN_LIST);
             getProgressMonitor().subTask(tr("Writing module list to local cache ''{0}''", cacheFile.toString()));
-            try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(cacheFile), "utf-8"))) {
+            try (OutputStream fileOutputStream = Files.newOutputStream(cacheFile.toPath());
+                 PrintWriter writer = new PrintWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8))) {
                 writer.write(list);
             }
@@ -275,12 +265,9 @@
         try {
             getProgressMonitor().subTask(tr("Parsing module list from site ''{0}''", site));
-            InputStream in = new ByteArrayInputStream(doc.getBytes("UTF-8"));
+            InputStream in = new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8));
             availableModules.addAll(new ModuleListParser().parse(in));
-        } catch (UnsupportedEncodingException e) {
-            Logging.error(tr("Failed to parse module list document from site ''{0}''. Skipping site. Exception was: {1}", site, e.toString()));
-            e.printStackTrace();
         } catch (ModuleListParseException e) {
             Logging.error(tr("Failed to parse module list document from site ''{0}''. Skipping site. Exception was: {1}", site, e.toString()));
-            e.printStackTrace();
+            Logging.debug(e);
         }
     }
@@ -296,12 +283,7 @@
         for (String location : ModuleInformation.getModuleLocations()) {
             File[] f = new File(location).listFiles(
-                    new FilenameFilter() {
-                        @Override
-                        public boolean accept(File dir, String name) {
-                            return name.matches("^([0-9]+-)?site.*\\.txt$") ||
-                                    name.matches("^([0-9]+-)?site.*-icons\\.zip$");
-                        }
-                    }
-                    );
+                    (dir, name) -> name.matches("^([0-9]+-)?site.*\\.txt$") ||
+                            name.matches("^([0-9]+-)?site.*-icons\\.zip$")
+            );
             if (f != null && f.length > 0) {
                 siteCacheFiles.addAll(Arrays.asList(f));
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java	(revision 36173)
@@ -5,7 +5,9 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
@@ -21,15 +23,15 @@
 public abstract class NamesFrUtils {
 
-    private static Map<String, String> dictionary = initDictionary();
-
-    public static final String checkDictionary(String value) {
-        String result = "";
+    private static final Map<String, String> dictionary = initDictionary();
+
+    public static String checkDictionary(String value) {
+        StringBuilder result = new StringBuilder();
         for (String word : value.split(" ")) {
-            if (!result.isEmpty()) {
-                result += " ";
+            if (result.length() != 0) {
+                result.append(' ');
             }
-            result += dictionary.containsKey(word) ? dictionary.get(word) : word;
-        }
-        return result;
+            result.append(dictionary.getOrDefault(word, word));
+        }
+        return result.toString();
     }
 
@@ -37,5 +39,5 @@
         Map<String, String> result = new HashMap<>();
         try (BufferedReader reader = new BufferedReader(new InputStreamReader(
-                SimpleDataSetHandler.class.getResourceAsStream(OdConstants.DICTIONARY_FR), OdConstants.UTF8))) {
+                SimpleDataSetHandler.class.getResourceAsStream(OdConstants.DICTIONARY_FR), StandardCharsets.UTF_8))) {
             String line = reader.readLine(); // Skip first line
             Logging.trace(line);
@@ -50,10 +52,10 @@
     }
 
-    public static final String getStreetLabel(String label) {
+    public static String getStreetLabel(String label) {
         if (label == null) {
-            return label;
+            return null;
         } else if (label.startsWith("All")) {
             return "Allée";
-        } else if (label.equals("Autoroute")) {
+        } else if ("Autoroute".equals(label)) {
             return label;
         } else if (label.startsWith("Anc")) {
@@ -63,15 +65,15 @@
         } else if (label.startsWith("Barr")) {
             return "Barrière";
-        } else if (label.equals("Bd") || label.equals("Boulevard")) {
+        } else if ("Bd".equals(label) || "Boulevard".equals(label)) {
             return "Boulevard";
         } else if (label.startsWith("Bret")) {
             return "Bretelle";
-        } else if (label.equals("Bre")) {
+        } else if ("Bre".equals(label)) {
             return "Bré";
-        } else if (label.equals("Caminot")) {
-            return label;
-        } else if (label.equals("Carrefour")) {
-            return label;
-        } else if (label.equals("Carré")) {
+        } else if ("Caminot".equals(label)) {
+            return label;
+        } else if ("Carrefour".equals(label)) {
+            return label;
+        } else if ("Carré".equals(label)) {
             return label;
         } else if (label.startsWith("Chemine")) {
@@ -81,9 +83,9 @@
         } else if (label.startsWith("Cit")) {
             return "Cité";
-        } else if (label.equals("Clos")) {
-            return label;
-        } else if (label.equals("Cote") || label.equals("Côte")) {
+        } else if ("Clos".equals(label)) {
+            return label;
+        } else if ("Cote".equals(label) || "Côte".equals(label)) {
             return "Côte";
-        } else if (label.equals("Cours")) {
+        } else if ("Cours".equals(label)) {
             return label;
         } else if (label.startsWith("Dep") || label.startsWith("Dép")) {
@@ -91,88 +93,88 @@
         } else if (label.startsWith("Dom")) {
             return "Domaine";
-        } else if (label.equals("Dsc") || label.startsWith("Desc")) {
+        } else if ("Dsc".equals(label) || label.startsWith("Desc")) {
             return "Descente";
-        } else if (label.equals("Esp") || label.startsWith("Espl")) {
+        } else if ("Esp".equals(label) || label.startsWith("Espl")) {
             return "Esplanade";
         } else if (label.startsWith("Espa")) {
             return "Espace";
-        } else if (label.equals("Giratoire")) {
-            return label;
-        } else if (label.equals("Grande-rue")) {
-            return label;
-        } else if (label.equals("Hameau")) {
-            return label;
-        } else if (label.startsWith("Imp") || label.equals("Ipasse")) {
+        } else if ("Giratoire".equals(label)) {
+            return label;
+        } else if ("Grande-rue".equals(label)) {
+            return label;
+        } else if ("Hameau".equals(label)) {
+            return label;
+        } else if (label.startsWith("Imp") || "Ipasse".equals(label)) {
             return "Impasse";
         } else if (label.startsWith("Itin")) {
             return "Itinéraire";
-        } else if (label.equals("Jardin")) {
-            return label;
-        } else if (label.startsWith("L'") || label.equals("La") || label.equals("Le") || label.equals("Les") ||
-                label.equals("Saint")) { // Lieux-dits
+        } else if ("Jardin".equals(label)) {
+            return label;
+        } else if (label.startsWith("L'") || "La".equals(label) || "Le".equals(label) || "Les".equals(label) ||
+                "Saint".equals(label)) { // Lieux-dits
             return label;
         } else if (label.startsWith("Lot")) {
             return "Lotissement";
-        } else if (label.equals("Mail")) {
-            return label;
-        } else if (label.equals("Mas")) {
+        } else if ("Mail".equals(label)) {
+            return label;
+        } else if ("Mas".equals(label)) {
             return label;
         } else if (label.startsWith("Nat")) {
             return "Nationale";
-        } else if (label.equals("Parc")) {
-            return label;
-        } else if (label.equals("Passerelle")) {
+        } else if ("Parc".equals(label)) {
+            return label;
+        } else if ("Passerelle".equals(label)) {
             return label;
         } else if (label.startsWith("Pas")) {
             return "Passage";
-        } else if (label.equals("Pch") || label.startsWith("Petit-chem")) {
+        } else if ("Pch".equals(label) || label.startsWith("Petit-chem")) {
             return "Petit-chemin";
-        } else if (label.equals("Petit") || label.equals("Petite")) {
-            return label;
-        } else if (label.equals("Petite-allée")) {
-            return label;
-        } else if (label.equals("Petite-rue")) {
-            return label;
-        } else if (label.equals("Plan")) {
+        } else if ("Petit".equals(label) || "Petite".equals(label)) {
+            return label;
+        } else if ("Petite-allée".equals(label)) {
+            return label;
+        } else if ("Petite-rue".equals(label)) {
+            return label;
+        } else if ("Plan".equals(label)) {
             return label;
         } else if (label.startsWith("Pl")) {
             return "Place";
-        } else if (label.equals("Pont")) {
-            return label;
-        } else if (label.equals("Port")) {
-            return label;
-        } else if (label.equals("Porte")) {
+        } else if ("Pont".equals(label)) {
+            return label;
+        } else if ("Port".equals(label)) {
+            return label;
+        } else if ("Porte".equals(label)) {
             return label;
         } else if (label.startsWith("Prom")) {
             return "Promenade";
-        } else if (label.equals("Prv") || label.startsWith("Parv")) {
+        } else if ("Prv".equals(label) || label.startsWith("Parv")) {
             return "Parvis";
         } else if (label.startsWith("Qu")) {
             return "Quai";
-        } else if (label.equals("Rampe")) {
+        } else if ("Rampe".equals(label)) {
             return label;
         } else if (label.startsWith("Res") || label.startsWith("Rés")) {
             return "Résidence";
-        } else if (label.equals("Rocade")) {
-            return label;
-        } else if (label.equals("Rpt") || label.startsWith("Ron")) {
+        } else if ("Rocade".equals(label)) {
+            return label;
+        } else if ("Rpt".equals(label) || label.startsWith("Ron")) {
             return "Rond-Point";
-        } else if (label.equals("Rte") || label.equals("Route")) {
+        } else if ("Rte".equals(label) || "Route".equals(label)) {
             return "Route";
-        } else if (label.equals("Rue") || label.equals("Rued")) {
+        } else if ("Rue".equals(label) || "Rued".equals(label)) {
             return "Rue";
-        } else if (label.equals("Sentier")) {
+        } else if ("Sentier".equals(label)) {
             return label;
         } else if (label.startsWith("Sq")) {
             return "Square";
-        } else if (label.equals("Théâtre")) {
+        } else if ("Théâtre".equals(label)) {
             return "Théâtre";
         } else if (label.startsWith("Tra")) {
             return "Traverse";
-        } else if (label.equals("Vieux")) {
-            return label;
-        } else if (label.equals("Voie")) {
-            return label;
-        } else if (label.equals("Zone")) {
+        } else if ("Vieux".equals(label)) {
+            return label;
+        } else if ("Voie".equals(label)) {
+            return label;
+        } else if ("Zone".equals(label)) {
             return label;
         } else {
@@ -182,5 +184,5 @@
     }
 
-    public static final String checkStreetName(OsmPrimitive p, String key) {
+    public static String checkStreetName(OsmPrimitive p, String key) {
         String value = null;
         if (p != null) {
@@ -189,9 +191,9 @@
                 value = WordUtils.capitalizeFully(value);
                 // Cas particuliers
-                if (value.equals("Boulingrin")) { // square Boulingrin, mal formé
+                if ("Boulingrin".equals(value)) { // square Boulingrin, mal formé
                     value = "Sq Boulingrin";
                 } else if (value.matches("A[0-9]+")) { // Autoroutes sans le mot "Autoroute"
                     value = "Autoroute "+value;
-                } else if (value.equals("All A61")) { // A61 qualifiée d'Allée ?
+                } else if ("All A61".equals(value)) { // A61 qualifiée d'Allée ?
                     value = "Autoroute A61";
                 } else if (value.startsWith("Che Vieux Che")) { // "Che" redondant
@@ -210,66 +212,67 @@
                 String[] words = value.split(" ");
                 if (words.length > 0) {
-                    value = "";
+                    final StringBuilder stringBuilder = new StringBuilder();
                     List<String> list = Arrays.asList(words);
                     words[0] = getStreetLabel(words[0]);
-                    if (words[0].equals("Ancien") && words.length > 1 && words[1].equals("Che")) {
+                    if ("Ancien".equals(words[0]) && words.length > 1 && "Che".equals(words[1])) {
                         words[1] = "Chemin";
                     }
                     for (int i = 0; i < words.length; i++) {
                         if (i > 0) {
-                            value += " ";
+                            stringBuilder.append(' ');
                             // Prénoms/Noms propres abrégés
-                            if (words[i].equals("A") && list.contains("Bernard")) {
+                            if ("A".equals(words[i]) && list.contains("Bernard")) {
                                 words[i] = "Arnaud";
-                            } else if (words[i].equals("A") && list.contains("Passerieu")) {
+                            } else if ("A".equals(words[i]) && list.contains("Passerieu")) {
                                 words[i] = "Ariste";
-                            } else if (words[i].equals("A") && list.contains("Bougainville")) {
+                            } else if ("A".equals(words[i]) && list.contains("Bougainville")) {
                                 words[i] = "Antoine";
-                            } else if (words[i].equals("Ch") && list.contains("Leconte")) {
+                            } else if ("Ch".equals(words[i]) && list.contains("Leconte")) {
                                 words[i] = "Charles";
-                            } else if (words[i].equals("Frs") && list.contains("Dugua")) {
+                            } else if ("Frs".equals(words[i]) && list.contains("Dugua")) {
                                 words[i] = "François";
-                            } else if (words[i].equals("G") && list.contains("Latecoere")) {
+                            } else if ("G".equals(words[i]) && list.contains("Latecoere")) {
                                 words[i] = "Georges";
-                            } else if (words[i].equals("H") && list.contains("Lautrec")) {
+                            } else if ("H".equals(words[i]) && list.contains("Lautrec")) {
                                 words[i] = "Henri";
-                            } else if (words[i].equals("J") && list.contains("Dieulafoy")) {
+                            } else if ("J".equals(words[i]) && list.contains("Dieulafoy")) {
                                 words[i] = "Jane";
-                            } else if (words[i].equals("J") && (list.contains("Champollion") || list.contains("Stanislas"))) {
+                            } else if ("J".equals(words[i]) && (list.contains("Champollion") || list.contains("Stanislas"))) {
                                 words[i] = "Jean";
-                            } else if (words[i].equals("L") && list.contains("Zamenhof")) {
+                            } else if ("L".equals(words[i]) && list.contains("Zamenhof")) {
                                 words[i] = "Ludwik";
-                            } else if (words[i].equals("L") && list.contains("Sacha")) {
+                            } else if ("L".equals(words[i]) && list.contains("Sacha")) {
                                 words[i] = "Lucien";
                                 if (!list.contains("Et")) {
                                     words[i] += " et";
                                 }
-                            } else if (words[i].equals("L") && (list.contains("Vauquelin") || list.contains("Bougainville"))) {
+                            } else if ("L".equals(words[i]) && (list.contains("Vauquelin") || list.contains("Bougainville"))) {
                                 words[i] = "Louis";
-                            } else if (words[i].equals("M") && list.contains("Dieulafoy")) {
+                            } else if ("M".equals(words[i]) && list.contains("Dieulafoy")) {
                                 words[i] = "Marcel";
-                            } else if (words[i].equals("M") && list.contains("Arifat")) {
+                            } else if ("M".equals(words[i]) && list.contains("Arifat")) {
                                 words[i] = "Marie";
-                            } else if (words[i].equals("N") && list.contains("Djamena")) {
+                            } else if ("N".equals(words[i]) && list.contains("Djamena")) {
                                 words[i] = "N'";
-                            } else if (words[i].equals("Oo")) {
+                            } else if ("Oo".equals(words[i])) {
                                 words[i] = "Oô";
-                            } else if (words[i].equals("Ph") && list.contains("Ravary")) {
+                            } else if ("Ph".equals(words[i]) && list.contains("Ravary")) {
                                 words[i] = "Philippe";
-                            } else if (words[i].equals("R") && list.contains("Folliot")) {
+                            } else if ("R".equals(words[i]) && list.contains("Folliot")) {
                                 words[i] = "Raphaël";
-                            } else if (words[i].equals("W") && list.contains("Booth")) {
+                            } else if ("W".equals(words[i]) && list.contains("Booth")) {
                                 words[i] = "William";
                             // Mots de liaison non couverts par le dictionnaire
-                            } else if (words[i].equals("A")) {
+                            } else if ("A".equals(words[i])) {
                                 words[i] = "à";
-                            } else if (words[i].equals("D") || words[i].equals("L")) {
-                                words[i] = words[i].toLowerCase()+"'";
-                            } else if (words[i].equals("La") || words[i].equals("Le")) {
-                                words[i] = words[i].toLowerCase();
+                            } else if ("D".equals(words[i]) || "L".equals(words[i])) {
+                                words[i] = words[i].toLowerCase(Locale.FRENCH)+"'";
+                            } else if ("La".equals(words[i]) || "Le".equals(words[i])) {
+                                words[i] = words[i].toLowerCase(Locale.FRENCH);
                             }
                         }
-                        value += words[i];
+                        stringBuilder.append(words[i]);
                     }
+                    value = stringBuilder.toString();
                 }
                 // Ponctuation
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/OdUtils.java	(revision 36173)
@@ -3,5 +3,4 @@
 
 import java.io.File;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -24,9 +23,9 @@
     private static final String TEMP_DIR_PREFIX = "josm_opendata_temp_";
 
-    public static final boolean isMultipolygon(OsmPrimitive p) {
-        return p instanceof Relation && ((Relation) p).isMultipolygon();
+    public static boolean isMultipolygon(OsmPrimitive p) {
+        return p instanceof Relation && p.isMultipolygon();
     }
 
-    public static final String[] stripQuotesAndExtraChars(String[] split, String sep) {
+    public static String[] stripQuotesAndExtraChars(String[] split, String sep) {
         List<String> result = new ArrayList<>();
         boolean append = false;
@@ -37,10 +36,10 @@
                     append = false;
                 }
-                result.set(index, result.get(index)+sep+split[i].replaceAll("\"", ""));
+                result.set(index, result.get(index)+sep+split[i].replace("\"", ""));
             } else if (split[i].startsWith("\"")) {
                 if (!(split[i].endsWith("\"") && StringUtils.countMatches(split[i], "\"") % 2 == 0)) {
                     append = true;
                 }
-                result.add(split[i].replaceAll("\"", ""));
+                result.add(split[i].replace("\"", ""));
             } else {
                 result.add(split[i]);
@@ -54,21 +53,21 @@
     }
 
-    public static final ImageIcon getImageIcon(String iconName) {
+    public static ImageIcon getImageIcon(String iconName) {
         return getImageIcon(iconName, false);
     }
 
-    public static final ImageIcon getImageIcon(String iconName, boolean optional) {
+    public static ImageIcon getImageIcon(String iconName, boolean optional) {
         return getImageProvider(iconName, optional).get();
     }
 
-    public static final ImageProvider getImageProvider(String iconName) {
+    public static ImageProvider getImageProvider(String iconName) {
         return getImageProvider(iconName, false);
     }
 
-    public static final ImageProvider getImageProvider(String iconName, boolean optional) {
+    public static ImageProvider getImageProvider(String iconName, boolean optional) {
         return new ImageProvider(iconName).setOptional(optional);
     }
 
-    public static final String getJosmLanguage() {
+    public static String getJosmLanguage() {
         String lang = Config.getPref().get("language");
         if (lang == null || lang.isEmpty()) {
@@ -78,17 +77,17 @@
     }
 
-    public static final double convertMinuteSecond(double minute, double second) {
+    public static double convertMinuteSecond(double minute, double second) {
         return (minute/60.0) + (second/3600.0);
     }
 
-    public static final double convertDegreeMinuteSecond(double degree, double minute, double second) {
+    public static double convertDegreeMinuteSecond(double degree, double minute, double second) {
         return degree + convertMinuteSecond(minute, second);
     }
 
-    public static final File createTempDir() throws IOException {
+    public static File createTempDir() throws IOException {
         return Files.createTempDirectory(TEMP_DIR_PREFIX).toFile();
     }
 
-    public static final void deleteDir(File dir) {
+    public static void deleteDir(File dir) {
         for (File file : dir.listFiles()) {
             if (!file.delete()) {
@@ -101,13 +100,8 @@
     }
 
-    public static final void deletePreviousTempDirs() {
+    public static void deletePreviousTempDirs() {
         File tmpDir = new File(System.getProperty("java.io.tmpdir"));
         if (tmpDir.exists() && tmpDir.isDirectory()) {
-            for (File dir : tmpDir.listFiles(new FilenameFilter() {
-                @Override
-                public boolean accept(File dir, String name) {
-                    return name.startsWith(TEMP_DIR_PREFIX);
-                }
-            })) {
+            for (File dir : tmpDir.listFiles((dir, name) -> name.startsWith(TEMP_DIR_PREFIX))) {
                 deleteDir(dir);
             }
Index: /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java
===================================================================
--- /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java	(revision 36172)
+++ /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java	(revision 36173)
@@ -47,5 +47,5 @@
         File file = new File(TestUtils.getRegressionDataFile(9592, "bg.mif"));
         try (InputStream is = new FileInputStream(file)) {
-            NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, newHandler("EPSG:32635"), null));
+            NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, newHandler("EPSG:32635")));
         }
     }
