Remove getStanzaProcessor from the ServerRuntimeContext
diff --git a/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java b/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
index 896c0f8..6c65860 100644
--- a/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
+++ b/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
@@ -34,6 +34,7 @@
 import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
 import org.apache.vysper.xmpp.modules.extension.xep0199_xmppping.XmppPingModule;
 import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerFeatures;
 import org.apache.vysper.xmpp.server.XMPPServer;
 
@@ -47,7 +48,7 @@
             
             StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
     
-            final AccountManagement accountManagement = (AccountManagement) providerRegistry
+            final AccountManagement accountManagement = providerRegistry
                     .retrieve(AccountManagement.class);
 
             Entity user1 = EntityImpl.parse("user1@" + domain);
@@ -92,6 +93,7 @@
 
             // Used by the websocket endpoint, if enabled
             sce.getServletContext().setAttribute("org.apache.vysper.xmpp.server.ServerRuntimeContext", server.getServerRuntimeContext());
+            sce.getServletContext().setAttribute(StanzaProcessor.class.getCanonicalName(), server.getStanzaProcessor());
             sce.getServletContext().setAttribute("vysper", server);
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java b/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
index f74aa43..32c5cbc 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
@@ -28,6 +28,7 @@
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.vysper.mina.codec.StanzaWriteInfo;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -54,9 +55,9 @@
 
     protected CloseFuture closeFuture;
 
-    public MinaBackedSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
-            IoSession minaSession) {
-        super(serverRuntimeContext, sessionStateHolder);
+    public MinaBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, SessionStateHolder sessionStateHolder,
+                                    IoSession minaSession) {
+        super(serverRuntimeContext, stanzaProcessor, sessionStateHolder);
         this.minaSession = minaSession;
         closeFuture = minaSession.getCloseFuture();
         closeFuture.addListener(this);
diff --git a/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java b/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
index 9246f07..3ff021d 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
@@ -30,6 +30,7 @@
 import org.apache.mina.transport.socket.SocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.vysper.mina.codec.XMPPProtocolCodecFactory;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.Endpoint;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 
@@ -40,6 +41,8 @@
 public class TCPEndpoint implements Endpoint {
 
     private ServerRuntimeContext serverRuntimeContext;
+    
+    private StanzaProcessor stanzaProcessor;
 
     private int port = 5222;
 
@@ -59,7 +62,12 @@
     public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
         this.serverRuntimeContext = serverRuntimeContext;
     }
-    
+
+    @Override
+    public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+        this.stanzaProcessor = stanzaProcessor;
+    }
+
     /**
      * Returns the configured port if one is provided (non-zero value).
      */
@@ -92,8 +100,7 @@
         filterChainBuilder.addLast("executorFilter", new ExecutorFilter(new OrderedThreadPoolExecutor(coreThreadCount, maxThreadCount, threadTimeoutSeconds, TimeUnit.SECONDS)));
         acceptor.setFilterChainBuilder(filterChainBuilder);
 
-        XmppIoHandlerAdapter adapter = new XmppIoHandlerAdapter();
-        adapter.setServerRuntimeContext(serverRuntimeContext);
+        XmppIoHandlerAdapter adapter = new XmppIoHandlerAdapter(serverRuntimeContext, stanzaProcessor);
         acceptor.setHandler(adapter);
 
         acceptor.setReuseAddress(true);
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 23e1cbe..cffa8d4 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
@@ -27,9 +27,9 @@
 import org.apache.mina.core.write.WriteToClosedSessionException;
 import org.apache.mina.filter.FilterEvent;
 import org.apache.mina.filter.ssl.SslEvent;
-import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.vysper.xml.fragment.XMLText;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -40,6 +40,8 @@
 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)
@@ -54,10 +56,12 @@
     
     final Logger logger = LoggerFactory.getLogger(XmppIoHandlerAdapter.class);
 
-    private ServerRuntimeContext serverRuntimeContext;
+    private final ServerRuntimeContext serverRuntimeContext;
+    private final StanzaProcessor stanzaProcessor;
 
-    public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+    public XmppIoHandlerAdapter(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
         this.serverRuntimeContext = serverRuntimeContext;
+        this.stanzaProcessor = stanzaProcessor;
     }
 
     @Override
@@ -79,7 +83,7 @@
         SessionStateHolder stateHolder = (SessionStateHolder) ioSession
                 .getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
 
-        serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, session, stanza, stateHolder);
+        stanzaProcessor.processStanza(serverRuntimeContext, session, stanza, stateHolder);
     }
 
     private SessionContext extractSession(IoSession ioSession) {
@@ -102,7 +106,7 @@
             SessionContext session = extractSession(ioSession);
             SessionStateHolder stateHolder = (SessionStateHolder) ioSession
                     .getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
-            serverRuntimeContext.getStanzaProcessor().processTLSEstablished(session, stateHolder);
+            stanzaProcessor.processTLSEstablished(session, stateHolder);
         } else if (event == SslEvent.UNSECURED) {
             // TODO
         }
@@ -111,7 +115,7 @@
     @Override
     public void sessionCreated(IoSession ioSession) throws Exception {
         SessionStateHolder stateHolder = new SessionStateHolder();
-        SessionContext sessionContext = new MinaBackedSessionContext(serverRuntimeContext, 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);
diff --git a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
index 44876a2..86ddac2 100644
--- a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
@@ -28,6 +28,7 @@
 import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import org.apache.vysper.xmpp.modules.Module;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.AlterableComponentRegistry;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerFeatures;
@@ -65,8 +66,9 @@
 
     public SpringCompatibleDefaultServerRuntimeContext(Entity serverEntity, ServerFeatures serverFeatures,
             List<HandlerDictionary> dictionaries, ResourceRegistry resourceRegistry,
+            StanzaProcessor stanzaProcessor,
             AlterableComponentRegistry componentRegistry) {
-        super(serverEntity, new StanzaRelayHull(), componentRegistry, resourceRegistry, serverFeatures, dictionaries);
+        super(serverEntity, new StanzaRelayHull(), stanzaProcessor, componentRegistry, resourceRegistry, serverFeatures, dictionaries);
     }
 
     public void setStanzaRelay(StanzaRelay stanzaRelay) {
diff --git a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
index 48a6698..007e4f1 100644
--- a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
@@ -23,6 +23,7 @@
 import java.util.Queue;
 
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -38,9 +39,12 @@
 public class StanzaSessionContext extends AbstractSessionContext implements StanzaWriter {
 
     protected Queue<Stanza> stanzaQueue = new LinkedList<Stanza>();
+    
+    private final StanzaProcessor stanzaProcessor;
 
-    public StanzaSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder) {
-        super(serverRuntimeContext, sessionStateHolder);
+    public StanzaSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, SessionStateHolder sessionStateHolder) {
+        super(serverRuntimeContext, stanzaProcessor, sessionStateHolder);
+        this.stanzaProcessor = stanzaProcessor;
     }
 
     public StanzaWriter getResponseWriter() {
@@ -48,7 +52,7 @@
     }
 
     public void sendStanzaToServer(Stanza stanza) {
-        serverRuntimeContext.getStanzaProcessor().processStanza(getServerRuntimeContext(), this, stanza,
+        stanzaProcessor.processStanza(getServerRuntimeContext(), this, stanza,
                 sessionStateHolder);
     }
 
diff --git a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
index 7b09bf5..23b3627 100644
--- a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
+++ b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
@@ -20,6 +20,7 @@
 package org.apache.vysper.stanzasession;
 
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.Endpoint;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -31,6 +32,7 @@
 public class StanzaSessionFactory implements Endpoint {
 
     private ServerRuntimeContext serverRuntimeContext;
+    private StanzaProcessor stanzaProcessor;
 
     /**
      * returns a new session for the server. the session behaves like a client, but lives within the server JVM
@@ -38,7 +40,7 @@
     public StanzaSession createNewSession() {
         SessionStateHolder stateHolder = new SessionStateHolder();
         stateHolder.setState(SessionState.INITIATED);
-        StanzaSessionContext sessionContext = new StanzaSessionContext(serverRuntimeContext, stateHolder);
+        StanzaSessionContext sessionContext = new StanzaSessionContext(serverRuntimeContext, stanzaProcessor, stateHolder);
         StanzaSession session = new StanzaSession(sessionContext);
         return session;
     }
@@ -47,6 +49,11 @@
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
+    @Override
+    public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+        this.stanzaProcessor = stanzaProcessor;
+    }
+
     public void start() {
         // nothing to do
     }
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 2adc3ba..e7b2952 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
@@ -33,8 +33,8 @@
     /**
      * processes a stanza as received from a local session
      */
-    public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
-            SessionStateHolder sessionStateHolder);
+    void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
+                       SessionStateHolder sessionStateHolder);
 
-    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
+    void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
 }
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 ae99cfd..848624e 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
@@ -25,14 +25,13 @@
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.BindException;
 import org.apache.vysper.xmpp.uuid.JVMBuiltinUUIDGenerator;
 import org.apache.vysper.xmpp.uuid.UUIDGenerator;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * provides default session context behavior
@@ -41,9 +40,9 @@
  */
 public abstract class AbstractSessionContext implements SessionContext {
 
-    private static final Logger logger = LoggerFactory.getLogger(AbstractSessionContext.class);
+    protected final ServerRuntimeContext serverRuntimeContext;
 
-    protected ServerRuntimeContext serverRuntimeContext;
+    private final StanzaProcessor stanzaProcessor;
 
     protected String sessionId;
 
@@ -59,10 +58,12 @@
 
     private boolean serverToServer = false;
 
-    private Map<String, Object> attributeMap = new HashMap<String, Object>();
+    private Map<String, Object> attributeMap = new HashMap<>();
 
-    public AbstractSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder) {
+    public AbstractSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor,
+            SessionStateHolder sessionStateHolder) {
         this.serverRuntimeContext = serverRuntimeContext;
+        this.stanzaProcessor = stanzaProcessor;
         sessionId = serverRuntimeContext.getNextSessionId();
         serverEntity = serverRuntimeContext.getServerEntity();
         xmlLang = serverRuntimeContext.getDefaultXMLLang();
@@ -140,7 +141,7 @@
                 || terminationCause == SessionTerminationCause.CONNECTION_ABORT) {
             if (getState().equals(SessionState.AUTHENTICATED)) {
                 Stanza unavailableStanza = StanzaBuilder.createUnavailablePresenceStanza(null, terminationCause);
-                serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, unavailableStanza,
+                stanzaProcessor.processStanza(serverRuntimeContext, this, unavailableStanza,
                         sessionStateHolder);
             }
         } else if (terminationCause == SessionTerminationCause.SERVER_SHUTDOWN) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
index 87aac14..a7ff5f7 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
@@ -98,12 +98,6 @@
     // basic services the server is using...
 
     /**
-     * 'input stream': receives stanzas issued by client sessions to be handled by
-     * the server
-     */
-    private final StanzaProcessor stanzaProcessor;
-
-    /**
      * 'output stream': receives stanzas issued by a session, which are going to
      * other sessions/servers
      */
@@ -141,17 +135,16 @@
     private final AlterableComponentRegistry componentRegistry;
 
     private final SimpleEventBus eventBus;
-    
+
     private final ComponentStanzaProcessorFactory componentStanzaProcessorFactory;
 
-    public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay,
+    public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay, StanzaProcessor stanzaProcessor,
             AlterableComponentRegistry componentRegistry, ResourceRegistry resourceRegistry,
             ServerFeatures serverFeatures, List<HandlerDictionary> dictionaries) {
         this.serverEntity = serverEntity;
         this.stanzaRelay = stanzaRelay;
-        this.stanzaProcessor = new ProtocolWorker(stanzaRelay);
         this.componentRegistry = requireNonNull(componentRegistry);
-        this.serverConnectorRegistry = new DefaultXMPPServerConnectorRegistry(this, stanzaRelay);
+        this.serverConnectorRegistry = new DefaultXMPPServerConnectorRegistry(this, stanzaRelay, stanzaProcessor);
         this.stanzaHandlerLookup = new StanzaHandlerLookup(this);
         this.eventBus = new SimpleEventBus();
         this.serverFeatures = serverFeatures;
@@ -168,8 +161,8 @@
     }
 
     public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay) {
-        this(serverEntity, stanzaRelay, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(),
-                new ServerFeatures(), Collections.emptyList());
+        this(serverEntity, stanzaRelay, new ProtocolWorker(stanzaRelay), new SimpleComponentRegistry(serverEntity),
+                new DefaultResourceRegistry(), new ServerFeatures(), Collections.emptyList());
     }
 
     /**
@@ -203,11 +196,6 @@
         return "en_US"; // TODO must be configurable as of RFC3920
     }
 
-    @Override
-    public StanzaProcessor getStanzaProcessor() {
-        return stanzaProcessor;
-    }
-
     public StanzaRelay getStanzaRelay() {
         return stanzaRelay;
     }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
index 4a1a75c..50f95c0 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.server;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+
 import java.io.IOException;
 
 /**
@@ -33,6 +35,8 @@
 public interface Endpoint {
 
     void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext);
+    
+    void setStanzaProcessor(StanzaProcessor stanzaProcessor);
 
     void start() throws IOException;
 
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
index 1cebe0d..d73149a 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
@@ -54,8 +54,6 @@
 
     String getDefaultXMLLang();
 
-    StanzaProcessor getStanzaProcessor();
-
     ServerFeatures getServerFeatures();
 
     SSLContext getSslContext();
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
index 0176190..f516e0d 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
@@ -47,6 +47,8 @@
 import org.apache.vysper.xmpp.modules.roster.RosterModule;
 import org.apache.vysper.xmpp.modules.servicediscovery.ServiceDiscoveryModule;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
 import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
 
@@ -69,6 +71,8 @@
     private String serverDomain;
 
     private DefaultServerRuntimeContext serverRuntimeContext;
+    
+    private StanzaProcessor stanzaProcessor;
 
     private StorageProviderRegistry storageProviderRegistry;
 
@@ -193,7 +197,9 @@
         stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
         stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
 
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, stanzaRelayBroker, componentRegistry,
+        stanzaProcessor = new ProtocolWorker(stanzaRelayBroker);
+
+        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, stanzaRelayBroker, stanzaProcessor, componentRegistry,
                 resourceRegistry, serverFeatures, dictionaries);
         serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
         serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
@@ -213,8 +219,14 @@
 
         if (endpoints.size() == 0)
             throw new IllegalStateException("server must have at least one endpoint");
+
+        /*
+          'input stream': receives stanzas issued by client sessions to be handled by
+          the server
+         */
         for (Endpoint endpoint : endpoints) {
             endpoint.setServerRuntimeContext(serverRuntimeContext);
+            endpoint.setStanzaProcessor(stanzaProcessor);
             endpoint.start();
         }
     }
@@ -260,4 +272,8 @@
     public ServerRuntimeContext getServerRuntimeContext() {
         return serverRuntimeContext;
     }
+    
+    public StanzaProcessor getStanzaProcessor(){
+        return stanzaProcessor;
+    }
 }
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 2047ad1..54aebd4 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
@@ -52,6 +52,7 @@
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
+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.SessionState;
@@ -78,6 +79,8 @@
     private final ServerRuntimeContext serverRuntimeContext;
 
     private final StanzaRelay stanzaRelay;
+    
+    private final StanzaProcessor stanzaProcessor;
 
     private MinaBackedSessionContext sessionContext;
 
@@ -108,9 +111,11 @@
     protected final CountDownLatch authenticatedLatch = new CountDownLatch(1);
 
     public DefaultXMPPServerConnector(Entity remoteServer, ServerRuntimeContext serverRuntimeContext,
-            StanzaRelay stanzaRelay, SessionContext dialbackSessionContext,
-            SessionStateHolder dialbackSessionStateHolder) {
+                                      StanzaRelay stanzaRelay, StanzaProcessor stanzaProcessor, 
+                                      SessionContext dialbackSessionContext,
+                                      SessionStateHolder dialbackSessionStateHolder) {
         this.serverRuntimeContext = serverRuntimeContext;
+        this.stanzaProcessor = stanzaProcessor;
         this.stanzaRelay = stanzaRelay;
         this.remoteServer = remoteServer;
         this.dialbackSessionContext = dialbackSessionContext;
@@ -279,7 +284,7 @@
                 return;
             }
 
-            serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, sessionContext, stanza,
+            stanzaProcessor.processStanza(serverRuntimeContext, sessionContext, stanza,
                     sessionStateHolder);
         }
     }
@@ -301,7 +306,7 @@
 
     public void handleSessionOpened(IoSession session) {
         LOG.info("XMPP server session opened to {}", remoteServer);
-        sessionContext = new MinaBackedSessionContext(serverRuntimeContext, sessionStateHolder, session);
+        sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stanzaProcessor, sessionStateHolder, session);
         sessionStateHolder.setState(SessionState.INITIATED);
         Stanza opener = new ServerResponses().getStreamOpenerForServerConnector(serverRuntimeContext.getServerEntity(),
                 remoteServer, XMPPVersion.VERSION_1_0, sessionContext);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
index a463d99..f1694d2 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
@@ -28,6 +28,7 @@
 import org.apache.vysper.xmpp.delivery.failure.RemoteServerNotFoundException;
 import org.apache.vysper.xmpp.delivery.failure.RemoteServerTimeoutException;
 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.slf4j.Logger;
@@ -47,10 +48,15 @@
     private final Map<Entity, XMPPServerConnector> connectors = new ConcurrentHashMap<>();
 
     private final StanzaRelay stanzaRelay;
+    
+    private final StanzaProcessor stanzaProcessor;
 
-    public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext serverRuntimeContext, StanzaRelay stanzaRelay) {
+    public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext serverRuntimeContext, 
+                                              StanzaRelay stanzaRelay, 
+                                              StanzaProcessor stanzaProcessor) {
         this.serverRuntimeContext = serverRuntimeContext;
         this.stanzaRelay = stanzaRelay;
+        this.stanzaProcessor = stanzaProcessor;
     }
 
     /*
@@ -98,7 +104,7 @@
 
     protected XMPPServerConnector createConnector(Entity otherServer, ServerRuntimeContext serverRuntimeContext,
             SessionContext dialbackSessionContext, SessionStateHolder dialbackSessionStateHolder) {
-        return new DefaultXMPPServerConnector(otherServer, serverRuntimeContext, stanzaRelay, dialbackSessionContext,
+        return new DefaultXMPPServerConnector(otherServer, serverRuntimeContext, stanzaRelay, stanzaProcessor, dialbackSessionContext,
                 dialbackSessionStateHolder);
     }
 
diff --git a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
index e0af08c..73556f6 100644
--- a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
@@ -28,6 +28,7 @@
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.delivery.StanzaRelayBroker;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerFeatures;
 import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
@@ -56,13 +57,15 @@
         dictionaries.add(new org.apache.vysper.xmpp.modules.roster.RosterDictionary());
 
         Entity serverEntity = new EntityImpl(null, "test", null);
+        ProtocolWorker protocolWorker = new ProtocolWorker(relay);
         DefaultServerRuntimeContext serverContext = new DefaultServerRuntimeContext(serverEntity,
-                relay, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(), new ServerFeatures(), dictionaries);
+                relay, protocolWorker, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(), new ServerFeatures(), dictionaries);
 
         relay.setServerRuntimeContext(serverContext);
 
         sessionFactory = new StanzaSessionFactory();
         sessionFactory.setServerRuntimeContext(serverContext);
+        sessionFactory.setStanzaProcessor(protocolWorker);
     }
 
     public void testHandshake() {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
index a9343f2..6624392 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
@@ -31,6 +31,7 @@
 import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
@@ -109,21 +110,20 @@
     }
 
     public TestSessionContext(SessionStateHolder sessionStateHolder) {
-        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder);
-        sessionId = serverRuntimeContext.getNextSessionId();
-        xmlLang = "de";
-        this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
-    }
-
-    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
-        this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+        this(sessionStateHolder, new RecordingStanzaRelay());
     }
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
             StanzaRelay relay) {
-        super(serverRuntimeContext, sessionStateHolder);
+        super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+        sessionId = serverRuntimeContext.getNextSessionId();
+        xmlLang = "de";
+        this.relay = relay;
+    }
+    
+    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+                new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
index 91ece0a..0b2326d 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
@@ -60,7 +60,8 @@
 
     @Test
     public void connectorShouldBeReused() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
-        DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+        DefaultXMPPServerConnectorRegistry registry = 
+                new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
             @Override
             protected XMPPServerConnector createConnector(Entity otherServer,
                     ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -83,7 +84,8 @@
     
     @Test
     public void dontReuseClosedConnector() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
-        DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+        DefaultXMPPServerConnectorRegistry registry = 
+                new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
             @Override
             protected XMPPServerConnector createConnector(Entity otherServer,
                     ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -104,7 +106,8 @@
 
     @Test
     public void dontReuseConnectorToDifferentServers() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
-        DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+        DefaultXMPPServerConnectorRegistry registry = 
+                new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
             @Override
             protected XMPPServerConnector createConnector(Entity otherServer,
                     ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -123,7 +126,8 @@
 
     @Test
     public void createDialbackConnector() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
-        DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+        DefaultXMPPServerConnectorRegistry registry = 
+                new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
             @Override
             protected XMPPServerConnector createConnector(Entity otherServer,
                     ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -143,7 +147,8 @@
 
     @Test
     public void close() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
-        DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+        DefaultXMPPServerConnectorRegistry registry = 
+                new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
             @Override
             protected XMPPServerConnector createConnector(Entity otherServer,
                     ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
index 014f0f5..8570a07 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.eclipse.jetty.websocket.WebSocket;
@@ -34,14 +35,14 @@
  */
 public class JettyXmppWebSocket implements WebSocket, WebSocket.OnTextMessage, Outbound {
 
-
     private final static Logger LOG = LoggerFactory.getLogger(JettyXmppWebSocket.class);
 
     private WebSocketBackedSessionContext sessionContext;
+
     private Connection outbound;
 
-    public JettyXmppWebSocket(ServerRuntimeContext serverRuntimeContext) {
-        this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, this);
+    public JettyXmppWebSocket(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+        this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, stanzaProcessor, this);
     }
 
     /**
@@ -54,7 +55,6 @@
         sessionContext.onOpen();
     }
 
-
     public void onMessage(String data) {
         LOG.info("< " + data);
         sessionContext.onMessage(data);
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
index 4b77cc3..8fd7edf 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
@@ -24,6 +24,7 @@
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.eclipse.jetty.websocket.WebSocket;
 import org.eclipse.jetty.websocket.WebSocketServlet;
@@ -33,9 +34,11 @@
 /**
  * Servlet for initiating websocket connections for Jetty.
  * <p>
- * When creating this servlet from web.xml, the Vysper server needs to be started beforehand
- * (e.g. from a {@link ServletContextListener} and the {@link ServerRuntimeContext} needs to be
- * added as an attribute in the {@link ServletContext} with the key "org.apache.vysper.xmpp.server.ServerRuntimeContext".
+ * When creating this servlet from web.xml, the Vysper server needs to be
+ * started beforehand (e.g. from a {@link ServletContextListener} and the
+ * {@link ServerRuntimeContext} needs to be added as an attribute in the
+ * {@link ServletContext} with the key
+ * "org.apache.vysper.xmpp.server.ServerRuntimeContext".
  * </p>
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
@@ -43,23 +46,28 @@
 public class JettyXmppWebSocketServlet extends WebSocketServlet {
 
     /**
-     * The attribute key for the {@link ServerRuntimeContext} in {@link ServletContext}
+     * The attribute key for the {@link ServerRuntimeContext} in
+     * {@link ServletContext}
      */
     public static final String SERVER_RUNTIME_CONTEXT_ATTRIBUTE = "org.apache.vysper.xmpp.server.ServerRuntimeContext";
 
     private final static Logger LOG = LoggerFactory.getLogger(JettyXmppWebSocketServlet.class);
 
     private static final long serialVersionUID = 197413099255392883L;
+
     private static final String SUB_PROTOCOL = "xmpp";
 
     private ServerRuntimeContext serverRuntimeContext;
 
+    private StanzaProcessor stanzaProcessor;
+
     public JettyXmppWebSocketServlet() {
         // default cstr needed
     }
 
-    public JettyXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+    public JettyXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
         this.serverRuntimeContext = serverRuntimeContext;
+        this.stanzaProcessor = stanzaProcessor;
     }
 
     /**
@@ -69,10 +77,21 @@
     public void init() throws ServletException {
         super.init();
 
-        if(serverRuntimeContext == null) {
-            serverRuntimeContext = (ServerRuntimeContext) getServletContext().getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
-            if(serverRuntimeContext == null) {
-                throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \"" + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+        if (serverRuntimeContext == null) {
+            serverRuntimeContext = (ServerRuntimeContext) getServletContext()
+                    .getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
+            if (serverRuntimeContext == null) {
+                throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \""
+                        + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+            }
+        }
+
+        if (stanzaProcessor == null) {
+            stanzaProcessor = (StanzaProcessor) getServletContext()
+                    .getAttribute(StanzaProcessor.class.getCanonicalName());
+            if (stanzaProcessor == null) {
+                throw new RuntimeException("Failed to get Vysper StanzaProcessor from servlet context attribute \""
+                        + StanzaProcessor.class.getCanonicalName() + "\"");
             }
         }
     }
@@ -80,11 +99,12 @@
     /**
      * {@inheritDoc}
      *
-     * Will return null if the client does not provide the correct websocket sub protocol. "xmpp" is required.
+     * Will return null if the client does not provide the correct websocket sub
+     * protocol. "xmpp" is required.
      */
     public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
-        if(SUB_PROTOCOL.equals(protocol)) {
-            JettyXmppWebSocket sessionContext = new JettyXmppWebSocket(serverRuntimeContext);
+        if (SUB_PROTOCOL.equals(protocol)) {
+            JettyXmppWebSocket sessionContext = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
             return sessionContext;
         } else {
             LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
index 4776c09..bb92b82 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
@@ -25,6 +25,7 @@
 
 import org.apache.catalina.websocket.MessageInbound;
 import org.apache.catalina.websocket.WsOutbound;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.slf4j.Logger;
@@ -42,8 +43,8 @@
     private WebSocketBackedSessionContext sessionContext;
     private WsOutbound outbound;
 
-    public TomcatXmppWebSocket(ServerRuntimeContext serverRuntimeContext) {
-        this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, this);
+    public TomcatXmppWebSocket(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+        this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, stanzaProcessor, this);
     }
 
     /**
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
index ca901ee..c628b9a 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
@@ -27,16 +27,18 @@
 
 import org.apache.catalina.websocket.StreamInbound;
 import org.apache.catalina.websocket.WebSocketServlet;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
- * Servlet for initiating websocket connections in Apache Tomcat. Requires Tomcat 7.0.27 or later.
+ * Servlet for initiating websocket connections in Apache Tomcat. Requires
+ * Tomcat 7.0.27 or later.
  * <p>
- * When creating this servlet from web.xml, the Vysper server needs to be started beforehand
- * (e.g. from a {@link ServletContextListener} and the {@link ServerRuntimeContext} needs to be
- * added as an attribute in the {@link ServletContext} with the key "org.apache.vysper.xmpp.server.ServerRuntimeContext".
+ * When creating this servlet from web.xml, the Vysper server needs to be
+ * started beforehand (e.g. from a {@link ServletContextListener} and the
+ * {@link ServerRuntimeContext} needs to be added as an attribute in the
+ * {@link ServletContext} with the key
+ * "org.apache.vysper.xmpp.server.ServerRuntimeContext".
  * </p>
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
@@ -44,23 +46,26 @@
 public class TomcatXmppWebSocketServlet extends WebSocketServlet {
 
     /**
-     * The attribute key for the {@link ServerRuntimeContext} in {@link ServletContext}
+     * The attribute key for the {@link ServerRuntimeContext} in
+     * {@link ServletContext}
      */
     public static final String SERVER_RUNTIME_CONTEXT_ATTRIBUTE = "org.apache.vysper.xmpp.server.ServerRuntimeContext";
 
-    private final static Logger LOG = LoggerFactory.getLogger(TomcatXmppWebSocketServlet.class);
-
     private static final long serialVersionUID = 197413099255392884L;
+
     private static final String SUB_PROTOCOL = "xmpp";
 
     private ServerRuntimeContext serverRuntimeContext;
 
+    private StanzaProcessor stanzaProcessor;
+
     public TomcatXmppWebSocketServlet() {
         // default cstr needed
     }
 
-    public TomcatXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+    public TomcatXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
         this.serverRuntimeContext = serverRuntimeContext;
+        this.stanzaProcessor = stanzaProcessor;
     }
 
     /**
@@ -70,10 +75,21 @@
     public void init() throws ServletException {
         super.init();
 
-        if(serverRuntimeContext == null) {
-            serverRuntimeContext = (ServerRuntimeContext) getServletContext().getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
-            if(serverRuntimeContext == null) {
-                throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \"" + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+        if (serverRuntimeContext == null) {
+            serverRuntimeContext = (ServerRuntimeContext) getServletContext()
+                    .getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
+            if (serverRuntimeContext == null) {
+                throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \""
+                        + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+            }
+        }
+
+        if (stanzaProcessor == null) {
+            stanzaProcessor = (StanzaProcessor) getServletContext()
+                    .getAttribute(StanzaProcessor.class.getCanonicalName());
+            if (stanzaProcessor == null) {
+                throw new RuntimeException("Failed to get Vysper StanzaProcessor from servlet context attribute \""
+                        + StanzaProcessor.class.getCanonicalName() + "\"");
             }
         }
     }
@@ -86,17 +102,19 @@
     /**
      * {@inheritDoc}
      *
-     * Will return null if the client does not provide the correct websocket sub protocol. "xmpp" is required.
+     * Will return null if the client does not provide the correct websocket sub
+     * protocol. "xmpp" is required.
      */
     @Override
     protected StreamInbound createWebSocketInbound(String subProtocol) {
         // TODO subProtocol is always null on Tomcat 7.0.27, reactivate check when fixed
-        //if (SUB_PROTOCOL.equals(subProtocol)) {
-            TomcatXmppWebSocket sessionContext = new TomcatXmppWebSocket(serverRuntimeContext);
-            return sessionContext;
-        //} else {
-        //    LOG.warn("Unsupported websocket sub protocol, must be \"xmpp\", but was \"" + subProtocol + "\"");
-        //    return null;
-        //}
+        // if (SUB_PROTOCOL.equals(subProtocol)) {
+        TomcatXmppWebSocket sessionContext = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
+        return sessionContext;
+        // } else {
+        // LOG.warn("Unsupported websocket sub protocol, must be \"xmpp\", but was \"" +
+        // subProtocol + "\"");
+        // return null;
+        // }
     }
 }
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
index dfe781a..c96c446 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
@@ -33,6 +33,7 @@
 import org.apache.vysper.xml.sax.impl.DefaultNonBlockingXMLReader;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -51,13 +52,19 @@
 public class WebSocketBackedSessionContext extends AbstractSessionContext implements XMLElementListener, StanzaWriter {
 
     private final static Charset CHARSET = Charset.forName("UTF-8");
+
     private final static CharsetDecoder CHARSET_DECODER = CHARSET.newDecoder();
 
     private NonBlockingXMLReader xmlReader = new DefaultNonBlockingXMLReader();
+    
+    private final StanzaProcessor stanzaProcessor;
+
     private Outbound outbound;
 
-    public WebSocketBackedSessionContext(ServerRuntimeContext serverRuntimeContext, Outbound outbound) {
-        super(serverRuntimeContext, new SessionStateHolder());
+    public WebSocketBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor,
+            Outbound outbound) {
+        super(serverRuntimeContext, stanzaProcessor, new SessionStateHolder());
+        this.stanzaProcessor = stanzaProcessor;
 
         this.outbound = outbound;
 
@@ -104,7 +111,8 @@
      */
     public void element(XMLElement element) {
         // on parsed stanzas
-        serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, (Stanza) element, sessionStateHolder);
+        stanzaProcessor.processStanza(serverRuntimeContext, this, (Stanza) element,
+                sessionStateHolder);
     }
 
     public void onOpen() {
@@ -120,7 +128,7 @@
             throw new RuntimeException(e);
         } catch (SAXException e) {
             Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
-                getXMLLang(), "Stanza not well-formed", null);
+                    getXMLLang(), "Stanza not well-formed", null);
             write(errorStanza);
             endSession(SessionTerminationCause.STREAM_ERROR);
         }
@@ -136,7 +144,8 @@
     public void write(Stanza stanza) {
         // handle stream open
         Renderer renderer = new Renderer(stanza);
-        if("stream".equals(stanza.getName()) && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
+        if ("stream".equals(stanza.getName())
+                && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
             // stream:stream and stream:features comes at the same time, split them
             write(renderer.getOpeningElement());
             write(renderer.getElementContent());
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
index b8b59f1..b4b0473 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.Endpoint;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.eclipse.jetty.server.Connector;
@@ -45,6 +46,8 @@
     protected final static Logger logger = LoggerFactory.getLogger(WebSocketEndpoint.class);
 
     protected ServerRuntimeContext serverRuntimeContext;
+    
+    private StanzaProcessor stanzaProcessor;
 
     protected int port = 8080;
 
@@ -65,6 +68,11 @@
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
+    @Override
+    public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+        this.stanzaProcessor = stanzaProcessor;
+    }
+
     /**
      * Set the port on which the endpoint will listen for incoming traffic.
      * Defaults to 8080.
@@ -142,7 +150,7 @@
         ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
         servletContext.setContextPath(contextPath);
 
-        JettyXmppWebSocketServlet wsServlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+        JettyXmppWebSocketServlet wsServlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
         servletContext.addServlet(new ServletHolder(wsServlet), "/ws");
 
         return servletContext;
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
index 9e7a60d..5376983 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
@@ -19,6 +19,7 @@
  */
 package org.apache.vysper.xmpp.extension.websockets;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 
 
@@ -34,7 +35,7 @@
     super();
   }
 
-  public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
-    super(serverRuntimeContext);
+  public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+    super(serverRuntimeContext, stanzaProcessor);
   }
 }
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
index de61107..3c8b7f9 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
@@ -23,6 +23,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.eclipse.jetty.websocket.WebSocket;
 import org.junit.Assert;
@@ -36,11 +37,13 @@
 public class JettyXmppWebSocketServletTest {
 
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+    private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
 
     @Test
     public void doWebSocketConnectWithDefaultCstr() throws ServletException {
         ServletContext servletContext = Mockito.mock(ServletContext.class);
         Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
+        Mockito.when(servletContext.getAttribute(StanzaProcessor.class.getCanonicalName())).thenReturn(stanzaProcessor);
 
         ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
         Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
@@ -54,7 +57,7 @@
 
     @Test
     public void doWebSocketConnectWithDirectCstr() throws ServletException {
-      JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+      JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
 
         WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
         Assert.assertTrue(webSocket instanceof JettyXmppWebSocket);
@@ -62,7 +65,7 @@
 
     @Test
     public void doWebSocketConnectWithInvalidSubprotocl() throws ServletException {
-      JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+      JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
 
         WebSocket webSocket = servlet.doWebSocketConnect(null, "dummy");
         Assert.assertNull(webSocket);
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 7473b0f..868456c 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
@@ -28,7 +28,6 @@
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.eclipse.jetty.websocket.WebSocket.Connection;
-import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -39,26 +38,24 @@
 public class JettyXmppWebSocketTest {
 
     private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
-    private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
-    private Connection outbound = Mockito.mock(Connection.class);
 
-    @Before
-    public void before() {
-        Mockito.when(serverRuntimeContext.getStanzaProcessor()).thenReturn(stanzaProcessor);
-    }
+    private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
+    private Connection outbound = Mockito.mock(Connection.class);
 
     @Test
     public void onMessage() {
-      JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext);
+        JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
         context.onMessage("<test></test>");
 
         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.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
+                Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
     }
 
     @Test
     public void write() throws IOException {
-        JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext);
+        JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
         context.onOpen(outbound);
 
         context.write("<test></test>");
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
index 0244f88..5c42a89 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
@@ -24,6 +24,7 @@
 import javax.servlet.ServletException;
 
 import org.apache.catalina.websocket.StreamInbound;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.junit.Assert;
 import org.junit.Ignore;
@@ -37,12 +38,14 @@
 public class TomcatXmppWebSocketServletTest {
 
     private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+    private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
 
     @Test
     public void doWebSocketConnectWithDefaultCstr() throws ServletException {
         ServletContext servletContext = Mockito.mock(ServletContext.class);
         Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
-
+        Mockito.when(servletContext.getAttribute(StanzaProcessor.class.getCanonicalName())).thenReturn(stanzaProcessor);
+        
         ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
         Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
 
@@ -55,7 +58,7 @@
 
     @Test
     public void doWebSocketConnectWithDirectCstr() throws ServletException {
-        TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext);
+        TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
 
         StreamInbound webSocket = servlet.createWebSocketInbound("xmpp");
         Assert.assertTrue(webSocket instanceof TomcatXmppWebSocket);
@@ -64,7 +67,7 @@
     @Test
     @Ignore("sub protocol check temporarily disabled for Tomcat")
     public void doWebSocketConnectWithInvalidSubprotocl() throws ServletException {
-        TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext);
+        TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
 
         StreamInbound webSocket = servlet.createWebSocketInbound("dummy");
         Assert.assertNull(webSocket);
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 f09756a..ac19a8b 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
@@ -29,7 +29,6 @@
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
-import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -40,26 +39,24 @@
 public class TomcatXmppWebSocketTest {
 
     private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
-    private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
-    private WsOutbound outbound = Mockito.mock(WsOutbound.class);
 
-    @Before
-    public void before() {
-        Mockito.when(serverRuntimeContext.getStanzaProcessor()).thenReturn(stanzaProcessor);
-    }
+    private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
+    private WsOutbound outbound = Mockito.mock(WsOutbound.class);
 
     @Test
     public void onMessage() throws IOException {
-        TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext);
+        TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
         context.onTextMessage(CharBuffer.wrap("<test></test>"));
 
         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.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
+                Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
     }
 
     @Test
     public void write() throws IOException {
-        TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext);
+        TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
         context.onOpen(outbound);
 
         context.write("<test></test>");
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
index a751e2d..eb30a76 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
@@ -31,6 +31,7 @@
 import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -113,21 +114,20 @@
     }
 
     public TestSessionContext(SessionStateHolder sessionStateHolder) {
-        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder);
-        sessionId = serverRuntimeContext.getNextSessionId();
-        xmlLang = "de";
-        this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
-    }
-
-    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
-        this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+        this(sessionStateHolder, new RecordingStanzaRelay());
     }
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
                               StanzaRelay relay) {
-        super(serverRuntimeContext, sessionStateHolder);
+        super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+        sessionId = serverRuntimeContext.getNextSessionId();
+        xmlLang = "de";
+        this.relay = relay;
+    }
+
+    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+                new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
index 084c807..aeab842 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
@@ -31,6 +31,7 @@
 import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -113,21 +114,20 @@
     }
 
     public TestSessionContext(SessionStateHolder sessionStateHolder) {
-        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder);
-        sessionId = serverRuntimeContext.getNextSessionId();
-        xmlLang = "de";
-        this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
-    }
-
-    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
-        this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
-                new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+        this(sessionStateHolder, new RecordingStanzaRelay());
     }
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
                               StanzaRelay relay) {
-        super(serverRuntimeContext, sessionStateHolder);
+        super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+        sessionId = serverRuntimeContext.getNextSessionId();
+        xmlLang = "de";
+        this.relay = relay;
+    }
+
+    public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+        super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+                new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
index 25547db..f281d96 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
@@ -39,6 +39,7 @@
 import org.apache.vysper.xml.fragment.Renderer;
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
@@ -144,10 +145,11 @@
     /**
      * Creates a new context for a session
      * @param serverRuntimeContext
+     * @param stanzaProcessor
      * @param inactivityChecker
      */
-    public BoshBackedSessionContext(ServerRuntimeContext serverRuntimeContext, BoshHandler boshHandler, InactivityChecker inactivityChecker) {
-        super(serverRuntimeContext, new SessionStateHolder());
+    public BoshBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, BoshHandler boshHandler, InactivityChecker inactivityChecker) {
+        super(serverRuntimeContext, stanzaProcessor, new SessionStateHolder());
 
         // in BOSH we jump directly to the encrypted state
         sessionStateHolder.setState(SessionState.ENCRYPTED);
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
index 7c78f80..c303d01 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.Endpoint;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.eclipse.jetty.server.Connector;
@@ -48,7 +49,9 @@
     protected final static Logger logger = LoggerFactory.getLogger(BoshEndpoint.class);
 
     protected ServerRuntimeContext serverRuntimeContext;
-
+    
+    private StanzaProcessor stanzaProcessor;
+    
     protected int port = 8080;
 
     protected Server server;
@@ -67,6 +70,11 @@
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
+    @Override
+    public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+        this.stanzaProcessor = stanzaProcessor;
+    }
+
     /**
      * Setter for the listen port
      * @param port
@@ -175,7 +183,7 @@
         boshContext.setContextPath(contextPath);
 
         BoshServlet boshServlet = new BoshServlet();
-        boshServlet.setServerRuntimeContext(serverRuntimeContext);
+        boshServlet.inject(serverRuntimeContext, stanzaProcessor);
         boshServlet.setAccessControlAllowOrigin(accessControlAllowOrigin);
         boshContext.addServlet(new ServletHolder(boshServlet), "/");
 
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
index 87eb7e8..847eea4 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
@@ -22,6 +22,7 @@
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.server.response.ServerResponses;
@@ -51,6 +52,8 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(BoshHandler.class);
 
     private ServerRuntimeContext serverRuntimeContext;
+    
+    private StanzaProcessor stanzaProcessor;
 
     private Map<String, BoshBackedSessionContext> sessions;
     
@@ -85,9 +88,13 @@
     public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
         this.serverRuntimeContext = serverRuntimeContext;
     }
+    
+    public void setStanzaProcessor(StanzaProcessor stanzaProcessor){
+        this.stanzaProcessor = stanzaProcessor;
+    }
 
     protected BoshBackedSessionContext createSessionContext() {
-        return new BoshBackedSessionContext(serverRuntimeContext, this, inactivityChecker);
+        return new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, this, inactivityChecker);
     }
 
     /**
@@ -225,7 +232,7 @@
             stanza = new Stanza(element.getNamespaceURI(), element.getName(), element.getNamespacePrefix(),
                     element.getAttributes(), element.getInnerFragments());
         }
-        serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, session, stanza,
+        stanzaProcessor.processStanza(serverRuntimeContext, session, stanza,
                 session.getStateHolder());
     }
 
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
index e594309..9f71369 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
@@ -19,6 +19,7 @@
  */
 package org.apache.vysper.xmpp.extension.xep0124;
 
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -76,14 +77,14 @@
     /**
      * Setter for the {@link ServerRuntimeContext}
      * @param serverRuntimeContext
+     * @param stanzaProcessor
      */
-    public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+    public void inject(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
         boshHandler.setServerRuntimeContext(serverRuntimeContext);
+        boshHandler.setStanzaProcessor(stanzaProcessor);
         serverRuntimeContext.registerServerRuntimeContextService(boshHandler);
     }
     
-    
-    
     public List<String> getAccessControlAllowOrigin() {
         return accessControlAllowOrigin;
     }
diff --git a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
index 750f4ca..b8a8c69 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
@@ -34,6 +34,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.vysper.xml.fragment.Renderer;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.easymock.Capture;
@@ -51,6 +52,8 @@
 
     private ServerRuntimeContext serverRuntimeContext;
     
+    private StanzaProcessor stanzaProcessor;
+    
     private InactivityChecker inactivityChecker;
 
     @Before
@@ -58,6 +61,7 @@
         mocksControl = createControl();
         boshHandler = mocksControl.createMock(BoshHandler.class);
         serverRuntimeContext = mocksControl.createMock(ServerRuntimeContext.class);
+        stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
         expect(serverRuntimeContext.getNextSessionId()).andReturn("123");
         expect(serverRuntimeContext.getServerEntity()).andReturn(new EntityImpl(null, "vysper.org", null));
         expect(serverRuntimeContext.getDefaultXMLLang()).andReturn("en");
@@ -87,7 +91,7 @@
         httpServletRequest.setAttribute(eq(BOSH_RESPONSE_ATTRIBUTE), EasyMock.<BoshResponse> capture(captured));
         mocksControl.replay();
 
-        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
         Stanza body = BoshStanzaUtils.EMPTY_BOSH_RESPONSE;
         boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest, body, 1L));
         boshBackedSessionContext.writeBoshResponse(body);
@@ -101,7 +105,7 @@
     @Test
     public void testSetBoshVersion1() {
         mocksControl.replay();
-        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
         boshBackedSessionContext.setBoshVersion("1.8");
         assertEquals("1.8", boshBackedSessionContext.getBoshVersion());
         mocksControl.verify();
@@ -110,7 +114,7 @@
     @Test
     public void testSetBoshVersion2() {
         mocksControl.replay();
-        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
         boshBackedSessionContext.setBoshVersion("2.0");
         assertEquals("1.9", boshBackedSessionContext.getBoshVersion());
         mocksControl.verify();
@@ -146,7 +150,7 @@
 
         // write0
         mocksControl.replay();
-        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
         
         boshBackedSessionContext.insertRequest(br);
         listenerCaptured.getValue().onTimeout(asyncEvent);
@@ -192,7 +196,7 @@
         httpServletRequest1.setAttribute(eq(BOSH_RESPONSE_ATTRIBUTE), EasyMock.<BoshResponse> capture(captured));
 
         mocksControl.replay();
-        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+        BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
 
         boshBackedSessionContext.setHold(2);
         // consecutive writes with RID 1 and 2
@@ -233,7 +237,7 @@
         mocksControl.replay();
 
         BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(
-                serverRuntimeContext, null, inactivityChecker);
+                serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
         boshBackedSessionContext.writeBoshResponse(body); // queued for merging
         boshBackedSessionContext.writeBoshResponse(body); // queued for merging
         boshBackedSessionContext.writeBoshResponse(body); // queued for merging
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 e41f759..e01a829 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
@@ -58,6 +58,7 @@
     private IMocksControl mocksControl;
 
     private ServerRuntimeContext serverRuntimeContext;
+    private StanzaProcessor stanzaProcessor;
 
     private BoshHandler boshHandler;
 
@@ -65,8 +66,10 @@
     public void setUp() throws Exception {
         mocksControl = createControl();
         serverRuntimeContext = mocksControl.createMock(ServerRuntimeContext.class);
+        stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
         boshHandler = new BoshHandler();
         boshHandler.setServerRuntimeContext(serverRuntimeContext);
+        boshHandler.setStanzaProcessor(stanzaProcessor);
     }
 
     @After
@@ -130,8 +133,6 @@
         asyncContext.setTimeout(anyLong());
         httpServletRequest.setAttribute(eq(BOSH_REQUEST_ATTRIBUTE), EasyMock.<BoshRequest> capture(br));
         asyncContext.addListener(EasyMock.<AsyncListener> anyObject());
-        StanzaProcessor stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
-        expect(serverRuntimeContext.getStanzaProcessor()).andReturn(stanzaProcessor);
         Capture<Stanza> stanzaCaptured = new Capture<Stanza>();
         stanzaProcessor.processStanza(eq(serverRuntimeContext), EasyMock.<SessionContext> anyObject(),
                 EasyMock.<Stanza> capture(stanzaCaptured), EasyMock.<SessionStateHolder> anyObject());