Index: /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 13992)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 13993)
@@ -84,4 +84,6 @@
     /** All manifest attributes. */
     public final Map<String, String> attr = new TreeMap<>();
+    /** Invalid manifest entries */
+    final List<String> invalidManifestEntries = new ArrayList<>();
     /** Empty icon for these plugins which have none */
     private static final ImageIcon emptyIcon = ImageProvider.getEmpty(ImageProvider.ImageSizes.LARGEICON);
@@ -175,4 +177,6 @@
         this.attr.clear();
         this.attr.putAll(other.attr);
+        this.invalidManifestEntries.clear();
+        this.invalidManifestEntries.addAll(other.invalidManifestEntries);
     }
 
@@ -248,23 +252,23 @@
         }
         canloadatruntime = Boolean.parseBoolean(attr.getValue("Plugin-Canloadatruntime"));
-        if (oldcheck && mainversion > Version.getInstance().getVersion()) {
-            int myv = Version.getInstance().getVersion();
-            for (Map.Entry<Object, Object> entry : attr.entrySet()) {
+        int myv = Version.getInstance().getVersion();
+        for (Map.Entry<Object, Object> entry : attr.entrySet()) {
+            String key = ((Attributes.Name) entry.getKey()).toString();
+            if (key.endsWith("_Plugin-Url")) {
                 try {
-                    String key = ((Attributes.Name) entry.getKey()).toString();
-                    if (key.endsWith("_Plugin-Url")) {
-                        int mv = Integer.parseInt(key.substring(0, key.length()-11));
-                        if (mv <= myv && (mv > mainversion || mainversion > myv)) {
-                            String v = (String) entry.getValue();
-                            int i = v.indexOf(';');
-                            if (i > 0) {
-                                downloadlink = v.substring(i+1);
-                                mainversion = mv;
-                                version = v.substring(0, i);
-                                oldmode = true;
-                            }
-                        }
+                    int mv = Integer.parseInt(key.substring(0, key.length()-11));
+                    String v = (String) entry.getValue();
+                    int i = v.indexOf(';');
+                    if (i <= 0) {
+                        invalidManifestEntries.add(key);
+                    } else if (oldcheck && mainversion > Version.getInstance().getVersion() &&
+                        mv <= myv && (mv > mainversion || mainversion > myv)) {
+                        downloadlink = v.substring(i+1);
+                        mainversion = mv;
+                        version = v.substring(0, i);
+                        oldmode = true;
                     }
-                } catch (NumberFormatException e) {
+                } catch (NumberFormatException | IndexOutOfBoundsException e) {
+                    invalidManifestEntries.add(key);
                     Logging.error(e);
                 }
Index: /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java	(revision 13992)
+++ /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java	(revision 13993)
@@ -55,7 +55,10 @@
                 .collect(Collectors.toMap(e -> e.getKey(), e -> ExceptionUtils.getRootCause(e.getValue())));
 
+        List<PluginInformation> loadedPlugins = PluginHandler.getPlugins();
+        Map<String, List<String>> invalidManifestEntries = loadedPlugins.stream().filter(pi -> !pi.invalidManifestEntries.isEmpty())
+                .collect(Collectors.toMap(pi -> pi.name, pi -> pi.invalidManifestEntries));
+
         // Add/remove layers twice to test basic plugin good behaviour
         Map<String, Throwable> layerExceptions = new HashMap<>();
-        List<PluginInformation> loadedPlugins = PluginHandler.getPlugins();
         for (int i = 0; i < 2; i++) {
             OsmDataLayer layer = new OsmDataLayer(new DataSet(), "Layer "+i, null);
@@ -69,9 +72,11 @@
         }
 
+        MapUtils.debugPrint(System.out, null, invalidManifestEntries);
         MapUtils.debugPrint(System.out, null, loadingExceptions);
         MapUtils.debugPrint(System.out, null, layerExceptions);
-        String msg = Arrays.toString(loadingExceptions.entrySet().toArray()) + '\n' +
+        String msg = Arrays.toString(invalidManifestEntries.entrySet().toArray()) + '\n' +
+                     Arrays.toString(loadingExceptions.entrySet().toArray()) + '\n' +
                      Arrays.toString(layerExceptions.entrySet().toArray());
-        assertTrue(msg, loadingExceptions.isEmpty() && layerExceptions.isEmpty());
+        assertTrue(msg, invalidManifestEntries.isEmpty() && loadingExceptions.isEmpty() && layerExceptions.isEmpty());
     }
 
