diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
index 64304bd3bc796c509ea8dfec05c62d24d0d4e502..f327f739da95915bfd2fcc47be0bf2845d94e22a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
@@ -43,7 +43,9 @@ class PluginUpdateHandler implements Checker, Updater {
 
         Properties props = PluginStarter.pluginProperties(_context, appName);
         String oldVersion = props.getProperty("version");
-        String xpi2pURL = props.getProperty("updateURL");
+        String xpi2pURL = props.getProperty("updateURL.su3");
+        if (xpi2pURL == null)
+            xpi2pURL = props.getProperty("updateURL");
         List<URI> updateSources = null;
         if (xpi2pURL != null) {
             try {
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
index 0025436a547fa50f3039b7fe525f8701acf1c702..e42df7877eb98489d09e819dbf4219c9067ef17c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
@@ -254,6 +254,10 @@ class PluginUpdateRunner extends UpdateRunner {
             String signingKeyName;
             try {
                 su3.verifyAndMigrate(to);
+                if (su3.getFileType() != SU3File.TYPE_ZIP)
+                    throw new IOException("bad file type");
+                if (su3.getContentType() != SU3File.CONTENT_PLUGIN)
+                    throw new IOException("bad content type");
                 sudVersion = su3.getVersionString();
                 signingKeyName = su3.getSignerString();
             } catch (IOException ioe) {
@@ -265,9 +269,8 @@ class PluginUpdateRunner extends UpdateRunner {
             Properties props = getPluginConfig(f, to, url);
             if (props == null)
                 return;
-            String pubkey = props.getProperty("key");
             String signer = props.getProperty("signer");
-            if (pubkey == null || signer == null || pubkey.length() != 172 || signer.length() <= 0) {
+            if (signer == null || signer.length() <= 0) {
                 f.delete();
                 to.delete();
                 statusDone("<b>" + _("Plugin from {0} contains an invalid key", url) + "</b>");
@@ -284,7 +287,7 @@ class PluginUpdateRunner extends UpdateRunner {
                 statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>");
                 return;
             }
-            processFinal(to, appDir, url, props, sudVersion, pubkey, signer);
+            processFinal(to, appDir, url, props, sudVersion, null, signer);
         }
 
         /**
@@ -317,6 +320,7 @@ class PluginUpdateRunner extends UpdateRunner {
         }
 
         /**
+         *  @param pubkey null OK for su3
          *  @since 0.9.15
          */
         private void processFinal(File to, File appDir, String url, Properties props, String sudVersion, String pubkey, String signer) {
@@ -377,7 +381,7 @@ class PluginUpdateRunner extends UpdateRunner {
                 String oldPubkey = oldProps.getProperty("key");
                 String oldKeyName = oldProps.getProperty("signer");
                 String oldAppName = oldProps.getProperty("name");
-                if ((!pubkey.equals(oldPubkey)) || (!signer.equals(oldKeyName)) || (!appName.equals(oldAppName))) {
+                if ((pubkey != null && !pubkey.equals(oldPubkey)) || (!signer.equals(oldKeyName)) || (!appName.equals(oldAppName))) {
                     to.delete();
                     statusDone("<b>" + _("Signature of downloaded plugin does not match installed plugin") + "</b>");
                     return;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
index 1c1c28568dddbf65e41b9aa9601032179996574a..443b9f093e0131547748564b923878629d0576f2 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
@@ -344,7 +344,9 @@ public class ConfigClientsHandler extends FormHandler {
 
     private void updatePlugin(String app) {
         Properties props = PluginStarter.pluginProperties(_context, app);
-        String url = props.getProperty("updateURL");
+        String url = props.getProperty("updateURL.su3");
+        if (url == null)
+            url = props.getProperty("updateURL");
         if (url == null) {
             addFormError(_("No update URL specified for {0}",app));
             return;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
index c1463000bcdda1b6bc7776d84741e36e75ef2074..8d33a365efbb0e45bf6d13e6758d5ec2db3945c6 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
@@ -232,7 +232,9 @@ public class ConfigClientsHelper extends HelperBase {
                     desc.append("<tr><td>")
                         .append("<a href=\"").append(s).append("\">").append(_("Website")).append("</a><td>&nbsp;");
                 }
-                String updateURL = stripHTML(appProps, "updateURL");
+                String updateURL = stripHTML(appProps, "updateURL.su3");
+                if (updateURL == null)
+                    updateURL = stripHTML(appProps, "updateURL");
                 if (updateURL != null) {
                     desc.append("<tr><td>")
                         .append("<a href=\"").append(updateURL).append("\">").append(_("Update link")).append("</a><td>&nbsp;");