diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
index 3be3eb764b6d870f77bc4d7b9536a8a4e88df017..33cf4e7d6e00016d52baa8e08489f034f60d7bc6 100644
--- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
+++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
@@ -10,7 +10,6 @@ package net.i2p.crypto;
  */
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -221,10 +220,10 @@ class TransientSessionKeyManager extends SessionKeyManager {
      *
      */
     public void tagsDelivered(PublicKey target, SessionKey key, Set sessionTags) {
-        if (_log.shouldLog(Log.DEBUG)) {
+        if (_log.shouldLog(Log.WARN)) {
             //_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);
+                _log.warn("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags);
         }
         OutboundSession sess = getSession(target);
         if (sess == null) {
@@ -253,43 +252,43 @@ class TransientSessionKeyManager extends SessionKeyManager {
     public void tagsReceived(SessionKey key, Set sessionTags) {
         int overage = 0;
         TagSet tagSet = new TagSet(sessionTags, key, _context.clock().now());
+        TagSet old = null;
         for (Iterator iter = sessionTags.iterator(); iter.hasNext();) {
             SessionTag tag = (SessionTag) iter.next();
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Receiving tag " + tag + " for key " + key.toBase64() + " / " + key.toString() + ": tagSet: " + tagSet);
             synchronized (_inboundTagSets) {
-                Object old = _inboundTagSets.put(tag, tagSet);
+                old = (TagSet)_inboundTagSets.put(tag, tagSet);
                 overage = _inboundTagSets.size() - MAX_INBOUND_SESSION_TAGS;
                 if (old != null) {
-                    TagSet oldTS = (TagSet)old;
-                    if (!oldTS.getAssociatedKey().equals(tagSet.getAssociatedKey())) {
-                        if (_log.shouldLog(Log.WARN)) {
-                            _log.warn("Multiple tags matching!  tag: " + tag.toString() + " matches for new tagSet: " + tagSet + " and old tagSet: " + old);
-                            _log.warn("Earlier tag set creation: " + old + ": key=" + oldTS.getAssociatedKey().toBase64(), oldTS.getCreatedBy());
-                            _log.warn("Current tag set creation: " + tagSet + ": key=" + tagSet.getAssociatedKey().toBase64(), tagSet.getCreatedBy());
-                        }
-                        // drop both, rather than sit around confused
+                    if (!old.getAssociatedKey().equals(tagSet.getAssociatedKey())) {
                         _inboundTagSets.remove(tag);
-                        
-                        for (Iterator tsIter = oldTS.dropTags().iterator(); iter.hasNext(); ) {
-                            SessionTag curTag = (SessionTag)tsIter.next();
-                            _inboundTagSets.remove(curTag);
-                        }
-                        for (Iterator tsIter = tagSet.dropTags().iterator(); iter.hasNext(); ) {
-                            SessionTag curTag = (SessionTag)tsIter.next();
-                            _inboundTagSets.remove(curTag);
-                        }
-                    
+                        break;
                     } else {
-                        if (_log.shouldLog(Log.DEBUG)) {
-                            //tagSet.getTags().addAll(oldTS.getTags());
-                            _log.debug("Multiple tags matching, but equal keys (probably just a retransmission). tag: " + tag.toString() + " matches for new tagSet: " + tagSet + " and old tagSet: " + old);
-                            _log.debug("Earlier tag set creation: " + old + ": key=" + oldTS.getAssociatedKey().toBase64(), oldTS.getCreatedBy());
-                            _log.debug("Current tag set creation: " + tagSet + ": key=" + tagSet.getAssociatedKey().toBase64(), tagSet.getCreatedBy());
-                        }
+                        old = null; // ignore the dup
                     }
                 }
             }
+	}
+
+        if (old != null) {
+            // drop both old and tagSet tags
+            synchronized (_inboundTagSets) {
+                for (Iterator iter = old.getTags().iterator(); iter.hasNext(); ) {
+                    SessionTag tag = (SessionTag)iter.next();
+                    _inboundTagSets.remove(tag);
+                }
+                for (Iterator iter = sessionTags.iterator(); iter.hasNext(); ) {
+                    SessionTag tag = (SessionTag)iter.next();
+                    _inboundTagSets.remove(tag);
+                }
+            }
+
+            if (_log.shouldLog(Log.WARN)) {
+                _log.warn("Multiple tags matching!  tagSet: " + tagSet + " and old tagSet: " + old);
+                _log.warn("Earlier tag set creation: " + old + ": key=" + old.getAssociatedKey().toBase64(), old.getCreatedBy());
+                _log.warn("Current tag set creation: " + tagSet + ": key=" + tagSet.getAssociatedKey().toBase64(), tagSet.getCreatedBy());
+            }
         }
         
         if (overage > 0)
@@ -320,7 +319,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
         synchronized (_inboundTagSets) {
             for (Iterator iter = _inboundTagSets.values().iterator(); iter.hasNext(); ) {
                 TagSet set = (TagSet)iter.next();
-                int size = set.getTagCount();
+                int size = set.getTags().size();
                 if (size > 1000)
                     absurd++;
                 if (size > 100)
@@ -335,7 +334,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
             }
             for (int i = 0; i < removed.size(); i++) {
                 TagSet cur = (TagSet)removed.get(i);
-                for (Iterator iter = cur.dropTags().iterator(); iter.hasNext(); ) {
+                for (Iterator iter = cur.getTags().iterator(); iter.hasNext(); ) {
                     SessionTag tag = (SessionTag)iter.next();
                     _inboundTagSets.remove(tag);
                     tags++;
@@ -478,7 +477,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
             for (Iterator siter = sets.iterator(); siter.hasNext();) {
                 TagSet ts = (TagSet) siter.next();
                 buf.append("<li><b>Received on:</b> ").append(new Date(ts.getDate())).append(" with ")
-                   .append(ts.getTagCount()).append(" tags remaining</li>");
+                   .append(ts.getTags().size()).append(" tags remaining</li>");
             }
             buf.append("</ul></td></tr>");
         }
@@ -498,7 +497,9 @@ class TransientSessionKeyManager extends SessionKeyManager {
             buf.append("<tr><td><ul>");
             for (Iterator siter = sess.getTagSets().iterator(); siter.hasNext();) {
                 TagSet ts = (TagSet) siter.next();
-                buf.append("<li><b>Sent on:</b> ").append(new Date(ts.getDate())).append(" with ").append(ts.getTagCount())
+                buf.append("<li><b>Sent on:</b> ").append(new Date(ts.getDate())).append(" with ").append(
+                                                                                                          ts.getTags()
+                                                                                                            .size())
                    .append(" tags remaining</li>");
             }
             buf.append("</ul></td></tr>");
@@ -551,7 +552,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
                     _tagSets = new ArrayList();
                     for (int i = 0; i < sets.size(); i++) {
                         TagSet set = (TagSet) sets.get(i);
-                        dropped += set.getTagCount();
+                        dropped += set.getTags().size();
                     }
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Rekeyed from " + _currentKey + " to " + key 
@@ -615,7 +616,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
                 for (int i = 0; i < _tagSets.size(); i++) {
                     TagSet set = (TagSet) _tagSets.get(i);
                     if (set.getDate() + SESSION_TAG_DURATION_MS > now)
-                        tags += set.getTagCount();
+                        tags += set.getTags().size();
                 }
             }
             return tags;
@@ -631,7 +632,7 @@ class TransientSessionKeyManager extends SessionKeyManager {
             synchronized (_tagSets) {
                 for (Iterator iter = _tagSets.iterator(); iter.hasNext();) {
                     TagSet set = (TagSet) iter.next();
-                    if ( (set.getDate() > last) && (set.getTagCount() > 0) ) 
+                    if ( (set.getDate() > last) && (set.getTags().size() > 0) ) 
                         last = set.getDate();
                 }
             }
@@ -676,47 +677,22 @@ class TransientSessionKeyManager extends SessionKeyManager {
             _date = when;
         }
 
-        /** 
-         * raw tags still available - you MUST synchronize against the TagSet instance
-         * if you need to use this set
-         */
-        Set getTags() {
+        /** tags still available */
+        public Set getTags() {
             return _sessionTags;
         }
-        
-        public int getTagCount() {
-            synchronized (TagSet.this) {
-                if (_sessionTags == null)
-                    return 0;
-                else
-                    return _sessionTags.size();
-            }
-        }
-        
-        public Set dropTags() {
-            Set rv = null;
-            synchronized (TagSet.this) {
-                rv = new HashSet(_sessionTags);
-                _sessionTags = Collections.EMPTY_SET;
-            }
-            return rv;
-        }
 
         public SessionKey getAssociatedKey() {
             return _key;
         }
 
         public boolean contains(SessionTag tag) {
-            synchronized (TagSet.this) {
-                return _sessionTags.contains(tag);
-            }
+            return _sessionTags.contains(tag);
         }
 
         public void consume(SessionTag tag) {
             if (contains(tag)) {
-                synchronized (TagSet.this) {
-                    _sessionTags.remove(tag);
-                }
+                _sessionTags.remove(tag);
             }
         }
 
@@ -725,11 +701,9 @@ class TransientSessionKeyManager extends SessionKeyManager {
                 return null;
             }
 
-            synchronized (TagSet.this) {
-                SessionTag first = (SessionTag) _sessionTags.iterator().next();
-                _sessionTags.remove(first);
-                return first;
-            }
+            SessionTag first = (SessionTag) _sessionTags.iterator().next();
+            _sessionTags.remove(first);
+            return first;
         }
         
         public Exception getCreatedBy() { return _createdBy; }
@@ -750,4 +724,4 @@ class TransientSessionKeyManager extends SessionKeyManager {
                    && ts.getDate() == getDate();
         }
     }
-}
\ No newline at end of file
+}