diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
index eef1327123e575ac198e1d2bf46cd27539afceef..cf3c33ad313b8d2449db3bc16ff51ff92b87aceb 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
@@ -2,6 +2,7 @@ package net.i2p.router.tunnel;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
@@ -95,8 +96,8 @@ class FragmentHandler {
     protected final Log _log;
     private final Map<Long, FragmentedMessage> _fragmentedMessages;
     private final DefragmentedReceiver _receiver;
-    private int _completed;
-    private int _failed;
+    private final AtomicInteger _completed = new AtomicInteger();
+    private final AtomicInteger _failed = new AtomicInteger();
     
     /** don't wait more than 60s to defragment the partial message */
     static long MAX_DEFRAGMENT_TIME = 60*1000;
@@ -187,8 +188,8 @@ class FragmentHandler {
         }
     }
     
-    public int getCompleteCount() { return _completed; }
-    public int getFailedCount() { return _failed; }
+    public int getCompleteCount() { return _completed.get(); }
+    public int getFailedCount() { return _failed.get(); }
     
     private static final ByteCache _validateCache = ByteCache.getInstance(512, TrivialPreprocessor.PREPROCESSED_SIZE);
     
@@ -468,7 +469,7 @@ class FragmentHandler {
     private void receiveComplete(FragmentedMessage msg) {
         if (msg == null)
             return;
-        _completed++;
+        _completed.incrementAndGet();
         String stringified = null;
         if (_log.shouldLog(Log.DEBUG))
             stringified = msg.toString();
@@ -490,8 +491,9 @@ class FragmentHandler {
             // The unencrypted messages at the OBEP are (V)TBMs
             // and perhaps an occasional DatabaseLookupMessage
             I2NPMessage m = new I2NPMessageHandler(_context).readMessage(data);
-            noteReception(m.getUniqueId(), fragmentCount-1, "complete: ");// + msg.toString());
-            noteCompletion(m.getUniqueId());
+            long id = m.getUniqueId();
+            noteReception(id, fragmentCount-1, "complete");
+            noteCompletion(id);
             _receiver.receiveComplete(m, msg.getTargetRouter(), msg.getTargetTunnel());
         } catch (I2NPMessageException ime) {
             if (stringified == null) stringified = msg.toString();
@@ -508,7 +510,7 @@ class FragmentHandler {
      *  @since 0.9
      */
     private void receiveComplete(byte[] data, int offset, int len, Hash router, TunnelId tunnelId) {
-        _completed++;
+        _completed.incrementAndGet();
         try {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("RECV unfrag(" + len + ')');
@@ -522,8 +524,9 @@ class FragmentHandler {
             I2NPMessageHandler h = new I2NPMessageHandler(_context);
             h.readMessage(data, offset, len);
             I2NPMessage m = h.lastRead();
-            noteReception(m.getUniqueId(), 0, "complete: ");// + msg.toString());
-            noteCompletion(m.getUniqueId());
+            long id = m.getUniqueId();
+            noteReception(id, 0, "complete");
+            noteCompletion(id);
             _receiver.receiveComplete(m, router, tunnelId);
         } catch (I2NPMessageException ime) {
             if (_log.shouldLog(Log.WARN)) {
@@ -565,13 +568,13 @@ class FragmentHandler {
         }
 
         public void timeReached() {
-            boolean removed = false;
+            boolean removed;
             synchronized (_fragmentedMessages) {
                 removed = (null != _fragmentedMessages.remove(Long.valueOf(_msg.getMessageId())));
             }
             synchronized (_msg) {
                 if (removed && !_msg.getReleased()) {
-                    _failed++;
+                    _failed.incrementAndGet();
                     noteFailure(_msg.getMessageId(), _msg.toString());
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Dropped incomplete fragmented message: " + _msg);