diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index ae998ad59fe872f7bedf70fc3a7bdc485a672595..cd80a1a9a5e1a2ced1c3617764d0bd0b921e42d5 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -172,23 +172,23 @@ class PeerState {
     private long _consecutiveSmall;
     /** when did we last check the MTU? */
     //private long _mtuLastChecked;
-    private long _mtuIncreases;
-    private long _mtuDecreases;
+    private int _mtuIncreases;
+    private int _mtuDecreases;
     /** current round trip time estimate */
-    private volatile int _rtt;
+    private int _rtt;
     /** smoothed mean deviation in the rtt */
-    private volatile int _rttDeviation;
+    private int _rttDeviation;
     /** current retransmission timeout */
-    private volatile int _rto;
+    private int _rto;
     
     /** how many packets will be considered within the retransmission rate calculation */
     static final long RETRANSMISSION_PERIOD_WIDTH = 100;
     
-    private long _messagesReceived;
-    private long _messagesSent;
-    private long _packetsTransmitted;
+    private int _messagesReceived;
+    private int _messagesSent;
+    private int _packetsTransmitted;
     /** how many packets were retransmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */
-    private long _packetsRetransmitted;
+    private int _packetsRetransmitted;
 
     /** how many packets were transmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */
     //private long _packetsPeriodTransmitted;
@@ -196,8 +196,8 @@ class PeerState {
     //private int _packetRetransmissionRate;
 
     /** how many dup packets were received within the last RETRANSMISSION_PERIOD_WIDTH packets */
-    private long _packetsReceivedDuplicate;
-    private long _packetsReceived;
+    private int _packetsReceivedDuplicate;
+    private int _packetsReceived;
     
     /** list of InboundMessageState for active message */
     private final Map<Long, InboundMessageState> _inboundMessages;
@@ -621,7 +621,7 @@ class PeerState {
 
     /** return the smoothed send transfer rate */
     public int getSendBps() { return _sendBps; }
-    public int getReceiveBps() { return _receiveBps; }
+    public synchronized int getReceiveBps() { return _receiveBps; }
 
     public int incrementConsecutiveFailedSends() { 
         synchronized(_outboundMessages) {
@@ -774,8 +774,7 @@ class PeerState {
     /** we received the message specified completely */
     public void messageFullyReceived(Long messageId, int bytes) { messageFullyReceived(messageId, bytes, false); }
 
-    /** FIXME synch */
-    public void messageFullyReceived(Long messageId, int bytes, boolean isForACK) {
+    public synchronized void messageFullyReceived(Long messageId, int bytes, boolean isForACK) {
         if (bytes > 0) {
             _receiveBytes += bytes;
             //if (isForACK)
@@ -1256,60 +1255,36 @@ class PeerState {
     }
     
     /** we are resending a packet, so lets jack up the rto */
-    public void messageRetransmitted(int packets) { 
-        //long now = _context.clock().now();
-        //if (true || _retransmissionPeriodStart + 1000 <= now) {
-            _packetsRetransmitted += packets;
-        /*****
-        } else {
-            _packetRetransmissionRate = (int)((float)(0.9f*_packetRetransmissionRate) + (float)(0.1f*_packetsRetransmitted));
-            //_packetsPeriodTransmitted = _packetsTransmitted - _retransmissionPeriodStart;
-            _packetsPeriodRetransmitted = (int)_packetsRetransmitted;
-            _retransmissionPeriodStart = now;
-            _packetsRetransmitted = packets;
-        }
-        *****/
+    public synchronized void messageRetransmitted(int packets) { 
         _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes);
         _context.statManager().addRateData("udp.congestedRTO", _rto, _rttDeviation);
-        synchronized (this) {
-            congestionOccurred();
-            adjustMTU();
-        }
-        //_rto *= 2; 
+        _packetsRetransmitted += packets;
+        congestionOccurred();
+        adjustMTU();
     }
 
-    public void packetsTransmitted(int packets) { 
-        //long now = _context.clock().now();
+    public synchronized void packetsTransmitted(int packets) { 
         _packetsTransmitted += packets; 
-        //_packetsPeriodTransmitted += packets;
-        /*****
-        if (false && _retransmissionPeriodStart + 1000 <= now) {
-            _packetRetransmissionRate = (int)((float)(0.9f*_packetRetransmissionRate) + (float)(0.1f*_packetsRetransmitted));
-            _retransmissionPeriodStart = 0;
-            _packetsPeriodRetransmitted = (int)_packetsRetransmitted;
-            _packetsRetransmitted = 0;
-        }
-        *****/
     }
 
     /** how long does it usually take to get a message ACKed? */
-    public int getRTT() { return _rtt; }
+    public synchronized int getRTT() { return _rtt; }
     /** how soon should we retransmit an unacked packet? */
-    public int getRTO() { return _rto; }
+    public synchronized int getRTO() { return _rto; }
     /** how skewed are the measured RTTs? */
-    public long getRTTDeviation() { return _rttDeviation; }
+    public synchronized int getRTTDeviation() { return _rttDeviation; }
     
-    public long getMessagesSent() { return _messagesSent; }
-    public long getMessagesReceived() { return _messagesReceived; }
-    public long getPacketsTransmitted() { return _packetsTransmitted; }
-    public long getPacketsRetransmitted() { return _packetsRetransmitted; }
+    public synchronized int getMessagesSent() { return _messagesSent; }
+    public synchronized int getMessagesReceived() { return _messagesReceived; }
+    public synchronized int getPacketsTransmitted() { return _packetsTransmitted; }
+    public synchronized int getPacketsRetransmitted() { return _packetsRetransmitted; }
     //public long getPacketsPeriodTransmitted() { return _packetsPeriodTransmitted; }
     //public int getPacketsPeriodRetransmitted() { return _packetsPeriodRetransmitted; }
 
     /** avg number of packets retransmitted for every 100 packets */
     //public long getPacketRetransmissionRate() { return _packetRetransmissionRate; }
-    public long getPacketsReceived() { return _packetsReceived; }
-    public long getPacketsReceivedDuplicate() { return _packetsReceivedDuplicate; }
+    public synchronized int getPacketsReceived() { return _packetsReceived; }
+    public synchronized int getPacketsReceivedDuplicate() { return _packetsReceivedDuplicate; }
 
     private static final int MTU_RCV_DISPLAY_THRESHOLD = 20;
     /** 60 */
@@ -1322,7 +1297,7 @@ class PeerState {
     /** 
      *  @param size not including IP header, UDP header, MAC or IV
      */
-    public void packetReceived(int size) { 
+    public synchronized void packetReceived(int size) { 
         _packetsReceived++; 
         int minMTU;
         if (_remoteIP.length == 4) {
@@ -2077,6 +2052,7 @@ class PeerState {
         if (_remotePeer != null)
             buf.append(" ").append(_remotePeer.toBase64().substring(0,6));
 
+        buf.append(_isInbound? " IB " : " OB ");
         long now = _context.clock().now();
         buf.append(" recvAge: ").append(now-_lastReceiveTime);
         buf.append(" sendAge: ").append(now-_lastSendFullyTime);