diff --git a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
index 008837a1b2a1a8d6dcec2301f543be7758fac7e6..d950da78e75ea60792a160ca71217e47b6c877ec 100644
--- a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
@@ -65,6 +65,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
     // LS 2
     public static final String PROP_LS_TYPE = "i2cp.leaseSetType";
     private static final String PROP_LS_ENCTYPE = "i2cp.leaseSetEncType";
+    private static final String PROP_SECRET = "i2cp.leaseSetSecret";
 
     public RequestLeaseSetMessageHandler(I2PAppContext context) {
         this(context, RequestLeaseSetMessage.MESSAGE_TYPE);
@@ -123,7 +124,11 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
             if (_ls2Type == DatabaseEntry.KEY_TYPE_LS2) {
                 leaseSet = new LeaseSet2();
             } else if (_ls2Type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) {
-                leaseSet = new EncryptedLeaseSet();
+                EncryptedLeaseSet encls2 = new EncryptedLeaseSet();
+                String secret = session.getOptions().getProperty(PROP_SECRET);
+                if (secret != null)
+                    encls2.setSecret(secret);
+                leaseSet = encls2;
             } else if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) {
                 leaseSet = new MetaLeaseSet();
             } else {
@@ -136,7 +141,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
         } else {
             leaseSet = new LeaseSet();
         }
-        // Full Meta and Encrypted support TODO
+        // Full Meta support TODO
         for (int i = 0; i < msg.getEndpoints(); i++) {
             Lease lease;
             if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) {
diff --git a/core/java/src/net/i2p/data/EncryptedLeaseSet.java b/core/java/src/net/i2p/data/EncryptedLeaseSet.java
index e590d17cd5d4b1da43503701aef0eba0459863b0..2610edb8aab28c53183e4e6d53ed5e532358ca27 100644
--- a/core/java/src/net/i2p/data/EncryptedLeaseSet.java
+++ b/core/java/src/net/i2p/data/EncryptedLeaseSet.java
@@ -22,6 +22,8 @@ import net.i2p.util.Log;
  *
  * PRELIMINARY - Subject to change - see proposal 123
  *
+ * Per-client auth TODO
+ *
  * @since 0.9.38
  */
 public class EncryptedLeaseSet extends LeaseSet2 {
@@ -31,6 +33,7 @@ public class EncryptedLeaseSet extends LeaseSet2 {
     private LeaseSet2 _decryptedLS2;
     private Hash __calculatedHash;
     private SigningPrivateKey _alpha;
+    private String _secret;
     private final Log _log;
 
     private static final int MIN_ENCRYPTED_SIZE = 8 + 16;
@@ -56,6 +59,16 @@ public class EncryptedLeaseSet extends LeaseSet2 {
         return _decryptedLS2;
     }
 
+    /**
+     *  Must be set before sign or verify.
+     *
+     *  @param secret null or "" for none (default)
+     *  @since 0.9.39
+     */
+    public void setSecret(String secret) {
+        _secret = secret;
+    }
+
     ///// overrides below here
 
     @Override
@@ -84,6 +97,7 @@ public class EncryptedLeaseSet extends LeaseSet2 {
      *  @return null if not decrypted.
      *  @since 0.9.39
      */
+    @Override
     public List<PublicKey> getEncryptionKeys() {
         if (_decryptedLS2 != null)
             return _decryptedLS2.getEncryptionKeys();
@@ -129,9 +143,9 @@ public class EncryptedLeaseSet extends LeaseSet2 {
         SigningPublicKey spk = _destination.getSigningPublicKey();
         I2PAppContext ctx = I2PAppContext.getGlobalContext();
         if (_published <= 0)
-            _alpha = Blinding.generateAlpha(ctx, _destination.getSigningPublicKey(), null);
+            _alpha = Blinding.generateAlpha(ctx, _destination.getSigningPublicKey(), _secret);
         else
-            _alpha = Blinding.generateAlpha(ctx, _destination.getSigningPublicKey(), null, _published);
+            _alpha = Blinding.generateAlpha(ctx, _destination.getSigningPublicKey(), _secret, _published);
         SigningPublicKey rv = Blinding.blind(spk, _alpha);
         if (_log.shouldDebug())
             _log.debug("Blind:" +
@@ -680,6 +694,7 @@ public class EncryptedLeaseSet extends LeaseSet2 {
         net.i2p.crypto.KeyPair encKeys2 = net.i2p.crypto.KeyGenerator.getInstance().generatePKIKeys(net.i2p.crypto.EncType.ECIES_X25519);
         pubKey = encKeys2.getPublic();
         ls2.addEncryptionKey(pubKey);
+        ls2.setSecret("foobar");
         SigningPrivateKey spk = pkf.getSigningPrivKey();
         if (offline) {
             now += 365*24*60*60*1000L;
@@ -692,7 +707,7 @@ public class EncryptedLeaseSet extends LeaseSet2 {
         } else {
             ls2.sign(spk);
         }
-        System.out.println("Created: " + ls2);
+        System.out.println("\nCreated: " + ls2);
         if (!ls2.verifySignature()) {
             System.out.println("Verify FAILED");
             return;
@@ -703,11 +718,11 @@ public class EncryptedLeaseSet extends LeaseSet2 {
         ls2.writeBytes(out2);
         out2.close();
         java.io.ByteArrayInputStream in = new java.io.ByteArrayInputStream(out.toByteArray());
-        System.out.println("Size calculated: " + (ls2.size() + ls2.getSignature().length()));
-        System.out.println("Size to read in: " + in.available());
+        System.out.println("\nSize calculated: " + (ls2.size() + ls2.getSignature().length()));
+        System.out.println("\nSize to read in: " + in.available());
         EncryptedLeaseSet ls3 = new EncryptedLeaseSet();
         ls3.readBytes(in);
-        System.out.println("Read back: " + ls3);
+        System.out.println("\nRead back: " + ls3);
         // required to decrypt
         ls3.setDestination(pkf.getDestination());
         if (!ls3.verifySignature())
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index d2a9340677345a5e3b9e29491f29ae6a31b6b5f1..9963bf5ff04cd094bf27144c60483827fab075e9 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -642,6 +642,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
                     _runner.disconnectClient("Duplicate hash of encrypted LS2");
                     return;
                 }
+                String secret = cfg.getOptions().getProperty("i2cp.leaseSetSecret");
+                if (secret != null) {
+                    EncryptedLeaseSet encls = (EncryptedLeaseSet) ls;
+                    encls.setSecret(secret);
+                }
             }
             if (_log.shouldDebug())
                 _log.debug("Publishing: " + ls);