Make StanzaHandler use StanzaBroker instead of returning stanzas for reply
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java
index 24bcef8..3a48938 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java
@@ -33,27 +33,24 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
- * relays stanzas to a StanzaReceiver identified by an Entity
- * this relay is mostly for testing purposes
+ * relays stanzas to a StanzaReceiver identified by an Entity this relay is
+ * mostly for testing purposes
  */
 public class StanzaReceiverRelay implements StanzaRelay {
 
-    private final Map<Entity, StanzaReceiver> receiverMap = new HashMap<Entity, StanzaReceiver>();
+    private final Map<Entity, StanzaReceiver> receiverMap = new HashMap<>();
 
     private boolean exploitFailureStrategy = true;
 
-    private ServerRuntimeContext serverRuntimeContext = null;
-
     private int countRelayed = 0;
 
     private int countFailed = 0;
 
     private int countDelivered = 0;
-    
+
     private final AtomicBoolean acceptingMode = new AtomicBoolean(true);
-    
+
     public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
-        this.serverRuntimeContext = serverRuntimeContext;
     }
 
     /**
@@ -63,8 +60,8 @@
         receiverMap.put(receiverID, receiver);
     }
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
-            throws DeliveryException {
+    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza,
+            DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException {
         if (!isRelaying()) {
             throw new ServiceNotAvailableException("relay is not relaying");
         }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandler.java
index c918627..95bdf77 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandler.java
@@ -117,6 +117,6 @@
             sessionContext.getResponseWriter().write(stanza);
         }
 
-        return null;
+        return Collections.emptyList();
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
index 4296f1e..14ef79a 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
@@ -24,11 +24,9 @@
 import org.apache.vysper.xmpp.addressing.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -62,15 +60,16 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
         boolean jabberNamespace = NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI());
 
         boolean clientCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_CLIENT);
         boolean serverCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_SERVER);
 
-        // TODO is it better to derive c2s or s2s from the type of endpoint and verify the namespace here?
+        // TODO is it better to derive c2s or s2s from the type of endpoint and verify
+        // the namespace here?
         if (clientCall && serverCall)
             serverCall = false; // silently ignore ambiguous attributes
         if (serverCall)
@@ -81,13 +80,15 @@
         if (sessionStateHolder.getState() != SessionState.INITIATED
                 && sessionStateHolder.getState() != SessionState.ENCRYPTED
                 && sessionStateHolder.getState() != SessionState.AUTHENTICATED) {
-            return respondUnsupportedStanzaType("unexpected stream start");
+            stanzaBroker.writeToSession(buildUnsupportedStanzaType("unexpected stream start"));
+            return;
         }
 
         // http://etherx.jabber.org/streams cannot be omitted
         if (!jabberNamespace) {
-            return respondIllegalNamespaceError("namespace is mandatory: "
-                    + NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS);
+            stanzaBroker.writeToSession(buildIllegalNamespaceError(
+                    "namespace is mandatory: " + NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS));
+            return;
         }
 
         // processing xml:lang
@@ -104,7 +105,9 @@
                 clientVersion = new XMPPVersion(versionAttributeValue);
             } catch (IllegalArgumentException e) {
                 // version string does not conform to spec
-                return respondUnsupportedVersionError(xmlLang, versionAttributeValue, "illegal version value: ");
+                stanzaBroker.writeToSession(
+                        buildUnsupportedVersionError(xmlLang, versionAttributeValue, "illegal version value: "));
+                return;
             }
             // check if version is supported
             if (!clientVersion.equals(XMPPVersion.VERSION_1_0)) {
@@ -113,8 +116,9 @@
                     responseVersion = XMPPVersion.VERSION_1_0;
                 } else {
                     // we do not support major changes, as of RFC3920
-                    return respondUnsupportedVersionError(xmlLang, versionAttributeValue,
-                            "major version change not supported: ");
+                    stanzaBroker.writeToSession(buildUnsupportedVersionError(xmlLang, versionAttributeValue,
+                            "major version change not supported: "));
+                    return;
                 }
             } else {
                 responseVersion = clientVersion;
@@ -133,16 +137,18 @@
                 try {
                     EntityImpl.parse(toValue);
                 } catch (EntityFormatException e) {
-                    return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
+                    stanzaBroker.writeToSession(ServerErrorResponses.getStreamError(
                             StreamErrorCondition.IMPROPER_ADDRESSING, sessionContext.getXMLLang(),
                             "could not parse incoming stanza's TO attribute", null));
-
+                    return;
                 }
                 // TODO check if toEntity is served by this server
                 // if (!server.doesServe(toEntity)) throw WhateverException();
 
-                // TODO RFC3920: 'from' attribute SHOULD be silently ignored by the receiving entity
-                // TODO RFC3920bis: 'from' attribute SHOULD be not ignored by the receiving entity and used as 'to' in responses
+                // TODO RFC3920: 'from' attribute SHOULD be silently ignored by the receiving
+                // entity
+                // TODO RFC3920bis: 'from' attribute SHOULD be not ignored by the receiving
+                // entity and used as 'to' in responses
             }
             responseStanza = new ServerResponses().getStreamOpenerForClient(sessionContext.getServerJID(),
                     responseVersion, sessionContext);
@@ -153,9 +159,9 @@
                 try {
                     EntityImpl.parse(fromValue);
                 } catch (EntityFormatException e) {
-                    return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
-                            StreamErrorCondition.INVALID_FROM, sessionContext.getXMLLang(),
-                            "could not parse incoming stanza's FROM attribute", null));
+                    stanzaBroker.writeToSession(ServerErrorResponses.getStreamError(StreamErrorCondition.INVALID_FROM,
+                            sessionContext.getXMLLang(), "could not parse incoming stanza's FROM attribute", null));
+                    return;
                 }
             }
 
@@ -164,7 +170,8 @@
         } else {
             String descriptiveText = "one of the two namespaces must be present: " + NamespaceURIs.JABBER_CLIENT
                     + " or " + NamespaceURIs.JABBER_SERVER;
-            return respondIllegalNamespaceError(descriptiveText);
+            stanzaBroker.writeToSession(buildIllegalNamespaceError(descriptiveText));
+            return;
         }
 
         // if all is correct, go to next phase
@@ -178,29 +185,26 @@
             sessionStateHolder.setState(SessionState.STARTED);
         }
 
-        if (responseStanza != null)
-            return new ResponseStanzaContainerImpl(responseStanza);
-
-        return null;
+        if (responseStanza == null) {
+            return;
+        }
+        stanzaBroker.writeToSession(responseStanza);
     }
 
-    private ResponseStanzaContainer respondIllegalNamespaceError(String descriptiveText) {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
-                StreamErrorCondition.INVALID_NAMESPACE, null, descriptiveText, null));
+    private Stanza buildIllegalNamespaceError(String descriptiveText) {
+        return ServerErrorResponses.getStreamError(StreamErrorCondition.INVALID_NAMESPACE, null, descriptiveText, null);
     }
 
-    private ResponseStanzaContainer respondUnsupportedStanzaType(String descriptiveText) {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
-                StreamErrorCondition.UNSUPPORTED_STANZA_TYPE, null, descriptiveText, null));
+    private Stanza buildUnsupportedStanzaType(String descriptiveText) {
+        return ServerErrorResponses.getStreamError(StreamErrorCondition.UNSUPPORTED_STANZA_TYPE, null, descriptiveText,
+                null);
     }
 
-    private ResponseStanzaContainer respondUnsupportedVersionError(String xmlLang, String versionAttributeValue,
-            String errorMessage) {
+    private Stanza buildUnsupportedVersionError(String xmlLang, String versionAttributeValue, String errorMessage) {
         if (xmlLang == null)
             xmlLang = "en_US";
-        Stanza error = ServerErrorResponses.getStreamError(StreamErrorCondition.UNSUPPORTED_VERSION,
-                xmlLang, errorMessage + versionAttributeValue, null);
-        return new ResponseStanzaContainerImpl(error);
+        return ServerErrorResponses.getStreamError(StreamErrorCondition.UNSUPPORTED_VERSION, xmlLang,
+                errorMessage + versionAttributeValue, null);
     }
 
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMLPrologHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMLPrologHandler.java
index ce82baf..f977884 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMLPrologHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMLPrologHandler.java
@@ -20,7 +20,6 @@
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
@@ -49,15 +48,13 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
+						boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
 
         String version = stanza.getAttributeValue("version");
         // TODO check version attribute and other attributes
         //        String encoding = stanza.getAttribute("encoding").getValue();
-
-        return null;
     }
 
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMPPCoreStanzaHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMPPCoreStanzaHandler.java
index 3d4f362..9cabdd1 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMPPCoreStanzaHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/XMPPCoreStanzaHandler.java
@@ -19,15 +19,15 @@
  */
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
+import java.util.List;
+
 import org.apache.vysper.xml.fragment.Attribute;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -38,8 +38,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-
 /**
  * foundation for the three core protocol stanzas: iq, message, presence
  *
@@ -50,8 +48,9 @@
     final static Logger logger = LoggerFactory.getLogger(XMPPCoreStanzaHandler.class);
 
     public boolean verify(Stanza stanza) {
-        if(stanza == null) return false;
-        
+        if (stanza == null)
+            return false;
+
         boolean typeVerified = verifyType(stanza);
         boolean namespaceVerified = verifyNamespace(stanza);
         return typeVerified && namespaceVerified;
@@ -64,13 +63,12 @@
     protected abstract boolean verifyType(Stanza stanza);
 
     protected boolean verifyNamespace(Stanza stanza) {
-        return NamespaceURIs.JABBER_CLIENT.equals(stanza.getNamespaceURI()) || 
-               NamespaceURIs.JABBER_SERVER.equals(stanza.getNamespaceURI());
+        return NamespaceURIs.JABBER_CLIENT.equals(stanza.getNamespaceURI())
+                || NamespaceURIs.JABBER_SERVER.equals(stanza.getNamespaceURI());
     }
 
-    public ResponseStanzaContainer execute(Stanza anyStanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, 
-                                           StanzaBroker stanzaBroker) {
+    public void execute(Stanza anyStanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         XMPPCoreStanza stanza = XMPPCoreStanza.getWrapper(anyStanza);
         if (stanza == null)
             throw new IllegalArgumentException("can only handle core XMPP stanzas (iq, message, presence)");
@@ -98,44 +96,53 @@
             // at this point, we are not allowed to respond with another error
             // we cannot really close the stream
             // we simply ignore it.
-            /*ResponseStanzaContainerImpl errorResponseContainer = new ResponseStanzaContainerImpl(
-                    ServerErrorResponses.getInstance().getErrorResponse(xmppCoreStanza,
-                            StanzaErrorType.MODIFY, StanzaErrorCondition.BAD_REQUEST,
-                            errorDescription,
-                            sessionContext.getXMLLang(), null)
-            );
-            return errorResponseContainer;*/
+            /*
+             * ResponseStanzaContainerImpl errorResponseContainer = new
+             * ResponseStanzaContainerImpl(
+             * ServerErrorResponses.getInstance().getErrorResponse(xmppCoreStanza,
+             * StanzaErrorType.MODIFY, StanzaErrorCondition.BAD_REQUEST, errorDescription,
+             * sessionContext.getXMLLang(), null) ); return errorResponseContainer;
+             */
         }
 
         Entity to = stanza.getTo();
         if (sessionContext != null && sessionContext.isServerToServer() && to == null) {
             // "to" MUST be present for jabber:server
-            return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
-                    StreamErrorCondition.IMPROPER_ADDRESSING, stanza.getXMLLang(), "missing to attribute", null));
+            stanzaBroker.writeToSession(ServerErrorResponses.getStreamError(StreamErrorCondition.IMPROPER_ADDRESSING,
+                    stanza.getXMLLang(), "missing to attribute", null));
+            return;
         }
 
         if (to != null) {
-            // TODO ensure, that RFC3920 9.1.1 "If the value of the 'to' attribute is invalid or cannot be contacted..." is enforced
+            // TODO ensure, that RFC3920 9.1.1 "If the value of the 'to' attribute is
+            // invalid or cannot be contacted..." is enforced
         }
 
-        List<Stanza> responseStanzas = executeCore(stanza, serverRuntimeContext, isOutboundStanza, sessionContext, stanzaBroker);
-        return new ResponseStanzaContainerImpl(responseStanzas);
+        List<Stanza> responseStanzas = executeCore(stanza, serverRuntimeContext, isOutboundStanza, sessionContext,
+                stanzaBroker);
+        if (responseStanzas == null) {
+            return;
+        }
+        responseStanzas.forEach(stanzaBroker::writeToSession);
     }
 
     protected abstract List<Stanza> executeCore(XMPPCoreStanza stanza, ServerRuntimeContext serverRuntimeContext,
-                                                boolean isOutboundStanza, SessionContext sessionContext, StanzaBroker stanzaBroker);
-    
+            boolean isOutboundStanza, SessionContext sessionContext, StanzaBroker stanzaBroker);
+
     /**
-     * Extracts the from address either from the "from" attribute of the stanza, if this isn't given
-     * retracts to using the address of the initiating entity plus the resource of the sessionContext (if available).
+     * Extracts the from address either from the "from" attribute of the stanza, if
+     * this isn't given retracts to using the address of the initiating entity plus
+     * the resource of the sessionContext (if available).
      * 
-     * A client might send a stanza without a 'from' attribute, if the sending (bare or full) entity can be determined
-     * from the context. such a missing from is determined here, if possible.
-     * for a formal discussion, see RFC3921bis/Resource Binding/Binding multiple resources/From Addresses
+     * A client might send a stanza without a 'from' attribute, if the sending (bare
+     * or full) entity can be determined from the context. such a missing from is
+     * determined here, if possible. for a formal discussion, see
+     * RFC3921bis/Resource Binding/Binding multiple resources/From Addresses
      * 
      * @param stanza
      * @param sessionContext
-     * @return The JID of the sender, either from the stanza or the context. A bare JID is returned if no, or more than one resource is bound.
+     * @return The JID of the sender, either from the stanza or the context. A bare
+     *         JID is returned if no, or more than one resource is bound.
      */
     public static Entity extractSenderJID(XMPPCoreStanza stanza, SessionContext sessionContext) {
         Entity from = stanza.getFrom();
@@ -147,16 +154,19 @@
     }
 
     /**
-     * Extracts the from address either from the "from" attribute of the stanza, if this isn't given
-     * retracts to using the address of the initiating entity plus the resource of the sessionContext.
+     * Extracts the from address either from the "from" attribute of the stanza, if
+     * this isn't given retracts to using the address of the initiating entity plus
+     * the resource of the sessionContext.
      * 
-     * A client might send a stanza without a 'from' attribute, if the sending (bare or full) entity can be determined
-     * from the context. such a missing from is determined here, if possible.
-     * for a formal discussion, see RFC3921bis/Resource Binding/Binding multiple resources/From Addresses
+     * A client might send a stanza without a 'from' attribute, if the sending (bare
+     * or full) entity can be determined from the context. such a missing from is
+     * determined here, if possible. for a formal discussion, see
+     * RFC3921bis/Resource Binding/Binding multiple resources/From Addresses
      * 
      * @param stanza
      * @param sessionContext
-     * @return The JID of the sender, either from the stanza or the context. If there is no, or multiple resources bound, it returns null.
+     * @return The JID of the sender, either from the stanza or the context. If
+     *         there is no, or multiple resources bound, it returns null.
      */
     public static Entity extractUniqueSenderJID(XMPPCoreStanza stanza, SessionContext sessionContext) {
         Entity from = stanza.getFrom();
@@ -170,13 +180,12 @@
             throw new RuntimeException("no 'from' attribute, and initiating entity not set");
         }
 
-        String resourceId = sessionContext.getServerRuntimeContext().getResourceRegistry().getUniqueResourceForSession(
-                sessionContext);
+        String resourceId = sessionContext.getServerRuntimeContext().getResourceRegistry()
+                .getUniqueResourceForSession(sessionContext);
         if (resourceId == null) {
-            logger
-                    .warn(
-                            "no 'from' attribute, and cannot uniquely determine sending resource for initiating entity {} in session {}",
-                            initiatingEntity.getFullQualifiedName(), sessionContext.getSessionId());
+            logger.warn(
+                    "no 'from' attribute, and cannot uniquely determine sending resource for initiating entity {} in session {}",
+                    initiatingEntity.getFullQualifiedName(), sessionContext.getSessionId());
             return null;
         }
 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AbstractAsyncIQGetHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AbstractAsyncIQGetHandler.java
index 2242c3f..372aeda 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AbstractAsyncIQGetHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AbstractAsyncIQGetHandler.java
@@ -19,6 +19,7 @@
  */
 package org.apache.vysper.xmpp.modules.core.base.handler.async;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Executor;
 
@@ -57,7 +58,7 @@
         switch (stanza.getIQType()) {
         case GET:
             executeGetIQLogicAsync(stanza, serverRuntimeContext, sessionContext);
-            return null; // IQ response is sent later
+            return Collections.emptyList(); // IQ response is sent later
 
             // all non-GET requests are handled synchronously, regardless of  
         case ERROR:
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java
index aa2d7b5..0997036 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java
@@ -20,7 +20,6 @@
 package org.apache.vysper.xmpp.modules.core.sasl.handler;
 
 import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -41,15 +40,15 @@
     }
 
     @Override
-    public ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext,
-            SessionStateHolder sessionStateHolder) {
+    public Stanza executeWorker(Stanza stanza, SessionContext sessionContext,
+                                SessionStateHolder sessionStateHolder) {
 
         AuthorizationRetriesCounter counter = AuthorizationRetriesCounter.getFromSession(sessionContext);
         boolean moreTriesLeft = counter.countFailedTry(); // record that client aborted
 
         // TODO do more clean-ups as mechanism requires.
 
-        return new ResponseStanzaContainerImpl(new ServerResponses().getAuthAborted());
+        return new ServerResponses().getAuthAborted();
     }
 
 }
\ No newline at end of file
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java
index 5d78a6d..75ec0e2 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java
@@ -23,11 +23,9 @@
 import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
 import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.protocol.exception.AuthenticationFailedException;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -49,13 +47,13 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
             throws AuthenticationFailedException {
         if (!AuthorizationRetriesCounter.getFromSession(sessionContext).hasTriesLeft()) {
             AuthenticationFailedException failedException = new AuthenticationFailedException("too many retries");
-            failedException.setErrorStanza(ServerErrorResponses.getStreamError(
-                    StreamErrorCondition.POLICY_VIOLATION, null, null, null));
+            failedException.setErrorStanza(
+                    ServerErrorResponses.getStreamError(StreamErrorCondition.POLICY_VIOLATION, null, null, null));
             throw failedException;
         }
 
@@ -63,25 +61,26 @@
         boolean saslNamespace = xmlElementVerifier.namespacePresent(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
 
         if (!saslNamespace) {
-            return respondSASLFailure();
+            stanzaBroker.writeToSession(buildSASLFailure());
+            return;
         }
-        // the session must be in status ENCRYPTED. HOWEVER, only if encryption is not required, SessionState.INITIATED
+        // the session must be in status ENCRYPTED. HOWEVER, only if encryption is not
+        // required, SessionState.INITIATED
         // is fine, too.
-        if (sessionStateHolder.getState() != SessionState.ENCRYPTED && 
-            !(sessionStateHolder.getState() != SessionState.INITIATED && 
-              !serverRuntimeContext.getServerFeatures().isStartTLSRequired())
-           ) {
-            return respondSASLFailure();
+        if (sessionStateHolder.getState() != SessionState.ENCRYPTED
+                && !(sessionStateHolder.getState() != SessionState.INITIATED
+                        && !serverRuntimeContext.getServerFeatures().isStartTLSRequired())) {
+            stanzaBroker.writeToSession(buildSASLFailure());
+            return;
         }
 
-        return executeWorker(stanza, sessionContext, sessionStateHolder);
+        stanzaBroker.writeToSession(executeWorker(stanza, sessionContext, sessionStateHolder));
     }
 
-    protected ResponseStanzaContainer respondSASLFailure() {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getSASLFailure(
-                SASLFailureType.MALFORMED_REQUEST));
+    protected Stanza buildSASLFailure() {
+        return ServerErrorResponses.getSASLFailure(SASLFailureType.MALFORMED_REQUEST);
     }
 
-    protected abstract ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext,
+    protected abstract Stanza executeWorker(Stanza stanza, SessionContext sessionContext,
             SessionStateHolder sessionStateHolder);
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
index c7213d0..60f7e2e 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
@@ -23,8 +23,6 @@
 
 import org.apache.vysper.xmpp.authentication.SASLMechanism;
 import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -44,11 +42,11 @@
     }
 
     @Override
-    protected ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext,
+    protected Stanza executeWorker(Stanza stanza, SessionContext sessionContext,
             SessionStateHolder sessionStateHolder) {
         String requestedMechanism = stanza.getAttributeValue("mechanism");
         if (requestedMechanism == null) {
-            return respondSASLFailure();
+            return buildSASLFailure();
         }
 
         SASLMechanism identifiedMechanism = null;
@@ -71,7 +69,7 @@
             AuthorizationRetriesCounter.getFromSession(sessionContext).countFailedTry();
         }
 
-        return new ResponseStanzaContainerImpl(responseStanza);
+        return responseStanza;
     }
 
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java
index 74d2de8..861c161 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java
@@ -21,11 +21,9 @@
 
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -54,16 +52,18 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
         boolean tlsNamespace = xmlElementVerifier.namespacePresent(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS);
 
         if (!tlsNamespace) {
-            return respondTLSFailure();
+            stanzaBroker.writeToSession(ServerErrorResponses.getTLSFailure());
+            return;
         }
         if (sessionStateHolder.getState() != SessionState.STARTED) {
-            return respondTLSFailure();
+            stanzaBroker.writeToSession(ServerErrorResponses.getTLSFailure());
+            return;
         }
 
         Stanza responseStanza = new ServerResponses().getTLSProceed();
@@ -73,10 +73,7 @@
 
         sessionContext.switchToTLS(true, false);
 
-        return new ResponseStanzaContainerImpl(responseStanza);
+        stanzaBroker.writeToSession(responseStanza);
     }
 
-    private ResponseStanzaContainer respondTLSFailure() {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getTLSFailure());
-    }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
index 9d7bbbd..8c467a1 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
@@ -23,11 +23,9 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -42,10 +40,9 @@
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 public class DbResultHandler implements StanzaHandler {
-    
+
     private static final Logger LOG = LoggerFactory.getLogger(DbResultHandler.class);
 
-    
     public String getName() {
         return "result";
     }
@@ -65,55 +62,49 @@
         return false;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
 
         String type = stanza.getAttributeValue("type");
-        
-        if(type == null) {
+
+        if (type == null) {
             // acting as the Receiving server
             // start of dailback, respond
             String streamId = sessionContext.getSessionId();
             String dailbackId = stanza.getInnerText().getText();
             Entity receiving = EntityImpl.parseUnchecked(stanza.getAttributeValue("from"));
             Entity originating = serverRuntimeContext.getServerEntity();
-            
+
             try {
-                XMPPServerConnector connector = serverRuntimeContext.getServerConnectorRegistry().connectForDialback(receiving, sessionContext, sessionStateHolder);
-                
+                XMPPServerConnector connector = serverRuntimeContext.getServerConnectorRegistry()
+                        .connectForDialback(receiving, sessionContext, sessionStateHolder);
+
                 /*
-                     <db:verify
-                      from='target.tld'
-                      id='417GAF25'
-                      to='sender.tld'>
-                       38b501ec606752318f72ad53de17ac6d15f86257485b0d8f5d54e1f619e6b869
-                     </db:verify>
+                 * <db:verify from='target.tld' id='417GAF25' to='sender.tld'>
+                 * 38b501ec606752318f72ad53de17ac6d15f86257485b0d8f5d54e1f619e6b869 </db:verify>
                  */
-                
+
                 StanzaBuilder verifyBuilder = new StanzaBuilder("verify", NamespaceURIs.JABBER_SERVER_DIALBACK, "db");
                 verifyBuilder.addAttribute("from", originating.getFullQualifiedName());
                 verifyBuilder.addAttribute("to", receiving.getFullQualifiedName());
                 verifyBuilder.addAttribute("id", sessionContext.getSessionId());
                 verifyBuilder.addText(dailbackId);
                 connector.write(verifyBuilder.build());
-                return null;
             } catch (Exception e) {
                 StanzaBuilder builder = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db");
                 builder.addAttribute("from", originating.getDomain());
                 builder.addAttribute("to", receiving.getDomain());
                 builder.addAttribute("type", "invalid");
-                return new ResponseStanzaContainerImpl(builder.build());
+                stanzaBroker.writeToSession(builder.build());
             }
         } else {
             // acting as the Originating server
             // receiving the result from the Receiving server
-            if("valid".equals(type)) {
+            if ("valid".equals(type)) {
                 sessionStateHolder.setState(SessionState.AUTHENTICATED);
                 Entity receiving = EntityImpl.parseUnchecked(stanza.getAttributeValue("from"));
                 LOG.info("XMPP server connector to {} authenticated using dialback", receiving);
-            } 
-
-            return null;
+            }
         }
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
index 36ee278..75865a4 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
@@ -23,11 +23,9 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
@@ -41,7 +39,7 @@
  */
 public class DbVerifyHandler implements StanzaHandler {
     private DialbackIdGenerator dailbackIdGenerator = new DialbackIdGenerator();
-    
+
     public String getName() {
         return "verify";
     }
@@ -61,63 +59,68 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-                                           boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
-        
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+
         String type = stanza.getAttributeValue("type");
         String id = stanza.getAttributeValue("id");
         Entity receiving = EntityImpl.parseUnchecked(stanza.getAttributeValue("from"));
         Entity originating = serverRuntimeContext.getServerEntity();
-        if(type == null) {
+        if (type == null) {
             // acting as a Authoritative server
             // getting asked for verification from the Receiving server
             String dailbackId = stanza.getInnerText().getText();
-            
+
             StanzaBuilder builder = new StanzaBuilder("verify", NamespaceURIs.JABBER_SERVER_DIALBACK, "db");
             builder.addAttribute("from", originating.getDomain());
             builder.addAttribute("to", receiving.getDomain());
             builder.addAttribute("id", id);
-            
-            if(dailbackIdGenerator.verify(dailbackId, receiving, originating, id)) {
+
+            if (dailbackIdGenerator.verify(dailbackId, receiving, originating, id)) {
                 builder.addAttribute("type", "valid");
             } else {
                 builder.addAttribute("type", "invalid");
             }
-            return new ResponseStanzaContainerImpl(builder.build());
+            stanzaBroker.writeToSession(builder.build());
+            return;
         } else {
             // acting as a Receiving server
             // getting a response from the Authoritative server
-            SessionStateHolder dialbackSessionStateHolder = (SessionStateHolder) sessionContext.getAttribute("DIALBACK_SESSION_STATE_HOLDER");
-            SessionContext dialbackSessionContext = (SessionContext) sessionContext.getAttribute("DIALBACK_SESSION_CONTEXT");
+            SessionStateHolder dialbackSessionStateHolder = (SessionStateHolder) sessionContext
+                    .getAttribute("DIALBACK_SESSION_STATE_HOLDER");
+            SessionContext dialbackSessionContext = (SessionContext) sessionContext
+                    .getAttribute("DIALBACK_SESSION_CONTEXT");
 
-//            XMPPServerConnector connector = serverRuntimeContext.getServerConnectorRegistry().getConnectorBySessionId(id);
-            
-//            if(connector != null) {
-//                SessionStateHolder dialbackSessionStateHolder = connector.getSessionStateHolder();
-//                SessionContext dialbackSessionContext = connector.getSessionContext();
-    
-                
-                Entity otherServer = sessionContext.getInitiatingEntity();
-                String resultType = "invalid";
-                // dialbackSessionContext must be non-null or someone is trying to send this stanza in the wrong state
-                if("valid".equals(type)) {
-                    dialbackSessionStateHolder.setState(SessionState.AUTHENTICATED);
-                    dialbackSessionContext.setInitiatingEntity(otherServer);
-                    resultType = "valid";
-                }
-                
-                // <db:result xmlns:db="jabber:server:dialback" to="xmpp.protocol7.com" from="jabber.org" type="valid"></db:result>
-                StanzaBuilder builder = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db");
-                builder.addAttribute("from", originating.getDomain());
-                builder.addAttribute("to", otherServer.getDomain());
-                builder.addAttribute("type", resultType);
-    
-                dialbackSessionContext.getResponseWriter().write(builder.build());
-//            }
-            
+            // XMPPServerConnector connector =
+            // serverRuntimeContext.getServerConnectorRegistry().getConnectorBySessionId(id);
+
+            // if(connector != null) {
+            // SessionStateHolder dialbackSessionStateHolder =
+            // connector.getSessionStateHolder();
+            // SessionContext dialbackSessionContext = connector.getSessionContext();
+
+            Entity otherServer = sessionContext.getInitiatingEntity();
+            String resultType = "invalid";
+            // dialbackSessionContext must be non-null or someone is trying to send this
+            // stanza in the wrong state
+            if ("valid".equals(type)) {
+                dialbackSessionStateHolder.setState(SessionState.AUTHENTICATED);
+                dialbackSessionContext.setInitiatingEntity(otherServer);
+                resultType = "valid";
+            }
+
+            // <db:result xmlns:db="jabber:server:dialback" to="xmpp.protocol7.com"
+            // from="jabber.org" type="valid"></db:result>
+            StanzaBuilder builder = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db");
+            builder.addAttribute("from", originating.getDomain());
+            builder.addAttribute("to", otherServer.getDomain());
+            builder.addAttribute("type", resultType);
+
+            dialbackSessionContext.getResponseWriter().write(builder.build());
+            // }
+
             // close this session as we are now done checking dialback
             sessionContext.endSession(SessionTerminationCause.CLIENT_BYEBYE);
-            return null;
         }
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ServiceUnavailableStanzaErrorHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ServiceUnavailableStanzaErrorHandler.java
index 53dece2..0349715 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ServiceUnavailableStanzaErrorHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ServiceUnavailableStanzaErrorHandler.java
@@ -45,9 +45,8 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
-            throws ProtocolException {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         if (!(stanza instanceof XMPPCoreStanza)) {
             stanza = XMPPCoreStanza.getWrapper(stanza);
         }
@@ -55,9 +54,8 @@
             throw new IllegalArgumentException("cannot coerce into a message, iq or presence stanza");
 
         XMPPCoreStanza coreStanza = (XMPPCoreStanza) stanza;
-        Stanza errorStanza = ServerErrorResponses.getStanzaError(
-                StanzaErrorCondition.SERVICE_UNAVAILABLE, coreStanza, StanzaErrorType.CANCEL,
-                "namespace not supported", null, null);
-        return new ResponseStanzaContainerImpl(errorStanza);
+        Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.SERVICE_UNAVAILABLE, coreStanza,
+                StanzaErrorType.CANCEL, "namespace not supported", null, null);
+        stanzaBroker.writeToSession(errorStanza);
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaBroker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaBroker.java
index 5a54b39..3398378 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaBroker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaBroker.java
@@ -45,11 +45,17 @@
     @Override
     public void write(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
             throws DeliveryException {
+        if (stanza == null) {
+            return;
+        }
         stanzaRelay.relay(sessionContext, receiver, stanza, deliveryFailureStrategy);
     }
 
     @Override
     public void writeToSession(Stanza stanza) {
+        if (stanza == null) {
+            return;
+        }
         if (sessionContext == null) {
             // TODO Move offline storage here?
             return;
@@ -71,13 +77,13 @@
         if (!stanzaRelay.equals(that.stanzaRelay)) {
             return false;
         }
-        return sessionContext.equals(that.sessionContext);
+        return sessionContext != null ? sessionContext.equals(that.sessionContext) : that.sessionContext == null;
     }
 
     @Override
     public int hashCode() {
         int result = stanzaRelay.hashCode();
-        result = 31 * result + sessionContext.hashCode();
+        result = 31 * result + (sessionContext != null ? sessionContext.hashCode() : 0);
         return result;
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
index 470f316..062d8ae 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
@@ -41,10 +41,9 @@
     }
 
     @Override
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-            boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder)
-            throws ProtocolException {
-        return stanzaHandler.execute(stanza, serverRuntimeContext, isOutboundStanza, sessionContext, sessionStateHolder,
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder) throws ProtocolException {
+        stanzaHandler.execute(stanza, serverRuntimeContext, isOutboundStanza, sessionContext, sessionStateHolder,
                 new SimpleStanzaBroker(stanzaRelay, sessionContext));
     }
 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
index d3c7b71..a2df28a 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
@@ -36,7 +36,7 @@
     /**
      * the stanza name handled by this handler
      */
-    public String getName();
+    String getName();
 
     /**
      * Allows to check the type of the handler by maintaining compatibility with
@@ -55,12 +55,12 @@
      * @param stanza
      * @return true, if it is processed, false otherwise
      */
-    public boolean verify(Stanza stanza);
+    boolean verify(Stanza stanza);
 
     /**
      * specifies if a session context is needed for this handler
      */
-    public boolean isSessionRequired();
+    boolean isSessionRequired();
 
     /**
      * executes a stanza
@@ -70,10 +70,8 @@
      *            the session belonging to the given sessionContext parameter.
      *            false, if the session is receiving the stanza targeted to the
      *            session's client.
-     * @return optionally returns a stanzaBroker which is passed to the session's
-     *         client
      */
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-            boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder,
-            StanzaBroker stanzaBroker) throws ProtocolException;
+    void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
+                 boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder,
+                 StanzaBroker stanzaBroker) throws ProtocolException;
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java
index 3526d70..4a19e64 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java
@@ -37,6 +37,6 @@
  * @author Réda Housni Alaoui
  */
 public interface StanzaHandlerExecutor {
-    ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+    void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
             SessionContext sessionContext, SessionStateHolder sessionStateHolder) throws ProtocolException;
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java
index af3c9f9..edcd9a6 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java
@@ -22,7 +22,6 @@
 import static java.util.Objects.requireNonNull;
 
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -41,8 +40,7 @@
 
     private final StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
 
-    protected AbstractStateAwareProtocolWorker(
-            StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory) {
+    protected AbstractStateAwareProtocolWorker(StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory) {
         this.stanzaHandlerExecutorFactory = requireNonNull(stanzaHandlerExecutorFactory);
     }
 
@@ -54,10 +52,7 @@
         if (!proceed)
             return; // TODO close stream?
 
-        ResponseStanzaContainer responseStanzaContainer = executeHandler(sessionContext, sessionStateHolder, stanza,
-                stanzaHandler);
-
-        writeResponse(sessionContext, responseStanzaContainer);
+        executeHandler(sessionContext, sessionStateHolder, stanza, stanzaHandler);
     }
 
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
@@ -65,29 +60,14 @@
         return 0 == getHandledState().compareTo(sessionContext.getState());
     }
 
-    protected void writeResponse(SessionContext sessionContext, ResponseStanzaContainer responseStanzaContainer) {
-        if (responseStanzaContainer == null) {
-            return;
-        }
-        if (sessionContext == null) {
-            throw new IllegalStateException(
-                    "no session context to write stanza to: " + responseStanzaContainer.getResponseStanzas());
-        }
-        ResponseWriter.writeResponse(sessionContext, responseStanzaContainer);
-    }
-
-    protected ResponseStanzaContainer executeHandler(SessionContext sessionContext,
-            SessionStateHolder sessionStateHolder, Stanza stanza, StanzaHandler stanzaHandler) {
-        ResponseStanzaContainer responseStanzaContainer;
+    private void executeHandler(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+            StanzaHandler stanzaHandler) {
         try {
-            responseStanzaContainer = stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza,
-                    sessionContext.getServerRuntimeContext(), isProcessingOutboundStanzas(), sessionContext,
-                    sessionStateHolder);
+            stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza, sessionContext.getServerRuntimeContext(),
+                    isProcessingOutboundStanzas(), sessionContext, sessionStateHolder);
         } catch (ProtocolException e) {
             ResponseWriter.handleProtocolError(e, sessionContext, stanza);
-            return null;
         }
-        return responseStanzaContainer;
     }
 
     protected boolean isProcessingOutboundStanzas() {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
index 0c60769..0699de4 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
@@ -48,11 +48,4 @@
         return false; // this worker is delivering inbound only
     }
 
-    @Override
-    protected void writeResponse(SessionContext sessionContext, ResponseStanzaContainer responseStanzaContainer) {
-        if (responseStanzaContainer == null) {
-            return;
-        }
-        ResponseWriter.writeResponse(sessionContext, responseStanzaContainer);
-    }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessor.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessor.java
index 36737ca..7ed26f9 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessor.java
@@ -23,8 +23,6 @@
 
 import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
@@ -69,20 +67,14 @@
             throw new RuntimeException("no handler for stanza");
         }
 
-        ResponseStanzaContainer responseStanzaContainer = null;
         try {
-            responseStanzaContainer = stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza,
-                    serverRuntimeContext, false, sessionContext, sessionStateHolder);
+            stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza, serverRuntimeContext, false,
+                    sessionContext, sessionStateHolder);
         } catch (ProtocolException e) {
             // TODO handle
             e.printStackTrace();
         }
 
-        if (responseStanzaContainer == null) {
-            return;
-        }
-        ResponseWriter.writeResponse(sessionContext, responseStanzaContainer);
-
     }
 
     public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
index 99d400c..bf9849e 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
@@ -47,7 +47,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DialbackIdGenerator;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
@@ -110,8 +109,8 @@
     protected final CountDownLatch authenticatedLatch = new CountDownLatch(1);
 
     public DefaultXMPPServerConnector(Entity remoteServer, ServerRuntimeContext serverRuntimeContext,
-                                      StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory, StanzaProcessor stanzaProcessor,
-                                      SessionContext dialbackSessionContext, SessionStateHolder dialbackSessionStateHolder) {
+            StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory, StanzaProcessor stanzaProcessor,
+            SessionContext dialbackSessionContext, SessionStateHolder dialbackSessionStateHolder) {
         this.serverRuntimeContext = serverRuntimeContext;
         this.stanzaProcessor = stanzaProcessor;
         this.stanzaHandlerExecutorFactory = stanzaHandlerExecutorFactory;
@@ -223,16 +222,12 @@
         StanzaHandler s2sHandler = lookupS2SHandler(stanza);
 
         if (s2sHandler != null) {
-            ResponseStanzaContainer container;
             try {
-                container = stanzaHandlerExecutorFactory.build(s2sHandler).execute(stanza, serverRuntimeContext,
-                        false, sessionContext, sessionStateHolder);
+                stanzaHandlerExecutorFactory.build(s2sHandler).execute(stanza, serverRuntimeContext, false,
+                        sessionContext, sessionStateHolder);
             } catch (ProtocolException e) {
                 return;
             }
-            if (container != null && container.hasResponse()) {
-                container.getResponseStanzas().forEach(sessionContext::write);
-            }
 
             if (sessionStateHolder.getState() == SessionState.AUTHENTICATED) {
                 LOG.info("XMPP server connector to {} authenticated", remoteServer);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java
index 78cd88e..35dcd2b 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java
@@ -23,11 +23,9 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DialbackIdGenerator;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -41,16 +39,18 @@
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 public class FeaturesHandler implements StanzaHandler {
-    
+
     private static final Logger LOG = LoggerFactory.getLogger(FeaturesHandler.class);
-    
+
     public String getName() {
         return "features";
     }
 
     public boolean verify(Stanza stanza) {
-        if (stanza == null) return false;
-        if (!getName().equals(stanza.getName())) return false;
+        if (stanza == null)
+            return false;
+        if (!getName().equals(stanza.getName()))
+            return false;
         String namespaceURI = stanza.getNamespaceURI();
         return namespaceURI.equals(NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS);
     }
@@ -59,38 +59,36 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
-        if(sessionStateHolder.getState() != SessionState.AUTHENTICATED) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+        if (sessionStateHolder.getState() != SessionState.AUTHENTICATED) {
             Entity otherServer = sessionContext.getInitiatingEntity();
-            
-            if(startTlsSupported(stanza) && serverRuntimeContext.getSslContext() != null) {
+
+            if (startTlsSupported(stanza) && serverRuntimeContext.getSslContext() != null) {
                 // remote server support TLS and we got keys set up
                 LOG.info("XMPP server connector to {} is starting TLS", otherServer);
-                Stanza startTlsStanza = new StanzaBuilder("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).build();
-                
-                return new ResponseStanzaContainerImpl(startTlsStanza);
-            } else if(dialbackSupported(stanza)) {
+                Stanza startTlsStanza = new StanzaBuilder("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS)
+                        .build();
+
+                stanzaBroker.writeToSession(startTlsStanza);
+            } else if (dialbackSupported(stanza)) {
                 Entity originating = serverRuntimeContext.getServerEntity();
 
-                String dailbackId = new DialbackIdGenerator().generate(otherServer, originating, sessionContext.getSessionId());
-                
+                String dailbackId = new DialbackIdGenerator().generate(otherServer, originating,
+                        sessionContext.getSessionId());
+
                 Stanza dbResult = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db")
-                    .addAttribute("from", originating.getDomain())
-                    .addAttribute("to", otherServer.getDomain())
-                    .addText(dailbackId)
-                    .build();
-                
-                return new ResponseStanzaContainerImpl(dbResult);
+                        .addAttribute("from", originating.getDomain()).addAttribute("to", otherServer.getDomain())
+                        .addText(dailbackId).build();
+
+                stanzaBroker.writeToSession(dbResult);
             } else {
                 // TODO how to handle
                 throw new RuntimeException("Unsupported features");
             }
         }
-        
-        return null;
     }
-    
+
     private boolean startTlsSupported(Stanza stanza) {
         return !stanza.getInnerElementsNamed("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).isEmpty();
     }
@@ -99,5 +97,4 @@
         return !stanza.getInnerElementsNamed("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).isEmpty();
     }
 
-
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java
index 6bb841d..4997d0c 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java
@@ -21,7 +21,6 @@
 package org.apache.vysper.xmpp.server.s2s;
 
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
@@ -55,13 +54,11 @@
         return true;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
+						boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker) {
         sessionStateHolder.setState(SessionState.ENCRYPTION_STARTED);
         
         LOG.debug("XMPP server connector switching to TLS");
         sessionContext.switchToTLS(false, true);
-
-        return null;
     }
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/IQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/IQHandlerTestCase.java
index 90783a5..135c873 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/IQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/IQHandlerTestCase.java
@@ -20,11 +20,9 @@
 
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -33,6 +31,8 @@
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanzaVerifier;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class IQHandlerTestCase extends TestCase {
@@ -57,9 +57,10 @@
         sessionContext.setServerToServer();
 
         TestIQHandler iqHandler = new TestIQHandler();
-        ResponseStanzaContainer responseStanzaContainer = iqHandler.execute(stanzaBuilder.build(), sessionContext
-                .getServerRuntimeContext(), true, sessionContext, null, null);
-        Stanza responseStanza = responseStanzaContainer.getUniqueResponseStanza();
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        iqHandler.execute(stanzaBuilder.build(), sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
+        Stanza responseStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
         XMLElementVerifier verifier = responseStanza.getVerifier();
         assertTrue("error", verifier.nameEquals("error"));
     }
@@ -76,18 +77,18 @@
         Stanza stanza = stanzaBuilder.build(); // this stanza has no ID
 
         IQHandler iqHandler = new IQHandler();
-        ResponseStanzaContainer responseStanzaContainer = iqHandler.execute(stanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, null, null);
-        Stanza responseStanza = responseStanzaContainer.getUniqueResponseStanza();
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        iqHandler.execute(stanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null, stanzaBroker);
+        Stanza responseStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
         XMLElementVerifier verifier = responseStanza.getVerifier();
         assertTrue("error", verifier.nameEquals("error")); // response is _not_ IQ stanza
     }
 
     private void assertIQError(Stanza stanza) {
         TestIQHandler iqHandler = new TestIQHandler();
-        ResponseStanzaContainer responseStanzaContainer = iqHandler.execute(stanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, null, null);
-        Stanza responseStanza = responseStanzaContainer.getUniqueResponseStanza();
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        iqHandler.execute(stanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null, stanzaBroker);
+        Stanza responseStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
         XMLElementVerifier verifier = responseStanza.getVerifier();
         assertTrue("iq", verifier.nameEquals("iq"));
         assertTrue("error type", verifier.attributeEquals("type", IQStanzaType.ERROR.value()));
@@ -149,8 +150,9 @@
         stanzaBuilder.startInnerElement("getRequest", NamespaceURIs.JABBER_CLIENT).endInnerElement();
 
         TestIQHandler iqHandler = new TestIQHandler();
-        ResponseStanzaContainer responseStanzaContainer = iqHandler.execute(stanzaBuilder.build(), sessionContext
-                .getServerRuntimeContext(), true, sessionContext, null, null);
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        iqHandler.execute(stanzaBuilder.build(), sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
         IQStanza incomingStanza = iqHandler.getIncomingStanza();
 
         XMPPCoreStanzaVerifier verifier = incomingStanza.getCoreVerifier();
@@ -159,7 +161,7 @@
         assertTrue("iq-type-get", verifier.attributeEquals("type", "get"));
 
         // response is "result"
-        Stanza responseStanza = responseStanzaContainer.getUniqueResponseStanza();
+        Stanza responseStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
         XMLElementVerifier responseVerifier = responseStanza.getVerifier();
         assertTrue("iq", responseVerifier.nameEquals("iq"));
         assertTrue("iq-id", responseVerifier.attributeEquals("id", "1"));
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
index 944d108..cdd6bf9 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
@@ -29,7 +29,6 @@
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.modules.core.TestUser;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.server.TestSessionContext;
@@ -92,8 +91,7 @@
         assertNull(senderUser.getNextStanza()); // nothing there yet
 
         Stanza stanza = stanzaBuilder.build();
-        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(stanza,
-                senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null,
+        messageHandler.execute(stanza, senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null,
                 new SimpleStanzaBroker(senderSessionContext.getStanzaRelay(), senderSessionContext));
 
         Stanza receivedStanza = receiverUser.getNextStanza();
@@ -120,15 +118,13 @@
         stanzaRelay.add(receiver, receiverQueue);
 
         Stanza successfulMessageStanza = StanzaBuilder.createMessageStanza(sender, receiver, "en", "info").build();
-        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(successfulMessageStanza,
-                senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null,
-                new SimpleStanzaBroker(stanzaRelay, senderSessionContext));
+        messageHandler.execute(successfulMessageStanza, senderSessionContext.getServerRuntimeContext(), true,
+                senderSessionContext, null, new SimpleStanzaBroker(stanzaRelay, senderSessionContext));
         assertEquals(successfulMessageStanza, receiverQueue.getNext());
 
         Stanza failureMessageStanza = StanzaBuilder.createMessageStanza(sender, noReceiver, "en", "info").build();
-        responseStanzaContainer = messageHandler.execute(failureMessageStanza,
-                senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null,
-                new SimpleStanzaBroker(stanzaRelay, senderSessionContext));
+        messageHandler.execute(failureMessageStanza, senderSessionContext.getServerRuntimeContext(), true,
+                senderSessionContext, null, new SimpleStanzaBroker(stanzaRelay, senderSessionContext));
         assertNull(receiverQueue.getNext());
         Stanza rejectionStanza = senderQueue.getNext();
         assertNotNull(rejectionStanza);
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandlerTestCase.java
index 2398e13..8db7188 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/RelayingIQHandlerTestCase.java
@@ -21,7 +21,7 @@
 
 import org.apache.vysper.xmpp.modules.core.im.handler.PresenceHandlerBaseTestCase;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -34,15 +34,23 @@
 
     protected RelayingIQHandler relayingIQHandler = new RelayingIQHandler();
 
+    private RecordingStanzaBroker stanzaBroker;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        stanzaBroker = new RecordingStanzaBroker(new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+    }
+
     public void testIQClientToClient_Outbound_NotSubscribed() {
         Stanza iqStanza = StanzaBuilder
                 .createIQStanza(initiatingUser.getEntityFQ(), unrelatedUser.getEntityFQ(), IQStanzaType.GET, "test")
                 .startInnerElement("mandatory", NamespaceURIs.JABBER_CLIENT).build();
 
-        ResponseStanzaContainer stanzaContainer = relayingIQHandler.execute(iqStanza,
-                sessionContext.getServerRuntimeContext(), true, sessionContext, null, new SimpleStanzaBroker(
-                        sessionContext.getStanzaRelay(), sessionContext)/* don't we have as sessionStateHolder? */);
-        XMPPCoreStanza response = XMPPCoreStanza.getWrapper(stanzaContainer.getUniqueResponseStanza());
+        relayingIQHandler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker/* don't we have as sessionStateHolder? */);
+        XMPPCoreStanza response = XMPPCoreStanza.getWrapper(stanzaBroker.getUniqueStanzaWrittenToSession());
         assertNotNull(response);
         assertTrue(response.isError());
     }
@@ -52,10 +60,9 @@
                 .createIQStanza(initiatingUser.getEntityFQ(), subscribed_FROM.getEntityFQ(), IQStanzaType.GET, "test")
                 .startInnerElement("mandatory", NamespaceURIs.JABBER_CLIENT).build();
 
-        ResponseStanzaContainer stanzaContainer = relayingIQHandler.execute(iqStanza,
-                sessionContext.getServerRuntimeContext(), true, sessionContext, null, new SimpleStanzaBroker(
-                        sessionContext.getStanzaRelay(), sessionContext) /* don't we have as sessionStateHolder? */);
-        assertFalse(stanzaContainer.hasResponse());
+        relayingIQHandler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker /* don't we have as sessionStateHolder? */);
+        assertFalse(stanzaBroker.hasStanzaWrittenToSession());
         Stanza deliveredStanza = subscribed_FROM.getNextStanza();
         assertTrue(deliveredStanza.getVerifier().onlySubelementEquals("mandatory", NamespaceURIs.JABBER_CLIENT));
         assertEquals(subscribed_FROM.getEntityFQ(), deliveredStanza.getTo());
@@ -66,10 +73,9 @@
                 .createIQStanza(subscribed_FROM.getEntityFQ(), initiatingUser.getEntityFQ(), IQStanzaType.GET, "test")
                 .startInnerElement("mandatory", NamespaceURIs.JABBER_CLIENT).build();
 
-        ResponseStanzaContainer stanzaContainer = relayingIQHandler.execute(iqStanza,
-                sessionContext.getServerRuntimeContext(), false, sessionContext, null, new SimpleStanzaBroker(
-                        sessionContext.getStanzaRelay(), sessionContext)/* don't we have as sessionStateHolder? */);
-        XMPPCoreStanza response = XMPPCoreStanza.getWrapper(stanzaContainer.getUniqueResponseStanza());
+        relayingIQHandler.execute(iqStanza, sessionContext.getServerRuntimeContext(), false, sessionContext, null,
+                stanzaBroker/* don't we have as sessionStateHolder? */);
+        XMPPCoreStanza response = XMPPCoreStanza.getWrapper(stanzaBroker.getUniqueStanzaWrittenToSession());
         assertNotNull(response);
         assertTrue(response.isError());
     }
@@ -79,10 +85,9 @@
                 .createIQStanza(subscribed_TO.getEntityFQ(), initiatingUser.getEntityFQ(), IQStanzaType.GET, "test")
                 .startInnerElement("mandatory", NamespaceURIs.JABBER_CLIENT).build();
 
-        ResponseStanzaContainer stanzaContainer = relayingIQHandler.execute(iqStanza,
-                sessionContext.getServerRuntimeContext(), false, sessionContext, null, new SimpleStanzaBroker(
-                        sessionContext.getStanzaRelay(), sessionContext)/* don't we have as sessionStateHolder? */);
-        assertFalse(stanzaContainer.hasResponse());
+        relayingIQHandler.execute(iqStanza, sessionContext.getServerRuntimeContext(), false, sessionContext, null,
+                stanzaBroker/* don't we have as sessionStateHolder? */);
+        assertFalse(stanzaBroker.hasStanzaWrittenToSession());
         Stanza deliveredStanza = sessionContext.getNextRecordedResponse();
         assertTrue(deliveredStanza.getVerifier().onlySubelementEquals("mandatory", NamespaceURIs.JABBER_CLIENT));
         assertEquals(initiatingUser.getEntityFQ(), deliveredStanza.getTo());
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AsyncIQGetHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AsyncIQGetHandlerTestCase.java
index 125bb9f..7224e7b 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AsyncIQGetHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/async/AsyncIQGetHandlerTestCase.java
@@ -24,11 +24,9 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -39,6 +37,8 @@
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 
+import junit.framework.TestCase;
+
 /**
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
@@ -49,10 +49,13 @@
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
 
+    private RecordingStanzaBroker stanzaBroker;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         sessionContext = new TestSessionContext(sessionStateHolder);
+        stanzaBroker = new RecordingStanzaBroker();
     }
 
     protected static final int SLEEP_INTERVAL = 50;
@@ -110,8 +113,8 @@
             return response;
         }
 
-        public XMPPCoreStanza get(long l, TimeUnit timeUnit) throws InterruptedException, ExecutionException,
-                TimeoutException {
+        public XMPPCoreStanza get(long l, TimeUnit timeUnit)
+                throws InterruptedException, ExecutionException, TimeoutException {
             return response;
         }
 
@@ -125,9 +128,10 @@
                     }
                 }
                 try {
-                    Stanza finalStanza = StanzaBuilder.createIQStanza(requestStanza.getTo(), requestStanza.getFrom(),
-                            IQStanzaType.RESULT, requestStanza.getID()).startInnerElement("success",
-                            NamespaceURIs.JABBER_CLIENT).endInnerElement().build();
+                    Stanza finalStanza = StanzaBuilder
+                            .createIQStanza(requestStanza.getTo(), requestStanza.getFrom(), IQStanzaType.RESULT,
+                                    requestStanza.getID())
+                            .startInnerElement("success", NamespaceURIs.JABBER_CLIENT).endInnerElement().build();
                     response = XMPPCoreStanza.getWrapper(finalStanza);
                 } catch (Throwable e) {
                     e.printStackTrace();
@@ -152,9 +156,9 @@
         stanzaBuilder.startInnerElement("query", NamespaceURIs.JABBER_CLIENT).endInnerElement();
         Stanza iqStanza = stanzaBuilder.build();
 
-        ResponseStanzaContainer container = asyncIQGetHandler.execute(iqStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
-        assertTrue(container == null || container.hasNoResponse());
+        asyncIQGetHandler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
+        assertFalse(stanzaBroker.hasStanzaWrittenToSession());
 
         TriggeredRunnableFuture runnableFuture = asyncIQGetHandler.getWaitingRunnableFuture();
         assertNotNull("future has been created", runnableFuture);
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/compatibility/jabber_iq_auth/handler/AuthCompatibilityIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/compatibility/jabber_iq_auth/handler/AuthCompatibilityIQHandlerTestCase.java
index 24480a8..b2389b3 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/compatibility/jabber_iq_auth/handler/AuthCompatibilityIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/compatibility/jabber_iq_auth/handler/AuthCompatibilityIQHandlerTestCase.java
@@ -23,9 +23,8 @@
 
 import org.apache.vysper.StanzaAssert;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaBroker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -33,6 +32,7 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.BindException;
+import org.junit.Before;
 import org.junit.Test;
 
 import junit.framework.Assert;
@@ -57,7 +57,7 @@
 
     private AuthCompatibilityIQHandler handler = new AuthCompatibilityIQHandler();
 
-    private StanzaBroker stanzaBroker = mock(StanzaBroker.class);
+    private RecordingStanzaBroker stanzaBroker;
 
     private Stanza buildStanza(String type) {
         return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "query", NamespaceURIs.JABBER_IQ_AUTH_COMPATIBILITY,
@@ -74,6 +74,11 @@
                 .startInnerElement(innerName, innerNamespaceUri).build();
     }
 
+    @Before
+    public void before() {
+        stanzaBroker = new RecordingStanzaBroker();
+    }
+
     @Test
     public void nameMustBeIq() {
         Assert.assertEquals("iq", handler.getName());
@@ -137,20 +142,21 @@
 
     @Test
     public void handleResult() throws BindException {
-        Assert.assertFalse(handler.execute(stanzaWithResult, serverRuntimeContext, false, sessionContext,
-                sessionStateHolder, stanzaBroker).hasResponse());
+        handler.execute(stanzaWithResult, serverRuntimeContext, false, sessionContext, sessionStateHolder,
+                stanzaBroker);
+
+        Assert.assertFalse(stanzaBroker.hasStanzaWrittenToSession());
     }
 
     @Test
     public void handleError() throws BindException {
-        Assert.assertFalse(handler
-                .execute(stanzaWithError, serverRuntimeContext, false, sessionContext, sessionStateHolder, stanzaBroker)
-                .hasResponse());
+        handler.execute(stanzaWithError, serverRuntimeContext, false, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Assert.assertFalse(stanzaBroker.hasStanzaWrittenToSession());
     }
 
     private void assertResponse(Stanza stanza) {
-        ResponseStanzaContainer response = handler.execute(stanza, serverRuntimeContext, false, sessionContext,
-                sessionStateHolder, stanzaBroker);
+        handler.execute(stanza, serverRuntimeContext, false, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expectedResponse = StanzaBuilder.createIQStanza(null, null, IQStanzaType.ERROR, "1")
                 .startInnerElement("query", NamespaceURIs.JABBER_IQ_AUTH_COMPATIBILITY).endInnerElement()
@@ -159,7 +165,7 @@
                 .endInnerElement().startInnerElement("text", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
                 .addAttribute(NamespaceURIs.XML, "lang", "en").addText("jabber:iq:auth not supported").build();
 
-        StanzaAssert.assertEquals(expectedResponse, response.getUniqueResponseStanza());
+        StanzaAssert.assertEquals(expectedResponse, stanzaBroker.getUniqueStanzaWrittenToSession());
     }
 
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java
index 458d9bb..786a502 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java
@@ -22,18 +22,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.commons.codec.binary.Base64;
 import org.apache.vysper.storage.OpenStorageProviderRegistry;
-import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.Plain;
 import org.apache.vysper.xmpp.authentication.SASLMechanism;
 import org.apache.vysper.xmpp.authentication.SimpleUserAuthentication;
 import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.exception.AuthenticationFailedException;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -42,6 +39,8 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class AbortHandlerTestCase extends TestCase {
@@ -55,7 +54,7 @@
         sessionContext = new TestSessionContext(sessionStateHolder);
         sessionContext.setSessionState(SessionState.ENCRYPTED);
 
-        List<SASLMechanism> methods = new ArrayList<SASLMechanism>();
+        List<SASLMechanism> methods = new ArrayList<>();
         methods.add(new Plain());
 
         sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
@@ -67,13 +66,11 @@
                 .setStorageProviderRegistry(providerRegistry);
     }
 
-    public void testAbort() throws XMLSemanticError, AuthenticationFailedException {
+    public void testAbort() throws AuthenticationFailedException {
 
         executeAbortAuthorization_3Times();
 
-        StanzaBuilder stanzaBuilder = createAbort();
-
-        stanzaBuilder = new StanzaBuilder("auth", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("auth", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
         stanzaBuilder.addAttribute("mechanism", "PLAIN");
         stanzaBuilder.addText(new String(Base64.encodeBase64("dummy\0user007\0pass007".getBytes())));
         Stanza authPlainStanza = stanzaBuilder.build();
@@ -81,8 +78,8 @@
         // correct credential no longer work - no retries left
         AuthHandler authHandler = new AuthHandler();
         try {
-            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                    .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+            authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                    sessionStateHolder, new RecordingStanzaBroker());
             fail("should raise error - no tries left");
         } catch (AuthenticationFailedException e) {
             // test succeeded
@@ -113,15 +110,14 @@
         Stanza abortStanza = stanzaBuilder.build();
 
         AbortHandler abortHandler = new AbortHandler();
-        ResponseStanzaContainer responseContainer = abortHandler.execute(abortStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
-        Stanza responseStanza = responseContainer.getUniqueResponseStanza();
-        return responseStanza;
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        abortHandler.execute(abortStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     private StanzaBuilder createAbort() {
-        StanzaBuilder stanzaBuilder = new StanzaBuilder("abort", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
-        return stanzaBuilder;
+        return new StanzaBuilder("abort", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
     }
 
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java
index a87d7f9..48bb44a 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java
@@ -22,8 +22,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.commons.codec.binary.Base64;
 import org.apache.vysper.storage.OpenStorageProviderRegistry;
 import org.apache.vysper.xml.fragment.XMLSemanticError;
@@ -33,7 +31,7 @@
 import org.apache.vysper.xmpp.authentication.SimpleUserAuthentication;
 import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.exception.AuthenticationFailedException;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -42,6 +40,8 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class AuthHandlerPlainMechanismTestCase extends TestCase {
@@ -52,10 +52,11 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+
         sessionContext = new TestSessionContext(sessionStateHolder);
         sessionContext.setSessionState(SessionState.ENCRYPTED);
 
-        List<SASLMechanism> methods = new ArrayList<SASLMechanism>();
+        List<SASLMechanism> methods = new ArrayList<>();
         methods.add(new Plain());
 
         sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
@@ -72,10 +73,11 @@
         Stanza authPlainStanza = stanzaBuilder.build();
 
         AuthHandler authHandler = new AuthHandler();
-        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
 
-        assertTrue(responseContainer.getUniqueResponseStanza().getVerifier().nameEquals("failure"));
+        assertTrue(stanzaBroker.getUniqueStanzaWrittenToSession().getVerifier().nameEquals("failure"));
         assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
     }
 
@@ -85,10 +87,11 @@
         Stanza authPlainStanza = stanzaBuilder.build();
 
         AuthHandler authHandler = new AuthHandler();
-        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
 
-        assertTrue(responseContainer.getUniqueResponseStanza().getVerifier().nameEquals("failure"));
+        assertTrue(stanzaBroker.getUniqueStanzaWrittenToSession().getVerifier().nameEquals("failure"));
         assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
     }
 
@@ -101,9 +104,10 @@
         assertEquals(3, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
 
         AuthHandler authHandler = new AuthHandler();
-        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
-        Stanza responseStanza = responseContainer.getUniqueResponseStanza();
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
+        Stanza responseStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         assertTrue(responseStanza.getVerifier().nameEquals("success"));
         assertTrue(sessionStateHolder.getState() == SessionState.AUTHENTICATED);
@@ -121,8 +125,9 @@
         // correct credential no longer work - no retries left
         AuthHandler authHandler = new AuthHandler();
         try {
-            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                    .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+            RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+            authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                    sessionStateHolder, stanzaBroker);
             fail("should raise error - no tries left");
         } catch (AuthenticationFailedException e) {
             // test succeeded
@@ -154,10 +159,10 @@
         Stanza authPlainStanza = stanzaBuilder.build();
 
         AuthHandler authHandler = new AuthHandler();
-        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
-        Stanza responseStanza = responseContainer.getUniqueResponseStanza();
-        return responseStanza;
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     private StanzaBuilder createAuthPlain() {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java
index c353af3..b9ffaa5 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java
@@ -23,12 +23,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.xmpp.authentication.Plain;
 import org.apache.vysper.xmpp.authentication.SASLMechanism;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.exception.AuthenticationFailedException;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -36,6 +34,8 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class AuthHandlerUnavailableMechanismTestCase extends TestCase {
@@ -43,6 +43,8 @@
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
 
+    private RecordingStanzaBroker stanzaBroker;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -53,6 +55,8 @@
         methods.add(new Plain());
 
         sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
 
     public void testAuthPlainWrongCase() throws AuthenticationFailedException {
@@ -62,8 +66,8 @@
 
         AuthHandler authHandler = new AuthHandler();
         try {
-            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                    .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+            authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                    sessionStateHolder, stanzaBroker);
 
             fail("should raise exception");
         } catch (RuntimeException e) {
@@ -78,8 +82,8 @@
 
         AuthHandler authHandler = new AuthHandler();
         try {
-            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext
-                    .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
+            authHandler.execute(authPlainStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                    sessionStateHolder, stanzaBroker);
 
             fail("should raise exception");
         } catch (RuntimeException e) {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/session/handler/SessionIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/session/handler/SessionIQHandlerTestCase.java
index 34877ac..902efbd 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/session/handler/SessionIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/session/handler/SessionIQHandlerTestCase.java
@@ -19,13 +19,12 @@
  */
 package org.apache.vysper.xmpp.modules.core.session.handler;
 
-import junit.framework.Assert;
-
 import org.apache.vysper.StanzaAssert;
 import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -38,44 +37,50 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import junit.framework.Assert;
+
 /**
  */
 public class SessionIQHandlerTestCase {
 
     private static final Entity FROM = EntityImpl.parseUnchecked("from@vysper.org");
+
     private static final Entity TO = EntityImpl.parseUnchecked("vysper.org");
 
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
     private SessionContext sessionContext = Mockito.mock(SessionContext.class);
+
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
-    
+
     private IQStanza verifyStanza = (IQStanza) IQStanza.getWrapper(buildStanza());
-    
+
     private SessionIQHandler handler = new SessionIQHandler();
-    
+
+    private RecordingStanzaBroker stanzaBroker;
+
     @Before
     public void before() {
         Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
         Mockito.when(sessionContext.getServerJID()).thenReturn(TO);
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
-    
-    
+
     private Stanza buildStanza() {
-        return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "session", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION);
+        return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "session",
+                NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION);
     }
 
     private Stanza buildStanza(String name, String namespaceUri) {
         return buildStanza(name, namespaceUri, "session", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION);
     }
-    
+
     private Stanza buildStanza(String name, String namespaceUri, String innerName, String innerNamespaceUri) {
-        return new StanzaBuilder(name, namespaceUri)
-            .addAttribute("type", "get")
-            .addAttribute("id", "1")
-            .startInnerElement(innerName, innerNamespaceUri)
-            .build();
+        return new StanzaBuilder(name, namespaceUri).addAttribute("type", "get").addAttribute("id", "1")
+                .startInnerElement(innerName, innerNamespaceUri).build();
     }
-    
+
     @Test
     public void nameMustBeIq() {
         Assert.assertEquals("iq", handler.getName());
@@ -110,10 +115,11 @@
     public void verifyInvalidInnerNamespace() {
         Assert.assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "session", "dummy")));
     }
-    
+
     @Test
     public void verifyInvalidInnerName() {
-        Assert.assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION)));
+        Assert.assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy",
+                NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION)));
     }
 
     @Test
@@ -121,7 +127,7 @@
         Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT).build();
         Assert.assertFalse(handler.verify(stanza));
     }
-    
+
     @Test
     public void verifyValidStanza() {
         Assert.assertTrue(handler.verify(verifyStanza));
@@ -133,15 +139,16 @@
     }
 
     @Test
-    public void handleSet() throws BindException, XMLSemanticError {
+    public void handleSet() throws XMLSemanticError {
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
-            .startInnerElement("session", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("session", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SESSION).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, null, IQStanzaType.RESULT, "id1").build();
-        
+
         StanzaAssert.assertEquals(expected, response);
     }
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java
index cc246b6..80558c5 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java
@@ -20,17 +20,17 @@
 
 package org.apache.vysper.xmpp.modules.core.starttls.handler;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class StartTLSHandlerTestCase extends TestCase {
@@ -67,17 +67,17 @@
         responseStanza = executeStartTLSHandler(starttlsStanza, sessionContext);
         verifier = responseStanza.getVerifier();
         assertTrue("session state ready", verifier.nameEquals("proceed"));
-        assertEquals("session stat is encryption started", SessionState.ENCRYPTION_STARTED, sessionStateHolder
-                .getState());
+        assertEquals("session stat is encryption started", SessionState.ENCRYPTION_STARTED,
+                sessionStateHolder.getState());
         assertTrue("tls init", sessionContext.isSwitchToTLSCalled());
     }
 
     private Stanza executeStartTLSHandler(Stanza starttlsStanza, TestSessionContext sessionContext) {
         StartTLSHandler startTLSHandler = new StartTLSHandler();
-        ResponseStanzaContainer responseStanzaContainer = startTLSHandler.execute(starttlsStanza, sessionContext
-                .getServerRuntimeContext(), true, sessionContext, sessionStateHolder, null);
-        Stanza responseStanza = responseStanzaContainer.getUniqueResponseStanza();
-        return responseStanza;
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        startTLSHandler.execute(starttlsStanza, sessionContext.getServerRuntimeContext(), true, sessionContext,
+                sessionStateHolder, stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     public void testNamespace() {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataIQHandlerTestCase.java
index 82e5f08..9f426cb 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataIQHandlerTestCase.java
@@ -19,8 +19,6 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0049_privatedata;
 
-import junit.framework.Assert;
-
 import org.apache.vysper.StanzaAssert;
 import org.apache.vysper.xml.fragment.Renderer;
 import org.apache.vysper.xml.fragment.XMLElement;
@@ -29,6 +27,7 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -41,35 +40,45 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import junit.framework.Assert;
+
 /**
  */
 public class PrivateDataIQHandlerTestCase {
 
     private static final String NS = "http://example.com";
+
     private static final Entity FROM = EntityImpl.parseUnchecked("from@vysper.org");
+
     private static final Entity TO = EntityImpl.parseUnchecked("vysper.org");
 
     private static final String KEY = "foo-http-//example.com";
-    
+
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
     private SessionContext sessionContext = Mockito.mock(SessionContext.class);
+
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+
     private PrivateDataPersistenceManager persistenceManager = Mockito.mock(PrivateDataPersistenceManager.class);
-    
+
     private IQStanza verifyStanza = (IQStanza) IQStanza.getWrapper(buildStanza());
-    
+
     private PrivateDataIQHandler handler = new PrivateDataIQHandler();
-    
+
+    private RecordingStanzaBroker stanzaBroker;
+
     @Before
     public void before() {
         Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
-        
+
         Mockito.when(persistenceManager.getPrivateData(FROM, KEY)).thenReturn("<bar xmlns=\"http://example.com\" />");
-        
+
         handler.setPersistenceManager(persistenceManager);
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
-    
-    
+
     private Stanza buildStanza() {
         return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "query", NamespaceURIs.PRIVATE_DATA);
     }
@@ -77,15 +86,12 @@
     private Stanza buildStanza(String name, String namespaceUri) {
         return buildStanza(name, namespaceUri, "query", NamespaceURIs.PRIVATE_DATA);
     }
-    
+
     private Stanza buildStanza(String name, String namespaceUri, String innerName, String innerNamespaceUri) {
-        return new StanzaBuilder(name, namespaceUri)
-            .addAttribute("type", "get")
-            .addAttribute("id", "1")
-            .startInnerElement(innerName, innerNamespaceUri)
-            .build();
+        return new StanzaBuilder(name, namespaceUri).addAttribute("type", "get").addAttribute("id", "1")
+                .startInnerElement(innerName, innerNamespaceUri).build();
     }
-    
+
     @Test
     public void nameMustBeIq() {
         Assert.assertEquals("iq", handler.getName());
@@ -120,10 +126,11 @@
     public void verifyInvalidInnerNamespace() {
         Assert.assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "query", "dummy")));
     }
-    
+
     @Test
     public void verifyInvalidInnerName() {
-        Assert.assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy", NamespaceURIs.PRIVATE_DATA)));
+        Assert.assertFalse(
+                handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy", NamespaceURIs.PRIVATE_DATA)));
     }
 
     @Test
@@ -131,7 +138,7 @@
         Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT).build();
         Assert.assertFalse(handler.verify(stanza));
     }
-    
+
     @Test
     public void verifyValidStanza() {
         Assert.assertTrue(handler.verify(verifyStanza));
@@ -145,121 +152,108 @@
     @Test
     public void handleGet() throws BindException, XMLSemanticError {
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("foo", NS)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Stanza expected = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.RESULT, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("bar", NS)
-            .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("bar", NS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
-    
+
     @Test
     public void handleGetNonExisting() throws BindException, XMLSemanticError {
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-        .startInnerElement("dummy", NS)
-        .addAttribute("attr", "attrval")
-        .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("dummy", NS)
+                .addAttribute("attr", "attrval").build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
         Stanza expected = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.RESULT, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-        .startInnerElement("dummy", NS)
-        .addAttribute("attr", "attrval")
-        .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("dummy", NS)
+                .addAttribute("attr", "attrval").build();
+
         StanzaAssert.assertEquals(expected, response);
     }
-    
+
     @Test
     public void handleGetWithoutInnerElement() throws BindException, XMLSemanticError {
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).endInnerElement()
-            .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-            .addAttribute("type", "modify")
-            .startInnerElement("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-            .build();
-            
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).endInnerElement()
+                .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "modify")
+                .startInnerElement("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
     @Test
     public void handleGetForOtherUser() throws BindException, XMLSemanticError {
         Entity other = EntityImpl.parseUnchecked("other@vysper.org");
-        
+
         Stanza request = StanzaBuilder.createIQStanza(FROM, other, IQStanzaType.GET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).endInnerElement()
-        .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-        .addAttribute("type", "cancel")
-        .addAttribute("code", "403")
-        .startInnerElement("forbidden", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-        .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).endInnerElement()
+                .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "cancel")
+                .addAttribute("code", "403")
+                .startInnerElement("forbidden", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
-    
+
     @Test
     public void handleGetWithoutPersitenceManager() throws BindException, XMLSemanticError {
         handler.setPersistenceManager(null);
-        
+
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-        .startInnerElement("foo", NS)
-        .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-        .startInnerElement("foo", NS).endInnerElement()
-        .endInnerElement()
-        .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-        .addAttribute("type", "wait")
-        .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-        .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).endInnerElement()
+                .endInnerElement().startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "wait")
+                .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
     @Test
     public void handleSet() throws BindException, XMLSemanticError {
-        XMLElement stored = new XMLElementBuilder("foo", NS)
-            .startInnerElement("fez", NS)
-            .build();
-        
-        String storedXml = new Renderer(stored).getComplete();
-        
-        Mockito.when(persistenceManager.setPrivateData(FROM, KEY, storedXml)).thenReturn(true);
-        
-        Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .addPreparedElement(stored)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+        XMLElement stored = new XMLElementBuilder("foo", NS).startInnerElement("fez", NS).build();
 
-        Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.RESULT, "id1")
-            .build();
-        
+        String storedXml = new Renderer(stored).getComplete();
+
+        Mockito.when(persistenceManager.setPrivateData(FROM, KEY, storedXml)).thenReturn(true);
+
+        Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).addPreparedElement(stored).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.RESULT, "id1").build();
+
         StanzaAssert.assertEquals(expected, response);
 
         Mockito.verify(persistenceManager).setPrivateData(FROM, KEY, storedXml);
@@ -268,85 +262,73 @@
     @Test
     public void handleSetWithoutPersistenceManager() throws BindException, XMLSemanticError {
         handler.setPersistenceManager(null);
-        
+
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("foo", NS)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("foo", NS).endInnerElement()
-            .endInnerElement()
-            .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-            .addAttribute("type", "wait")
-            .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-            .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).endInnerElement()
+                .endInnerElement().startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "wait")
+                .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
     @Test
     public void handleSetForOtherUser() throws BindException, XMLSemanticError {
         Entity other = EntityImpl.parseUnchecked("other@vysper.org");
-        
+
         Stanza request = StanzaBuilder.createIQStanza(FROM, other, IQStanzaType.SET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("foo", NS)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-        .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-        .startInnerElement("foo", NS).endInnerElement()
-        .endInnerElement()
-        .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-        .addAttribute("type", "cancel")
-        .addAttribute("code", "403")
-        .startInnerElement("forbidden", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-        .build();
-        
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).endInnerElement()
+                .endInnerElement().startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
+                .addAttribute("type", "cancel").addAttribute("code", "403")
+                .startInnerElement("forbidden", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
     @Test
     public void handleSetWithoutInnerElement() throws BindException, XMLSemanticError {
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .endInnerElement()
-            .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
-            .addAttribute("type", "modify")
-            .startInnerElement("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
-            .build();
-            
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).endInnerElement()
+                .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "modify")
+                .startInnerElement("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
     @Test
     public void handleSetFailedPersisting() throws BindException, XMLSemanticError {
         // persistence manager mock will always default to return false
-        
-        Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
-            .startInnerElement("query", NamespaceURIs.PRIVATE_DATA)
-            .startInnerElement("foo", NS)
-            .build();
-        
-        Stanza response = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
 
-        Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.ERROR, "id1")
-            .build();
-        
+        Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
+                .startInnerElement("query", NamespaceURIs.PRIVATE_DATA).startInnerElement("foo", NS).build();
+
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.ERROR, "id1").build();
+
         StanzaAssert.assertEquals(expected, response);
     }
 
-
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandlerTestCase.java
index bd4058f..23d46d2 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandlerTestCase.java
@@ -20,8 +20,8 @@
 package org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
-import org.apache.vysper.StanzaAssert;
 import org.apache.vysper.xml.fragment.Renderer;
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xml.fragment.XMLElementBuilder;
@@ -165,14 +165,12 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1").addPreparedElement(VCARD)
                 .build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.RESULT, "id1").addPreparedElement(VCARD)
                 .build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -182,14 +180,12 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
                 .startInnerElement("vCard", NamespaceURIs.VCARD_TEMP).build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.RESULT, "id1")
                 .startInnerElement("vCard", NamespaceURIs.VCARD_TEMP).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -197,14 +193,12 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, OTHER, IQStanzaType.GET, "id1")
                 .startInnerElement("vCard", NamespaceURIs.VCARD_TEMP).build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(OTHER, FROM, IQStanzaType.RESULT, "id1")
                 .addPreparedElement(OTHER_VCARD).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -214,16 +208,14 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.GET, "id1")
                 .startInnerElement("vCard", NamespaceURIs.VCARD_TEMP).build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
                 .startInnerElement("vCard", NamespaceURIs.VCARD_TEMP).endInnerElement()
                 .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "wait")
                 .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -233,13 +225,11 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1").addPreparedElement(VCARD)
                 .build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.RESULT, "id1").build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
 
         Mockito.verify(persistenceManager).setVcard(FROM, VCARD_STRING);
     }
@@ -251,15 +241,13 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1").addPreparedElement(VCARD)
                 .build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1").addPreparedElement(VCARD)
                 .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "wait")
                 .startInnerElement("internal-server-error", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -267,16 +255,14 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1")
                 .startInnerElement("dummy", NamespaceURIs.VCARD_TEMP).build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
                 .startInnerElement("dummy", NamespaceURIs.VCARD_TEMP).endInnerElement()
                 .startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "modify")
                 .startInnerElement("bad-request", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -284,16 +270,14 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, OTHER, IQStanzaType.SET, "id1")
                 .addPreparedElement(OTHER_VCARD).build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(TO, FROM, IQStanzaType.ERROR, "id1")
                 .addPreparedElement(OTHER_VCARD).startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
                 .addAttribute("type", "auth")
                 .startInnerElement("forbidden", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
     @Test
@@ -303,13 +287,11 @@
         Stanza request = StanzaBuilder.createIQStanza(FROM, FROM, IQStanzaType.SET, "id1").addPreparedElement(VCARD)
                 .build();
 
-        Stanza response = handler
-                .execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker)
-                .getUniqueResponseStanza();
+        handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expected = StanzaBuilder.createIQStanza(null, FROM, IQStanzaType.ERROR, "id1").build();
 
-        StanzaAssert.assertEquals(expected, response);
+        verify(stanzaBroker).writeToSession(expected);
     }
 
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep007_inbandreg/InBandRegistrationHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep007_inbandreg/InBandRegistrationHandlerTestCase.java
index 24b09e7..df1d5b7 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep007_inbandreg/InBandRegistrationHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep007_inbandreg/InBandRegistrationHandlerTestCase.java
@@ -27,6 +27,7 @@
 import org.apache.vysper.xmpp.authentication.AccountManagement;
 import org.apache.vysper.xmpp.modules.extension.xep0077_inbandreg.InBandRegistrationHandler;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -46,80 +47,90 @@
     private static final String IQ_ID = "id1";
 
     private AccountManagement accountManagement = Mockito.mock(AccountManagement.class);
+
     private SessionContext sessionContext = Mockito.mock(SessionContext.class);
+
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
     private SessionStateHolder sessionStateHolder = Mockito.mock(SessionStateHolder.class);
 
     private static final Entity FROM = EntityImpl.parseUnchecked("from@vysper.org");
+
     private static final Entity SERVER = EntityImpl.parseUnchecked("vysper.org");
+
     private static final Entity EXISTING = EntityImpl.parseUnchecked("existing@vysper.org");
 
     protected InBandRegistrationHandler handler = new InBandRegistrationHandler();
 
+    private RecordingStanzaBroker stanzaBroker;
+
     @Before
     public void before() {
         Mockito.when(serverRuntimeContext.getStorageProvider(AccountManagement.class)).thenReturn(accountManagement);
         Mockito.when(serverRuntimeContext.getServerEntity()).thenReturn(SERVER);
         Mockito.when(accountManagement.verifyAccountExists(EXISTING)).thenReturn(true);
         Mockito.when(sessionContext.getState()).thenReturn(SessionState.STARTED);
+        stanzaBroker = new RecordingStanzaBroker();
     }
-    
-    
+
     @Test
     public void testGetUnauthenticated() throws XMLSemanticError {
-        //        <iq type='get' id='reg1'>
-        //            <query xmlns='jabber:iq:register'/>
-        //        </iq>
+        // <iq type='get' id='reg1'>
+        // <query xmlns='jabber:iq:register'/>
+        // </iq>
         Stanza get = StanzaBuilder.createIQStanza(FROM, SERVER, IQStanzaType.GET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER).build();
-        
-        Stanza response = handler.execute(get, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER).build();
 
-        //        <iq type='result' id='reg1'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <instructions>
-        //                Choose a username and password for use with this service.
-        //                Please also provide your email address.
-        //              </instructions>
-        //              <username/>
-        //              <password/>
-        //              <email/>
-        //            </query>
-        //          </iq>
+        handler.execute(get, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        // <iq type='result' id='reg1'>
+        // <query xmlns='jabber:iq:register'>
+        // <instructions>
+        // Choose a username and password for use with this service.
+        // Please also provide your email address.
+        // </instructions>
+        // <username/>
+        // <password/>
+        // <email/>
+        // </query>
+        // </iq>
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
         Assert.assertEquals(IQ_ID, response.getAttributeValue("id"));
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(FROM.getFullQualifiedName(), response.getAttributeValue("to"));
-        
+
         XMLElement query = response.getSingleInnerElementsNamed("query", NamespaceURIs.JABBER_IQ_REGISTER);
         Assert.assertNotNull(query.getSingleInnerElementsNamed("instructions", NamespaceURIs.JABBER_IQ_REGISTER));
         Assert.assertNotNull(query.getSingleInnerElementsNamed("username", NamespaceURIs.JABBER_IQ_REGISTER));
         Assert.assertNotNull(query.getSingleInnerElementsNamed("password", NamespaceURIs.JABBER_IQ_REGISTER));
     }
-    
+
     @Test
     public void testGetAuthenticated() throws XMLSemanticError {
-        //        <iq type='get' id='reg1'>
-        //            <query xmlns='jabber:iq:register'/>
-        //        </iq>
+        // <iq type='get' id='reg1'>
+        // <query xmlns='jabber:iq:register'/>
+        // </iq>
         Stanza get = StanzaBuilder.createIQStanza(EXISTING, SERVER, IQStanzaType.GET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER).build();
-        
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER).build();
+
         Mockito.when(sessionContext.getState()).thenReturn(SessionState.AUTHENTICATED);
         Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(EXISTING);
 
-        Stanza response = handler.execute(get, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+        handler.execute(get, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
-        //        <iq type='result' id='reg1'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <registered/>
-        //              <username>juliet</username>
-        //              <password>R0m30</password>
-        //              <email>juliet@capulet.com</email>
-        //            </query>
-        //          </iq>
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        // <iq type='result' id='reg1'>
+        // <query xmlns='jabber:iq:register'>
+        // <registered/>
+        // <username>juliet</username>
+        // <password>R0m30</password>
+        // <email>juliet@capulet.com</email>
+        // </query>
+        // </iq>
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
@@ -127,31 +138,32 @@
         Assert.assertEquals("result", response.getAttributeValue("type"));
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(EXISTING.getFullQualifiedName(), response.getAttributeValue("to"));
-        
+
         XMLElement query = response.getSingleInnerElementsNamed("query", NamespaceURIs.JABBER_IQ_REGISTER);
         Assert.assertNotNull(query.getSingleInnerElementsNamed("registered", NamespaceURIs.JABBER_IQ_REGISTER));
-        assertInnerText(EXISTING.getNode(), "username", query); 
+        assertInnerText(EXISTING.getNode(), "username", query);
     }
 
     @Test
     public void testSet() throws XMLSemanticError, AccountCreationException {
-        //        <iq type='set' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>Calliope</password>
-        //              <email>bard@shakespeare.lit</email>
-        //            </query>
-        //          </iq>        
-      Stanza set = StanzaBuilder.createIQStanza(FROM, SERVER, IQStanzaType.SET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
-            .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(FROM.getNode()).endInnerElement()
-            .startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password").endInnerElement()
-            .endInnerElement()
-            .build();
-        
-        Stanza response = handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+        // <iq type='set' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>Calliope</password>
+        // <email>bard@shakespeare.lit</email>
+        // </query>
+        // </iq>
+        Stanza set = StanzaBuilder.createIQStanza(FROM, SERVER, IQStanzaType.SET, IQ_ID)
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
+                .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(FROM.getNode())
+                .endInnerElement().startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password")
+                .endInnerElement().endInnerElement().build();
 
-        //        <iq type='result' id='reg2'/>
+        handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        // <iq type='result' id='reg2'/>
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
@@ -160,38 +172,39 @@
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(FROM.getFullQualifiedName(), response.getAttributeValue("to"));
         Assert.assertEquals(0, response.getInnerElements().size());
-        
+
         Mockito.verify(accountManagement).addUser(FROM, "password");
     }
 
     @Test
     public void testSetExisting() throws XMLSemanticError, AccountCreationException {
-        //        <iq type='set' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>Calliope</password>
-        //              <email>bard@shakespeare.lit</email>
-        //            </query>
-        //          </iq>        
-      Stanza set = StanzaBuilder.createIQStanza(EXISTING, SERVER, IQStanzaType.SET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
-            .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(EXISTING.getNode()).endInnerElement()
-            .startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password").endInnerElement()
-            .endInnerElement()
-            .build();
-        
-        Stanza response = handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+        // <iq type='set' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>Calliope</password>
+        // <email>bard@shakespeare.lit</email>
+        // </query>
+        // </iq>
+        Stanza set = StanzaBuilder.createIQStanza(EXISTING, SERVER, IQStanzaType.SET, IQ_ID)
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
+                .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(EXISTING.getNode())
+                .endInnerElement().startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password")
+                .endInnerElement().endInnerElement().build();
 
-        //        <iq type='error' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>m1cro$oft</password>
-        //              <email>billg@bigcompany.com</email>
-        //            </query>
-        //            <error code='409' type='cancel'>
-        //              <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
-        //            </error>
-        //          </iq>
+        handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        // <iq type='error' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>m1cro$oft</password>
+        // <email>billg@bigcompany.com</email>
+        // </query>
+        // <error code='409' type='cancel'>
+        // <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+        // </error>
+        // </iq>
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
@@ -199,45 +212,47 @@
         Assert.assertEquals("error", response.getAttributeValue("type"));
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(EXISTING.getFullQualifiedName(), response.getAttributeValue("to"));
-     
+
         XMLElement query = response.getSingleInnerElementsNamed("query", NamespaceURIs.JABBER_IQ_REGISTER);
-        assertInnerText(EXISTING.getNode(), "username", query); 
-        assertInnerText("password", "password", query); 
+        assertInnerText(EXISTING.getNode(), "username", query);
+        assertInnerText("password", "password", query);
 
         XMLElement error = response.getSingleInnerElementsNamed("error", NamespaceURIs.JABBER_CLIENT);
         Assert.assertEquals("409", error.getAttributeValue("code"));
         Assert.assertEquals("cancel", error.getAttributeValue("type"));
-        Assert.assertNotNull(error.getSingleInnerElementsNamed("conflict", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS));
-        
+        Assert.assertNotNull(
+                error.getSingleInnerElementsNamed("conflict", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS));
+
         Mockito.verify(accountManagement, Mockito.never()).addUser(EXISTING, "password");
     }
 
     @Test
     public void testSetMissingPassword() throws XMLSemanticError, AccountCreationException {
-        //        <iq type='set' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>Calliope</password>
-        //              <email>bard@shakespeare.lit</email>
-        //            </query>
-        //          </iq>        
-      Stanza set = StanzaBuilder.createIQStanza(FROM, SERVER, IQStanzaType.SET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
-            .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(FROM.getNode()).endInnerElement()
-            .endInnerElement()
-            .build();
-        
-        Stanza response = handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, null).getUniqueResponseStanza();
+        // <iq type='set' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>Calliope</password>
+        // <email>bard@shakespeare.lit</email>
+        // </query>
+        // </iq>
+        Stanza set = StanzaBuilder.createIQStanza(FROM, SERVER, IQStanzaType.SET, IQ_ID)
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
+                .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(FROM.getNode())
+                .endInnerElement().endInnerElement().build();
 
-        //        <iq type='error' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>Calliope</password>
-        //            </query>
-        //            <error code='406' type='modify'>
-        //              <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
-        //            </error>
-        //          </iq>
+        handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        // <iq type='error' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>Calliope</password>
+        // </query>
+        // <error code='406' type='modify'>
+        // <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+        // </error>
+        // </iq>
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
@@ -245,41 +260,42 @@
         Assert.assertEquals("error", response.getAttributeValue("type"));
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(FROM.getFullQualifiedName(), response.getAttributeValue("to"));
-     
+
         XMLElement query = response.getSingleInnerElementsNamed("query", NamespaceURIs.JABBER_IQ_REGISTER);
-        assertInnerText(FROM.getNode(), "username", query); 
+        assertInnerText(FROM.getNode(), "username", query);
 
         XMLElement error = response.getSingleInnerElementsNamed("error", NamespaceURIs.JABBER_CLIENT);
         Assert.assertEquals("406", error.getAttributeValue("code"));
         Assert.assertEquals("modify", error.getAttributeValue("type"));
-        Assert.assertNotNull(error.getSingleInnerElementsNamed("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS));
-        
+        Assert.assertNotNull(
+                error.getSingleInnerElementsNamed("not-acceptable", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS));
+
         Mockito.verify(accountManagement, Mockito.never()).addUser(EXISTING, "password");
     }
 
     @Test
     public void testSetChangePassword() throws XMLSemanticError, AccountCreationException {
-        //        <iq type='set' id='reg2'>
-        //            <query xmlns='jabber:iq:register'>
-        //              <username>bill</username>
-        //              <password>Calliope</password>
-        //              <email>bard@shakespeare.lit</email>
-        //            </query>
-        //          </iq>        
+        // <iq type='set' id='reg2'>
+        // <query xmlns='jabber:iq:register'>
+        // <username>bill</username>
+        // <password>Calliope</password>
+        // <email>bard@shakespeare.lit</email>
+        // </query>
+        // </iq>
         Stanza set = StanzaBuilder.createIQStanza(EXISTING, SERVER, IQStanzaType.SET, IQ_ID)
-            .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
-            .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(EXISTING.getNode()).endInnerElement()
-            .startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password").endInnerElement()
-            .endInnerElement()
-            .build();
-        
+                .startInnerElement("query", NamespaceURIs.JABBER_IQ_REGISTER)
+                .startInnerElement("username", NamespaceURIs.JABBER_IQ_REGISTER).addText(EXISTING.getNode())
+                .endInnerElement().startInnerElement("password", NamespaceURIs.JABBER_IQ_REGISTER).addText("password")
+                .endInnerElement().endInnerElement().build();
+
         Mockito.when(sessionContext.getState()).thenReturn(SessionState.AUTHENTICATED);
         Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(EXISTING);
 
-        Stanza response = handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, null)
-                .getUniqueResponseStanza();
+        handler.execute(set, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
-        //        <iq type='result' id='reg2'/>
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
+
+        // <iq type='result' id='reg2'/>
         Assert.assertNotNull(response);
         Assert.assertEquals("iq", response.getName());
         Assert.assertEquals(NamespaceURIs.JABBER_CLIENT, response.getNamespaceURI());
@@ -288,19 +304,18 @@
         Assert.assertEquals(SERVER.getFullQualifiedName(), response.getAttributeValue("from"));
         Assert.assertEquals(EXISTING.getFullQualifiedName(), response.getAttributeValue("to"));
         Assert.assertEquals(0, response.getInnerElements().size());
-        
+
         Mockito.verify(accountManagement).changePassword(EXISTING, "password");
     }
 
-    
     private void assertInnerText(String expected, String name, XMLElement parent) {
         try {
-            Assert.assertEquals(expected, 
-                    parent.getSingleInnerElementsNamed(name, NamespaceURIs.JABBER_IQ_REGISTER).getInnerText().getText());
+            Assert.assertEquals(expected, parent.getSingleInnerElementsNamed(name, NamespaceURIs.JABBER_IQ_REGISTER)
+                    .getInnerText().getText());
         } catch (XMLSemanticError e) {
             Assert.fail("Incorrect number of elements: " + e.getMessage());
         }
-        
+
     }
 
 }
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandlerTestCase.java
index 9f25db5..f89adc9 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandlerTestCase.java
@@ -19,10 +19,12 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0199_xmppping;
 
+import static org.junit.Assert.assertFalse;
+
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -32,8 +34,6 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import static org.junit.Assert.assertFalse;
-
 /**
  */
 public class XmppPingIQHandlerTestCase {
@@ -50,14 +50,18 @@
 
     protected XmppPingIQHandler handler = new XmppPingIQHandler();
 
+    private RecordingStanzaBroker stanzaBroker;
+
     @Before
     public void before() throws Exception {
         sessionContext.setInitiatingEntity(client);
 
         boundClient = new EntityImpl(client, sessionContext.bindResource());
         server = sessionContext.getServerJID();
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
-    
+
     private Stanza buildStanza() {
         return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "ping", NamespaceURIs.URN_XMPP_PING);
     }
@@ -65,15 +69,12 @@
     private Stanza buildStanza(String name, String namespaceUri) {
         return buildStanza(name, namespaceUri, "ping", NamespaceURIs.URN_XMPP_PING);
     }
-    
+
     private Stanza buildStanza(String name, String namespaceUri, String innerName, String innerNamespaceUri) {
-        return new StanzaBuilder(name, namespaceUri)
-            .addAttribute("type", "get")
-            .addAttribute("id", "1")
-            .startInnerElement(innerName, innerNamespaceUri)
-            .build();
+        return new StanzaBuilder(name, namespaceUri).addAttribute("type", "get").addAttribute("id", "1")
+                .startInnerElement(innerName, innerNamespaceUri).build();
     }
-    
+
     @Test
     public void nameMustBeIq() {
         Assert.assertEquals("iq", handler.getName());
@@ -108,10 +109,11 @@
     public void verifyInvalidInnerNamespace() {
         assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "ping", "dummy")));
     }
-    
+
     @Test
     public void verifyInvalidInnerName() {
-        assertFalse(handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy", NamespaceURIs.URN_XMPP_PING)));
+        assertFalse(
+                handler.verify(buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy", NamespaceURIs.URN_XMPP_PING)));
     }
 
     @Test
@@ -119,7 +121,7 @@
         Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT).build();
         assertFalse(handler.verify(stanza));
     }
-    
+
     @Test
     public void verifyValidStanza() {
         Assert.assertTrue(handler.verify(buildStanza()));
@@ -127,49 +129,46 @@
 
     @Test
     public void verifyValidResultStanza() {
-        Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT)
-        .addAttribute("type", "result")
-        .addAttribute("id", "xmppping-1")
-        .build();
+        Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "result")
+                .addAttribute("id", "xmppping-1").build();
 
         Assert.assertTrue(handler.verify(stanza));
     }
 
     @Test
     public void verifyInvalidResultStanza() {
-        Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT)
-        .addAttribute("type", "result")
-        .addAttribute("id", "dummy-1")
-        .build();
-        
+        Stanza stanza = new StanzaBuilder("iq", NamespaceURIs.JABBER_CLIENT).addAttribute("type", "result")
+                .addAttribute("id", "dummy-1").build();
+
         assertFalse(handler.verify(stanza));
     }
-    
+
     @Test
     public void sessionIsRequired() {
         Assert.assertTrue(handler.isSessionRequired());
     }
 
-
     @Test
     public void clientToServerPing() {
-        // C: <iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='c2s1' type='get'>
-        //      <ping xmlns='urn:xmpp:ping'/>
-        //    </iq>
+        // C: <iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='c2s1'
+        // type='get'>
+        // <ping xmlns='urn:xmpp:ping'/>
+        // </iq>
         //
-        // S: <iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1' type='result'/>
+        // S: <iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1'
+        // type='result'/>
 
         StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(boundClient, server, IQStanzaType.GET, IQ_ID);
         stanzaBuilder.startInnerElement("ping", NamespaceURIs.URN_XMPP_PING).endInnerElement();
 
         Stanza requestStanza = stanzaBuilder.build();
-        ResponseStanzaContainer resp = handler.execute(requestStanza, sessionContext.getServerRuntimeContext(), true,
-                sessionContext, null, null);
+        handler.execute(requestStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
 
         // we should always get a response
-        Assert.assertTrue(resp.hasResponse());
+        Assert.assertTrue(stanzaBroker.hasStanzaWrittenToSession());
 
-        Stanza respStanza = resp.getUniqueResponseStanza();
+        Stanza respStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Assert.assertEquals("iq", respStanza.getName());
         Assert.assertEquals(boundClient, respStanza.getTo());
@@ -180,24 +179,24 @@
 
     @Test
     public void handleResult() {
-        // S: <iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1' type='result'/>
+        // S: <iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1'
+        // type='result'/>
 
         Stanza stanza = StanzaBuilder.createIQStanza(boundClient, server, IQStanzaType.RESULT, IQ_ID).build();
 
         XmppPinger pinger1 = Mockito.mock(XmppPinger.class);
         XmppPinger pinger2 = Mockito.mock(XmppPinger.class);
         XmppPinger pinger3 = Mockito.mock(XmppPinger.class);
-        
+
         handler.addPinger(pinger1);
         handler.addPinger(pinger2);
         handler.addPinger(pinger3);
         handler.removePinger(pinger3);
-        
-        ResponseStanzaContainer resp = handler.execute(stanza, sessionContext.getServerRuntimeContext(), true,
-                sessionContext, null, null);
 
-        assertFalse(resp.hasResponse());
-        
+        handler.execute(stanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null, stanzaBroker);
+
+        assertFalse(stanzaBroker.hasStanzaWrittenToSession());
+
         Mockito.verify(pinger1).pong(IQ_ID);
         Mockito.verify(pinger1).pong(IQ_ID);
         Mockito.verifyZeroInteractions(pinger3);
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java
index fed5e03..63e8727 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java
@@ -22,6 +22,7 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -40,6 +41,15 @@
 
     private DbVerifyHandler handler = new DbVerifyHandler();
 
+    private RecordingStanzaBroker stanzaBroker;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        stanzaBroker = new RecordingStanzaBroker();
+    }
+
     public void testVerify() {
         Stanza correct = new StanzaBuilder("verify", NamespaceURIs.JABBER_SERVER_DIALBACK).build();
         Stanza invalidNamespace = new StanzaBuilder("verify", "dummy").build();
@@ -48,6 +58,7 @@
         Assert.assertTrue(handler.verify(correct));
         Assert.assertFalse(handler.verify(invalidNamespace));
         Assert.assertFalse(handler.verify(invalidName));
+
     }
 
     public void testExecuteValidVerification() {
@@ -67,8 +78,9 @@
                 .addAttribute("from", FROM.getFullQualifiedName()).addAttribute("to", TO.getFullQualifiedName())
                 .addAttribute("id", ID).addText(token).build();
 
-        Stanza response = handler.execute(stanza, serverRuntimeContext, false, null, null, null)
-                .getUniqueResponseStanza();
+        handler.execute(stanza, serverRuntimeContext, false, null, null, stanzaBroker);
+
+        Stanza response = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         Assert.assertNotNull(response);
         Assert.assertEquals(TO, response.getFrom());
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandlerTestCase.java
index 5448dae..1473483 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandlerTestCase.java
@@ -19,10 +19,13 @@
  */
 package org.apache.vysper.xmpp.modules.roster.handler;
 
+import static org.mockito.Mockito.mock;
+
 import org.apache.vysper.storage.OpenStorageProviderRegistry;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.modules.roster.persistence.MemoryRosterManager;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaBroker;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
@@ -68,7 +71,7 @@
 
         assertEquals(ResourceState.CONNECTED, getResourceState());
         handler.execute(stanzaBuilder.build(), sessionContext.getServerRuntimeContext(), true, sessionContext, null,
-                null);
+                mock(StanzaBroker.class));
         assertEquals(ResourceState.CONNECTED_INTERESTED, getResourceState());
 
         // C: <iq from='juliet@example.com/balcony'
@@ -88,7 +91,7 @@
                 ResourceState.AVAILABLE);
 
         handler.execute(stanzaBuilder.build(), sessionContext.getServerRuntimeContext(), true, sessionContext, null,
-                null);
+                mock(StanzaBroker.class));
         assertEquals(ResourceState.AVAILABLE_INTERESTED, getResourceState());
     }
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandler.java b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandler.java
index 43d373d..6dfd9ce 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandler.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandler.java
@@ -85,15 +85,14 @@
         this.exception = exception;
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
+						boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
             throws ProtocolException {
         if (stanza == null || !stanza.getName().equals(getName()) || sessionContext == null)
             throw new RuntimeException("test failed");
         handlerCalled = true;
         if (exception != null)
             throw exception;
-        return null;
     }
 
     public void assertHandlerCalled() {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandlerResponse.java b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandlerResponse.java
index 7c9eea4..724c02f 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandlerResponse.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/CallTestStanzaHandlerResponse.java
@@ -20,13 +20,13 @@
 
 package org.apache.vysper.xmpp.protocol;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
-import java.util.Collections;
-import java.util.List;
-
 /**
  */
 public class CallTestStanzaHandlerResponse extends CallTestStanzaHandler implements ResponseStanzaContainer {
@@ -37,11 +37,11 @@
     }
 
     @Override
-    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
-										   boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
+    public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder sessionStateHolder, StanzaBroker stanzaBroker)
             throws ProtocolException {
         super.execute(stanza, serverRuntimeContext, true, sessionContext, null, stanzaBroker);
-        return new ResponseStanzaContainerImpl(getResponseStanzas());
+        getResponseStanzas().forEach(stanzaBroker::writeToSession);
     }
 
     public void setResponseStanza(Stanza response) {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/RecordingStanzaBroker.java b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/RecordingStanzaBroker.java
new file mode 100644
index 0000000..55b570a
--- /dev/null
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/RecordingStanzaBroker.java
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *  
+ */
+package org.apache.vysper.xmpp.protocol;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public class RecordingStanzaBroker implements StanzaBroker {
+
+    private final List<Stanza> stanzasWrittenToSession = new ArrayList<>();
+
+    private StanzaBroker delegate;
+
+    public RecordingStanzaBroker() {
+
+    }
+
+    public RecordingStanzaBroker(StanzaBroker delegate) {
+        this.delegate = delegate;
+    }
+
+    public Stanza getUniqueStanzaWrittenToSession() {
+        assertTrue(stanzasWrittenToSession.size() < 2);
+        return stanzasWrittenToSession.stream().findFirst().orElse(null);
+    }
+
+    public boolean hasStanzaWrittenToSession() {
+        return !stanzasWrittenToSession.isEmpty();
+    }
+
+    @Override
+    public void write(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+            throws DeliveryException {
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.write(receiver, stanza, deliveryFailureStrategy);
+    }
+
+    @Override
+    public void writeToSession(Stanza stanza) {
+        stanzasWrittenToSession.add(stanza);
+    }
+}
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessorTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessorTestCase.java
index f801ba9..eb35444 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessorTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/components/ComponentStanzaProcessorTestCase.java
@@ -19,14 +19,15 @@
  */
 package org.apache.vysper.xmpp.server.components;
 
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
-import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
-import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
@@ -40,11 +41,6 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 /**
  */
 public class ComponentStanzaProcessorTestCase {
@@ -67,11 +63,9 @@
 
     private Stanza responseStanza = StanzaBuilder.createMessageStanza(TO, FROM, null, "response").build();
 
-    private ResponseStanzaContainer container = new ResponseStanzaContainerImpl(responseStanza);
-
     private ComponentStanzaProcessor processor = new ComponentStanzaProcessor(
             new SimpleStanzaHandlerExecutorFactory(stanzaRelay));
-    
+
     private StanzaWriter sessionContextStanzaWriter;
 
     @Before
@@ -109,22 +103,17 @@
     }
 
     @Test
-    public void processSuccessfulWithResponse() throws ProtocolException, DeliveryException {
-        when(handler.execute(stanza, serverRuntimeContext, false, sessionContext, sessionStateHolder,
-                new SimpleStanzaBroker(stanzaRelay, sessionContext))).thenReturn(container);
-
+    public void processSuccessfulWithResponse() throws ProtocolException {
         processor.addHandler(handler);
 
         processor.processStanza(serverRuntimeContext, sessionContext, stanza, sessionStateHolder);
 
-        verify(sessionContextStanzaWriter).write(responseStanza);
+        verify(handler).execute(stanza, serverRuntimeContext, false, sessionContext, sessionStateHolder,
+                new SimpleStanzaBroker(stanzaRelay, sessionContext));
     }
 
     @Test
-    public void handlerThrowsException() throws ProtocolException, DeliveryException {
-        when(handler.execute(stanza, serverRuntimeContext, false, sessionContext, sessionStateHolder,
-                new SimpleStanzaBroker(stanzaRelay, sessionContext))).thenThrow(new ProtocolException());
-
+    public void handlerThrowsException() {
         processor.addHandler(handler);
 
         processor.processStanza(serverRuntimeContext, sessionContext, stanza, sessionStateHolder);
@@ -134,9 +123,12 @@
 
     @Test(expected = RuntimeException.class)
     public void processThenFailRelaying() throws ProtocolException {
-        when(handler.execute(stanza, serverRuntimeContext, false, sessionContext, sessionStateHolder,
-                new SimpleStanzaBroker(stanzaRelay, sessionContext))).thenReturn(container);
-        doThrow(new RuntimeException()).when(sessionContextStanzaWriter).write(responseStanza);
+        // when(handler.execute(stanza, serverRuntimeContext, false, sessionContext,
+        // sessionStateHolder,
+        // new SimpleStanzaBroker(stanzaRelay, sessionContext))).thenReturn(container);
+
+        doThrow(new RuntimeException()).when(handler).execute(stanza, serverRuntimeContext, false, sessionContext,
+                sessionStateHolder, new SimpleStanzaBroker(stanzaRelay, sessionContext));
 
         processor.addHandler(handler);
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandlerTestCase.java
index 570e0f8..93867ce 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandlerTestCase.java
@@ -27,9 +27,8 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.StanzaBroker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -57,7 +56,7 @@
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
 
-    private StanzaBroker stanzaBroker = mock(StanzaBroker.class);
+    private RecordingStanzaBroker stanzaBroker;
 
     @Before
     public void before() {
@@ -69,6 +68,8 @@
         Mockito.when(sessionContext.getSessionId()).thenReturn("session-id");
 
         sessionStateHolder.setState(SessionState.STARTED);
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
 
     @Test
@@ -116,12 +117,11 @@
                 .startInnerElement("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).endInnerElement()
                 .startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement().build();
 
-        ResponseStanzaContainer response = handler.execute(stanza, serverRuntimeContext, true, sessionContext,
-                sessionStateHolder, stanzaBroker);
+        handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
         Stanza expectedResponse = new StanzaBuilder("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).build();
 
-        StanzaAssert.assertEquals(expectedResponse, response.getUniqueResponseStanza());
+        StanzaAssert.assertEquals(expectedResponse, stanzaBroker.getUniqueStanzaWrittenToSession());
     }
 
     @Test
@@ -132,10 +132,9 @@
                 .startInnerElement("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).endInnerElement()
                 .startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement().build();
 
-        ResponseStanzaContainer response = handler.execute(stanza, serverRuntimeContext, true, sessionContext,
-                sessionStateHolder, stanzaBroker);
+        handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
-        assertDialbackStanza(response.getUniqueResponseStanza());
+        assertDialbackStanza(stanzaBroker.getUniqueStanzaWrittenToSession());
     }
 
     @Test
@@ -143,10 +142,9 @@
         Stanza stanza = new StanzaBuilder("features", NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS)
                 .startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement().build();
 
-        ResponseStanzaContainer response = handler.execute(stanza, serverRuntimeContext, true, sessionContext,
-                sessionStateHolder, stanzaBroker);
+        handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
 
-        assertDialbackStanza(response.getUniqueResponseStanza());
+        assertDialbackStanza(stanzaBroker.getUniqueStanzaWrittenToSession());
     }
 
     @Test
@@ -156,8 +154,9 @@
         Stanza stanza = new StanzaBuilder("features", NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS)
                 .startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement().build();
 
-        Assert.assertNull(
-                handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker));
+        handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Assert.assertFalse(stanzaBroker.hasStanzaWrittenToSession());
     }
 
     // TODO Is this the correct behavior?
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandlerTestCase.java
index 039d597..b217713 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandlerTestCase.java
@@ -21,12 +21,10 @@
 
 import javax.net.ssl.SSLContext;
 
-import junit.framework.Assert;
-
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -37,30 +35,40 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import junit.framework.Assert;
+
 /**
  */
 public class TlsProceedHandlerTestCase {
 
     private static final Entity FROM = EntityImpl.parseUnchecked("other.org");
+
     private static final Entity TO = EntityImpl.parseUnchecked("vysper.org");
 
     private TlsProceedHandler handler = new TlsProceedHandler();
+
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
     private SessionContext sessionContext = Mockito.mock(SessionContext.class);
+
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
 
+    private RecordingStanzaBroker stanzaBroker;
+
     @Before
     public void before() {
         SSLContext sslContext = Mockito.mock(SSLContext.class);
         Mockito.when(serverRuntimeContext.getSslContext()).thenReturn(sslContext);
         Mockito.when(serverRuntimeContext.getServerEntity()).thenReturn(TO);
-        
+
         Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
         Mockito.when(sessionContext.getSessionId()).thenReturn("session-id");
 
         sessionStateHolder.setState(SessionState.STARTED);
+
+        stanzaBroker = new RecordingStanzaBroker();
     }
-    
+
     @Test
     public void nameMustBeFeatures() {
         Assert.assertEquals("proceed", handler.getName());
@@ -103,13 +111,13 @@
     @Test
     public void execute() {
         Stanza stanza = new StanzaBuilder("proceed", NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS).build();
-        
-        ResponseStanzaContainer response = handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, null);
-        
-        Assert.assertNull(response);
+
+        handler.execute(stanza, serverRuntimeContext, true, sessionContext, sessionStateHolder, stanzaBroker);
+
+        Assert.assertFalse(stanzaBroker.hasStanzaWrittenToSession());
 
         Assert.assertEquals(SessionState.ENCRYPTION_STARTED, sessionStateHolder.getState());
-        
+
         Mockito.verify(sessionContext).switchToTLS(false, true);
     }
 
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractDiscoTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractDiscoTestCase.java
index dd84033..a49fbaa 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractDiscoTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractDiscoTestCase.java
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
 
+import static org.mockito.Mockito.mock;
+
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -26,7 +28,6 @@
 import org.apache.vysper.xmpp.modules.Module;
 import org.apache.vysper.xmpp.modules.core.base.handler.IQHandler;
 import org.apache.vysper.xmpp.modules.servicediscovery.collection.ServiceCollector;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.components.Component;
@@ -35,8 +36,6 @@
 
 import junit.framework.TestCase;
 
-import static org.mockito.Mockito.mock;
-
 /**
  * 
  * @author The Apache MINA Project (dev@mina.apache.org)
@@ -86,11 +85,10 @@
 
         StanzaBuilder request = buildRequest();
 
-        ResponseStanzaContainer resultStanzaContainer = infoIQHandler.execute(request.build(), serverRuntimeContext,
-                false, new TestSessionContext(serverRuntimeContext, new SessionStateHolder(),
-                        serverRuntimeContext.getStanzaRelay()),
-                null, null);
-        Stanza resultStanza = resultStanzaContainer.getUniqueResponseStanza();
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker();
+        infoIQHandler.execute(request.build(), serverRuntimeContext, false, new TestSessionContext(serverRuntimeContext,
+                new SessionStateHolder(), serverRuntimeContext.getStanzaRelay()), null, stanzaBroker);
+        Stanza resultStanza = stanzaBroker.getUniqueStanzaWrittenToSession();
 
         assertEquals("Disco request must not return error", "result", resultStanza.getAttributeValue("type"));
         XMLElement queryElement = resultStanza.getFirstInnerElement();
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java
index 762793f..b7f8c35 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java
@@ -37,13 +37,12 @@
 public abstract class AbstractMUCOccupantDiscoTestCase extends AbstractMUCHandlerTestCase {
 
     private Stanza sendDisco(Stanza stanza) throws ProtocolException {
-        ResponseStanzaContainer container = handler.execute(stanza, sessionContext.getServerRuntimeContext(), true,
-                sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+        RecordingStanzaBroker recordingStanzaBroker = new RecordingStanzaBroker(
+                new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+
+        handler.execute(stanza, sessionContext.getServerRuntimeContext(), true,
+                sessionContext, null, recordingStanzaBroker);
+        return recordingStanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     @Override
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/RecordingStanzaBroker.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/RecordingStanzaBroker.java
new file mode 100644
index 0000000..33aa46b
--- /dev/null
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/RecordingStanzaBroker.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *  
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
+import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public class RecordingStanzaBroker implements StanzaBroker {
+
+    private final List<Stanza> stanzasWrittenToSession = new ArrayList<>();
+
+    private StanzaBroker delegate;
+
+    public RecordingStanzaBroker() {
+
+    }
+
+    public RecordingStanzaBroker(StanzaBroker delegate) {
+        this.delegate = delegate;
+    }
+
+    public Stanza getUniqueStanzaWrittenToSession() {
+        assertTrue(stanzasWrittenToSession.size() < 2);
+        return stanzasWrittenToSession.stream().findFirst().orElse(null);
+    }
+
+    public boolean hasStanzaWrittenToSession() {
+        return !stanzasWrittenToSession.isEmpty();
+    }
+
+    @Override
+    public void write(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+            throws DeliveryException {
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.write(receiver, stanza, deliveryFailureStrategy);
+    }
+
+    @Override
+    public void writeToSession(Stanza stanza) {
+        stanzasWrittenToSession.add(stanza);
+    }
+
+}
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
index 1706766..40e15b1 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
@@ -31,6 +31,7 @@
 import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCFeatures;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.TestSessionContext;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
@@ -38,7 +39,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -271,13 +271,10 @@
         stanzaBuilder.endInnerElement();
 
         Stanza iqStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true,
-                sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null, stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
 }
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java
index 20c8d38..febacae 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java
@@ -24,10 +24,10 @@
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xml.fragment.XMLElementBuilder;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.MessageStanzaType;
@@ -61,13 +61,11 @@
         }
 
         Stanza messageStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(messageStanza, sessionContext.getServerRuntimeContext(),
-                true, sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(
+                new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(messageStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     protected void assertMessageErrorStanza(Stanza actualResponse, Entity expectedFrom, Entity expectedTo,
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java
index 2dd1883..27e46e7 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java
@@ -23,6 +23,7 @@
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
@@ -31,7 +32,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
@@ -49,13 +49,12 @@
 
         stanzaBuilder.endInnerElement();
         Stanza presenceStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(),
-                true, sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(
+                new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     @Override
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java
index 0c696ec..e5e44c7 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java
@@ -23,12 +23,12 @@
 
 import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -44,13 +44,10 @@
                 status);
 
         Stanza presenceStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(),
-                true, sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     @Override
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java
index 93fa7f6..ba37ca5 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java
@@ -26,6 +26,7 @@
 import org.apache.vysper.xml.fragment.XMLElementBuilder;
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.TestSessionContext;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.ConferenceTestUtils;
@@ -38,7 +39,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -77,14 +77,11 @@
             stanzaBuilder.addPreparedElement(new X(xInnerElms));
         }
         Stanza presenceStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(presenceStanza,
-                userSessionContext.getServerRuntimeContext(), true, userSessionContext, null,
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(
                 new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+        handler.execute(presenceStanza, userSessionContext.getServerRuntimeContext(), true, userSessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     protected TestSessionContext sessionContext2;
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ExitRoomTestCase.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ExitRoomTestCase.java
index bc684f2..1774684 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ExitRoomTestCase.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ExitRoomTestCase.java
@@ -24,13 +24,13 @@
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.ConferenceTestUtils;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
@@ -50,13 +50,11 @@
                 PresenceStanzaType.UNAVAILABLE, null, status);
 
         Stanza presenceStanza = stanzaBuilder.build();
-        ResponseStanzaContainer container = handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(),
-                true, sessionContext, null, new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
-        if (container != null) {
-            return container.getUniqueResponseStanza();
-        } else {
-            return null;
-        }
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(
+                new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     @Override
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/RecordingStanzaBroker.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/RecordingStanzaBroker.java
new file mode 100644
index 0000000..d742af8
--- /dev/null
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/RecordingStanzaBroker.java
@@ -0,0 +1,76 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
+import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
+import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaBroker;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public class RecordingStanzaBroker implements StanzaBroker {
+
+    private final List<Stanza> stanzasWrittenToSession = new ArrayList<>();
+
+    private StanzaBroker delegate;
+
+    public RecordingStanzaBroker() {
+
+    }
+
+    public RecordingStanzaBroker(StanzaBroker delegate) {
+        this.delegate = delegate;
+    }
+
+    public Stanza getUniqueStanzaWrittenToSession() {
+        assertTrue(stanzasWrittenToSession.size() < 2);
+        return stanzasWrittenToSession.stream().findFirst().orElse(null);
+    }
+
+    public boolean hasStanzaWrittenToSession() {
+        return !stanzasWrittenToSession.isEmpty();
+    }
+
+    @Override
+    public void write(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+            throws DeliveryException {
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.write(receiver, stanza, deliveryFailureStrategy);
+    }
+
+    @Override
+    public void writeToSession(Stanza stanza) {
+        stanzasWrittenToSession.add(stanza);
+    }
+}
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java
index bb0ffde..4193130 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java
@@ -19,6 +19,7 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub;
 
+import org.apache.vysper.RecordingStanzaBroker;
 import org.apache.vysper.storage.OpenStorageProviderRegistry;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -29,7 +30,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.storageprovider.CollectionNodeInMemoryStorageProvider;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.storageprovider.LeafNodeInMemoryStorageProvider;
 import org.apache.vysper.xmpp.modules.servicediscovery.collection.ServiceCollector;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -151,9 +151,11 @@
      */
     protected abstract AbstractStanzaGenerator getDefaultStanzaGenerator();
 
-    protected ResponseStanzaContainer sendStanza(Stanza toSend, boolean isOutboundStanza) {
-        return handler.execute(toSend, sessionContext.getServerRuntimeContext(), isOutboundStanza, sessionContext, null,
-                new SimpleStanzaBroker(relay, sessionContext));
+    protected Stanza sendStanza(Stanza toSend, boolean isOutboundStanza) {
+        RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
+        handler.execute(toSend, sessionContext.getServerRuntimeContext(), isOutboundStanza, sessionContext, null,
+                stanzaBroker);
+        return stanzaBroker.getUniqueStanzaWrittenToSession();
     }
 
     public void testSimpleStanza() {
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoInfoTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoInfoTestCase.java
index aed786a..72f3437 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoInfoTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoInfoTestCase.java
@@ -31,7 +31,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.modules.servicediscovery.handler.DiscoInfoIQHandler;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -53,9 +52,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -70,17 +69,21 @@
         // at least we have an identity and a feature element
         assertTrue(inner.size() >= 2);
 
-        // ordering etc. is unknown; step through all subelements and pick the ones we need
+        // ordering etc. is unknown; step through all subelements and pick the ones we
+        // need
         XMLElement identity = null;
         XMLElement feature = null;
         for (XMLElement el : inner) {
             if (el.getName().equals("identity")
-                    //&& el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) // TODO enable when the parser is fixed
+                    // && el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) //
+                    // TODO enable when the parser is fixed
                     && el.getAttributeValue("category").equals("pubsub")
                     && el.getAttributeValue("type").equals("service")) {
                 identity = el;
             } else if (el.getName().equals("feature")
-            /*&& el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)*/// TODO enable when the parser is fixed
+                    /* && el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) */// TODO enable when
+                                                                                                   // the parser is
+                                                                                                   // fixed
                     && el.getAttributeValue("var").equals(NamespaceURIs.XEP0060_PUBSUB)) {
                 feature = el;
             }
@@ -97,9 +100,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123", "news");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -114,12 +117,15 @@
         // at least we have an identity element
         assertTrue(inner.size() >= 1);
 
-        // ordering etc. is unknown; step through all subelements and pick the ones we need
+        // ordering etc. is unknown; step through all subelements and pick the ones we
+        // need
         XMLElement identity = null;
         for (XMLElement el : inner) {
             if (el.getName().equals("identity")
-            //&& el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) // TODO enable when the parser is fixed
-                    && el.getAttributeValue("category").equals("pubsub") && el.getAttributeValue("type").equals("leaf")) {
+                    // && el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) //
+                    // TODO enable when the parser is fixed
+                    && el.getAttributeValue("category").equals("pubsub")
+                    && el.getAttributeValue("type").equals("leaf")) {
                 identity = el;
             }
         }
@@ -135,7 +141,8 @@
         XMLElement[] elementList = collectFeatures(inner, featuresList);
 
         for (int idx = 0; idx < elementList.length; ++idx) {
-            assertNotNull(featuresList[idx], elementList[idx]); // add a more descriptive error message if the test fails
+            assertNotNull(featuresList[idx], elementList[idx]); // add a more descriptive error message if the test
+                                                                // fails
         }
     }
 
@@ -144,7 +151,8 @@
         Arrays.sort(features);
         for (XMLElement el : inner) {
             if (el.getName().equals("feature"))
-            /*&& el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)*/{ // TODO enable when the parser is fixed
+            /* && el.getNamespace().equals(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO) */ { // TODO enable when the
+                                                                                              // parser is fixed
                 int index = Arrays.binarySearch(features, el.getAttributeValue("var"));
                 if (index != -1) {
                     elementList[index] = el;
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoItemsTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoItemsTestCase.java
index 4e00508..127cba6 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoItemsTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/disco/PubSubDiscoItemsTestCase.java
@@ -31,7 +31,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.modules.servicediscovery.handler.DiscoItemIQHandler;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
@@ -54,9 +53,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -79,9 +78,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -126,9 +125,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123", "news");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -167,9 +166,9 @@
         DefaultDiscoInfoStanzaGenerator sg = (DefaultDiscoInfoStanzaGenerator) getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService.getBareJID(), "id123", "news");
 
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java
index 60c2dcd..d837eb7 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java
@@ -25,7 +25,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -72,9 +71,9 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
@@ -90,9 +89,9 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java
index 603cfec..9c9918c 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java
@@ -28,9 +28,9 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.BindException;
 
@@ -61,9 +61,9 @@
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
 
         node.subscribe("id", client);
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
@@ -95,12 +95,12 @@
         assertEquals(3, node.countSubscriptions());
 
         // publish a message
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id1", "news"), true);
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id1", "news"), true);
 
         // verify response
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
 
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
@@ -125,16 +125,15 @@
         DefaultPublishStanzaGenerator sg = new DefaultPublishStanzaGenerator();
         Entity pubsubWrongNode = EntityImpl.parse("pubsub.vysper.org");
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexist"),
-                true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexist"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -148,17 +147,16 @@
         DefaultPublishStanzaGenerator sg = new DefaultPublishStanzaGenerator();
         Entity yodaNotSubscribed = new EntityImpl("yoda", "vysper.org", "dagobah"); // yoda@vysper.org/dagobah
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(yodaNotSubscribed, pubsubService, "id123", "news"),
-                true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(yodaNotSubscribed, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
         assertEquals(0, node.countSubscriptions(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("auth", error.getAttributeValue("type"));
 
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java
index e83ae80..2826436 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java
@@ -70,11 +70,11 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client2, pubsubService, "id123", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("affiliations", sub.getName());
@@ -85,11 +85,11 @@
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("affiliations", sub.getName());
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveSubscriptionsTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveSubscriptionsTestCase.java
index 4e250ad..7e7b537 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveSubscriptionsTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveSubscriptionsTestCase.java
@@ -25,7 +25,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -67,11 +66,11 @@
     public void testNoSubscriptions() {
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("subscriptions", sub.getName());
@@ -87,11 +86,11 @@
         n3.subscribe("id126", client);
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("subscriptions", sub.getName());
@@ -107,11 +106,11 @@
         n3.subscribe("id126", client);
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", "Node1");
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("subscriptions", sub.getName());
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java
index c8cacb6..91866e1 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java
@@ -28,7 +28,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -62,9 +61,9 @@
     public void testSubscribe() throws Exception {
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         assertTrue(node.isSubscribed(client));
 
@@ -85,9 +84,9 @@
         sg.overrideSubscriberJID(client.getFullQualifiedName());
 
         Stanza stanza = sg.getStanza(null, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         assertTrue(node.isSubscribed(client));
 
@@ -107,15 +106,15 @@
         DefaultSubscribeStanzaGenerator sg = new DefaultSubscribeStanzaGenerator();
         sg.overrideSubscriberJID("someone@quite.dif/ferent");
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", testNode), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", testNode), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
 
@@ -132,15 +131,15 @@
         DefaultSubscribeStanzaGenerator sg = new DefaultSubscribeStanzaGenerator();
         sg.overrideSubscriberJID("@@");
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", testNode), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", testNode), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
 
@@ -154,16 +153,15 @@
         DefaultSubscribeStanzaGenerator sg = new DefaultSubscribeStanzaGenerator();
         Entity pubsubWrongNode = EntityImpl.parse("pubsub.vysper.org");
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexist"),
-                true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexist"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -185,6 +183,7 @@
 
         /**
          * Use this method to force a different subscriber JID.
+         * 
          * @param jid
          */
         public void overrideSubscriberJID(String jid) {
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java
index 35a3e38..4ce2647 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java
@@ -28,9 +28,9 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
 /**
@@ -60,6 +60,7 @@
 
         /**
          * Use this method to force a different subscriber JID.
+         * 
          * @param jid
          */
         public void overrideSubscriberJID(String jid) {
@@ -115,11 +116,11 @@
         assertTrue(node.isSubscribed(client));
 
         // unsubscribe via XMPP
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
 
         // check subscription and response stanza
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         assertFalse(node.isSubscribed(client));
     }
@@ -131,16 +132,16 @@
         node.subscribe("subid1", client);
         node.subscribe("subid2", client);
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertTrue(node.isSubscribed(client));
         assertEquals(2, node.countSubscriptions(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
 
@@ -157,16 +158,16 @@
         DefaultUnsubscribeStanzaGenerator sg = new DefaultUnsubscribeStanzaGenerator();
 
         assertFalse(node.isSubscribed(client));
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
         assertEquals(0, node.countSubscriptions(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -186,16 +187,16 @@
 
         node.subscribe("subid1", EntityImpl.parse(yoda));
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
         assertEquals(0, node.countSubscriptions(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("auth", error.getAttributeValue("type"));
 
@@ -209,16 +210,15 @@
         DefaultUnsubscribeStanzaGenerator sg = new DefaultUnsubscribeStanzaGenerator();
         Entity pubsubWrongNode = new EntityImpl(null, "pubsub.vysper.org", null);
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexsist"),
-                true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubWrongNode, "id123", "doesnotexsist"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -236,16 +236,16 @@
         node.subscribe("subid1", client);
         node.subscribe("subid2", client);
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertTrue(node.isSubscribed(client));
         assertEquals(2, node.countSubscriptions(client)); // still 2 subscriptions
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
 
@@ -262,15 +262,15 @@
         DefaultUnsubscribeStanzaGenerator sg = new DefaultUnsubscribeStanzaGenerator();
         sg.overrideSubscriberJID("@@");
 
-        ResponseStanzaContainer result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(sg.getStanza(client, pubsubService, "id123", "news"), true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
         assertFalse(node.isSubscribed(client));
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
 
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java
index 5d7cb0f..2b308cb 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java
@@ -29,7 +29,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.AbstractStanzaGenerator;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -86,9 +85,9 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
@@ -109,14 +108,14 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(clientNotAuthorized, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("auth", error.getAttributeValue("type"));
 
@@ -135,14 +134,14 @@
 
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerModifyAffiliationsTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerModifyAffiliationsTestCase.java
index efe5502..c7fdf17 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerModifyAffiliationsTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerModifyAffiliationsTestCase.java
@@ -30,7 +30,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.AbstractStanzaGenerator;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -74,16 +73,16 @@
         AbstractStanzaGenerator sg = new DefaultModifyAffiliationsStanzaGenerator("Node1", client,
                 PubSubAffiliation.MEMBER);
         Stanza stanza = sg.getStanza(client2, pubsubService, "id123", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("auth", error.getAttributeValue("type"));
 
@@ -100,14 +99,14 @@
         AbstractStanzaGenerator sg = new DefaultModifyAffiliationsStanzaGenerator("test", client,
                 PubSubAffiliation.MEMBER);
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -125,11 +124,11 @@
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         assertEquals("4711", response.getAttributeValue("id")); // IDs must match
 
@@ -147,11 +146,11 @@
                 client2, PubSubAffiliation.NONE);
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         assertEquals("4711", response.getAttributeValue("id")); // IDs must match
 
@@ -165,20 +164,20 @@
         assertEquals(PubSubAffiliation.MEMBER, n1.getAffiliation(client2));
         assertEquals(PubSubAffiliation.NONE, n1.getAffiliation(client3));
 
-        DefaultModifyAffiliationsStanzaGenerator sg = new DefaultModifyAffiliationsStanzaGenerator(n1.getName(),
-                client, PubSubAffiliation.NONE);
+        DefaultModifyAffiliationsStanzaGenerator sg = new DefaultModifyAffiliationsStanzaGenerator(n1.getName(), client,
+                PubSubAffiliation.NONE);
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("4711", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("modify", error.getAttributeValue("type"));
         assertEquals("not-acceptable", error.getFirstInnerElement().getName());
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
index 12eaad0..96d3043 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
@@ -30,7 +30,6 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.AbstractStanzaGenerator;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -70,16 +69,16 @@
 
         AbstractStanzaGenerator sg = new DefaultRetrieveAffiliationsStanzaGenerator("Node1");
         Stanza stanza = sg.getStanza(client2, pubsubService, "id123", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("auth", error.getAttributeValue("type"));
 
@@ -95,14 +94,14 @@
 
         AbstractStanzaGenerator sg = new DefaultRetrieveAffiliationsStanzaGenerator("test");
         Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
-        assertTrue(result.hasResponse());
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        Stanza result = sendStanza(stanza, true);
+        assertNotNull(result);
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.ERROR.value(), response.getType());
 
         assertEquals("id123", response.getAttributeValue("id")); // IDs must match
 
-        XMLElement error = response.getInnerElementsNamed("error").get(0); //jump directly to the error part
+        XMLElement error = response.getInnerElementsNamed("error").get(0); // jump directly to the error part
         assertEquals("error", error.getName());
         assertEquals("cancel", error.getAttributeValue("type"));
 
@@ -116,11 +115,11 @@
         AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
 
         Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
-        ResponseStanzaContainer result = sendStanza(stanza, true);
+        Stanza result = sendStanza(stanza, true);
 
-        assertTrue(result.hasResponse());
+        assertNotNull(result);
 
-        IQStanza response = new IQStanza(result.getUniqueResponseStanza());
+        IQStanza response = new IQStanza(result);
         assertEquals(IQStanzaType.RESULT.value(), response.getType());
         XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
         assertEquals("affiliations", sub.getName());