diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
index 9219bf519db9f6439d8809a71810df923047ef28..3be3eb764b6d870f77bc4d7b9536a8a4e88df017 100644
--- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
+++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
@@ -221,6 +221,11 @@ class TransientSessionKeyManager extends SessionKeyManager {
      *
      */
     public void tagsDelivered(PublicKey target, SessionKey key, Set sessionTags) {
+        if (_log.shouldLog(Log.DEBUG)) {
+            //_log.debug("Tags delivered to set " + set + " on session " + sess);
+            if (sessionTags.size() > 0)
+                _log.debug("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags);
+        }
         OutboundSession sess = getSession(target);
         if (sess == null) {
             createSession(target, key);
@@ -229,11 +234,6 @@ class TransientSessionKeyManager extends SessionKeyManager {
         sess.setCurrentKey(key);
         TagSet set = new TagSet(sessionTags, key, _context.clock().now());
         sess.addTags(set);
-        if (_log.shouldLog(Log.WARN)) {
-            //_log.debug("Tags delivered to set " + set + " on session " + sess);
-            if (sessionTags.size() > 0)
-                _log.warn("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags);
-        }
     }
 
     /**
@@ -696,7 +696,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
         public Set dropTags() {
             Set rv = null;
             synchronized (TagSet.this) {
-                rv = _sessionTags;
+                rv = new HashSet(_sessionTags);
                 _sessionTags = Collections.EMPTY_SET;
             }
             return rv;
@@ -707,12 +707,16 @@ class TransientSessionKeyManager extends SessionKeyManager {
         }
 
         public boolean contains(SessionTag tag) {
-            return _sessionTags.contains(tag);
+            synchronized (TagSet.this) {
+                return _sessionTags.contains(tag);
+            }
         }
 
         public void consume(SessionTag tag) {
             if (contains(tag)) {
-                _sessionTags.remove(tag);
+                synchronized (TagSet.this) {
+                    _sessionTags.remove(tag);
+                }
             }
         }
 
@@ -721,9 +725,11 @@ class TransientSessionKeyManager extends SessionKeyManager {
                 return null;
             }
 
-            SessionTag first = (SessionTag) _sessionTags.iterator().next();
-            _sessionTags.remove(first);
-            return first;
+            synchronized (TagSet.this) {
+                SessionTag first = (SessionTag) _sessionTags.iterator().next();
+                _sessionTags.remove(first);
+                return first;
+            }
         }
         
         public Exception getCreatedBy() { return _createdBy; }
diff --git a/history.txt b/history.txt
index daa055c895f75075ec939c0ac26dae09d30a87dc..c762e1a1e536774e7ace2e320b30c4063ccf1cc1 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,8 @@
-$Id: history.txt,v 1.208 2005/07/05 17:08:56 jrandom Exp $
+$Id: history.txt,v 1.209 2005/07/11 18:06:23 jrandom Exp $
+
+2005-07-12  jrandom
+    * Add some data duplication to avoid a recently injected concurrency problem 
+      in the session tag manager (thanks redzara and romster).
 
 2005-07-11  jrandom
     * Reduced the growth factor on the slow start and congestion avoidance for
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index dea8d7a2b726804ea86aa325bcde86dad1a0006c..626bef3aeab8ed442a5bfcb4c571b7884e8fe23b 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
  *
  */
 public class RouterVersion {
-    public final static String ID = "$Revision: 1.199 $ $Date: 2005/07/05 17:08:59 $";
+    public final static String ID = "$Revision: 1.200 $ $Date: 2005/07/11 18:06:24 $";
     public final static String VERSION = "0.5.0.7";
-    public final static long BUILD = 11;
+    public final static long BUILD = 12;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION);
         System.out.println("Router ID: " + RouterVersion.ID);