diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
index 786990e8050f9026ddae4466432a0fcc9c10a679..8b90ba3451a66451d519b25f457e11fa96c5ee04 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
@@ -685,6 +685,11 @@ class InboundEstablishState2 extends InboundEstablishState implements SSU2Payloa
         // PS2.super adds CLOCK_SKEW_FUDGE that doesn't apply here
         _pstate.adjustClockSkew(_skew - (_rtt / 2) - PeerState.CLOCK_SKEW_FUDGE);
         _pstate.setHisMTU(_mtu);
+        // set our address. _bobIP and _bobPort in super are not set for SSU2
+        boolean isIPv6 = _aliceIP.length == 16;
+        RouterAddress ra = _transport.getCurrentExternalAddress(isIPv6);
+        if (ra != null)
+            _pstate.setOurAddress(ra.getIP(), ra.getPort());
     }
 
     /**
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState2.java
index 84fe2acccd966368b64e9d0f8042d598aa1adf13..073f3d27f5d409dc76ef3f6a95a3dab6b5a1ecb1 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState2.java
@@ -111,7 +111,6 @@ class OutboundEstablishState2 extends OutboundEstablishState implements SSU2Payl
             }
         }
         _mtu = mtu;
-        // TODO if RI too big, give up now
         if (addr.getIntroducerCount() > 0) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("new outbound establish to " + remotePeer.calculateHash() + ", with address: " + addr);
@@ -520,6 +519,7 @@ class OutboundEstablishState2 extends OutboundEstablishState implements SSU2Payl
             // PS2.super adds CLOCK_SKEW_FUDGE that doesn't apply here
             _pstate.adjustClockSkew(_skew - (_rtt / 2) - PeerState.CLOCK_SKEW_FUDGE);
             _pstate.setHisMTU(_mtu);
+            _pstate.setOurAddress(_aliceIP, _alicePort);
         }
         confirmedPacketsSent();
         return _pstate;
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 24cf830b5567dcba3a0293bd1110b52710b649d8..f6a200faf9da3e01d8ff66c511f1c717361820cb 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java
@@ -59,6 +59,8 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
     private final SSU2Bitfield _ackedMessages;
     private final ConcurrentHashMap<Long, List<PacketBuilder.Fragment>> _sentMessages;
     private long _sentMessagesLastExpired;
+    private byte[] _ourIP;
+    private int _ourPort;
 
     // Session Confirmed retransmit
     private byte[][] _sessConfForReTX;
@@ -269,6 +271,12 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
     byte[] getSendHeaderEncryptKey2() { return _sendHeaderEncryptKey2; }
     byte[] getRcvHeaderEncryptKey2() { return _rcvHeaderEncryptKey2; }
 
+    void setOurAddress(byte[] ip, int port) {
+        _ourIP = ip; _ourPort = port;
+    }
+    byte[] getOurIP() { return _ourIP; }
+    int getOurPort() { return _ourPort; }
+
     SSU2Bitfield getReceivedMessages() {
         // logged in PacketBuilder2
         //if (_log.shouldDebug())
@@ -379,6 +387,7 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
     }
 
     public void gotAddress(byte[] ip, int port) {
+        _ourIP = ip; _ourPort = port;
     }
 
     public void gotRelayTagRequest() {
@@ -594,8 +603,8 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
             if (_log.shouldWarn())
                 _log.warn("Dup send of pkt " + pktNum + " on " + this);
         } else {
-            if (_log.shouldWarn())
-                _log.warn("New data pkt " + pktNum + " sent with " + fragments.size() + " fragments on " + this);
+            if (_log.shouldDebug())
+                _log.debug("New data pkt " + pktNum + " sent with " + fragments.size() + " fragments on " + this);
         }
     }
 
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index fd4ad6836c3bb48ebb5e8df2d7e5a6a7d8678f75..33febe5f39bd93a01f418a67d6f3ebe695c2f38a 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -293,7 +293,7 @@ class PeerTestManager {
                 PeerState2 bob = (PeerState2) test.getBob();
                 // TODO only create this once
                 byte[] data = SSU2Util.createPeerTestData(_context, bob.getRemotePeer(), _context.routerHash(),
-                                                          ALICE, test.getNonce(), null, 0, spk);
+                                                          ALICE, test.getNonce(), bob.getOurIP(), bob.getOurPort(), spk);
                 if (data == null) {
                     if (_log.shouldWarn())
                         _log.warn("sig fail");
@@ -786,7 +786,7 @@ class PeerTestManager {
             state = _activeTests.get(lNonce);
 
         if (_log.shouldDebug())
-            _log.debug("Got peer test from " + from + ' ' + fromPeer +
+            _log.debug("Got peer test" +
                        " msg: " + msg +
                        " status: " + status +
                        " hash: " + h +
@@ -794,6 +794,7 @@ class PeerTestManager {
                        " nonce: " + nonce +
                        " time: " + DataHelper.formatTime(time) +
                        " ip/port: " + Addresses.toString(testIP, testPort) +
+                       " from " + fromPeer +
                        " state: " + state);
 
         byte[] fromIP = from.getIP();
@@ -877,6 +878,11 @@ class PeerTestManager {
         switch (msg) {
             // alice to bob, in-session
             case 1: {
+                if (status != 0) {
+                    if (_log.shouldWarn())
+                        _log.warn("Msg 1 status " + status);
+                    return;
+                }
                 PeerState charlie = _transport.pickTestPeer(CHARLIE, fromPeer.getVersion(), isIPv6, from);
                 if (charlie == null) {
                     if (_log.shouldLog(Log.WARN))
@@ -921,6 +927,11 @@ class PeerTestManager {
 
             // bob to charlie, in-session
             case 2: {
+                if (status != 0) {
+                    if (_log.shouldWarn())
+                        _log.warn("Msg 2 status " + status);
+                    return;
+                }
                 InetAddress aliceIP;
                 try {
                     aliceIP = InetAddress.getByAddress(testIP);
@@ -952,9 +963,13 @@ class PeerTestManager {
                             else
                                 rcode = SSU2Util.TEST_REJECT_CHARLIE_ADDRESS;
                         } else {
+                            if (_log.shouldWarn())
+                                _log.warn("Signature failed msg 2\n" + aliceRI);
                             rcode = SSU2Util.TEST_REJECT_CHARLIE_SIGFAIL;
                         }
                     } else {
+                        if (_log.shouldWarn())
+                            _log.warn("Alice RI not found " + h);
                         rcode = SSU2Util.TEST_REJECT_CHARLIE_UNKNOWN_ALICE;
                     }
                 }
@@ -1037,7 +1052,10 @@ class PeerTestManager {
                 boolean fail = false;
                 RouterInfo charlieRI = null;
                 SessionKey charlieIntroKey = null;
-                if (_context.banlist().isBanlisted(h) ||
+                if (status != 0) {
+                    if (_log.shouldWarn())
+                        _log.warn("Msg 4 status " + status);
+                } else if (_context.banlist().isBanlisted(h) ||
                     !TransportUtil.isValidPort(testPort) ||
                     !_transport.isValid(testIP) ||
                     _transport.isTooClose(testIP) ||
@@ -1052,9 +1070,17 @@ class PeerTestManager {
                         // validate signed data
                         SigningPublicKey spk = charlieRI.getIdentity().getSigningPublicKey();
                         if (SSU2Util.validateSig(_context, SSU2Util.PEER_TEST_PROLOGUE,
-                                                 fromPeer.getRemotePeer(), h, data, spk)) {
+                                                 fromPeer.getRemotePeer(), _context.routerHash(), data, spk)) {
                             charlieIntroKey = getIntroKey(charlieRI, isIPv6);
+                            if (charlieIntroKey == null && _log.shouldWarn())
+                                _log.warn("Charlie intro key not found: " + test + '\n' + charlieRI);
+                        } else {
+                            if (_log.shouldWarn())
+                                _log.warn("Signature failed msg 4 " + test + '\n' + charlieRI);
                         }
+                    } else {
+                        if (_log.shouldWarn())
+                            _log.warn("Charlie RI not found" + test + ' ' + h);
                     }
                 }
                 if (charlieIntroKey == null) {
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 46cddb67b7d317ebb6d3e4233cb273374a958367..7598b978ed1629eedf0af501c80932b94cf24d0a 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -3808,8 +3808,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             PeerState peer = iter.next();
             if (peerRole == BOB) {
                 // Skip SSU2 until we have support for peer test
-                if (peer.getVersion() != 1 && !SSU2Util.ENABLE_PEER_TEST)
-                    continue;
+                if (peer.getVersion() != 1) {
+                    if (!SSU2Util.ENABLE_PEER_TEST)
+                        continue;
+                    // we must know our IP/port
+                    PeerState2 bob = (PeerState2) peer;
+                    if (bob.getOurIP() == null || bob.getOurPort() <= 0)
+                        continue;
+                }
             } else {
                 // charlie must be same version
                 if (peer.getVersion() != version)