diff --git a/org.synyx.hera.si/.springBeans b/org.synyx.hera.si/.springBeans
new file mode 100644
index 0000000..85a42a9
--- /dev/null
+++ b/org.synyx.hera.si/.springBeans
@@ -0,0 +1,13 @@
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
diff --git a/org.synyx.hera.si/pom.xml b/org.synyx.hera.si/pom.xml
new file mode 100644
index 0000000..de4385a
--- /dev/null
+++ b/org.synyx.hera.si/pom.xml
@@ -0,0 +1,58 @@
+
+ 4.0.0
+
+ org.synyx.hera
+ org.synyx.hera
+ 0.7.0.BUILD-SNAPSHOT
+
+ org.synyx.hera
+ org.synyx.hera.si
+ 0.7.0.BUILD-SNAPSHOT
+ Hera Spring Integration integration
+
+
+ 2.0.3.RELEASE
+ 3.0.5.RELEASE
+
+
+
+
+ ${project.groupId}
+ org.synyx.hera.core
+ ${project.version}
+
+
+
+ org.springframework.integration
+ spring-integration-core
+ ${spring.integration.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-beans
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
+
+
+
\ No newline at end of file
diff --git a/org.synyx.hera.si/src/main/java/org/synyx/hera/si/PluginRegistryAwareMessageHandler.java b/org.synyx.hera.si/src/main/java/org/synyx/hera/si/PluginRegistryAwareMessageHandler.java
new file mode 100644
index 0000000..91c8810
--- /dev/null
+++ b/org.synyx.hera.si/src/main/java/org/synyx/hera/si/PluginRegistryAwareMessageHandler.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2011 the original author or authors.
+ *
+ * Licensed 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.synyx.hera.si;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.springframework.core.GenericTypeResolver;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.integration.Message;
+import org.springframework.integration.MessageHandlingException;
+import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
+import org.springframework.util.Assert;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.ReflectionUtils;
+import org.synyx.hera.core.Plugin;
+import org.synyx.hera.core.PluginRegistry;
+
+/**
+ * Dynamic service activator that uses a {@link PluginRegistry} to delegate execution to one or more plugins matching a
+ * delimiter.
+ *
+ * @author Oliver Gierke
+ */
+public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMessageHandler {
+
+ private enum InvocationMethod {
+ ONE, ALL;
+ }
+
+ private final PluginRegistry extends Plugin>, Object> registry;
+ private final Class extends Plugin>> pluginType;
+ private final Class> delimitzerType;
+ private final SpelExpressionParser parser = new SpelExpressionParser();
+
+ private Expression delimiterExpression;
+ private Expression invocationArgumentsExpression;
+ private String serviceMethodName;
+ private InvocationMethod invocationMethod = InvocationMethod.ONE;
+
+ /**
+ * Creates a new {@link PluginRegistryAwareMessageHandler} for the given {@link PluginRegistry}, pluginType and a
+ * method name to call.
+ *
+ * @param registry
+ * @param pluginType
+ * @param serviceMethodName
+ */
+ @SuppressWarnings("unchecked")
+ public PluginRegistryAwareMessageHandler(PluginRegistry extends Plugin>, ?> registry,
+ Class extends Plugin>> pluginType, String serviceMethodName) {
+
+ Assert.notNull(registry);
+ Assert.notNull(pluginType);
+ Assert.hasText(serviceMethodName);
+
+ this.registry = (PluginRegistry extends Plugin>, Object>) registry;
+ this.serviceMethodName = serviceMethodName;
+ this.pluginType = pluginType;
+ this.delimitzerType = GenericTypeResolver.resolveTypeArgument(pluginType, Plugin.class);
+ }
+
+ /**
+ * Sets the SpEL expression to extract the delimiter from the {@link Message}.
+ *
+ * @param delimiterExpression the delimiterExpression to set
+ */
+ public void setDelimiterExpression(String expression) {
+ Assert.hasText(expression);
+ this.delimiterExpression = parser.parseExpression(expression);
+ }
+
+ /**
+ * Sets the SpEL expression to extract the method arguments for the actual plugin method invocation from the
+ * {@link Message}.
+ *
+ * @param invocationArgumentsExpression the invocationArgumentsExpression to set
+ */
+ public void setInvocationArgumentsExpression(String expression) {
+ Assert.hasText(expression);
+ this.invocationArgumentsExpression = parser.parseExpression(expression);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.integration.handler.AbstractReplyProducingMessageHandler#handleRequestMessage(org.springframework.integration.Message)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Object handleRequestMessage(Message> requestMessage) {
+
+ Object delimiter = getDelimiter(requestMessage);
+
+ switch (invocationMethod) {
+ case ALL:
+ return invokePlugins(registry.getPluginsFor(delimiter), requestMessage);
+ case ONE:
+ default:
+ List