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 c0d3b2b  Add StanzaHandlerExecutor and make it unavoidable to execute 
a StanzaHandler
c0d3b2b is described below

commit c0d3b2bcef14fc54e008d42bb5cf85f8a5957c69
Author: Réda Housni Alaoui <reda.housniala...@gmail.com>
AuthorDate: Wed Aug 28 01:07:31 2019 +0200

    Add StanzaHandlerExecutor and make it unavoidable to execute a StanzaHandler
---
 .../DeliveringInternalInboundStanzaRelay.java      |  9 +--
 .../modules/core/base/handler/MessageHandler.java  |  9 ++-
 .../vysper/xmpp/protocol/ProtocolWorker.java       | 19 +++----
 .../SimpleStanzaHandlerExecutor.java}              | 22 ++++++--
 .../SimpleStanzaHandlerExecutorFactory.java}       | 13 +++--
 .../apache/vysper/xmpp/protocol/StanzaHandler.java |  8 +--
 .../xmpp/protocol/StanzaHandlerExecutor.java       | 42 ++++++++++++++
 .../StanzaHandlerExecutorFactory.java}             | 13 ++---
 .../worker/AbstractStateAwareProtocolWorker.java   | 18 +++---
 .../worker/AuthenticatedProtocolWorker.java        | 10 ++--
 .../protocol/worker/EncryptedProtocolWorker.java   | 10 ++--
 .../worker/EncryptionStartedProtocolWorker.java    | 14 ++---
 .../protocol/worker/EndOrClosedProtocolWorker.java | 10 ++--
 .../worker/InboundStanzaProtocolWorker.java        | 15 ++---
 .../protocol/worker/InitiatedProtocolWorker.java   | 10 ++--
 .../protocol/worker/StartedProtocolWorker.java     | 10 ++--
 .../protocol/worker/UnconnectedProtocolWorker.java | 10 ++--
 .../server/ComponentStanzaProcessorFactory.java    | 10 ++--
 .../xmpp/server/DefaultServerRuntimeContext.java   | 17 ++++--
 .../org/apache/vysper/xmpp/server/XMPPServer.java  | 25 +++++---
 .../AlterableComponentRegistry.java                |  5 +-
 .../server/{ => components}/ComponentRegistry.java |  2 +-
 .../components/ComponentStanzaProcessor.java       | 66 ++++++++++++++++------
 .../{ => components}/SimpleComponentRegistry.java  |  5 +-
 .../server/s2s/DefaultXMPPServerConnector.java     | 24 ++++----
 .../s2s/DefaultXMPPServerConnectorRegistry.java    | 18 +++---
 .../stanzasession/StanzaSessionTestCase.java       | 28 +++++----
 ...eliveringInteralInboundStanzaRelayTestCase.java | 20 ++++---
 .../protocol/AbstractProtocolStateTestCase.java    |  2 +-
 .../protocol/ProtocolWorkerProcessTestCase.java    |  2 +-
 .../ProtocolWorkerStateAwarenessTestCase.java      |  5 +-
 .../vysper/xmpp/server/TestSessionContext.java     |  9 ++-
 .../ComponentStanzaProcessorTestCase.java          |  4 +-
 .../extension/xep0045_muc/TestSessionContext.java  | 11 ++--
 .../handler/PubSubPublishHandler.java              | 28 +++++----
 .../xep0060_pubsub/TestSessionContext.java         | 11 ++--
 36 files changed, 328 insertions(+), 206 deletions(-)

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 49fb761..86fe263 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
@@ -49,13 +49,13 @@ import 
org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
 import 
org.apache.vysper.xmpp.modules.extension.xep0160_offline_storage.OfflineStorageProvider;
 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.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.protocol.worker.InboundStanzaProtocolWorker;
-import org.apache.vysper.xmpp.server.ComponentRegistry;
 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.SimpleComponentRegistry;
+import org.apache.vysper.xmpp.server.components.ComponentRegistry;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPool;
 import org.apache.vysper.xmpp.server.resources.ManagedThreadPoolUtil;
 import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -151,8 +151,9 @@ public class DeliveringInternalInboundStanzaRelay 
implements StanzaRelay, Manage
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
-    public void setStanzaRelay(StanzaRelay stanzaRelay) {
-        this.inboundStanzaProtocolWorker = new 
InboundStanzaProtocolWorker(stanzaRelay);
+    public void setStanzaHandlerExecutionContextFactory(
+            StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory) {
+        this.inboundStanzaProtocolWorker = new 
InboundStanzaProtocolWorker(stanzaHandlerExecutorFactory);
     }
 
     public final void setLogStorageProvider(final LogStorageProvider 
logStorageProvider) {
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
index e28aaa2..34e7c02 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
@@ -20,12 +20,13 @@
 
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
+import java.util.List;
+
 import org.apache.vysper.xml.fragment.Attribute;
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import 
org.apache.vysper.xmpp.delivery.failure.ReturnErrorToSenderFailureStrategy;
 import org.apache.vysper.xmpp.protocol.StanzaBroker;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -35,8 +36,6 @@ import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 
-import java.util.List;
-
 /**
  * handling message stanzas
  *
@@ -54,7 +53,7 @@ public class MessageHandler extends XMPPCoreStanzaHandler {
 
     @Override
     protected List<Stanza> executeCore(XMPPCoreStanza stanza, 
ServerRuntimeContext serverRuntimeContext,
-                                       boolean isOutboundStanza, 
SessionContext sessionContext, StanzaBroker stanzaBroker) {
+            boolean isOutboundStanza, SessionContext sessionContext, 
StanzaBroker stanzaBroker) {
 
         // (try to) read thread id
         String threadId = null;
@@ -123,7 +122,7 @@ public class MessageHandler extends XMPPCoreStanzaHandler {
                 stanzaBroker.write(stanza.getTo(), stanza, new 
ReturnErrorToSenderFailureStrategy(stanzaBroker));
             } catch (Exception e) {
                 // TODO return error stanza
-                e.printStackTrace(); //To change body of catch statement use 
File | Settings | File Templates.
+                e.printStackTrace(); // To change body of catch statement use 
File | Settings | File Templates.
             }
         } else if (sessionContext != null) {
             sessionContext.getResponseWriter().write(stanza);
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 6606575..a10e185 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
@@ -25,7 +25,6 @@ import java.util.Map;
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityUtils;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import 
org.apache.vysper.xmpp.modules.extension.xep0077_inbandreg.InBandRegistrationHandler;
 import org.apache.vysper.xmpp.protocol.exception.TLSException;
 import org.apache.vysper.xmpp.protocol.worker.AuthenticatedProtocolWorker;
@@ -66,16 +65,16 @@ public class ProtocolWorker implements StanzaProcessor {
 
     private final ResponseWriter responseWriter = new ResponseWriter();
 
-    public ProtocolWorker(StanzaRelay stanzaRelay) {
+    public ProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
 
-        stateWorker.put(SessionState.UNCONNECTED, new 
UnconnectedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.INITIATED, new 
InitiatedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.STARTED, new 
StartedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.ENCRYPTION_STARTED, new 
EncryptionStartedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.ENCRYPTED, new 
EncryptedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.AUTHENTICATED, new 
AuthenticatedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.ENDED, new 
EndOrClosedProtocolWorker(stanzaRelay));
-        stateWorker.put(SessionState.CLOSED, new 
EndOrClosedProtocolWorker(stanzaRelay));
+        stateWorker.put(SessionState.UNCONNECTED, new 
UnconnectedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.INITIATED, new 
InitiatedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.STARTED, new 
StartedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.ENCRYPTION_STARTED, new 
EncryptionStartedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.ENCRYPTED, new 
EncryptedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.AUTHENTICATED, new 
AuthenticatedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.ENDED, new 
EndOrClosedProtocolWorker(stanzaHandlerExecutorFactory));
+        stateWorker.put(SessionState.CLOSED, new 
EndOrClosedProtocolWorker(stanzaHandlerExecutorFactory));
     }
 
     /**
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
similarity index 54%
copy from 
server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
copy to 
server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
index ef2dc04..470f316 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutor.java
@@ -17,25 +17,35 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.xmpp.protocol;
 
 import static java.util.Objects.requireNonNull;
 
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
-import org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
 
 /**
  * @author Réda Housni Alaoui
  */
-public class ComponentStanzaProcessorFactory {
+class SimpleStanzaHandlerExecutor implements StanzaHandlerExecutor {
 
     private final StanzaRelay stanzaRelay;
 
-    public ComponentStanzaProcessorFactory(StanzaRelay stanzaRelay) {
+    private final StanzaHandler stanzaHandler;
+
+    public SimpleStanzaHandlerExecutor(StanzaRelay stanzaRelay, StanzaHandler 
stanzaHandler) {
         this.stanzaRelay = requireNonNull(stanzaRelay);
+        this.stanzaHandler = requireNonNull(stanzaHandler);
     }
 
-    public ComponentStanzaProcessor build() {
-        return new ComponentStanzaProcessor(stanzaRelay);
+    @Override
+    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext 
serverRuntimeContext,
+            boolean isOutboundStanza, SessionContext sessionContext, 
SessionStateHolder sessionStateHolder)
+            throws ProtocolException {
+        return stanzaHandler.execute(stanza, serverRuntimeContext, 
isOutboundStanza, sessionContext, sessionStateHolder,
+                new SimpleStanzaBroker(stanzaRelay, sessionContext));
     }
+
 }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutorFactory.java
similarity index 74%
copy from 
server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
copy to 
server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutorFactory.java
index ef2dc04..efcf05e 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/SimpleStanzaHandlerExecutorFactory.java
@@ -17,25 +17,26 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.xmpp.protocol;
 
 import static java.util.Objects.requireNonNull;
 
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
-import org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
 
 /**
  * @author Réda Housni Alaoui
  */
-public class ComponentStanzaProcessorFactory {
+public class SimpleStanzaHandlerExecutorFactory implements 
StanzaHandlerExecutorFactory {
 
     private final StanzaRelay stanzaRelay;
 
-    public ComponentStanzaProcessorFactory(StanzaRelay stanzaRelay) {
+    public SimpleStanzaHandlerExecutorFactory(StanzaRelay stanzaRelay) {
         this.stanzaRelay = requireNonNull(stanzaRelay);
     }
 
-    public ComponentStanzaProcessor build() {
-        return new ComponentStanzaProcessor(stanzaRelay);
+    @Override
+    public StanzaHandlerExecutor build(StanzaHandler stanzaHandler) {
+        return new SimpleStanzaHandlerExecutor(stanzaRelay, stanzaHandler);
     }
+
 }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
index 1575aaf..d3c7b71 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
@@ -65,17 +65,13 @@ public interface StanzaHandler {
     /**
      * executes a stanza
      * 
-     * @param stanza
-     * @param serverRuntimeContext
      * @param isOutboundStanza
      *            true, if the stanza was emitted by the client which is 
handled by
      *            the session belonging to the given sessionContext parameter.
      *            false, if the session is receiving the stanza targeted to the
      *            session's client.
-     * @param sessionContext
-     * @param sessionStateHolder
-     * @param stanzaBroker
-     * @return optionally returns a stanzaBroker which is passed to the 
session's client
+     * @return optionally returns a stanzaBroker which is passed to the 
session's
+     *         client
      */
     public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext 
serverRuntimeContext,
             boolean isOutboundStanza, SessionContext sessionContext, 
SessionStateHolder sessionStateHolder,
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
new file mode 100644
index 0000000..3526d70
--- /dev/null
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutor.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *  
+ */
+package org.apache.vysper.xmpp.protocol;
+
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+/**
+ * The stanza handler executor sole purpose is to execute a
+ * {@link StanzaHandler}. Consumers must use this executor instead of directly
+ * calling the
+ * {@link StanzaHandler#execute(Stanza, ServerRuntimeContext, boolean, 
SessionContext, SessionStateHolder, StanzaBroker)}
+ * 
+ * An executor allows to decorate the {@link StanzaHandler} execution. For
+ * example vysper could make sure that the executor always runs some process
+ * before and/or after
+ * {@link StanzaHandler#execute(Stanza, ServerRuntimeContext, boolean, 
SessionContext, SessionStateHolder, StanzaBroker)}.
+ * 
+ * @author Réda Housni Alaoui
+ */
+public interface StanzaHandlerExecutor {
+    ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext 
serverRuntimeContext, boolean isOutboundStanza,
+            SessionContext sessionContext, SessionStateHolder 
sessionStateHolder) throws ProtocolException;
+}
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutorFactory.java
similarity index 78%
copy from 
server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
copy to 
server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutorFactory.java
index cd97b55..4b0b9a5 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerExecutorFactory.java
@@ -17,16 +17,15 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
-
-import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+package org.apache.vysper.xmpp.protocol;
 
 /**
  * @author Réda Housni Alaoui
  */
-public interface ComponentRegistry {
+public interface StanzaHandlerExecutorFactory {
 
-       StanzaProcessor getComponentStanzaProcessor(Entity entity);
-       
+    /**
+     * @see StanzaHandlerExecutor
+     */
+    StanzaHandlerExecutor build(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 24f3acc..af3c9f9 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
@@ -21,13 +21,12 @@ package org.apache.vysper.xmpp.protocol.worker;
 
 import static java.util.Objects.requireNonNull;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
+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;
@@ -40,10 +39,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public abstract class AbstractStateAwareProtocolWorker implements 
StateAwareProtocolWorker {
 
-    private final StanzaRelay stanzaRelay;
+    private final StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
 
-    protected AbstractStateAwareProtocolWorker(StanzaRelay stanzaRelay) {
-        this.stanzaRelay = requireNonNull(stanzaRelay);
+    protected AbstractStateAwareProtocolWorker(
+            StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory) {
+        this.stanzaHandlerExecutorFactory = 
requireNonNull(stanzaHandlerExecutorFactory);
     }
 
     abstract public SessionState getHandledState();
@@ -78,11 +78,11 @@ public abstract class AbstractStateAwareProtocolWorker 
implements StateAwareProt
 
     protected ResponseStanzaContainer executeHandler(SessionContext 
sessionContext,
             SessionStateHolder sessionStateHolder, Stanza stanza, 
StanzaHandler stanzaHandler) {
-        ResponseStanzaContainer responseStanzaContainer = null;
+        ResponseStanzaContainer responseStanzaContainer;
         try {
-            responseStanzaContainer = stanzaHandler.execute(stanza, 
sessionContext.getServerRuntimeContext(),
-                    isProcessingOutboundStanzas(), sessionContext, 
sessionStateHolder,
-                    new SimpleStanzaBroker(stanzaRelay, sessionContext));
+            responseStanzaContainer = 
stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza,
+                    sessionContext.getServerRuntimeContext(), 
isProcessingOutboundStanzas(), sessionContext,
+                    sessionStateHolder);
         } catch (ProtocolException e) {
             ResponseWriter.handleProtocolError(e, sessionContext, stanza);
             return null;
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 a4e6cc3..10d37f8 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
@@ -19,11 +19,11 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 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.stanza.Stanza;
@@ -34,11 +34,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class AuthenticatedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
 
-       public AuthenticatedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public AuthenticatedProtocolWorker(StanzaHandlerExecutorFactory 
StanzaHandlerExecutorFactory) {
+        super(StanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     protected boolean checkState(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
         if 
(StreamStartHandler.class.isAssignableFrom(stanzaHandler.unwrapType()))
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 f7fd352..96623f9 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
@@ -19,7 +19,6 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 import org.apache.vysper.xmpp.modules.core.sasl.handler.AbstractSASLHandler;
@@ -29,6 +28,7 @@ import 
org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerify
 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.stanza.Stanza;
@@ -39,11 +39,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class EncryptedProtocolWorker extends AbstractStateAwareProtocolWorker {
 
-       public EncryptedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public EncryptedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.ENCRYPTED;
     }
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 51a5414..20e84de 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
@@ -19,24 +19,23 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 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.stanza.Stanza;
 
 /**
- *
  * @author The Apache MINA Project (d...@mina.apache.org)
  */
 public class EncryptionStartedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
 
-       public EncryptionStartedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public EncryptionStartedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.ENCRYPTION_STARTED;
     }
@@ -45,7 +44,8 @@ public class EncryptionStartedProtocolWorker extends 
AbstractStateAwareProtocolW
     protected boolean checkState(SessionContext 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.
+        // anyway, there are no stanzas to be parsed between 
ENCRYPTION_STARTED and
+        // ENCRYPTED.
         // the state change is handeld in 
ProtocolWorker.processTLSEstablished()
         throw new RuntimeException("worker not implemented");
     }
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 1157f04..dac84e3 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
@@ -19,9 +19,9 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 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.stanza.Stanza;
@@ -32,11 +32,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class EndOrClosedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
 
-       public EndOrClosedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public EndOrClosedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.ENDED;
     }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
index d92ea72..0c60769 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InboundStanzaProtocolWorker.java
@@ -19,25 +19,26 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
+import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
 
 /**
- * to send a mail through the handler and afterwards actually forwarding the 
result to the client
- * inbound stanzas can only be forwarded when the client is authenticated
+ * to send a mail through the handler and afterwards actually forwarding the
+ * result to the client inbound stanzas can only be forwarded when the client 
is
+ * authenticated
  *
  * @author The Apache MINA Project (d...@mina.apache.org)
  */
 public class InboundStanzaProtocolWorker extends 
AbstractStateAwareProtocolWorker {
 
-       public InboundStanzaProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public InboundStanzaProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.AUTHENTICATED;
     }
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 a47ec84..cf0d9bd 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
@@ -19,12 +19,12 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 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.stanza.Stanza;
@@ -35,11 +35,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class InitiatedProtocolWorker extends AbstractStateAwareProtocolWorker {
 
-       public InitiatedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public InitiatedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.INITIATED;
     }
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 407ed49..9887669 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
@@ -19,7 +19,6 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.modules.core.sasl.handler.AbstractSASLHandler;
 import org.apache.vysper.xmpp.modules.core.starttls.handler.StartTLSHandler;
 import 
org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
@@ -27,6 +26,7 @@ import 
org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerify
 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.stanza.Stanza;
@@ -37,11 +37,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class StartedProtocolWorker extends AbstractStateAwareProtocolWorker {
 
-       public StartedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public StartedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.STARTED;
     }
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 9ce5701..e5e5f4e 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
@@ -19,9 +19,9 @@
  */
 package org.apache.vysper.xmpp.protocol.worker;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 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.stanza.Stanza;
@@ -32,11 +32,11 @@ import org.apache.vysper.xmpp.stanza.Stanza;
  */
 public class UnconnectedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
 
-       public UnconnectedProtocolWorker(StanzaRelay stanzaRelay) {
-               super(stanzaRelay);
-       }
+    public UnconnectedProtocolWorker(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        super(stanzaHandlerExecutorFactory);
+    }
 
-       @Override
+    @Override
     public SessionState getHandledState() {
         return SessionState.UNCONNECTED;
     }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
index ef2dc04..d209186 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentStanzaProcessorFactory.java
@@ -21,7 +21,7 @@ package org.apache.vysper.xmpp.server;
 
 import static java.util.Objects.requireNonNull;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
 
 /**
@@ -29,13 +29,13 @@ import 
org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
  */
 public class ComponentStanzaProcessorFactory {
 
-    private final StanzaRelay stanzaRelay;
+    private final StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
 
-    public ComponentStanzaProcessorFactory(StanzaRelay stanzaRelay) {
-        this.stanzaRelay = requireNonNull(stanzaRelay);
+    public ComponentStanzaProcessorFactory(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        this.stanzaHandlerExecutorFactory = 
requireNonNull(stanzaHandlerExecutorFactory);
     }
 
     public ComponentStanzaProcessor build() {
-        return new ComponentStanzaProcessor(stanzaRelay);
+        return new ComponentStanzaProcessor(stanzaHandlerExecutorFactory);
     }
 }
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 a7ff5f7..2681bf9 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
@@ -44,10 +44,14 @@ import org.apache.vysper.xmpp.modules.ModuleRegistry;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
 import org.apache.vysper.xmpp.protocol.ProtocolWorker;
+import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerLookup;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+import org.apache.vysper.xmpp.server.components.AlterableComponentRegistry;
 import org.apache.vysper.xmpp.server.components.Component;
+import org.apache.vysper.xmpp.server.components.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.server.s2s.DefaultXMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -144,12 +148,16 @@ public class DefaultServerRuntimeContext implements 
ServerRuntimeContext, Module
         this.serverEntity = serverEntity;
         this.stanzaRelay = stanzaRelay;
         this.componentRegistry = requireNonNull(componentRegistry);
-        this.serverConnectorRegistry = new 
DefaultXMPPServerConnectorRegistry(this, stanzaRelay, stanzaProcessor);
+        StanzaHandlerExecutorFactory simpleStanzaHandlerExecutorFactory = new 
SimpleStanzaHandlerExecutorFactory(
+                stanzaRelay);
+        this.serverConnectorRegistry = new 
DefaultXMPPServerConnectorRegistry(this,
+                simpleStanzaHandlerExecutorFactory, stanzaProcessor);
         this.stanzaHandlerLookup = new StanzaHandlerLookup(this);
         this.eventBus = new SimpleEventBus();
         this.serverFeatures = serverFeatures;
         this.resourceRegistry = resourceRegistry;
-        this.componentStanzaProcessorFactory = new 
ComponentStanzaProcessorFactory(stanzaRelay);
+        this.componentStanzaProcessorFactory = new 
ComponentStanzaProcessorFactory(
+                simpleStanzaHandlerExecutorFactory);
 
         addDictionaries(dictionaries);
     }
@@ -161,8 +169,9 @@ public class DefaultServerRuntimeContext implements 
ServerRuntimeContext, Module
     }
 
     public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay 
stanzaRelay) {
-        this(serverEntity, stanzaRelay, new ProtocolWorker(stanzaRelay), new 
SimpleComponentRegistry(serverEntity),
-                new DefaultResourceRegistry(), new ServerFeatures(), 
Collections.emptyList());
+        this(serverEntity, stanzaRelay, new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay)),
+                new SimpleComponentRegistry(serverEntity), new 
DefaultResourceRegistry(), new ServerFeatures(),
+                Collections.emptyList());
     }
 
     /**
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 f516e0d..58901bf 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
@@ -48,7 +48,11 @@ 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.SimpleStanzaHandlerExecutorFactory;
+import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+import org.apache.vysper.xmpp.server.components.AlterableComponentRegistry;
+import org.apache.vysper.xmpp.server.components.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
 import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
 
@@ -71,7 +75,7 @@ public class XMPPServer {
     private String serverDomain;
 
     private DefaultServerRuntimeContext serverRuntimeContext;
-    
+
     private StanzaProcessor stanzaProcessor;
 
     private StorageProviderRegistry storageProviderRegistry;
@@ -197,10 +201,13 @@ public class XMPPServer {
         stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
         stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
 
-        stanzaProcessor = new ProtocolWorker(stanzaRelayBroker);
+        StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory = new 
SimpleStanzaHandlerExecutorFactory(
+                stanzaRelayBroker);
+
+        stanzaProcessor = new ProtocolWorker(stanzaHandlerExecutorFactory);
 
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, 
stanzaRelayBroker, stanzaProcessor, componentRegistry,
-                resourceRegistry, serverFeatures, dictionaries);
+        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, 
stanzaRelayBroker, stanzaProcessor,
+                componentRegistry, resourceRegistry, serverFeatures, 
dictionaries);
         
serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
         serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
 
@@ -210,7 +217,7 @@ public class XMPPServer {
 
         stanzaRelayBroker.setServerRuntimeContext(serverRuntimeContext);
         internalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        internalStanzaRelay.setStanzaRelay(stanzaRelayBroker);
+        
internalStanzaRelay.setStanzaHandlerExecutionContextFactory(stanzaHandlerExecutorFactory);
         externalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
 
         final LogStorageProvider logStorageProvider = 
this.storageProviderRegistry.retrieve(LogStorageProvider.class);
@@ -221,8 +228,8 @@ public class XMPPServer {
             throw new IllegalStateException("server must have at least one 
endpoint");
 
         /*
-          'input stream': receives stanzas issued by client sessions to be 
handled by
-          the server
+         * 'input stream': receives stanzas issued by client sessions to be 
handled by
+         * the server
          */
         for (Endpoint endpoint : endpoints) {
             endpoint.setServerRuntimeContext(serverRuntimeContext);
@@ -272,8 +279,8 @@ public class XMPPServer {
     public ServerRuntimeContext getServerRuntimeContext() {
         return serverRuntimeContext;
     }
-    
-    public StanzaProcessor getStanzaProcessor(){
+
+    public StanzaProcessor getStanzaProcessor() {
         return stanzaProcessor;
     }
 }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/AlterableComponentRegistry.java
similarity index 87%
rename from 
server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
rename to 
server/core/src/main/java/org/apache/vysper/xmpp/server/components/AlterableComponentRegistry.java
index b38fe0a..f9a9e3c 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/AlterableComponentRegistry.java
@@ -17,10 +17,9 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.xmpp.server.components;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
-import org.apache.vysper.xmpp.server.components.Component;
+import org.apache.vysper.xmpp.server.ComponentStanzaProcessorFactory;
 
 /**
  * @author Réda Housni Alaoui
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentRegistry.java
similarity index 95%
rename from 
server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
rename to 
server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentRegistry.java
index cd97b55..d88f5f7 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentRegistry.java
@@ -17,7 +17,7 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.xmpp.server.components;
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
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 cbdf0cb..518f24e 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
@@ -19,35 +19,36 @@
  */
 package org.apache.vysper.xmpp.server.components;
 
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import static java.util.Objects.requireNonNull;
+
+import java.util.List;
+
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
 import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
+import org.apache.vysper.xmpp.protocol.StanzaBroker;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.protocol.StanzaHandlerExecutor;
+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.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 
-import java.util.List;
-
-import static java.util.Objects.requireNonNull;
-
 /**
  */
 public class ComponentStanzaProcessor implements StanzaProcessor {
 
-    protected StanzaRelay stanzaRelay;
+    protected StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
 
     protected ComponentStanzaHandlerLookup componentStanzaHandlerLookup = new 
ComponentStanzaHandlerLookup();
 
-    public ComponentStanzaProcessor(StanzaRelay stanzaRelay) {
-        this.stanzaRelay = requireNonNull(stanzaRelay);
+    public ComponentStanzaProcessor(StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory) {
+        this.stanzaHandlerExecutorFactory = 
requireNonNull(stanzaHandlerExecutorFactory);
     }
 
     public void addHandler(StanzaHandler stanzaHandler) {
@@ -75,10 +76,10 @@ public class ComponentStanzaProcessor implements 
StanzaProcessor {
 
         ResponseStanzaContainer responseStanzaContainer = null;
         try {
-            responseStanzaContainer = stanzaHandler.execute(stanza, 
serverRuntimeContext, false, sessionContext,
-                    sessionStateHolder, new SimpleStanzaBroker(stanzaRelay, 
sessionContext));
+            responseStanzaContainer = 
stanzaHandlerExecutorFactory.build(stanzaHandler).execute(stanza,
+                    serverRuntimeContext, false, sessionContext, 
sessionStateHolder);
         } catch (ProtocolException e) {
-            // TODO handle 
+            // TODO handle
             e.printStackTrace();
         }
 
@@ -87,11 +88,14 @@ public class ComponentStanzaProcessor implements 
StanzaProcessor {
         }
         List<Stanza> responseStanzas = 
responseStanzaContainer.getResponseStanzas();
         try {
-            IgnoreFailureStrategy failureStrategy = 
IgnoreFailureStrategy.IGNORE_FAILURE_STRATEGY; // TODO call back module
-            for (Stanza responseStanza: responseStanzas) {
-                stanzaRelay.relay(responseStanza.getTo(), responseStanza, 
failureStrategy);
+            // module
+            StanzaHandlerExecutor executionContext = 
stanzaHandlerExecutorFactory
+                    .build(new RelayingStanzaHandler());
+            for (Stanza responseStanza : responseStanzas) {
+                executionContext.execute(responseStanza, serverRuntimeContext, 
false, sessionContext,
+                        sessionStateHolder);
             }
-        } catch (DeliveryException e) {
+        } catch (ProtocolException e) {
             throw new RuntimeException(e);
         }
 
@@ -100,4 +104,34 @@ public class ComponentStanzaProcessor implements 
StanzaProcessor {
     public void processTLSEstablished(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder) {
         throw new RuntimeException("should not be called for components, which 
only acts as an established session");
     }
+
+    private static class RelayingStanzaHandler implements StanzaHandler {
+
+        @Override
+        public String getName() {
+            return null;
+        }
+
+        @Override
+        public boolean verify(Stanza stanza) {
+            return false;
+        }
+
+        @Override
+        public boolean isSessionRequired() {
+            return false;
+        }
+
+        @Override
+        public ResponseStanzaContainer execute(Stanza stanza, 
ServerRuntimeContext serverRuntimeContext,
+                boolean isOutboundStanza, SessionContext sessionContext, 
SessionStateHolder sessionStateHolder,
+                StanzaBroker stanzaBroker) {
+            try {
+                stanzaBroker.write(stanza.getTo(), stanza, 
IgnoreFailureStrategy.IGNORE_FAILURE_STRATEGY);
+            } catch (DeliveryException e) {
+                throw new RuntimeException(e);
+            }
+            return null;
+        }
+    }
 }
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/SimpleComponentRegistry.java
similarity index 93%
rename from 
server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
rename to 
server/core/src/main/java/org/apache/vysper/xmpp/server/components/SimpleComponentRegistry.java
index 30b480e..6d045f0 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/server/components/SimpleComponentRegistry.java
@@ -17,7 +17,7 @@
  *  under the License.
  *  
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.xmpp.server.components;
 
 import static java.util.Objects.requireNonNull;
 
@@ -27,8 +27,7 @@ import java.util.Map;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityUtils;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
-import org.apache.vysper.xmpp.server.components.Component;
-import org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
+import org.apache.vysper.xmpp.server.ComponentStanzaProcessorFactory;
 
 /**
  * @author Réda Housni Alaoui
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 54aebd4..99d400c 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
@@ -38,7 +38,6 @@ import org.apache.vysper.mina.MinaBackedSessionContext;
 import org.apache.vysper.mina.StanzaLoggingFilter;
 import org.apache.vysper.mina.codec.XMPPProtocolCodecFactory;
 import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.delivery.failure.RemoteServerNotFoundException;
 import org.apache.vysper.xmpp.delivery.failure.RemoteServerTimeoutException;
 import 
org.apache.vysper.xmpp.modules.extension.xep0199_xmppping.XmppPingListener;
@@ -50,8 +49,8 @@ import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
-import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
 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;
@@ -78,8 +77,8 @@ public class DefaultXMPPServerConnector implements 
XmppPingListener, XMPPServerC
 
     private final ServerRuntimeContext serverRuntimeContext;
 
-    private final StanzaRelay stanzaRelay;
-    
+    private final StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
+
     private final StanzaProcessor stanzaProcessor;
 
     private MinaBackedSessionContext sessionContext;
@@ -111,12 +110,11 @@ public class DefaultXMPPServerConnector implements 
XmppPingListener, XMPPServerC
     protected final CountDownLatch authenticatedLatch = new CountDownLatch(1);
 
     public DefaultXMPPServerConnector(Entity remoteServer, 
ServerRuntimeContext serverRuntimeContext,
-                                      StanzaRelay stanzaRelay, StanzaProcessor 
stanzaProcessor, 
-                                      SessionContext dialbackSessionContext,
-                                      SessionStateHolder 
dialbackSessionStateHolder) {
+                                      StanzaHandlerExecutorFactory 
stanzaHandlerExecutorFactory, StanzaProcessor stanzaProcessor,
+                                      SessionContext dialbackSessionContext, 
SessionStateHolder dialbackSessionStateHolder) {
         this.serverRuntimeContext = serverRuntimeContext;
         this.stanzaProcessor = stanzaProcessor;
-        this.stanzaRelay = stanzaRelay;
+        this.stanzaHandlerExecutorFactory = stanzaHandlerExecutorFactory;
         this.remoteServer = remoteServer;
         this.dialbackSessionContext = dialbackSessionContext;
         this.dialbackSessionStateHolder = dialbackSessionStateHolder;
@@ -227,8 +225,8 @@ public class DefaultXMPPServerConnector implements 
XmppPingListener, XMPPServerC
         if (s2sHandler != null) {
             ResponseStanzaContainer container;
             try {
-                container = s2sHandler.execute(stanza, serverRuntimeContext, 
false, sessionContext, sessionStateHolder,
-                        new SimpleStanzaBroker(stanzaRelay, sessionContext));
+                container = 
stanzaHandlerExecutorFactory.build(s2sHandler).execute(stanza, 
serverRuntimeContext,
+                        false, sessionContext, sessionStateHolder);
             } catch (ProtocolException e) {
                 return;
             }
@@ -284,8 +282,7 @@ public class DefaultXMPPServerConnector implements 
XmppPingListener, XMPPServerC
                 return;
             }
 
-            stanzaProcessor.processStanza(serverRuntimeContext, 
sessionContext, stanza,
-                    sessionStateHolder);
+            stanzaProcessor.processStanza(serverRuntimeContext, 
sessionContext, stanza, sessionStateHolder);
         }
     }
 
@@ -306,7 +303,8 @@ public class DefaultXMPPServerConnector implements 
XmppPingListener, XMPPServerC
 
     public void handleSessionOpened(IoSession session) {
         LOG.info("XMPP server session opened to {}", remoteServer);
-        sessionContext = new MinaBackedSessionContext(serverRuntimeContext, 
stanzaProcessor, 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 f1694d2..cd186c1 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
@@ -24,10 +24,10 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.vysper.compliance.SpecCompliant;
 import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 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.StanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -47,15 +47,15 @@ public class DefaultXMPPServerConnectorRegistry implements 
XMPPServerConnectorRe
 
     private final Map<Entity, XMPPServerConnector> connectors = new 
ConcurrentHashMap<>();
 
-    private final StanzaRelay stanzaRelay;
-    
+    private final StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory;
+
     private final StanzaProcessor stanzaProcessor;
 
-    public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext 
serverRuntimeContext, 
-                                              StanzaRelay stanzaRelay, 
-                                              StanzaProcessor stanzaProcessor) 
{
+    public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext 
serverRuntimeContext,
+            StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory,
+            StanzaProcessor stanzaProcessor) {
         this.serverRuntimeContext = serverRuntimeContext;
-        this.stanzaRelay = stanzaRelay;
+        this.stanzaHandlerExecutorFactory = stanzaHandlerExecutorFactory;
         this.stanzaProcessor = stanzaProcessor;
     }
 
@@ -104,8 +104,8 @@ public class DefaultXMPPServerConnectorRegistry implements 
XMPPServerConnectorRe
 
     protected XMPPServerConnector createConnector(Entity otherServer, 
ServerRuntimeContext serverRuntimeContext,
             SessionContext dialbackSessionContext, SessionStateHolder 
dialbackSessionStateHolder) {
-        return new DefaultXMPPServerConnector(otherServer, 
serverRuntimeContext, stanzaRelay, stanzaProcessor, dialbackSessionContext,
-                dialbackSessionStateHolder);
+        return new DefaultXMPPServerConnector(otherServer, 
serverRuntimeContext, stanzaHandlerExecutorFactory,
+                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 73556f6..1e63b3e 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
@@ -22,21 +22,22 @@ package org.apache.vysper.stanzasession;
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.xmpp.addressing.Entity;
 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.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerFeatures;
-import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
+import org.apache.vysper.xmpp.server.components.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
 import org.apache.vysper.xmpp.writer.DenseStanzaLogRenderer;
 
+import junit.framework.TestCase;
+
 /**
  */
 public class StanzaSessionTestCase extends TestCase {
@@ -57,9 +58,10 @@ public class StanzaSessionTestCase extends TestCase {
         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, protocolWorker, new 
SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(), new 
ServerFeatures(), dictionaries);
+        ProtocolWorker protocolWorker = new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay));
+        DefaultServerRuntimeContext serverContext = new 
DefaultServerRuntimeContext(serverEntity, relay, protocolWorker,
+                new SimpleComponentRegistry(serverEntity), new 
DefaultResourceRegistry(), new ServerFeatures(),
+                dictionaries);
 
         relay.setServerRuntimeContext(serverContext);
 
@@ -70,19 +72,21 @@ public class StanzaSessionTestCase extends TestCase {
 
     public void testHandshake() {
         StanzaSession session = sessionFactory.createNewSession();
-        session.send(new StanzaBuilder("stream", 
"http://etherx.jabber.org/streams";, "stream").addAttribute("from",
-                "m...@vysper.org").addAttribute("to", 
"vysper.org").declareNamespace("", "jabber:client").build());
+        session.send(new StanzaBuilder("stream", 
"http://etherx.jabber.org/streams";, "stream")
+                .addAttribute("from", "m...@vysper.org").addAttribute("to", 
"vysper.org")
+                .declareNamespace("", "jabber:client").build());
         Stanza stanza = waitForStanza(session);
         assertNotNull(stanza);
         System.out.println(DenseStanzaLogRenderer.render(stanza));
-        session.send(new StanzaBuilder("starttls", 
"urn:ietf:params:xml:ns:xmpp-tls").addAttribute("from",
-                "m...@vysper.org").build());
+        session.send(new StanzaBuilder("starttls", 
"urn:ietf:params:xml:ns:xmpp-tls")
+                .addAttribute("from", "m...@vysper.org").build());
         stanza = waitForStanza(session);
         assertNotNull(stanza);
         System.out.println(DenseStanzaLogRenderer.render(stanza));
         session.setIsSecure();
-        session.send(new StanzaBuilder("stream", 
"http://etherx.jabber.org/streams";, "stream").addAttribute("from",
-                "m...@vysper.org").addAttribute("to", 
"vysper.org").declareNamespace("", "jabber:client").build());
+        session.send(new StanzaBuilder("stream", 
"http://etherx.jabber.org/streams";, "stream")
+                .addAttribute("from", "m...@vysper.org").addAttribute("to", 
"vysper.org")
+                .declareNamespace("", "jabber:client").build());
         stanza = waitForStanza(session);
         assertNotNull(stanza);
         System.out.println(DenseStanzaLogRenderer.render(stanza));
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 05c42eb..312823a 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
@@ -34,10 +34,11 @@ import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
 import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
+import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
-import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.server.components.SimpleComponentRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.BindException;
@@ -74,7 +75,7 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
             ; // empty
         }
     }
-    
+
     private Entity serverEntity;
 
     @Override
@@ -91,7 +92,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
         DefaultServerRuntimeContext serverRuntimeContext = new 
DefaultServerRuntimeContext(serverEntity,
                 mock(StanzaRelay.class));
         stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        stanzaRelay.setStanzaRelay(stanzaRelay);
+        stanzaRelay
+                .setStanzaHandlerExecutionContextFactory(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay));
 
         TestSessionContext sessionContext = 
TestSessionContext.createSessionContext(TO_ENTITY);
         sessionContext.setSessionState(SessionState.AUTHENTICATED);
@@ -135,7 +137,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
         
serverRuntimeContext.getServerFeatures().setDeliverMessageToHighestPriorityResourcesOnly(false);
 
         stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        stanzaRelay.setStanzaRelay(stanzaRelay);
+        stanzaRelay
+                .setStanzaHandlerExecutionContextFactory(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay));
 
         TestSessionContext sessionContextTO_ENTITY_1_prio3 = 
createSessionForTo(TO_ENTITY, 3); // NON-NEGATIVE
         TestSessionContext sessionContextTO_ENTITY_2_prio0 = 
createSessionForTo(TO_ENTITY, 0); // NON-NEGATIVE
@@ -170,7 +173,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
         
serverRuntimeContext.getServerFeatures().setDeliverMessageToHighestPriorityResourcesOnly(true);
 
         stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        stanzaRelay.setStanzaRelay(stanzaRelay);
+        stanzaRelay
+                .setStanzaHandlerExecutionContextFactory(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay));
 
         TestSessionContext sessionContextTO_ENTITY_1_prio3 = 
createSessionForTo(TO_ENTITY, 3); // HIGHEST PRIO
         TestSessionContext sessionContextTO_ENTITY_2_prio0 = 
createSessionForTo(TO_ENTITY, 1); // not receiving
@@ -227,7 +231,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
                 mock(StanzaRelay.class));
 
         stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        stanzaRelay.setStanzaRelay(stanzaRelay);
+        stanzaRelay
+                .setStanzaHandlerExecutionContextFactory(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay));
         stanzaRelay.setMaxThreadCount(1);
 
         TestSessionContext sessionContext = createSessionForTo(TO_ENTITY, 1);
@@ -251,7 +256,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase 
extends TestCase {
                 mock(StanzaRelay.class));
 
         stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-        stanzaRelay.setStanzaRelay(stanzaRelay);
+        stanzaRelay
+                .setStanzaHandlerExecutionContextFactory(new 
SimpleStanzaHandlerExecutorFactory(stanzaRelay));
         stanzaRelay.setMaxThreadCount(10);
 
         TestSessionContext sessionContext = createSessionForTo(TO_ENTITY, 1);
diff --git 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
index f944cae..d5cfbdb 100644
--- 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
+++ 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
@@ -54,7 +54,7 @@ public abstract class AbstractProtocolStateTestCase extends 
TestCase {
         super.setUp();
 
         StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
-        protocolWorker = new ProtocolWorker(receiverRelay);
+        protocolWorker = new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(receiverRelay));
         serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, 
receiverRelay);
         receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(new BaseStreamStanzaDictionary());
diff --git 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
index e82c734..514f3f0 100644
--- 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
+++ 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
@@ -58,7 +58,7 @@ public class ProtocolWorkerProcessTestCase extends TestCase {
         namespaceHandlerDictionary = new 
NamespaceHandlerDictionary("testNSURI");
         StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
         serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, 
receiverRelay);
-        protocolWorker = new 
ProtocolWorker(serverRuntimeContext.getStanzaRelay());
+        protocolWorker = new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(receiverRelay));
         receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(namespaceHandlerDictionary);
         sessionStateHolder = new SessionStateHolder();
diff --git 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
index f31cf4e..88aa0b4 100644
--- 
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
+++ 
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
@@ -48,8 +48,9 @@ public class ProtocolWorkerStateAwarenessTestCase extends 
TestCase {
         sessionStateHolder = new SessionStateHolder();
         Entity serverEnitity = new EntityImpl(null, "vysper-server.org", null);
         StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
-        protocolWorker = new ProtocolWorker(receiverRelay);
-        DefaultServerRuntimeContext serverRuntimeContext = new 
DefaultServerRuntimeContext(serverEnitity, receiverRelay);
+        protocolWorker = new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(receiverRelay));
+        DefaultServerRuntimeContext serverRuntimeContext = new 
DefaultServerRuntimeContext(serverEnitity,
+                receiverRelay);
         receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(new BaseStreamStanzaDictionary());
         sessionStateHolder = new SessionStateHolder();
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 6624392..ee98878 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
@@ -33,6 +33,7 @@ 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.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
 
@@ -115,15 +116,17 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, 
SessionStateHolder sessionStateHolder,
             StanzaRelay relay) {
-        super(serverRuntimeContext, new ProtocolWorker(relay), 
sessionStateHolder);
+        super(serverRuntimeContext, new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(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);
+                new MemoryStorageProviderRegistry()),
+                new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay)), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
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 c0d9aed..2d3c514 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
@@ -29,6 +29,7 @@ import 
org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
+import org.apache.vysper.xmpp.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -62,7 +63,8 @@ public class ComponentStanzaProcessorTestCase {
 
     private ResponseStanzaContainer container = new 
ResponseStanzaContainerImpl(responseStanza);
 
-    private ComponentStanzaProcessor processor = new 
ComponentStanzaProcessor(stanzaRelay);
+    private ComponentStanzaProcessor processor = new ComponentStanzaProcessor(
+            new SimpleStanzaHandlerExecutorFactory(stanzaRelay));
 
     @Before
     public void before() {
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 eb30a76..dce5d5e 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
@@ -33,6 +33,7 @@ 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.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -104,7 +105,7 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
      * @return
      */
     public static TestSessionContext 
createWithStanzaReceiverRelay(SessionStateHolder sessionStateHolder,
-                                                                   
ServerRuntimeContext serverContext, StanzaReceiverRelay relay) {
+            ServerRuntimeContext serverContext, StanzaReceiverRelay relay) {
         relay.setServerRuntimeContext(serverContext);
         return new TestSessionContext(serverContext, sessionStateHolder, 
relay);
     }
@@ -118,8 +119,9 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
     }
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, 
SessionStateHolder sessionStateHolder,
-                              StanzaRelay relay) {
-        super(serverRuntimeContext, new ProtocolWorker(relay), 
sessionStateHolder);
+            StanzaRelay relay) {
+        super(serverRuntimeContext, new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay)),
+                sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
@@ -127,7 +129,8 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
 
     public TestSessionContext(SessionStateHolder sessionStateHolder, 
StanzaRelay relay) {
         super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", 
null), relay,
-                new MemoryStorageProviderRegistry()), new 
ProtocolWorker(relay), sessionStateHolder);
+                new MemoryStorageProviderRegistry()),
+                new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay)), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
diff --git 
a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
 
b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
index 7931cb7..c56cb8e 100644
--- 
a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
+++ 
b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
@@ -19,6 +19,9 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.vysper.compliance.SpecCompliance;
 import org.apache.vysper.compliance.SpecCompliant;
 import org.apache.vysper.xml.fragment.XMLElement;
@@ -26,7 +29,6 @@ import org.apache.vysper.xml.fragment.XMLElementBuilder;
 import org.apache.vysper.xml.fragment.XMLFragment;
 import org.apache.vysper.xml.fragment.XMLText;
 import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubPrivilege;
 import 
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubServiceConfiguration;
 import 
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
@@ -40,9 +42,6 @@ import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
-import java.util.Collections;
-import java.util.List;
-
 /**
  * This class handles the "publish" use cases for the "pubsub" namespace.
  * 
@@ -69,9 +68,11 @@ public class PubSubPublishHandler extends 
AbstractPubSubGeneralHandler {
     }
 
     /**
-     * This method takes care of handling the "publish" use-case including all 
(relevant) error conditions.
+     * This method takes care of handling the "publish" use-case including all
+     * (relevant) error conditions.
      * 
-     * @return the appropriate response stanza (either success or some error 
condition).
+     * @return the appropriate response stanza (either success or some error
+     *         condition).
      */
     @Override
     @SpecCompliance(compliant = {
@@ -84,7 +85,8 @@ public class PubSubPublishHandler extends 
AbstractPubSubGeneralHandler {
             @SpecCompliant(spec = "xep-0060", section = "7.1.3.4", status = 
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage = 
SpecCompliant.ComplianceCoverage.UNSUPPORTED),
             @SpecCompliant(spec = "xep-0060", section = "7.1.3.5", status = 
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage = 
SpecCompliant.ComplianceCoverage.UNSUPPORTED),
             @SpecCompliant(spec = "xep-0060", section = "7.1.3.6", status = 
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage = 
SpecCompliant.ComplianceCoverage.UNSUPPORTED) })
-    protected List<Stanza> handleSet(IQStanza stanza, ServerRuntimeContext 
serverRuntimeContext, SessionContext sessionContext, StanzaBroker stanzaBroker) 
{
+    protected List<Stanza> handleSet(IQStanza stanza, ServerRuntimeContext 
serverRuntimeContext,
+            SessionContext sessionContext, StanzaBroker stanzaBroker) {
         Entity serverJID = serviceConfiguration.getDomainJID();
         CollectionNode root = serviceConfiguration.getRootNode();
 
@@ -108,7 +110,8 @@ public class PubSubPublishHandler extends 
AbstractPubSubGeneralHandler {
 
         if (!node.isAuthorized(sender, PubSubPrivilege.PUBLISH)) {
             // not enough privileges to publish - error condition 1 (7.1.3)
-            return 
Collections.singletonList(errorStanzaGenerator.generateInsufficientPrivilegesErrorStanza(sender,
 serverJID, stanza));
+            return Collections.singletonList(
+                    
errorStanzaGenerator.generateInsufficientPrivilegesErrorStanza(sender, 
serverJID, stanza));
         }
 
         XMLElementBuilder eventItemBuilder = new XMLElementBuilder("item", 
NamespaceURIs.XEP0060_PUBSUB_EVENT);
@@ -137,9 +140,12 @@ public class PubSubPublishHandler extends 
AbstractPubSubGeneralHandler {
     /**
      * This method adds the default "success" elements to the given 
StanzaBuilder.
      * 
-     * @param sb the StanzaBuilder to add the success elements.
-     * @param node the node to which the message was published.
-     * @param id the id of the published message.
+     * @param sb
+     *            the StanzaBuilder to add the success elements.
+     * @param node
+     *            the node to which the message was published.
+     * @param id
+     *            the id of the published message.
      */
     private void buildSuccessStanza(StanzaBuilder sb, String node, String id) {
         sb.startInnerElement("publish", NamespaceURIs.XEP0060_PUBSUB);
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 aeab842..78f0c30 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
@@ -33,6 +33,7 @@ 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.protocol.SimpleStanzaHandlerExecutorFactory;
 import org.apache.vysper.xmpp.server.AbstractSessionContext;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -104,7 +105,7 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
      * @return
      */
     public static TestSessionContext 
createWithStanzaReceiverRelay(SessionStateHolder sessionStateHolder,
-                                                                   
ServerRuntimeContext serverContext, StanzaReceiverRelay relay) {
+            ServerRuntimeContext serverContext, StanzaReceiverRelay relay) {
         relay.setServerRuntimeContext(serverContext);
         return new TestSessionContext(serverContext, sessionStateHolder, 
relay);
     }
@@ -118,8 +119,9 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
     }
 
     public TestSessionContext(ServerRuntimeContext serverRuntimeContext, 
SessionStateHolder sessionStateHolder,
-                              StanzaRelay relay) {
-        super(serverRuntimeContext, new ProtocolWorker(relay), 
sessionStateHolder);
+            StanzaRelay relay) {
+        super(serverRuntimeContext, new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay)),
+                sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;
@@ -127,7 +129,8 @@ public class TestSessionContext extends 
AbstractSessionContext implements Stanza
 
     public TestSessionContext(SessionStateHolder sessionStateHolder, 
StanzaRelay relay) {
         super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", 
null), relay,
-                new MemoryStorageProviderRegistry()), new 
ProtocolWorker(relay), sessionStateHolder);
+                new MemoryStorageProviderRegistry()),
+                new ProtocolWorker(new 
SimpleStanzaHandlerExecutorFactory(relay)), sessionStateHolder);
         sessionId = serverRuntimeContext.getNextSessionId();
         xmlLang = "de";
         this.relay = relay;

Reply via email to