diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 4c6b5dd41185637dc13ec0af0d4bedb1c6a04329..6ea78a0630816b60a9424df6a37c622e08d091f8 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -289,14 +289,22 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         if ( (message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null) ) {
             if (_log.shouldLog(Log.ERROR))
                 _log.error("Null lease set granted: " + message);
+            _runner.disconnectClient("Invalid CreateLeaseSetMessage");
             return;
         }
 
+        _context.keyManager().registerKeys(message.getLeaseSet().getDestination(), message.getSigningPrivateKey(), message.getPrivateKey());
+        try {
+            _context.netDb().publish(message.getLeaseSet());
+        } catch (IllegalArgumentException iae) {
+            if (_log.shouldLog(Log.ERROR))
+                _log.error("Invalid leaseset from client", iae);
+            _runner.disconnectClient("Invalid leaseset: " + iae);
+            return;
+        }
         if (_log.shouldLog(Log.INFO))
             _log.info("New lease set granted for destination " 
                       + message.getLeaseSet().getDestination().calculateHash().toBase64());
-        _context.keyManager().registerKeys(message.getLeaseSet().getDestination(), message.getSigningPrivateKey(), message.getPrivateKey());
-        _context.netDb().publish(message.getLeaseSet());
 
         // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
         _runner.leaseSetCreated(message.getLeaseSet());
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 851e7897ce853d8e01cd93c1fb9932779e933487..10c3560e1ddf23bb19d372dc93c44b077925b7ff 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -527,14 +527,17 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     
     private static final long PUBLISH_DELAY = 3*1000;
 
-    public void publish(LeaseSet localLeaseSet) {
+    /**
+     * @throws IllegalArgumentException if the leaseSet is not valid
+     */
+    public void publish(LeaseSet localLeaseSet) throws IllegalArgumentException {
         if (!_initialized) return;
         Hash h = localLeaseSet.getDestination().calculateHash();
         try {
             store(h, localLeaseSet);
         } catch (IllegalArgumentException iae) {
             _log.error("wtf, locally published leaseSet is not valid?", iae);
-            return;
+            throw iae;
         }
         if (!_context.clientManager().shouldPublishLeaseSet(h))
             return;