diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java
index fd344547b57d87291af7a005b6bd7f53af1a5929..f218eb7b368ce21c517b0535be01249e36871de3 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java
@@ -37,11 +37,20 @@ public class ConfigFamilyHandler extends FormHandler {
             } else if (family.length() > 32) {
                 // let's enforce some sanity
                 addFormError("Family too long, 32 chars max: " + family);
-            } else if (_context.router().saveConfig(FamilyKeyCrypto.PROP_FAMILY_NAME, family.trim())) {
-                addFormNotice(_t("Configuration saved successfully."));
-                addFormError(_t("Restart required to take effect"));
             } else {
-                addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs"));
+                family = family.trim();
+                File ks = new SecureDirectory(_context.getConfigDir(), "keystore");
+                ks = new File(ks, FamilyKeyCrypto.KEYSTORE_PREFIX + family + FamilyKeyCrypto.KEYSTORE_SUFFIX);
+                if (ks.exists()) {
+                    addFormError("Keystore for family " + family + " already exists! Delete or rename it first: " + ks);
+                } else {
+                    if (_context.router().saveConfig(FamilyKeyCrypto.PROP_FAMILY_NAME, family.trim())) {
+                        addFormNotice(_t("Configuration saved successfully."));
+                        addFormError(_t("Restart required to take effect"));
+                    } else {
+                        addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs"));
+                    }
+                }
             }
         } else if (_action.equals(_t("Join Family"))) {
             InputStream in = _requestWrapper.getInputStream("file");
@@ -57,6 +66,11 @@ public class ConfigFamilyHandler extends FormHandler {
                 String family = CertUtil.getSubjectValue(certs.get(0), "CN");
                 if (family == null) {
                     addFormError("Bad certificate - No Subject CN");
+                    return;
+                }
+                if (family.contains("/") || family.contains("\\")) {
+                    addFormError("Bad characters in Family: " + family);
+                    return;
                 }
                 if (family.endsWith(FamilyKeyCrypto.CN_SUFFIX) && family.length() > FamilyKeyCrypto.CN_SUFFIX.length())
                     family = family.substring(0, family.length() - FamilyKeyCrypto.CN_SUFFIX.length());
@@ -65,6 +79,10 @@ public class ConfigFamilyHandler extends FormHandler {
                 if (!ks.exists())
                     ks.mkdirs();
                 ks = new File(ks, FamilyKeyCrypto.KEYSTORE_PREFIX + family + FamilyKeyCrypto.KEYSTORE_SUFFIX);
+                if (ks.exists()) {
+                    addFormError("Keystore for family " + family + " already exists! Delete or rename it first: " + ks);
+                    return;
+                }
                 String keypw = KeyStoreUtil.randomString();
                 KeyStoreUtil.storePrivateKey(ks, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD, family, keypw, pk, certs);
                 // store certificate
diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java
index b85df5f1907d4f4a00ea148a6b48b6f3b602bffa..5375ebdade63860f4176b34f5431fa6be974e32c 100644
--- a/router/java/src/net/i2p/router/StatisticsManager.java
+++ b/router/java/src/net/i2p/router/StatisticsManager.java
@@ -159,7 +159,6 @@ public class StatisticsManager {
 
         String family = _context.getProperty(FamilyKeyCrypto.PROP_FAMILY_NAME);
         if (family != null) {
-            stats.setProperty(FamilyKeyCrypto.OPT_NAME, family);
             String sig = null;
             String key = null;
             RouterInfo oldRI = _context.router().getRouterInfo();
@@ -173,10 +172,12 @@ public class StatisticsManager {
                             // we changed the separator from ';' to ':'
                             key = null;
                         } else {
-                            stats.setProperty(FamilyKeyCrypto.OPT_KEY, key);
                             sig = oldRI.getOption(FamilyKeyCrypto.OPT_SIG);
-                            if (sig != null)
+                            if (sig != null) {
+                                stats.setProperty(FamilyKeyCrypto.OPT_NAME, family);
+                                stats.setProperty(FamilyKeyCrypto.OPT_KEY, key);
                                 stats.setProperty(FamilyKeyCrypto.OPT_SIG, sig);
+                            }
                         }
                     }
                 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 357761bd6e2de74cb9fd2e5716679ad3056360d4..1e8f8337db1277543512dd2e079dd6cd8a895288 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -1131,8 +1131,15 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
             switch (r) {
                 case BAD_KEY:
                 case INVALID_SIG:
+                    Hash h = routerInfo.getHash();
+                    // never fail our own router, that would cause a restart and rekey
+                    if (h.equals(_context.routerHash()))
+                        break;
+                    return "Bad family " + r + ' ' + h;
+
                 case NO_SIG:
-                    return "Bad family " + r + ' ' + routerInfo.getHash();
+                    // Routers older than 0.9.54 that added a family and haven't restarted
+                    break;
 
                 case BAD_SIG:
                     // To be investigated