diff --git a/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
index 2eb47f36b47ba264715667cc0c920fd0218fb318..6480733e12592955b50e0c36bbcc9fd7393ccb87 100644
--- a/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
+++ b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
@@ -1,6 +1,8 @@
 package net.i2p.client.impl;
 
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Map;
 
 import net.i2p.I2PAppContext;
@@ -59,13 +61,21 @@ public class I2PSessionDemultiplexer implements I2PSessionMuxedListener {
     }
 
     public void reportAbuse(I2PSession session, int severity) {
-        for (I2PSessionMuxedListener l : _listeners.values()) {
+        Collection<I2PSessionMuxedListener> lsnrs = _listeners.values();
+        // dedup
+        if (lsnrs.size() > 1)
+            lsnrs = new HashSet<I2PSessionMuxedListener>(lsnrs);
+        for (I2PSessionMuxedListener l : lsnrs) {
             l.reportAbuse(session, severity);
         }
     }
 
     public void disconnected(I2PSession session) {
-        for (I2PSessionMuxedListener l : _listeners.values()) {
+        Collection<I2PSessionMuxedListener> lsnrs = _listeners.values();
+        // dedup
+        if (lsnrs.size() > 1)
+            lsnrs = new HashSet<I2PSessionMuxedListener>(lsnrs);
+        for (I2PSessionMuxedListener l : lsnrs) {
             if (_log.shouldInfo())
                 _log.info("Sending disconnected() to " + l);
             l.disconnected(session);
@@ -73,7 +83,11 @@ public class I2PSessionDemultiplexer implements I2PSessionMuxedListener {
     }
 
     public void errorOccurred(I2PSession session, String message, Throwable error) {
-        for (I2PSessionMuxedListener l : _listeners.values()) {
+        Collection<I2PSessionMuxedListener> lsnrs = _listeners.values();
+        // dedup
+        if (lsnrs.size() > 1)
+            lsnrs = new HashSet<I2PSessionMuxedListener>(lsnrs);
+        for (I2PSessionMuxedListener l : lsnrs) {
             if (_log.shouldInfo())
                  _log.info("Sending errorOccurred() \"" + message + "\" to " + l);
             l.errorOccurred(session, message, error);