diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
index 51ea62fa2ea3ecb9aae515f0ae4850141f1a887a..f6b08e8fcdaa18f24c9edaf5d7606e7da603f3b6 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
@@ -6,6 +6,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import net.i2p.crypto.SigType;
 import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
@@ -212,7 +213,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         Hash rkey = gen.getRoutingKey(key);
         FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector();
         final int type = ds.getType();
-        final boolean isls2 = ds.isLeaseSet() && type != DatabaseEntry.KEY_TYPE_LEASESET;
+        final boolean isls = ds.isLeaseSet();
+        final boolean isls2 = isls && type != DatabaseEntry.KEY_TYPE_LEASESET;
+        final SigType lsSigType = (isls && type != DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) ?
+                                  ds.getKeysAndCert().getSigningPublicKey().getType() :
+                                  null;
         int max = MAX_TO_FLOOD;
         // increase candidates because we will be skipping some
         if (type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2)
@@ -254,8 +259,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         for (int i = 0; i < peers.size(); i++) {
             Hash peer = peers.get(i);
             RouterInfo target = lookupRouterInfoLocally(peer);
-            if (!shouldFloodTo(key, type, peer, target))
+            if (!shouldFloodTo(key, type, lsSigType, peer, target)) {
+                if (_log.shouldDebug())
+                    _log.debug("Too old, not flooding " + key.toBase64() + " to " + peer.toBase64());
                 continue;
+            }
             DatabaseStoreMessage msg = new DatabaseStoreMessage(_context);
             msg.setEntry(ds);
             OutNetMessage m = new OutNetMessage(_context, msg, _context.clock().now()+FLOOD_TIMEOUT, FLOOD_PRIORITY, target);
@@ -277,8 +285,12 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
             _log.info("Flooded the data to " + flooded + " of " + peers.size() + " peers");
     }
 
-    /** @since 0.9.39 */
-    private boolean shouldFloodTo(Hash key, int type, Hash peer, RouterInfo target) {
+    /**
+     *  @param type database store type
+     *  @param lsSigType may be null
+     *  @since 0.9.39
+     */
+    private boolean shouldFloodTo(Hash key, int type, SigType lsSigType, Hash peer, RouterInfo target) {
        if ( (target == null) || (_context.banlist().isBanlisted(peer)) )
            return false;
        // Don't flood an RI back to itself
@@ -289,10 +301,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
        if (peer.equals(_context.routerHash()))
            return false;
        // min version checks
-       if (type != DatabaseEntry.KEY_TYPE_ROUTERINFO && type != DatabaseEntry.KEY_TYPE_LS2 &&
+       if (type != DatabaseEntry.KEY_TYPE_ROUTERINFO && type != DatabaseEntry.KEY_TYPE_LEASESET &&
            !StoreJob.shouldStoreLS2To(target))
            return false;
-       if (type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2 &&
+       if ((type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2 ||
+            lsSigType == SigType.RedDSA_SHA512_Ed25519) &&
            !StoreJob.shouldStoreEncLS2To(target))
            return false;
        if (!StoreJob.shouldStoreTo(target))
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
index 66a8eecb7e3896fdc2cc3c2126cb5f71eba773b7..acc38fb657ecabc7a7adb1eb158538f47ea78a6f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
@@ -184,7 +184,11 @@ abstract class StoreJob extends JobImpl {
             int queued = 0;
             int skipped = 0;
             int type = _state.getData().getType();
-            boolean isls2 = DatabaseEntry.isLeaseSet(type) && type != DatabaseEntry.KEY_TYPE_LEASESET;
+            final boolean isls = DatabaseEntry.isLeaseSet(type);
+            final boolean isls2 = isls && type != DatabaseEntry.KEY_TYPE_LEASESET;
+            final SigType lsSigType = (isls && type != DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) ?
+                                      _state.getData().getKeysAndCert().getSigningPublicKey().getType() :
+                                      null;
             for (Hash peer : closestHashes) {
                 DatabaseEntry ds = _facade.getDataStore().get(peer);
                 if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) {
@@ -197,10 +201,11 @@ abstract class StoreJob extends JobImpl {
                         _log.info(getJobId() + ": Skipping old router " + peer);
                     _state.addSkipped(peer);
                     skipped++;
-                } else if (type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2 &&
+                } else if ((type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2 ||
+                            lsSigType == SigType.RedDSA_SHA512_Ed25519) &&
                            !shouldStoreEncLS2To((RouterInfo)ds)) {
                     if (_log.shouldInfo())
-                        _log.info(getJobId() + ": Skipping router that doesn't support Enc LS2 " + peer);
+                        _log.info(getJobId() + ": Skipping router that doesn't support EncLS2/RedDSA " + peer);
                     _state.addSkipped(peer);
                     skipped++;
                 } else if (isls2 &&