diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState2.java b/router/java/src/net/i2p/router/transport/udp/PeerState2.java
index 526cfe06979c42f11940ee45345ecdc7e471758d..a37c945e8c986f9b5606876c10607b5e12ae343e 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java
@@ -567,12 +567,19 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
                 _log.debug("Got dup ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)));
             return;
         }
-        SSU2Bitfield ackbf;
-        ackbf = SSU2Bitfield.fromACKBlock(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0));
-        if (_log.shouldDebug())
-            _log.debug("Got new ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)));
-        // calls bitSet() below
-        ackbf.forEachAndNot(_ackedMessages, this);
+        try {
+            SSU2Bitfield ackbf = SSU2Bitfield.fromACKBlock(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0));
+            if (_log.shouldDebug())
+                _log.debug("Got new ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)));
+            // calls bitSet() below
+            ackbf.forEachAndNot(_ackedMessages, this);
+        } catch (Exception e) {
+            // IllegalArgumentException, buggy ack block, let the other blocks get processed
+            if (_log.shouldWarn())
+                _log.warn("Bad ACK block\n" + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)) +
+                          "\nAck through " + ackThru + " acks " + acks + (ranges != null ? "\n" + HexDump.dump(ranges) : "") +
+                          "\nfrom " + this, e);
+        }
     }
 
     public void gotTermination(int reason, long count) {
diff --git a/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java b/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java
index bbad4ed2772ab4615bb7a720ce3a5f6da86163c0..df14fe2b4475258136c7e8e65198f2769a53bdb7 100644
--- a/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java
+++ b/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java
@@ -36,7 +36,7 @@ class SSU2Bitfield {
      */
     public SSU2Bitfield(int size, long offset) {
         if (size <= 0 || offset < 0)
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("size " + size + " offset " + offset);
         // force mult. of 256
         size = (size + 255) & 0x7FFFFF00;
         this.size = size;