You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ra...@apache.org on 2019/09/01 10:53:02 UTC

[mina-vysper] branch master updated: Hide session stanza writer in a StanzaReceivingSessionContext sub-interface

This is an automated email from the ASF dual-hosted git repository.

ralaoui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-vysper.git


The following commit(s) were added to refs/heads/master by this push:
     new d6a9cb3  Hide session stanza writer in a StanzaReceivingSessionContext sub-interface
d6a9cb3 is described below

commit d6a9cb38ed9d184958109d5ac983f739cec06c9d
Author: Réda Housni Alaoui <re...@gmail.com>
AuthorDate: Sun Sep 1 12:52:54 2019 +0200

    Hide session stanza writer in a StanzaReceivingSessionContext sub-interface
---
 .../apache/vysper/mina/XmppIoHandlerAdapter.java   | 44 ++++++++++++----------
 .../vysper/xmpp/delivery/LocalDeliveryUtils.java   | 19 ++++++----
 .../vysper/xmpp/delivery/RecordingStanzaRelay.java |  4 +-
 .../vysper/xmpp/delivery/StanzaReceiverRelay.java  |  6 +--
 .../apache/vysper/xmpp/delivery/StanzaRelay.java   |  5 ++-
 .../vysper/xmpp/delivery/StanzaRelayBroker.java    |  4 +-
 .../DeliveringExternalInboundStanzaRelay.java      |  4 +-
 .../DeliveringInternalInboundStanzaRelay.java      | 22 +++++------
 .../vysper/xmpp/protocol/ProtocolWorker.java       | 22 +++++------
 .../xmpp/protocol/QueuedStanzaProcessor.java       | 15 ++++----
 .../vysper/xmpp/protocol/ResponseWriter.java       | 35 +++++------------
 .../vysper/xmpp/protocol/SimpleStanzaBroker.java   |  6 +--
 .../xmpp/protocol/SimpleStanzaHandlerExecutor.java |  4 +-
 .../xmpp/protocol/StanzaHandlerExecutor.java       |  4 +-
 .../vysper/xmpp/protocol/StanzaProcessor.java      |  7 ++--
 .../xmpp/protocol/StateAwareProtocolWorker.java    |  6 +--
 .../worker/AbstractStateAwareProtocolWorker.java   | 13 ++++---
 .../worker/AuthenticatedProtocolWorker.java        |  6 +--
 .../protocol/worker/EncryptedProtocolWorker.java   |  6 +--
 .../worker/EncryptionStartedProtocolWorker.java    |  6 +--
 .../protocol/worker/EndOrClosedProtocolWorker.java |  6 +--
 .../protocol/worker/InitiatedProtocolWorker.java   |  6 +--
 .../protocol/worker/StartedProtocolWorker.java     |  6 +--
 .../protocol/worker/UnconnectedProtocolWorker.java |  6 +--
 .../vysper/xmpp/server/AbstractSessionContext.java |  2 +-
 .../apache/vysper/xmpp/server/SessionContext.java  |  2 -
 .../StanzaReceivingSessionContext.java}            | 25 ++++--------
 .../components/ComponentStanzaProcessor.java       |  8 ++--
 .../resourcebinding/DefaultResourceRegistry.java   | 21 ++++++-----
 .../state/resourcebinding/ResourceRegistry.java    | 11 +++---
 .../xmpp/delivery/StanzaRelayBrokerTestCase.java   |  3 +-
 ...liveringExternalInboundStanzaRelayTestCase.java |  3 +-
 ...eliveringInteralInboundStanzaRelayTestCase.java |  3 +-
 .../handler/DiscoInfoIQHandlerTestCase.java        | 12 +++---
 .../handler/ExtendedDiscoInfoTestCase.java         |  4 +-
 .../ComponentStanzaProcessorTestCase.java          |  3 +-
 .../resourcebinding/ResourceRegistryTestCase.java  |  7 ++--
 .../websockets/JettyXmppWebSocketTest.java         |  3 +-
 .../websockets/TomcatXmppWebSocketTest.java        |  3 +-
 .../xmpp/extension/xep0124/BoshHandlerTest.java    | 11 +++---
 40 files changed, 191 insertions(+), 192 deletions(-)

diff --git a/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java b/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
index cffa8d4..3ae94a7 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
@@ -34,16 +34,16 @@ import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXParseException;
 
-import static java.util.Objects.requireNonNull;
-
 /**
  * handler for client-to-server sessions
+ * 
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 public class XmppIoHandlerAdapter implements IoHandler {
@@ -53,10 +53,11 @@ public class XmppIoHandlerAdapter implements IoHandler {
     public static final String ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER = "vysperSessionStateHolder";
 
     public static final String ATTRIBUTE_VYSPER_TERMINATE_REASON = "vysperTerminateReason";
-    
+
     final Logger logger = LoggerFactory.getLogger(XmppIoHandlerAdapter.class);
 
     private final ServerRuntimeContext serverRuntimeContext;
+
     private final StanzaProcessor stanzaProcessor;
 
     public XmppIoHandlerAdapter(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
@@ -74,20 +75,20 @@ public class XmppIoHandlerAdapter implements IoHandler {
                     return;
             }
 
-            throw new IllegalArgumentException("xmpp handler only accepts Stanza-typed messages, but received type "
-                    + message.getClass());
+            throw new IllegalArgumentException(
+                    "xmpp handler only accepts Stanza-typed messages, but received type " + message.getClass());
         }
 
         Stanza stanza = (Stanza) message;
-        SessionContext session = extractSession(ioSession);
+        StanzaReceivingSessionContext session = extractSession(ioSession);
         SessionStateHolder stateHolder = (SessionStateHolder) ioSession
                 .getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
 
         stanzaProcessor.processStanza(serverRuntimeContext, session, stanza, stateHolder);
     }
 
-    private SessionContext extractSession(IoSession ioSession) {
-        return (SessionContext) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSION);
+    private StanzaReceivingSessionContext extractSession(IoSession ioSession) {
+        return (StanzaReceivingSessionContext) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSION);
     }
 
     @Override
@@ -103,7 +104,7 @@ public class XmppIoHandlerAdapter implements IoHandler {
     @Override
     public void event(IoSession ioSession, FilterEvent event) throws Exception {
         if (event == SslEvent.SECURED) {
-            SessionContext session = extractSession(ioSession);
+            StanzaReceivingSessionContext session = extractSession(ioSession);
             SessionStateHolder stateHolder = (SessionStateHolder) ioSession
                     .getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
             stanzaProcessor.processTLSEstablished(session, stateHolder);
@@ -115,7 +116,8 @@ public class XmppIoHandlerAdapter implements IoHandler {
     @Override
     public void sessionCreated(IoSession ioSession) throws Exception {
         SessionStateHolder stateHolder = new SessionStateHolder();
-        SessionContext sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stanzaProcessor, stateHolder, ioSession);
+        SessionContext sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stanzaProcessor, stateHolder,
+                ioSession);
         ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSION, sessionContext);
         ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER, stateHolder);
         ioSession.setAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON, SessionTerminationCause.CLIENT_BYEBYE);
@@ -129,7 +131,8 @@ public class XmppIoHandlerAdapter implements IoHandler {
     @Override
     public void sessionClosed(IoSession ioSession) throws Exception {
         SessionContext sessionContext = extractSession(ioSession);
-        SessionTerminationCause cause = (SessionTerminationCause) ioSession.getAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON);
+        SessionTerminationCause cause = (SessionTerminationCause) ioSession
+                .getAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON);
         String sessionId = "UNKNOWN";
         if (sessionContext != null) {
             sessionId = sessionContext.getSessionId();
@@ -140,28 +143,29 @@ public class XmppIoHandlerAdapter implements IoHandler {
 
     @Override
     public void sessionIdle(IoSession ioSession, IdleStatus idleStatus) throws Exception {
-        logger.debug("session {} is idle", ((SessionContext) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSION))
-                .getSessionId());
+        logger.debug("session {} is idle",
+                ((SessionContext) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSION)).getSessionId());
     }
 
     @Override
     public void exceptionCaught(IoSession ioSession, Throwable throwable) throws Exception {
-        SessionContext sessionContext = extractSession(ioSession);
-        
-        // Assume that the connection was aborted for now. Might be different depending on 
+        StanzaReceivingSessionContext sessionContext = extractSession(ioSession);
+
+        // Assume that the connection was aborted for now. Might be different depending
+        // on
         // cause of exception determined below.
         ioSession.setAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON, SessionTerminationCause.CONNECTION_ABORT);
-        
+
         Stanza errorStanza;
-        if(throwable.getCause() != null && throwable.getCause() instanceof SAXParseException) {
+        if (throwable.getCause() != null && throwable.getCause() instanceof SAXParseException) {
             logger.info("Client sent not well-formed XML, closing session", throwable);
             errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
                     sessionContext.getXMLLang(), "Stanza not well-formed", null);
             ioSession.setAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON, SessionTerminationCause.STREAM_ERROR);
-        } else if(throwable instanceof WriteToClosedSessionException) {
+        } else if (throwable instanceof WriteToClosedSessionException) {
             // ignore
             return;
-        } else if(throwable instanceof IOException) {
+        } else if (throwable instanceof IOException) {
             logger.info("error caught on transportation layer", throwable);
             return;
         } else {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/LocalDeliveryUtils.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/LocalDeliveryUtils.java
index 5ea8c76..bdff427 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/LocalDeliveryUtils.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/LocalDeliveryUtils.java
@@ -19,7 +19,7 @@
  */
 package org.apache.vysper.xmpp.delivery;
 
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
 import org.slf4j.Logger;
@@ -31,17 +31,22 @@ import org.slf4j.LoggerFactory;
  */
 public class LocalDeliveryUtils {
 
-    final static Logger logger = LoggerFactory.getLogger(LocalDeliveryUtils.class);
+    private static final Logger logger = LoggerFactory.getLogger(LocalDeliveryUtils.class);
 
     /**
-     * delivers a stanza to a server-local resource. used for sending a stanza to all resources of the same user.
-     * @param registry registry to look up session by resource ID
-     * @param resource receiving resource ID
-     * @param push stanza to be pushed
+     * delivers a stanza to a server-local resource. used for sending a stanza to
+     * all resources of the same user.
+     * 
+     * @param registry
+     *            registry to look up session by resource ID
+     * @param resource
+     *            receiving resource ID
+     * @param push
+     *            stanza to be pushed
      */
     public static void relayToResourceDirectly(ResourceRegistry registry, String resource, Stanza push) {
         try {
-            SessionContext targetContext = registry.getSessionContext(resource);
+            StanzaReceivingSessionContext targetContext = registry.getSessionContext(resource);
             if (targetContext == null)
                 return;
             targetContext.getResponseWriter().write(push);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java
index ab8ebf2..6030527 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java
@@ -27,7 +27,7 @@ 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.delivery.failure.ServiceNotAvailableException;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -43,7 +43,7 @@ public class RecordingStanzaRelay implements StanzaRelay {
 
     protected final AtomicBoolean isRelaying = new AtomicBoolean(true);
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+    public void relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
             throws DeliveryException {
         if (!isRelaying()) throw new ServiceNotAvailableException("recording stanza relay is not relaying");
         entityStanzaPairs.add(new Triple(receiver, stanza, deliveryFailureStrategy));
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 3a48938..0b89ef9 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
@@ -29,7 +29,7 @@ import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
 import org.apache.vysper.xmpp.delivery.failure.LocalRecipientOfflineException;
 import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -60,8 +60,8 @@ public class StanzaReceiverRelay implements StanzaRelay {
         receiverMap.put(receiverID, receiver);
     }
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza,
-            DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException {
+    public void relay(StanzaReceivingSessionContext 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/delivery/StanzaRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelay.java
index fa719a2..72f54e9 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelay.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelay.java
@@ -24,6 +24,7 @@ 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.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -47,8 +48,8 @@ public interface StanzaRelay {
      * @throws DeliveryException
      *             error while relaying
      */
-    void relay(SessionContext sessionContext, Entity receiver, Stanza stanza,
-            DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException;
+    void relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza,
+			   DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException;
 
     /**
      * @return TRUE iff the relay is live (started and not stopped)
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelayBroker.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelayBroker.java
index d898fe8..a365467 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelayBroker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelayBroker.java
@@ -25,7 +25,7 @@ import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
 import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPool;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
@@ -68,7 +68,7 @@ public class StanzaRelayBroker implements StanzaRelay {
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+    public void relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
             throws DeliveryException {
         
         if (!isRelaying()) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
index d6c50cb..95ef94b 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
@@ -39,7 +39,7 @@ import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
 import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPool;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPoolUtil;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnector;
@@ -137,7 +137,7 @@ public class DeliveringExternalInboundStanzaRelay implements StanzaRelay, Manage
         lastCompleted = completedTaskCount;
     }
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
+    public void relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy)
             throws DeliveryException {
         
         if (!isRelaying()) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
index 5b20df1..7b53abc 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
@@ -26,7 +26,6 @@ import java.io.Writer;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -53,8 +52,8 @@ import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.protocol.worker.InboundStanzaProtocolWorker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.components.ComponentRegistry;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPool;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPoolUtil;
@@ -194,14 +193,13 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
         lastCompleted = completedTaskCount;
     }
 
-    public void relay(SessionContext sessionContext, Entity receiver, Stanza stanza,
+    public void relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza,
             DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException {
         if (!isRelaying()) {
             throw new ServiceNotAvailableException("internal inbound relay is not relaying");
         }
 
-        executor
-                .submit(new Relay(sessionContext, receiver, stanza, deliveryFailureStrategy));
+        executor.submit(new Relay(sessionContext, receiver, stanza, deliveryFailureStrategy));
         if (this.logStorageProvider != null) {
             this.logStorageProvider.logStanza(receiver, stanza);
         }
@@ -216,7 +214,7 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
     }
 
     private class Relay implements Callable<RelayResult> {
-        private final SessionContext sessionContext;
+        private final StanzaReceivingSessionContext sessionContext;
 
         private final Entity receiver;
 
@@ -226,7 +224,7 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
 
         protected final UnmodifyableSessionStateHolder sessionStateHolder = new UnmodifyableSessionStateHolder();
 
-        Relay(SessionContext sessionContext, Entity receiver, Stanza stanza,
+        Relay(StanzaReceivingSessionContext sessionContext, Entity receiver, Stanza stanza,
                 DeliveryFailureStrategy deliveryFailureStrategy) {
             this.sessionContext = sessionContext;
             this.receiver = receiver;
@@ -393,7 +391,8 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
         }
 
         protected RelayResult relayToBestSessions(final boolean fallbackToBareJIDAllowed) {
-            List<SessionContext> receivingSessions = resourceRegistry.getHighestPrioSessions(receiver, PRIO_THRESHOLD);
+            List<StanzaReceivingSessionContext> receivingSessions = resourceRegistry.getHighestPrioSessions(receiver,
+                    PRIO_THRESHOLD);
 
             if (receivingSessions.size() == 0 && receiver.isResourceSet() && fallbackToBareJIDAllowed) {
                 // no concrete session for this resource has been found
@@ -406,7 +405,7 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
             }
 
             RelayResult relayResult = new RelayResult();
-            for (SessionContext receivingSession : receivingSessions) {
+            for (StanzaReceivingSessionContext receivingSession : receivingSessions) {
                 if (receivingSession.getState() != SessionState.AUTHENTICATED) {
                     relayResult.addProcessingError(new DeliveryException("no relay to non-authenticated sessions"));
                     continue;
@@ -430,7 +429,8 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
 
         protected RelayResult relayToAllSessions(Integer prioThreshold) {
 
-            List<SessionContext> receivingSessions = prioThreshold == null ? resourceRegistry.getSessions(receiver)
+            List<StanzaReceivingSessionContext> receivingSessions = prioThreshold == null
+                    ? resourceRegistry.getSessions(receiver)
                     : resourceRegistry.getSessions(receiver, prioThreshold);
 
             if (receivingSessions.size() == 0) {
@@ -443,7 +443,7 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage
 
             RelayResult relayResult = new RelayResult();
 
-            for (SessionContext sessionContext : receivingSessions) {
+            for (StanzaReceivingSessionContext sessionContext : receivingSessions) {
                 if (sessionContext.getState() != SessionState.AUTHENTICATED) {
                     relayResult.addProcessingError(new DeliveryException("no relay to non-authenticated sessions"));
                     continue;
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
index a10e185..51a7e60 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
@@ -35,8 +35,8 @@ import org.apache.vysper.xmpp.protocol.worker.InitiatedProtocolWorker;
 import org.apache.vysper.xmpp.protocol.worker.StartedProtocolWorker;
 import org.apache.vysper.xmpp.protocol.worker.UnconnectedProtocolWorker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -85,8 +85,8 @@ public class ProtocolWorker implements StanzaProcessor {
      * @param stanza
      * @param sessionStateHolder
      */
-    public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-            SessionStateHolder sessionStateHolder) {
+    public void processStanza(ServerRuntimeContext serverRuntimeContext, StanzaReceivingSessionContext sessionContext, Stanza stanza,
+                              SessionStateHolder sessionStateHolder) {
         if (stanza == null)
             throw new RuntimeException("cannot process NULL stanzas");
 
@@ -124,15 +124,15 @@ public class ProtocolWorker implements StanzaProcessor {
                 if(from == null) {
                     Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
                             coreStanza, StanzaErrorType.MODIFY, "Missing from attribute", null, null);
-                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    sessionContext.getResponseWriter().write(errorStanza);
                     return;
                 } else if(!EntityUtils.isAddressingServer(sessionContext.getInitiatingEntity(), from)) {
                     // make sure the from attribute refers to the correct remote server
                     
                         Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
                                 coreStanza, StanzaErrorType.MODIFY, "Incorrect from attribute", null, null);
-                        ResponseWriter.writeResponse(sessionContext, errorStanza); 
-                        return;
+                    sessionContext.getResponseWriter().write(errorStanza);
+                    return;
                 }
                 
                 Entity to = stanza.getTo();
@@ -140,13 +140,13 @@ public class ProtocolWorker implements StanzaProcessor {
                     // TODO what's the appropriate error? StreamErrorCondition.IMPROPER_ADDRESSING?
                     Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.BAD_REQUEST,
                             coreStanza, StanzaErrorType.MODIFY, "Missing to attribute", null, null);
-                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    sessionContext.getResponseWriter().write(errorStanza);
                     return;                    
                 } else if(!EntityUtils.isAddressingServer(serverRuntimeContext.getServerEntity(), to)) {
                     // TODO what's the appropriate error? StreamErrorCondition.IMPROPER_ADDRESSING?
                     Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.BAD_REQUEST,
                             coreStanza, StanzaErrorType.MODIFY, "Invalid to attribute", null, null);
-                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    sessionContext.getResponseWriter().write(errorStanza);
                     return;                    
                     
                 }
@@ -197,12 +197,12 @@ public class ProtocolWorker implements StanzaProcessor {
         }
     }
 
-    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+    public void processTLSEstablished(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder) {
         processTLSEstablishedInternal(sessionContext, sessionStateHolder, responseWriter);
     }
 
-    static void processTLSEstablishedInternal(SessionContext sessionContext, SessionStateHolder sessionStateHolder,
-            ResponseWriter responseWriter) {
+    static void processTLSEstablishedInternal(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder,
+                                              ResponseWriter responseWriter) {
         if (sessionContext.getState() != SessionState.ENCRYPTION_STARTED) {
             responseWriter.handleProtocolError(new TLSException(), sessionContext, null);
             return;
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/QueuedStanzaProcessor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/QueuedStanzaProcessor.java
index bc24210..9739189 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/QueuedStanzaProcessor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/QueuedStanzaProcessor.java
@@ -25,7 +25,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -48,28 +48,29 @@ public class QueuedStanzaProcessor implements StanzaProcessor {
         int maxThreadCount = 20;
         int threadTimeoutSeconds = 2 * 60 * 1000;
         this.executor = new ThreadPoolExecutor(coreThreadCount, maxThreadCount, threadTimeoutSeconds, TimeUnit.SECONDS,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<>());
         this.stanzaProcessor = stanzaProcessor;
     }
 
-    public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-            SessionStateHolder sessionStateHolder) {
+    public void processStanza(ServerRuntimeContext serverRuntimeContext, StanzaReceivingSessionContext sessionContext,
+            Stanza stanza, SessionStateHolder sessionStateHolder) {
         executor.submit(new StanzaProcessorUnitOfWork(sessionContext, stanza, sessionStateHolder));
     }
 
-    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+    public void processTLSEstablished(StanzaReceivingSessionContext sessionContext,
+            SessionStateHolder sessionStateHolder) {
         ProtocolWorker.processTLSEstablishedInternal(sessionContext, sessionStateHolder, responseWriter);
     }
 
     private class StanzaProcessorUnitOfWork implements Runnable {
 
-        private SessionContext sessionContext;
+        private StanzaReceivingSessionContext sessionContext;
 
         private Stanza stanza;
 
         private SessionStateHolder sessionStateHolder;
 
-        private StanzaProcessorUnitOfWork(SessionContext sessionContext, Stanza stanza,
+        private StanzaProcessorUnitOfWork(StanzaReceivingSessionContext sessionContext, Stanza stanza,
                 SessionStateHolder sessionStateHolder) {
             this.sessionContext = sessionContext;
             this.stanza = stanza;
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
index 14ba14c..d47b230 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
@@ -22,6 +22,7 @@ package org.apache.vysper.xmpp.protocol;
 import org.apache.vysper.xmpp.parser.ParsingErrorCondition;
 import org.apache.vysper.xmpp.parser.ParsingException;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.XMPPVersion;
 import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.server.response.ServerResponses;
@@ -37,7 +38,7 @@ import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
  */
 public class ResponseWriter {
 
-    public static void writeUnsupportedStanzaError(SessionContext sessionContext) {
+    public static void writeUnsupportedStanzaError(StanzaReceivingSessionContext sessionContext) {
 
         Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.UNSUPPORTED_STANZA_TYPE,
                 sessionContext.getXMLLang(), "service unavailable at this session state", null);
@@ -47,15 +48,8 @@ public class ResponseWriter {
         writeErrorAndClose(sessionContext, streamOpener);
     }
 
-    /**
-     * writes a response in this context
-     */
-    public static void writeResponse(SessionContext sessionContext, Stanza responseStanza) {
-        sessionContext.getResponseWriter().write(responseStanza);
-    }
-
-    public static void handleProtocolError(ProtocolException protocolException, SessionContext sessionContext,
-            Stanza receivedStanza) {
+    public static void handleProtocolError(ProtocolException protocolException, StanzaReceivingSessionContext sessionContext,
+                                           Stanza receivedStanza) {
         Stanza errorStanza = null;
         if (protocolException != null)
             errorStanza = protocolException.getErrorStanza();
@@ -67,19 +61,19 @@ public class ResponseWriter {
         writeErrorAndClose(sessionContext, errorStanza);
     }
 
-    public void handleUnsupportedStanzaType(SessionContext sessionContext, Stanza receivedStanza) {
+    public void handleUnsupportedStanzaType(StanzaReceivingSessionContext sessionContext, Stanza receivedStanza) {
         Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.UNSUPPORTED_STANZA_TYPE,
                 sessionContext.getXMLLang(), "could not process incoming stanza", receivedStanza);
         writeErrorAndClose(sessionContext, errorStanza);
     }
 
-    public void handleNotAuthorized(SessionContext sessionContext, Stanza receivedStanza) {
+    public void handleNotAuthorized(StanzaReceivingSessionContext sessionContext, Stanza receivedStanza) {
         Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.NOT_AUTHORIZED,
                 sessionContext.getXMLLang(), "could not process incoming stanza", receivedStanza);
         writeErrorAndClose(sessionContext, errorStanza);
     }
 
-    public void handleWrongFromJID(SessionContext sessionContext, Stanza receivedStanza) {
+    public void handleWrongFromJID(StanzaReceivingSessionContext sessionContext, Stanza receivedStanza) {
         XMPPCoreStanza receivedCoreStanza = XMPPCoreStanza.getWrapper(receivedStanza);
         if (receivedCoreStanza == null) {
             handleNotAuthorized(sessionContext, receivedStanza);
@@ -89,20 +83,11 @@ public class ResponseWriter {
         Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
                 receivedCoreStanza, StanzaErrorType.MODIFY, "from attribute does not match authorized entity", null,
                 null);
-        writeResponse(sessionContext, errorStanza);
-    }
-
-    public void handleParsingException(SessionContext sessionContext, ParsingException e) {
-        // TODO write the __right__ error response, not bad-format default only
-        if (e.getErrorCondition() != ParsingErrorCondition.BAD_FORMAT)
-            throw new RuntimeException("cannot handle this error condition yet");
-        Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.BAD_FORMAT,
-                sessionContext.getXMLLang(), "could not parse incoming stanza", null);
-        writeErrorAndClose(sessionContext, errorStanza);
+        sessionContext.getResponseWriter().write(errorStanza);
     }
 
-    public static void writeErrorAndClose(SessionContext sessionContext, Stanza errorStanza) {
-        writeResponse(sessionContext, errorStanza);
+    public static void writeErrorAndClose(StanzaReceivingSessionContext sessionContext, Stanza errorStanza) {
+        sessionContext.getResponseWriter().write(errorStanza);
         sessionContext.endSession(SessionContext.SessionTerminationCause.STREAM_ERROR);
     }
 
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 3398378..6404ba0 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
@@ -25,7 +25,7 @@ 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.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -35,9 +35,9 @@ public class SimpleStanzaBroker implements StanzaBroker {
 
     private final StanzaRelay stanzaRelay;
 
-    private final SessionContext sessionContext;
+    private final StanzaReceivingSessionContext sessionContext;
 
-    public SimpleStanzaBroker(StanzaRelay stanzaRelay, SessionContext sessionContext) {
+    public SimpleStanzaBroker(StanzaRelay stanzaRelay, StanzaReceivingSessionContext sessionContext) {
         this.stanzaRelay = requireNonNull(stanzaRelay);
         this.sessionContext = sessionContext;
     }
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 062d8ae..5de77af 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
@@ -23,7 +23,7 @@ import static java.util.Objects.requireNonNull;
 
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -42,7 +42,7 @@ class SimpleStanzaHandlerExecutor implements StanzaHandlerExecutor {
 
     @Override
     public void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
-            SessionContext sessionContext, SessionStateHolder sessionStateHolder) throws ProtocolException {
+                        StanzaReceivingSessionContext 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/StanzaHandlerExecutor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java
index 4a19e64..18094bb 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
@@ -21,6 +21,7 @@ package org.apache.vysper.xmpp.protocol;
 
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -38,5 +39,6 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public interface StanzaHandlerExecutor {
     void execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext, boolean isOutboundStanza,
-            SessionContext sessionContext, SessionStateHolder sessionStateHolder) throws ProtocolException;
+            StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder)
+            throws ProtocolException;
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
index e7b2952..8f910c3 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
@@ -21,6 +21,7 @@ package org.apache.vysper.xmpp.protocol;
 
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -33,8 +34,8 @@ public interface StanzaProcessor {
     /**
      * processes a stanza as received from a local session
      */
-    void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-                       SessionStateHolder sessionStateHolder);
+    void processStanza(ServerRuntimeContext serverRuntimeContext, StanzaReceivingSessionContext sessionContext,
+            Stanza stanza, SessionStateHolder sessionStateHolder);
 
-    void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
+    void processTLSEstablished(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder);
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StateAwareProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StateAwareProtocolWorker.java
index 4036584..e33f4a2 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StateAwareProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StateAwareProtocolWorker.java
@@ -19,7 +19,7 @@
  */
 package org.apache.vysper.xmpp.protocol;
 
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -32,6 +32,6 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public interface StateAwareProtocolWorker {
 
-    public void processStanza(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler);
+    void processStanza(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+                              StanzaHandler stanzaHandler);
 }
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 edcd9a6..5e70fd7 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
@@ -29,6 +29,7 @@ import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StateAwareProtocolWorker;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -46,8 +47,8 @@ public abstract class AbstractStateAwareProtocolWorker implements StateAwareProt
 
     abstract public SessionState getHandledState();
 
-    public void processStanza(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    public void processStanza(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+                              StanzaHandler stanzaHandler) {
         boolean proceed = checkState(sessionContext, sessionStateHolder, stanza, stanzaHandler);
         if (!proceed)
             return; // TODO close stream?
@@ -55,13 +56,13 @@ public abstract class AbstractStateAwareProtocolWorker implements StateAwareProt
         executeHandler(sessionContext, sessionStateHolder, stanza, stanzaHandler);
     }
 
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+                                 StanzaHandler stanzaHandler) {
         return 0 == getHandledState().compareTo(sessionContext.getState());
     }
 
-    private void executeHandler(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    private void executeHandler(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+                                StanzaHandler stanzaHandler) {
         try {
             stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza, sessionContext.getServerRuntimeContext(),
                     isProcessingOutboundStanzas(), sessionContext, sessionStateHolder);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
index 10d37f8..c96496d 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
@@ -24,8 +24,8 @@ 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;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -39,8 +39,8 @@ public class AuthenticatedProtocolWorker extends AbstractStateAwareProtocolWorke
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
         if (StreamStartHandler.class.isAssignableFrom(stanzaHandler.unwrapType()))
             return true;
         if (stanzaHandler.verify(stanza))
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
index 96623f9..af62742 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
@@ -29,8 +29,8 @@ 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;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -49,8 +49,8 @@ public class EncryptedProtocolWorker extends AbstractStateAwareProtocolWorker {
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
 
         Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
         if (StreamStartHandler.class.isAssignableFrom(handlerUnwrappedType)) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java
index 20e84de..e99132e 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java
@@ -22,8 +22,8 @@ package org.apache.vysper.xmpp.protocol.worker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -41,8 +41,8 @@ public class EncryptionStartedProtocolWorker extends AbstractStateAwareProtocolW
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
         // StartTLS is currently completely handled on the protocol side.
         // anyway, there are no stanzas to be parsed between ENCRYPTION_STARTED and
         // ENCRYPTED.
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EndOrClosedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EndOrClosedProtocolWorker.java
index dac84e3..1b58673 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EndOrClosedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EndOrClosedProtocolWorker.java
@@ -22,8 +22,8 @@ package org.apache.vysper.xmpp.protocol.worker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -42,8 +42,8 @@ public class EndOrClosedProtocolWorker extends AbstractStateAwareProtocolWorker
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
         throw new RuntimeException("session was terminated");
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
index cf0d9bd..d4ba8d9 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
@@ -25,8 +25,8 @@ 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;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -45,8 +45,8 @@ public class InitiatedProtocolWorker extends AbstractStateAwareProtocolWorker {
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
         Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
         if (XMLPrologHandler.class.isAssignableFrom(handlerUnwrappedType))
             return true;
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
index 9887669..4bf4293 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
@@ -27,8 +27,8 @@ 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;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -47,8 +47,8 @@ public class StartedProtocolWorker extends AbstractStateAwareProtocolWorker {
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder,
+            Stanza stanza, StanzaHandler stanzaHandler) {
 
         Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
         if (StartTLSHandler.class.isAssignableFrom(handlerUnwrappedType)) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/UnconnectedProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/UnconnectedProtocolWorker.java
index e5e5f4e..1295851 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/UnconnectedProtocolWorker.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/UnconnectedProtocolWorker.java
@@ -22,8 +22,8 @@ package org.apache.vysper.xmpp.protocol.worker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
-import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
@@ -42,8 +42,8 @@ public class UnconnectedProtocolWorker extends AbstractStateAwareProtocolWorker
     }
 
     @Override
-    protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
-            StanzaHandler stanzaHandler) {
+    protected boolean checkState(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
+								 StanzaHandler stanzaHandler) {
         // TODO
         return true;
     }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
index 848624e..3dc4ddf 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
@@ -38,7 +38,7 @@ import org.apache.vysper.xmpp.writer.StanzaWriter;
  * 
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
-public abstract class AbstractSessionContext implements SessionContext {
+public abstract class AbstractSessionContext implements StanzaReceivingSessionContext {
 
     protected final ServerRuntimeContext serverRuntimeContext;
 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
index f6d4b48..f0d14f9 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
@@ -130,8 +130,6 @@ public interface SessionContext {
      */
     void setXMLLang(String languageCode);
 
-    StanzaWriter getResponseWriter();
-
     /**
      * Ends this session and the underlying TCP connection.
      * 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/StanzaReceivingSessionContext.java
similarity index 54%
copy from server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
copy to server/core/src/main/java/org/apache/vysper/xmpp/server/StanzaReceivingSessionContext.java
index e7b2952..5901765 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/StanzaReceivingSessionContext.java
@@ -6,35 +6,26 @@
  *  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;
+package org.apache.vysper.xmpp.server;
 
-import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
-import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.writer.StanzaWriter;
 
 /**
- * processes stanzas emmitted from local sessions
- *
- * @author The Apache MINA Project (dev@mina.apache.org)
+ * @author Réda Housni Alaoui
  */
-public interface StanzaProcessor {
+public interface StanzaReceivingSessionContext extends SessionContext {
 
-    /**
-     * processes a stanza as received from a local session
-     */
-    void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-                       SessionStateHolder sessionStateHolder);
+    StanzaWriter getResponseWriter();
 
-    void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
 }
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 7ed26f9..8176620 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
@@ -28,7 +28,7 @@ import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 
@@ -52,8 +52,8 @@ public class ComponentStanzaProcessor implements StanzaProcessor {
         componentStanzaHandlerLookup.addDictionary(namespaceHandlerDictionary);
     }
 
-    public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-            SessionStateHolder sessionStateHolder) {
+    public void processStanza(ServerRuntimeContext serverRuntimeContext, StanzaReceivingSessionContext sessionContext, Stanza stanza,
+                              SessionStateHolder sessionStateHolder) {
         if (stanza == null)
             throw new RuntimeException("cannot process NULL stanzas");
 
@@ -77,7 +77,7 @@ public class ComponentStanzaProcessor implements StanzaProcessor {
 
     }
 
-    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+    public void processTLSEstablished(StanzaReceivingSessionContext sessionContext, SessionStateHolder sessionStateHolder) {
         throw new RuntimeException("should not be called for components, which only acts as an established session");
     }
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/DefaultResourceRegistry.java b/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/DefaultResourceRegistry.java
index 00b0955..494aa7c 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/DefaultResourceRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/DefaultResourceRegistry.java
@@ -31,6 +31,7 @@ import java.util.Map;
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.uuid.JVMBuiltinUUIDGenerator;
 import org.apache.vysper.xmpp.uuid.UUIDGenerator;
 import org.slf4j.Logger;
@@ -47,13 +48,13 @@ public class DefaultResourceRegistry implements ResourceRegistry {
 
     private static class SessionData {
 
-        private final SessionContext context;
+        private final StanzaReceivingSessionContext context;
 
         private ResourceState state;
 
         private Integer priority;
 
-        SessionData(SessionContext context, ResourceState status, Integer priority) {
+        SessionData(StanzaReceivingSessionContext context, ResourceState status, Integer priority) {
             this.context = context;
             this.state = status;
             this.priority = priority == null ? 0 : priority;
@@ -87,7 +88,7 @@ public class DefaultResourceRegistry implements ResourceRegistry {
      * @param sessionContext
      * @return newly allocated resource id
      */
-    public String bindSession(SessionContext sessionContext) {
+    public String bindSession(StanzaReceivingSessionContext sessionContext) {
         if (sessionContext == null) {
             throw new IllegalArgumentException("session context cannot be NULL");
         }
@@ -225,7 +226,7 @@ public class DefaultResourceRegistry implements ResourceRegistry {
         return resourceList;
     }
 
-    public SessionContext getSessionContext(String resourceId) {
+    public StanzaReceivingSessionContext getSessionContext(String resourceId) {
         SessionData data = boundResources.get(resourceId);
         if (data == null)
             return null;
@@ -277,8 +278,8 @@ public class DefaultResourceRegistry implements ResourceRegistry {
      * session for the JID's resource part. if it's a bare JID, it will return all session for the JID.
      * @param entity
      */
-    public List<SessionContext> getSessions(Entity entity) {
-        List<SessionContext> sessionContexts = new ArrayList<SessionContext>();
+    public List<StanzaReceivingSessionContext> getSessions(Entity entity) {
+        List<StanzaReceivingSessionContext> sessionContexts = new ArrayList<>();
 
         List<String> boundResources = getBoundResources(entity, false);
         for (String resourceId : boundResources) {
@@ -296,10 +297,10 @@ public class DefaultResourceRegistry implements ResourceRegistry {
      * for the threshold is 0 (zero), which is also the default when param is NULL.
      * @return returns the sessions matching the given JID (bare) with same or higher priority
      */
-    public List<SessionContext> getSessions(Entity entity, Integer prioThreshold) {
+    public List<StanzaReceivingSessionContext> getSessions(Entity entity, Integer prioThreshold) {
         if (prioThreshold == null)
             prioThreshold = 0;
-        List<SessionContext> results = new ArrayList<SessionContext>();
+        List<StanzaReceivingSessionContext> results = new ArrayList<>();
 
         List<String> boundResourceIds = getBoundResources(entity, true);
         for (String resourceId : boundResourceIds) {
@@ -333,9 +334,9 @@ public class DefaultResourceRegistry implements ResourceRegistry {
      * @return for a bare JID, it will return the highest prioritized sessions. for a full JID, it will return the
      * related session.
      */
-    public List<SessionContext> getHighestPrioSessions(Entity entity, Integer prioThreshold) {
+    public List<StanzaReceivingSessionContext> getHighestPrioSessions(Entity entity, Integer prioThreshold) {
         Integer currentPrio = prioThreshold == null ? Integer.MIN_VALUE : prioThreshold;
-        List<SessionContext> results = new ArrayList<SessionContext>();
+        List<StanzaReceivingSessionContext> results = new ArrayList<>();
 
         boolean isResourceSet = entity.isResourceSet();
 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java b/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java
index 05f0a28..27f3e93 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java
@@ -2,13 +2,14 @@ package org.apache.vysper.xmpp.state.resourcebinding;
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 
 import java.util.List;
 
 /**
  */
 public interface ResourceRegistry {
-    SessionContext getSessionContext(String resourceId);
+    StanzaReceivingSessionContext getSessionContext(String resourceId);
 
     boolean setResourceState(String resourceId, ResourceState state);
 
@@ -20,17 +21,17 @@ public interface ResourceRegistry {
 
     String getUniqueResourceForSession(SessionContext sessionContext);
 
-    List<SessionContext> getSessions(Entity entity);
+    List<StanzaReceivingSessionContext> getSessions(Entity entity);
 
-    List<SessionContext> getSessions(Entity entity, Integer prioThreshold);
+    List<StanzaReceivingSessionContext> getSessions(Entity entity, Integer prioThreshold);
 
-    List<SessionContext> getHighestPrioSessions(Entity entity, Integer prioThreshold);
+    List<StanzaReceivingSessionContext> getHighestPrioSessions(Entity entity, Integer prioThreshold);
 
     void setResourcePriority(String resourceId, int priority);
 
     List<String> getAvailableResources(Entity entity);
 
-    String bindSession(SessionContext sessionContext);
+    String bindSession(StanzaReceivingSessionContext sessionContext);
 
     boolean unbindResource(String resourceId);
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/StanzaRelayBrokerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/StanzaRelayBrokerTestCase.java
index 1e12e11..ce9b904 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/StanzaRelayBrokerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/StanzaRelayBrokerTestCase.java
@@ -29,6 +29,7 @@ import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.server.ServerFeatures;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.junit.Before;
@@ -53,7 +54,7 @@ public class StanzaRelayBrokerTestCase extends Mockito {
     
     private StanzaRelay internalRelay = mock(StanzaRelay.class);
     private StanzaRelay externalRelay = mock(StanzaRelay.class);
-    private SessionContext sessionContext = mock(SessionContext.class);
+    private StanzaReceivingSessionContext sessionContext = mock(StanzaReceivingSessionContext.class);
     private ServerRuntimeContext serverRuntimeContext = mock(ServerRuntimeContext.class);
     private ServerFeatures serverFeatures = mock(ServerFeatures.class);
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java
index c304823..8a49ad0 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java
@@ -31,6 +31,7 @@ import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnector;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -61,7 +62,7 @@ public class DeliveringExternalInboundStanzaRelayTestCase extends TestCase {
     private static final Stanza STANZA = XMPPCoreStanza.getWrapper(StanzaBuilder.createMessageStanza(FROM, TO, LANG,
             BODY).build());
     
-    private SessionContext sessionContext = mock(SessionContext.class);
+    private StanzaReceivingSessionContext sessionContext = mock(StanzaReceivingSessionContext.class);
 
     public void testRemoteServerError() throws Exception {
         XMPPServerConnectorRegistry registry = mock(XMPPServerConnectorRegistry.class);
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
index 4d44192..b70fc76 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
@@ -38,6 +38,7 @@ import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.server.components.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -63,7 +64,7 @@ public class DeliveringInteralInboundStanzaRelayTestCase extends TestCase {
 
     protected DeliveringInternalInboundStanzaRelay stanzaRelay;
     
-    private SessionContext sessionContext = mock(SessionContext.class);
+    private StanzaReceivingSessionContext sessionContext = mock(StanzaReceivingSessionContext.class);
 
     static class AccountVerificationMock implements AccountManagement {
         public void addUser(Entity username, String password) throws AccountCreationException {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
index 39ff493..ce48988 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.servicediscovery.handler;
 
+import static org.junit.Assert.assertTrue;
+
 import java.util.Arrays;
 import java.util.List;
 
@@ -36,7 +38,7 @@ import org.apache.vysper.xmpp.modules.servicediscovery.management.ServiceDiscove
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 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.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -50,8 +52,6 @@ import org.mockito.Mockito;
 
 import junit.framework.Assert;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  */
 public class DiscoInfoIQHandlerTestCase extends Mockito {
@@ -68,7 +68,7 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
 
     private ServerRuntimeContext serverRuntimeContext = mock(ServerRuntimeContext.class);
 
-    private SessionContext sessionContext = mock(SessionContext.class);
+    private StanzaReceivingSessionContext sessionContext = mock(StanzaReceivingSessionContext.class);
 
     private ServiceCollector serviceCollector = mock(ServiceCollector.class);
 
@@ -316,7 +316,7 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
         List<Stanza> responses = handler.handleResult(stanza, serverRuntimeContext, sessionContext, stanzaBroker);
 
         assertTrue(responses.isEmpty());
-        
+
         verify(stanzaBroker).write(eq(USER), eq(stanza), any(DeliveryFailureStrategy.class));
     }
 
@@ -329,7 +329,7 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
         List<Stanza> responses = handler.handleResult(stanza, serverRuntimeContext, sessionContext, stanzaBroker);
 
         assertTrue(responses.isEmpty());
-        
+
         verify(stanzaBroker).writeToSession(stanza);
     }
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
index 494291d..472fd9d 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
@@ -41,7 +41,7 @@ import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
-import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
@@ -87,7 +87,7 @@ public class ExtendedDiscoInfoTestCase extends TestCase {
 
         IQStanza finalStanza = (IQStanza) XMPPCoreStanza.getWrapper(request.build());
 
-        SessionContext sessionContext = new TestSessionContext(runtimeContext, new SessionStateHolder(),
+        StanzaReceivingSessionContext sessionContext = new TestSessionContext(runtimeContext, new SessionStateHolder(),
                 runtimeContext.getStanzaRelay());
 
         List<Stanza> resultStanzas = infoIQHandler.handleGet(finalStanza, runtimeContext, sessionContext,
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 eb35444..00d556c 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
@@ -34,6 +34,7 @@ import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
 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.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
@@ -51,7 +52,7 @@ public class ComponentStanzaProcessorTestCase {
 
     private ServerRuntimeContext serverRuntimeContext = mock(ServerRuntimeContext.class);
 
-    private SessionContext sessionContext = mock(SessionContext.class);
+    private StanzaReceivingSessionContext sessionContext = mock(StanzaReceivingSessionContext.class);
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistryTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistryTestCase.java
index 1f0ed77..84e85ac 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistryTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistryTestCase.java
@@ -26,6 +26,7 @@ import junit.framework.TestCase;
 import org.apache.vysper.xmpp.addressing.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 
 /**
@@ -90,12 +91,12 @@ public class ResourceRegistryTestCase extends TestCase {
         assertTrue(resourceList.contains(resourceId1));
         assertTrue(resourceList.contains(resourceId2));
 
-        List<SessionContext> sessionList = resourceRegistry.getSessions(entity);
+        List<StanzaReceivingSessionContext> sessionList = resourceRegistry.getSessions(entity);
         assertEquals(2, resourceList.size());
         assertTrue(sessionList.contains(sessionContext1));
         assertTrue(sessionList.contains(sessionContext2));
 
-        List<SessionContext> highestPrioSessions = resourceRegistry.getHighestPrioSessions(entity, null);
+        List<StanzaReceivingSessionContext> highestPrioSessions = resourceRegistry.getHighestPrioSessions(entity, null);
         assertEquals(1, highestPrioSessions.size());
         SessionContext highestPrioSession = highestPrioSessions.get(0);
         assertSame(resourceRegistry.getSessionContext(resourceId2), highestPrioSession);
@@ -145,7 +146,7 @@ public class ResourceRegistryTestCase extends TestCase {
         assertTrue(resourceList.contains(resourceId1));
         assertTrue(resourceList.contains(resourceId2));
 
-        List<SessionContext> sessionList = resourceRegistry.getSessions(entity);
+        List<StanzaReceivingSessionContext> sessionList = resourceRegistry.getSessions(entity);
         assertEquals(2, resourceList.size());
         assertTrue(sessionList.contains(sessionContext1));
         assertTrue(sessionList.contains(sessionContext2));
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
index 868456c..d2f1d94 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
@@ -25,6 +25,7 @@ import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.eclipse.jetty.websocket.WebSocket.Connection;
@@ -50,7 +51,7 @@ public class JettyXmppWebSocketTest {
 
         Stanza expected = new StanzaBuilder("test").build();
         Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
-                Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
+                Mockito.any(StanzaReceivingSessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
     }
 
     @Test
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
index ac19a8b..9a1c6c9 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
@@ -27,6 +27,7 @@ import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.junit.Test;
@@ -51,7 +52,7 @@ public class TomcatXmppWebSocketTest {
 
         Stanza expected = new StanzaBuilder("test").build();
         Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
-                Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
+                Mockito.any(StanzaReceivingSessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
     }
 
     @Test
diff --git a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
index e01a829..9fd8c4a 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
@@ -43,6 +43,7 @@ import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerFeatures;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.StanzaReceivingSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.easymock.Capture;
@@ -131,11 +132,11 @@ public class BoshHandlerTest {
         expect(httpServletRequest.startAsync()).andReturn(asyncContext).atLeastOnce();
         expect(httpServletRequest.getAsyncContext()).andReturn(asyncContext).anyTimes();
         asyncContext.setTimeout(anyLong());
-        httpServletRequest.setAttribute(eq(BOSH_REQUEST_ATTRIBUTE), EasyMock.<BoshRequest> capture(br));
-        asyncContext.addListener(EasyMock.<AsyncListener> anyObject());
-        Capture<Stanza> stanzaCaptured = new Capture<Stanza>();
-        stanzaProcessor.processStanza(eq(serverRuntimeContext), EasyMock.<SessionContext> anyObject(),
-                EasyMock.<Stanza> capture(stanzaCaptured), EasyMock.<SessionStateHolder> anyObject());
+        httpServletRequest.setAttribute(eq(BOSH_REQUEST_ATTRIBUTE), EasyMock.capture(br));
+        asyncContext.addListener(EasyMock.anyObject());
+        Capture<Stanza> stanzaCaptured = new Capture<>();
+        stanzaProcessor.processStanza(eq(serverRuntimeContext), EasyMock.anyObject(),
+                EasyMock.capture(stanzaCaptured), EasyMock.anyObject());
         mocksControl.replay();
         boshRequest = createSaslRequest();
         boshHandler.process(httpServletRequest, boshRequest);